Merge "Add parameter for accessing channels from 3rd-party TV apps." into oc-dev
diff --git a/Android.mk b/Android.mk
index 991d185..e58f306 100644
--- a/Android.mk
+++ b/Android.mk
@@ -143,7 +143,6 @@
core/java/android/bluetooth/IBluetoothGatt.aidl \
core/java/android/bluetooth/IBluetoothGattCallback.aidl \
core/java/android/bluetooth/IBluetoothGattServerCallback.aidl \
- core/java/android/bluetooth/le/IAdvertiserCallback.aidl \
core/java/android/bluetooth/le/IAdvertisingSetCallback.aidl \
core/java/android/bluetooth/le/IPeriodicAdvertisingCallback.aidl \
core/java/android/bluetooth/le/IScannerCallback.aidl \
@@ -908,7 +907,6 @@
ext \
icu4j \
framework \
- telephony-common \
voip-common
framework_docs_LOCAL_JAVA_LIBRARIES := \
@@ -923,6 +921,7 @@
# Conscrypt (com.android.org.conscrypt) is an implementation detail and should
# not be referenced in the documentation.
framework_docs_LOCAL_DROIDDOC_OPTIONS := \
+ -android \
-knowntags ./frameworks/base/docs/knowntags.txt \
-knowntags ./libcore/known_oj_tags.txt \
-hidePackage com.android.org.conscrypt \
@@ -952,8 +951,8 @@
-since $(SRC_API_DIR)/24.txt 24 \
-since $(SRC_API_DIR)/25.txt 25 \
-since ./frameworks/base/api/current.txt O \
- -werror -hide 111 -hide 113 \
- -overview $(LOCAL_PATH)/core/java/overview.html
+ -werror -hide 111 -hide 113 -hide 121 \
+ -overview $(LOCAL_PATH)/core/java/overview.html \
# Allow the support library to add its own droiddoc options.
include $(LOCAL_PATH)/../support/droiddoc.mk
diff --git a/api/current.txt b/api/current.txt
index 8baca12..a8e4663 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -15,13 +15,11 @@
field public static final java.lang.String ACCESS_WIFI_STATE = "android.permission.ACCESS_WIFI_STATE";
field public static final java.lang.String ACCOUNT_MANAGER = "android.permission.ACCOUNT_MANAGER";
field public static final java.lang.String ADD_VOICEMAIL = "com.android.voicemail.permission.ADD_VOICEMAIL";
- field public static final java.lang.String ALLOCATE_AGGRESSIVE = "android.permission.ALLOCATE_AGGRESSIVE";
field public static final java.lang.String ANSWER_PHONE_CALLS = "android.permission.ANSWER_PHONE_CALLS";
field public static final java.lang.String BATTERY_STATS = "android.permission.BATTERY_STATS";
field public static final java.lang.String BIND_ACCESSIBILITY_SERVICE = "android.permission.BIND_ACCESSIBILITY_SERVICE";
field public static final java.lang.String BIND_APPWIDGET = "android.permission.BIND_APPWIDGET";
- field public static final java.lang.String BIND_AUTOFILL = "android.permission.BIND_AUTOFILL";
- field public static final java.lang.String BIND_AUTO_FILL = "android.permission.BIND_AUTO_FILL";
+ field public static final java.lang.String BIND_AUTOFILL_SERVICE = "android.permission.BIND_AUTOFILL_SERVICE";
field public static final deprecated java.lang.String BIND_CARRIER_MESSAGING_SERVICE = "android.permission.BIND_CARRIER_MESSAGING_SERVICE";
field public static final java.lang.String BIND_CARRIER_SERVICES = "android.permission.BIND_CARRIER_SERVICES";
field public static final java.lang.String BIND_CHOOSER_TARGET_SERVICE = "android.permission.BIND_CHOOSER_TARGET_SERVICE";
@@ -117,12 +115,12 @@
field public static final java.lang.String RECEIVE_WAP_PUSH = "android.permission.RECEIVE_WAP_PUSH";
field public static final java.lang.String RECORD_AUDIO = "android.permission.RECORD_AUDIO";
field public static final java.lang.String REORDER_TASKS = "android.permission.REORDER_TASKS";
+ field public static final java.lang.String REQUEST_COMPANION_RUN_IN_BACKGROUND = "android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND";
+ field public static final java.lang.String REQUEST_COMPANION_USE_DATA_IN_BACKGROUND = "android.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND";
field public static final java.lang.String REQUEST_DELETE_PACKAGES = "android.permission.REQUEST_DELETE_PACKAGES";
field public static final java.lang.String REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
field public static final java.lang.String REQUEST_INSTALL_PACKAGES = "android.permission.REQUEST_INSTALL_PACKAGES";
field public static final deprecated java.lang.String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES";
- field public static final java.lang.String RESTRICTED_VR_ACCESS = "android.permission.RESTRICTED_VR_ACCESS";
- field public static final java.lang.String RUN_IN_BACKGROUND = "android.permission.RUN_IN_BACKGROUND";
field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";
field public static final java.lang.String SEND_SMS = "android.permission.SEND_SMS";
field public static final java.lang.String SET_ALARM = "com.android.alarm.permission.SET_ALARM";
@@ -141,7 +139,6 @@
field public static final java.lang.String TRANSMIT_IR = "android.permission.TRANSMIT_IR";
field public static final java.lang.String UNINSTALL_SHORTCUT = "com.android.launcher.permission.UNINSTALL_SHORTCUT";
field public static final java.lang.String UPDATE_DEVICE_STATS = "android.permission.UPDATE_DEVICE_STATS";
- field public static final java.lang.String USE_DATA_IN_BACKGROUND = "android.permission.USE_DATA_IN_BACKGROUND";
field public static final java.lang.String USE_FINGERPRINT = "android.permission.USE_FINGERPRINT";
field public static final java.lang.String USE_SIP = "android.permission.USE_SIP";
field public static final java.lang.String VIBRATE = "android.permission.VIBRATE";
@@ -314,6 +311,7 @@
field public static final int autoUrlDetect = 16843404; // 0x101028c
field public static final int autoVerify = 16844014; // 0x10104ee
field public static final int autofillHints = 16844121; // 0x1010559
+ field public static final int autofilledHighlight = 16844139; // 0x101056b
field public static final int background = 16842964; // 0x10100d4
field public static final int backgroundDimAmount = 16842802; // 0x1010032
field public static final int backgroundDimEnabled = 16843295; // 0x101021f
@@ -358,12 +356,12 @@
field public static final int calendarTextColor = 16843931; // 0x101049b
field public static final int calendarViewShown = 16843596; // 0x101034c
field public static final int calendarViewStyle = 16843613; // 0x101035d
- field public static final int canCaptureFingerprintGestures = 16844111; // 0x101054f
field public static final int canControlMagnification = 16844039; // 0x1010507
field public static final int canPerformGestures = 16844045; // 0x101050d
field public static final int canRecord = 16844060; // 0x101051c
- field public static final int canRequestEnhancedWebAccessibility = 16843736; // 0x10103d8
+ field public static final deprecated int canRequestEnhancedWebAccessibility = 16843736; // 0x10103d8
field public static final int canRequestFilterKeyEvents = 16843737; // 0x10103d9
+ field public static final int canRequestFingerprintGestures = 16844111; // 0x101054f
field public static final int canRequestTouchExplorationMode = 16843735; // 0x10103d7
field public static final int canRetrieveWindowContent = 16843653; // 0x1010385
field public static final int candidatesTextStyleSpans = 16843312; // 0x1010230
@@ -994,7 +992,7 @@
field public static final int persistableMode = 16843821; // 0x101042d
field public static final int persistent = 16842765; // 0x101000d
field public static final int persistentDrawingCache = 16842990; // 0x10100ee
- field public static final int persistentFeature = 16844134; // 0x1010566
+ field public static final int persistentWhenFeatureAvailable = 16844134; // 0x1010566
field public static final deprecated int phoneNumber = 16843111; // 0x1010167
field public static final int pivotX = 16843189; // 0x10101b5
field public static final int pivotY = 16843190; // 0x10101b6
@@ -1298,7 +1296,7 @@
field public static final int targetId = 16843740; // 0x10103dc
field public static final int targetName = 16843853; // 0x101044d
field public static final int targetPackage = 16842785; // 0x1010021
- field public static final int targetProcess = 16844097; // 0x1010541
+ field public static final int targetProcesses = 16844097; // 0x1010541
field public static final int targetSandboxVersion = 16844110; // 0x101054e
field public static final int targetSdkVersion = 16843376; // 0x1010270
field public static final int taskAffinity = 16842770; // 0x1010012
@@ -1613,7 +1611,6 @@
field public static final int alert_light_frame = 17301505; // 0x1080001
field public static final int arrow_down_float = 17301506; // 0x1080002
field public static final int arrow_up_float = 17301507; // 0x1080003
- field public static final int autofilled_highlight = 17301684; // 0x10800b4
field public static final int bottom_bar = 17301658; // 0x108009a
field public static final int btn_default = 17301508; // 0x1080004
field public static final int btn_default_small = 17301509; // 0x1080005
@@ -1711,7 +1708,6 @@
field public static final int ic_notification_clear_all = 17301594; // 0x108005a
field public static final int ic_notification_overlay = 17301595; // 0x108005b
field public static final int ic_partial_secure = 17301596; // 0x108005c
- field public static final int ic_picture_in_picture = 17301685; // 0x10800b5
field public static final int ic_popup_disk_full = 17301597; // 0x108005d
field public static final int ic_popup_reminder = 17301598; // 0x108005e
field public static final int ic_popup_sync = 17301599; // 0x108005f
@@ -2832,13 +2828,13 @@
method public android.content.pm.ResolveInfo getResolveInfo();
method public java.lang.String getSettingsActivityName();
method public java.lang.String loadDescription(android.content.pm.PackageManager);
- method public java.lang.String loadSummary(android.content.pm.PackageManager);
+ method public java.lang.CharSequence loadSummary(android.content.pm.PackageManager);
method public void writeToParcel(android.os.Parcel, int);
- field public static final int CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES = 64; // 0x40
field public static final int CAPABILITY_CAN_CONTROL_MAGNIFICATION = 16; // 0x10
field public static final int CAPABILITY_CAN_PERFORM_GESTURES = 32; // 0x20
- field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+ field public static final deprecated int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
field public static final int CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS = 8; // 0x8
+ field public static final int CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES = 64; // 0x40
field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
field public static final android.os.Parcelable.Creator<android.accessibilityservice.AccessibilityServiceInfo> CREATOR;
@@ -2850,13 +2846,13 @@
field public static final int FEEDBACK_HAPTIC = 2; // 0x2
field public static final int FEEDBACK_SPOKEN = 1; // 0x1
field public static final int FEEDBACK_VISUAL = 8; // 0x8
- field public static final int FLAG_CAPTURE_FINGERPRINT_GESTURES = 512; // 0x200
field public static final int FLAG_ENABLE_ACCESSIBILITY_VOLUME = 128; // 0x80
field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
field public static final int FLAG_REQUEST_ACCESSIBILITY_BUTTON = 256; // 0x100
- field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+ field public static final deprecated int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+ field public static final int FLAG_REQUEST_FINGERPRINT_GESTURES = 512; // 0x200
field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
field public static final int FLAG_RETRIEVE_INTERACTIVE_WINDOWS = 64; // 0x40
field public int eventTypes;
@@ -2878,7 +2874,7 @@
public static abstract class FingerprintGestureController.FingerprintGestureCallback {
ctor public FingerprintGestureController.FingerprintGestureCallback();
- method public void onGesture(int);
+ method public void onGestureDetected(int);
method public void onGestureDetectionAvailabilityChanged(boolean);
}
@@ -2897,14 +2893,12 @@
public static class GestureDescription.StrokeDescription {
ctor public GestureDescription.StrokeDescription(android.graphics.Path, long, long);
- ctor public GestureDescription.StrokeDescription(android.graphics.Path, long, long, int, boolean);
- method public int getContinuedStrokeId();
+ ctor public GestureDescription.StrokeDescription(android.graphics.Path, long, long, boolean);
+ method public android.accessibilityservice.GestureDescription.StrokeDescription continueStroke(android.graphics.Path, long, long, boolean);
method public long getDuration();
- method public int getId();
method public android.graphics.Path getPath();
method public long getStartTime();
- method public boolean isContinued();
- field public static final int INVALID_STROKE_ID = -1; // 0xffffffff
+ method public boolean willContinue();
}
}
@@ -3036,8 +3030,8 @@
field public static final java.lang.String KEY_PASSWORD = "password";
field public static final java.lang.String KEY_USERDATA = "userdata";
field public static final deprecated java.lang.String LOGIN_ACCOUNTS_CHANGED_ACTION = "android.accounts.LOGIN_ACCOUNTS_CHANGED";
- field public static final java.lang.String PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE = "android.accounts.key_legacy_not_visible";
- field public static final java.lang.String PACKAGE_NAME_KEY_LEGACY_VISIBLE = "android.accounts.key_legacy_visible";
+ field public static final java.lang.String PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE = "android:accounts:key_legacy_not_visible";
+ field public static final java.lang.String PACKAGE_NAME_KEY_LEGACY_VISIBLE = "android:accounts:key_legacy_visible";
field public static final int VISIBILITY_NOT_VISIBLE = 3; // 0x3
field public static final int VISIBILITY_UNDEFINED = 0; // 0x0
field public static final int VISIBILITY_USER_MANAGED_NOT_VISIBLE = 4; // 0x4
@@ -3584,8 +3578,9 @@
method public boolean dispatchTouchEvent(android.view.MotionEvent);
method public boolean dispatchTrackballEvent(android.view.MotionEvent);
method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- method public void enterPictureInPictureMode();
- method public boolean enterPictureInPictureMode(android.app.PictureInPictureArgs);
+ method public deprecated void enterPictureInPictureMode();
+ method public deprecated boolean enterPictureInPictureMode(android.app.PictureInPictureArgs);
+ method public boolean enterPictureInPictureMode(android.app.PictureInPictureParams);
method public <T extends android.view.View> T findViewById(int);
method public void finish();
method public void finishActivity(int);
@@ -3609,6 +3604,7 @@
method public android.view.LayoutInflater getLayoutInflater();
method public android.app.LoaderManager getLoaderManager();
method public java.lang.String getLocalClassName();
+ method public int getMaxNumPictureInPictureActions();
method public final android.media.session.MediaController getMediaController();
method public android.view.MenuInflater getMenuInflater();
method public final android.app.Activity getParent();
@@ -3635,7 +3631,6 @@
method public boolean isInMultiWindowMode();
method public boolean isInPictureInPictureMode();
method public boolean isLocalVoiceInteractionSupported();
- method public boolean isOverlayWithDecorCaptionEnabled();
method public boolean isTaskRoot();
method public boolean isVoiceInteraction();
method public boolean isVoiceInteractionRoot();
@@ -3682,7 +3677,6 @@
method public void onLowMemory();
method public boolean onMenuItemSelected(int, android.view.MenuItem);
method public boolean onMenuOpened(int, android.view.Menu);
- method public void onMovedToDisplay(int, android.content.res.Configuration);
method public void onMultiWindowModeChanged(boolean, android.content.res.Configuration);
method public deprecated void onMultiWindowModeChanged(boolean);
method public boolean onNavigateUp();
@@ -3760,8 +3754,8 @@
method public void setImmersive(boolean);
method public void setIntent(android.content.Intent);
method public final void setMediaController(android.media.session.MediaController);
- method public void setOverlayWithDecorCaptionEnabled(boolean);
method public void setPictureInPictureArgs(android.app.PictureInPictureArgs);
+ method public void setPictureInPictureParams(android.app.PictureInPictureParams);
method public final deprecated void setProgress(int);
method public final deprecated void setProgressBarIndeterminate(boolean);
method public final deprecated void setProgressBarIndeterminateVisibility(boolean);
@@ -3840,7 +3834,7 @@
method public int getLauncherLargeIconDensity();
method public int getLauncherLargeIconSize();
method public int getLockTaskModeState();
- method public static int getMaxNumPictureInPictureActions();
+ method public static deprecated int getMaxNumPictureInPictureActions();
method public int getMemoryClass();
method public void getMemoryInfo(android.app.ActivityManager.MemoryInfo);
method public static void getMyMemoryState(android.app.ActivityManager.RunningAppProcessInfo);
@@ -3944,7 +3938,7 @@
field public static final int IMPORTANCE_FOREGROUND_SERVICE = 125; // 0x7d
field public static final int IMPORTANCE_GONE = 1000; // 0x3e8
field public static final int IMPORTANCE_PERCEPTIBLE = 230; // 0xe6
- field public static final deprecated int IMPORTANCE_PERCEPTIBLE_DEPRECATED = 130; // 0x82
+ field public static final int IMPORTANCE_PERCEPTIBLE_PRE_26 = 130; // 0x82
field public static final int IMPORTANCE_SERVICE = 300; // 0x12c
field public static final int IMPORTANCE_TOP_SLEEPING = 150; // 0x96
field public static final int IMPORTANCE_VISIBLE = 200; // 0xc8
@@ -4031,6 +4025,7 @@
method public static android.app.ActivityOptions makeTaskLaunchBehind();
method public static android.app.ActivityOptions makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
method public void requestUsageTimeReport(android.app.PendingIntent);
+ method public android.app.ActivityOptions setAppVerificationBundle(android.os.Bundle);
method public android.app.ActivityOptions setLaunchBounds(android.graphics.Rect);
method public android.app.ActivityOptions setLaunchDisplayId(int);
method public android.os.Bundle toBundle();
@@ -4818,6 +4813,7 @@
method public void onFragmentDetached(android.app.FragmentManager, android.app.Fragment);
method public void onFragmentPaused(android.app.FragmentManager, android.app.Fragment);
method public void onFragmentPreAttached(android.app.FragmentManager, android.app.Fragment, android.content.Context);
+ method public void onFragmentPreCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
method public void onFragmentResumed(android.app.FragmentManager, android.app.Fragment);
method public void onFragmentSaveInstanceState(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
method public void onFragmentStarted(android.app.FragmentManager, android.app.Fragment);
@@ -4850,11 +4846,10 @@
method public abstract android.app.FragmentTransaction hide(android.app.Fragment);
method public abstract boolean isAddToBackStackAllowed();
method public abstract boolean isEmpty();
- method public abstract android.app.FragmentTransaction postOnCommit(java.lang.Runnable);
method public abstract android.app.FragmentTransaction remove(android.app.Fragment);
method public abstract android.app.FragmentTransaction replace(int, android.app.Fragment);
method public abstract android.app.FragmentTransaction replace(int, android.app.Fragment, java.lang.String);
- method public abstract android.app.FragmentTransaction setAllowOptimization(boolean);
+ method public abstract android.app.FragmentTransaction runOnCommit(java.lang.Runnable);
method public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(int);
method public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
method public abstract android.app.FragmentTransaction setBreadCrumbTitle(int);
@@ -4862,6 +4857,7 @@
method public abstract android.app.FragmentTransaction setCustomAnimations(int, int);
method public abstract android.app.FragmentTransaction setCustomAnimations(int, int, int, int);
method public abstract android.app.FragmentTransaction setPrimaryNavigationFragment(android.app.Fragment);
+ method public abstract android.app.FragmentTransaction setReorderingAllowed(boolean);
method public abstract android.app.FragmentTransaction setTransition(int);
method public abstract android.app.FragmentTransaction setTransitionStyle(int);
method public abstract android.app.FragmentTransaction show(android.app.Fragment);
@@ -4955,7 +4951,7 @@
method public final android.app.Activity getLastActivity();
method public final android.app.Instrumentation.ActivityResult getResult();
method public final boolean isBlocking();
- method public android.app.Instrumentation.ActivityResult onMatchIntent(android.content.Intent);
+ method public android.app.Instrumentation.ActivityResult onStartActivity(android.content.Intent);
method public final android.app.Activity waitForActivity();
method public final android.app.Activity waitForActivityWithTimeout(long);
}
@@ -4975,7 +4971,7 @@
public class KeyguardManager {
method public android.content.Intent createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence);
- method public void dismissKeyguard(android.app.Activity, android.app.KeyguardManager.KeyguardDismissCallback, android.os.Handler);
+ method public deprecated void dismissKeyguard(android.app.Activity, android.app.KeyguardManager.KeyguardDismissCallback, android.os.Handler);
method public deprecated void exitKeyguardSecurely(android.app.KeyguardManager.OnKeyguardExitResult);
method public boolean inKeyguardRestrictedInputMode();
method public boolean isDeviceLocked();
@@ -4983,6 +4979,7 @@
method public boolean isKeyguardLocked();
method public boolean isKeyguardSecure();
method public deprecated android.app.KeyguardManager.KeyguardLock newKeyguardLock(java.lang.String);
+ method public void requestDismissKeyguard(android.app.Activity, android.app.KeyguardManager.KeyguardDismissCallback);
}
public static abstract class KeyguardManager.KeyguardDismissCallback {
@@ -5124,13 +5121,16 @@
method public int describeContents();
method public int getBadgeIconType();
method public java.lang.String getChannel();
+ method public java.lang.String getChannelId();
method public java.lang.String getGroup();
+ method public int getGroupAlertBehavior();
method public android.graphics.drawable.Icon getLargeIcon();
method public java.lang.CharSequence getSettingsText();
method public java.lang.String getShortcutId();
method public android.graphics.drawable.Icon getSmallIcon();
method public java.lang.String getSortKey();
method public long getTimeout();
+ method public long getTimeoutAfter();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.media.AudioAttributes AUDIO_ATTRIBUTES_DEFAULT;
field public static final int BADGE_ICON_LARGE = 2; // 0x2
@@ -5200,6 +5200,9 @@
field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
field public static final deprecated int FLAG_SHOW_LIGHTS = 1; // 0x1
+ field public static final int GROUP_ALERT_ALL = 0; // 0x0
+ field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+ field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
field public static final java.lang.String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
field public static final deprecated int PRIORITY_DEFAULT = 0; // 0x0
field public static final deprecated int PRIORITY_HIGH = 1; // 0x1
@@ -5330,6 +5333,7 @@
method public android.app.Notification.Builder setBadgeIconType(int);
method public android.app.Notification.Builder setCategory(java.lang.String);
method public android.app.Notification.Builder setChannel(java.lang.String);
+ method public android.app.Notification.Builder setChannelId(java.lang.String);
method public android.app.Notification.Builder setChronometerCountDown(boolean);
method public android.app.Notification.Builder setColor(int);
method public android.app.Notification.Builder setColorized(boolean);
@@ -5346,6 +5350,7 @@
method public android.app.Notification.Builder setExtras(android.os.Bundle);
method public android.app.Notification.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
method public android.app.Notification.Builder setGroup(java.lang.String);
+ method public android.app.Notification.Builder setGroupAlertBehavior(int);
method public android.app.Notification.Builder setGroupSummary(boolean);
method public android.app.Notification.Builder setLargeIcon(android.graphics.Bitmap);
method public android.app.Notification.Builder setLargeIcon(android.graphics.drawable.Icon);
@@ -5373,6 +5378,7 @@
method public android.app.Notification.Builder setTicker(java.lang.CharSequence);
method public deprecated android.app.Notification.Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
method public android.app.Notification.Builder setTimeout(long);
+ method public android.app.Notification.Builder setTimeoutAfter(long);
method public android.app.Notification.Builder setUsesChronometer(boolean);
method public deprecated android.app.Notification.Builder setVibrate(long[]);
method public android.app.Notification.Builder setVisibility(int);
@@ -5534,7 +5540,6 @@
public final class NotificationChannel implements android.os.Parcelable {
ctor public NotificationChannel(java.lang.String, java.lang.CharSequence, int);
- ctor protected NotificationChannel(android.os.Parcel);
method public boolean canBypassDnd();
method public boolean canShowBadge();
method public int describeContents();
@@ -5569,7 +5574,6 @@
public final class NotificationChannelGroup implements android.os.Parcelable {
ctor public NotificationChannelGroup(java.lang.String, java.lang.CharSequence);
- ctor protected NotificationChannelGroup(android.os.Parcel);
method public android.app.NotificationChannelGroup clone();
method public int describeContents();
method public java.util.List<android.app.NotificationChannel> getChannels();
@@ -5692,16 +5696,29 @@
method public abstract void onSendFinished(android.app.PendingIntent, android.content.Intent, int, java.lang.String, android.os.Bundle);
}
- public final class PictureInPictureArgs implements android.os.Parcelable {
- ctor public PictureInPictureArgs();
- ctor public PictureInPictureArgs(float, java.util.List<android.app.RemoteAction>);
- method public android.app.PictureInPictureArgs clone();
+ public final deprecated class PictureInPictureArgs extends android.app.PictureInPictureParams {
+ ctor public deprecated PictureInPictureArgs();
+ ctor public deprecated PictureInPictureArgs(float, java.util.List<android.app.RemoteAction>);
+ method public deprecated void setActions(java.util.List<android.app.RemoteAction>);
+ method public deprecated void setAspectRatio(float);
+ method public deprecated void setSourceRectHint(android.graphics.Rect);
+ }
+
+ public class PictureInPictureParams implements android.os.Parcelable {
method public int describeContents();
- method public void setActions(java.util.List<android.app.RemoteAction>);
- method public void setAspectRatio(float);
- method public void setSourceRectHint(android.graphics.Rect);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.app.PictureInPictureArgs> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.PictureInPictureParams> CREATOR;
+ field protected android.util.Rational mAspectRatio;
+ field protected android.graphics.Rect mSourceRectHint;
+ field protected java.util.List<android.app.RemoteAction> mUserActions;
+ }
+
+ public static class PictureInPictureParams.Builder {
+ ctor public PictureInPictureParams.Builder();
+ method public android.app.PictureInPictureParams build();
+ method public android.app.PictureInPictureParams.Builder setActions(java.util.List<android.app.RemoteAction>);
+ method public android.app.PictureInPictureParams.Builder setAspectRatio(android.util.Rational);
+ method public android.app.PictureInPictureParams.Builder setSourceRectHint(android.graphics.Rect);
}
public class Presentation extends android.app.Dialog {
@@ -6093,17 +6110,6 @@
method public void onDetached();
}
- public final class WallpaperColors implements android.os.Parcelable {
- ctor public WallpaperColors(android.os.Parcel);
- ctor public WallpaperColors(java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>>);
- ctor public WallpaperColors(java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>>, boolean);
- method public int describeContents();
- method public java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>> getColors();
- method public boolean supportsDarkText();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.app.WallpaperColors> CREATOR;
- }
-
public final class WallpaperInfo implements android.os.Parcelable {
ctor public WallpaperInfo(android.content.Context, android.content.pm.ResolveInfo) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public int describeContents();
@@ -6126,8 +6132,6 @@
}
public class WallpaperManager {
- method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener);
- method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener, android.os.Handler);
method public void clear() throws java.io.IOException;
method public void clear(int) throws java.io.IOException;
method public void clearWallpaperOffsets(android.os.IBinder);
@@ -6142,7 +6146,6 @@
method public android.graphics.drawable.Drawable getDrawable();
method public android.graphics.drawable.Drawable getFastDrawable();
method public static android.app.WallpaperManager getInstance(android.content.Context);
- method public android.app.WallpaperColors getWallpaperColors(int);
method public android.os.ParcelFileDescriptor getWallpaperFile(int);
method public int getWallpaperId(int);
method public android.app.WallpaperInfo getWallpaperInfo();
@@ -6151,7 +6154,6 @@
method public boolean isWallpaperSupported();
method public android.graphics.drawable.Drawable peekDrawable();
method public android.graphics.drawable.Drawable peekFastDrawable();
- method public void removeOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener);
method public void sendWallpaperCommand(android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle);
method public void setBitmap(android.graphics.Bitmap) throws java.io.IOException;
method public int setBitmap(android.graphics.Bitmap, android.graphics.Rect, boolean) throws java.io.IOException;
@@ -6176,16 +6178,12 @@
field public static final java.lang.String WALLPAPER_PREVIEW_META_DATA = "android.wallpaper.preview";
}
- public static abstract interface WallpaperManager.OnColorsChangedListener {
- method public abstract void onColorsChanged(android.app.WallpaperColors, int);
- }
-
}
package android.app.admin {
public final class ConnectEvent extends android.app.admin.NetworkEvent implements android.os.Parcelable {
- method public java.lang.String getIpAddress();
+ method public java.net.InetAddress getInetAddress();
method public int getPort();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.admin.ConnectEvent> CREATOR;
@@ -6287,7 +6285,7 @@
method public int enableSystemApp(android.content.ComponentName, android.content.Intent);
method public java.lang.String[] getAccountTypesWithManagementDisabled();
method public java.util.List<android.content.ComponentName> getActiveAdmins();
- method public java.util.List<java.lang.String> getAffiliationIds(android.content.ComponentName);
+ method public java.util.Set<java.lang.String> getAffiliationIds(android.content.ComponentName);
method public java.lang.String getAlwaysOnVpnPackage(android.content.ComponentName);
method public android.os.Bundle getApplicationRestrictions(android.content.ComponentName, java.lang.String);
method public deprecated java.lang.String getApplicationRestrictionsManagingPackage(android.content.ComponentName);
@@ -6328,6 +6326,7 @@
method public int getPermissionGrantState(android.content.ComponentName, java.lang.String, java.lang.String);
method public int getPermissionPolicy(android.content.ComponentName);
method public java.util.List<java.lang.String> getPermittedAccessibilityServices(android.content.ComponentName);
+ method public java.util.List<java.lang.String> getPermittedCrossProfileNotificationListeners(android.content.ComponentName);
method public java.util.List<java.lang.String> getPermittedInputMethods(android.content.ComponentName);
method public long getRequiredStrongAuthTimeout(android.content.ComponentName);
method public boolean getScreenCaptureDisabled(android.content.ComponentName);
@@ -6373,7 +6372,7 @@
method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrievePreRebootSecurityLogs(android.content.ComponentName);
method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrieveSecurityLogs(android.content.ComponentName);
method public void setAccountManagementDisabled(android.content.ComponentName, java.lang.String, boolean);
- method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>);
+ method public void setAffiliationIds(android.content.ComponentName, java.util.Set<java.lang.String>);
method public void setAlwaysOnVpnPackage(android.content.ComponentName, java.lang.String, boolean) throws android.content.pm.PackageManager.NameNotFoundException, java.lang.UnsupportedOperationException;
method public boolean setApplicationHidden(android.content.ComponentName, java.lang.String, boolean);
method public void setApplicationRestrictions(android.content.ComponentName, java.lang.String, android.os.Bundle);
@@ -6412,6 +6411,7 @@
method public boolean setPermissionGrantState(android.content.ComponentName, java.lang.String, java.lang.String, int);
method public void setPermissionPolicy(android.content.ComponentName, int);
method public boolean setPermittedAccessibilityServices(android.content.ComponentName, java.util.List<java.lang.String>);
+ method public boolean setPermittedCrossProfileNotificationListeners(android.content.ComponentName, java.util.List<java.lang.String>);
method public boolean setPermittedInputMethods(android.content.ComponentName, java.util.List<java.lang.String>);
method public void setProfileEnabled(android.content.ComponentName);
method public void setProfileName(android.content.ComponentName, java.lang.String);
@@ -6490,7 +6490,7 @@
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PROXY_PORT = "android.app.extra.PROVISIONING_WIFI_PROXY_PORT";
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SECURITY_TYPE = "android.app.extra.PROVISIONING_WIFI_SECURITY_TYPE";
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SSID = "android.app.extra.PROVISIONING_WIFI_SSID";
- field public static final int FLAG_EVICT_CE_KEY = 1; // 0x1
+ field public static final int FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY = 1; // 0x1
field public static final int FLAG_MANAGED_CAN_ACCESS_PARENT = 2; // 0x2
field public static final int FLAG_PARENT_CAN_ACCESS_MANAGED = 1; // 0x1
field public static final int KEYGUARD_DISABLE_FEATURES_ALL = 2147483647; // 0x7fffffff
@@ -6528,8 +6528,8 @@
public final class DnsEvent extends android.app.admin.NetworkEvent implements android.os.Parcelable {
method public java.lang.String getHostname();
- method public java.lang.String[] getIpAddresses();
- method public int getIpAddressesCount();
+ method public java.util.List<java.net.InetAddress> getInetAddresses();
+ method public int getTotalResolvedAddressCount();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.admin.DnsEvent> CREATOR;
}
@@ -6700,7 +6700,6 @@
public abstract class BackupAgent extends android.content.ContextWrapper {
ctor public BackupAgent();
method public final void fullBackupFile(java.io.File, android.app.backup.FullBackupDataOutput);
- method public long getBackupQuota();
method public abstract void onBackup(android.os.ParcelFileDescriptor, android.app.backup.BackupDataOutput, android.os.ParcelFileDescriptor) throws java.io.IOException;
method public void onCreate();
method public void onDestroy();
@@ -6735,6 +6734,7 @@
}
public class BackupDataOutput {
+ method public long getQuota();
method public int writeEntityData(byte[], int) throws java.io.IOException;
method public int writeEntityHeader(java.lang.String, int) throws java.io.IOException;
}
@@ -6763,6 +6763,7 @@
}
public class FullBackupDataOutput {
+ method public long getQuota();
}
public abstract class RestoreObserver {
@@ -6988,8 +6989,8 @@
public final class StorageStats implements android.os.Parcelable {
method public int describeContents();
+ method public long getAppBytes();
method public long getCacheBytes();
- method public long getCodeBytes();
method public long getDataBytes();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.usage.StorageStats> CREATOR;
@@ -7597,6 +7598,7 @@
method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback);
method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int);
method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int, int);
+ method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int, int, android.os.Handler);
method public boolean createBond();
method public android.bluetooth.BluetoothSocket createInsecureRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException;
method public android.bluetooth.BluetoothSocket createRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException;
@@ -8021,7 +8023,7 @@
method public void setAdvertisingData(android.bluetooth.le.AdvertiseData);
method public void setAdvertisingParameters(android.bluetooth.le.AdvertisingSetParameters);
method public void setPeriodicAdvertisingData(android.bluetooth.le.AdvertiseData);
- method public void setPeriodicAdvertisingEnable(boolean);
+ method public void setPeriodicAdvertisingEnabled(boolean);
method public void setPeriodicAdvertisingParameters(android.bluetooth.le.PeriodicAdvertisingParameters);
method public void setScanResponseData(android.bluetooth.le.AdvertiseData);
}
@@ -8196,8 +8198,10 @@
field public static final android.os.Parcelable.Creator<android.bluetooth.le.ScanResult> CREATOR;
field public static final int DATA_COMPLETE = 0; // 0x0
field public static final int DATA_TRUNCATED = 2; // 0x2
+ field public static final int PERIODIC_INTERVAL_NOT_PRESENT = 0; // 0x0
field public static final int PHY_UNUSED = 0; // 0x0
field public static final int SID_NOT_PRESENT = 255; // 0xff
+ field public static final int TX_POWER_NOT_PRESENT = 127; // 0x7f
}
public final class ScanSettings implements android.os.Parcelable {
@@ -8268,21 +8272,21 @@
method public android.companion.BluetoothDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
}
- public final class BluetoothLEDeviceFilter implements android.companion.DeviceFilter {
+ public final class BluetoothLeDeviceFilter implements android.companion.DeviceFilter {
method public int describeContents();
method public static int getRenamePrefixLengthLimit();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.companion.BluetoothLEDeviceFilter> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.companion.BluetoothLeDeviceFilter> CREATOR;
}
- public static final class BluetoothLEDeviceFilter.Builder {
- ctor public BluetoothLEDeviceFilter.Builder();
- method public android.companion.BluetoothLEDeviceFilter build();
- method public android.companion.BluetoothLEDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
- method public android.companion.BluetoothLEDeviceFilter.Builder setRawDataFilter(byte[], byte[]);
- method public android.companion.BluetoothLEDeviceFilter.Builder setRenameFromBytes(java.lang.String, java.lang.String, int, int, boolean);
- method public android.companion.BluetoothLEDeviceFilter.Builder setRenameFromName(java.lang.String, java.lang.String, int, int);
- method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
+ public static final class BluetoothLeDeviceFilter.Builder {
+ ctor public BluetoothLeDeviceFilter.Builder();
+ method public android.companion.BluetoothLeDeviceFilter build();
+ method public android.companion.BluetoothLeDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
+ method public android.companion.BluetoothLeDeviceFilter.Builder setRawDataFilter(byte[], byte[]);
+ method public android.companion.BluetoothLeDeviceFilter.Builder setRenameFromBytes(java.lang.String, java.lang.String, int, int, java.nio.ByteOrder);
+ method public android.companion.BluetoothLeDeviceFilter.Builder setRenameFromName(java.lang.String, java.lang.String, int, int);
+ method public android.companion.BluetoothLeDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
}
public final class CompanionDeviceManager {
@@ -8418,7 +8422,7 @@
ctor public ClipData(android.content.ClipDescription, android.content.ClipData.Item);
ctor public ClipData(android.content.ClipData);
method public void addItem(android.content.ClipData.Item);
- method public void addItem(android.content.ClipData.Item, android.content.ContentResolver);
+ method public void addItem(android.content.ContentResolver, android.content.ClipData.Item);
method public int describeContents();
method public android.content.ClipDescription getDescription();
method public android.content.ClipData.Item getItemAt(int);
@@ -8716,17 +8720,17 @@
field public static final java.lang.String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
field public static final java.lang.String EXTRA_REFRESH_SUPPORTED = "android.content.extra.REFRESH_SUPPORTED";
field public static final java.lang.String EXTRA_SIZE = "android.content.extra.SIZE";
- field public static final java.lang.String EXTRA_TOTAL_SIZE = "android.content.extra.TOTAL_SIZE";
+ field public static final java.lang.String EXTRA_TOTAL_COUNT = "android.content.extra.TOTAL_COUNT";
field public static final int NOTIFY_SKIP_NOTIFY_FOR_DESCENDANTS = 2; // 0x2
field public static final int NOTIFY_SYNC_TO_NETWORK = 1; // 0x1
- field public static final java.lang.String QUERY_ARG_LIMIT = "android:query-page-limit";
- field public static final java.lang.String QUERY_ARG_OFFSET = "android:query-page-offset";
- field public static final java.lang.String QUERY_ARG_SORT_COLLATION = "android:query-sort-collation";
- field public static final java.lang.String QUERY_ARG_SORT_COLUMNS = "android:query-sort-columns";
- field public static final java.lang.String QUERY_ARG_SORT_DIRECTION = "android:query-sort-direction";
- field public static final java.lang.String QUERY_ARG_SQL_SELECTION = "android:query-sql-selection";
- field public static final java.lang.String QUERY_ARG_SQL_SELECTION_ARGS = "android:query-sql-selection-args";
- field public static final java.lang.String QUERY_ARG_SQL_SORT_ORDER = "android:query-sql-sort-order";
+ field public static final java.lang.String QUERY_ARG_LIMIT = "android:query-arg-limit";
+ field public static final java.lang.String QUERY_ARG_OFFSET = "android:query-arg-offset";
+ field public static final java.lang.String QUERY_ARG_SORT_COLLATION = "android:query-arg-sort-collation";
+ field public static final java.lang.String QUERY_ARG_SORT_COLUMNS = "android:query-arg-sort-columns";
+ field public static final java.lang.String QUERY_ARG_SORT_DIRECTION = "android:query-arg-sort-direction";
+ field public static final java.lang.String QUERY_ARG_SQL_SELECTION = "android:query-arg-sql-selection";
+ field public static final java.lang.String QUERY_ARG_SQL_SELECTION_ARGS = "android:query-arg-sql-selection-args";
+ field public static final java.lang.String QUERY_ARG_SQL_SORT_ORDER = "android:query-arg-sql-sort-order";
field public static final int QUERY_SORT_DIRECTION_ASCENDING = 0; // 0x0
field public static final int QUERY_SORT_DIRECTION_DESCENDING = 1; // 0x1
field public static final java.lang.String SCHEME_ANDROID_RESOURCE = "android.resource";
@@ -8934,7 +8938,7 @@
field public static final java.lang.String CAPTIONING_SERVICE = "captioning";
field public static final java.lang.String CARRIER_CONFIG_SERVICE = "carrier_config";
field public static final java.lang.String CLIPBOARD_SERVICE = "clipboard";
- field public static final java.lang.String COMPANION_DEVICE_SERVICE = "companion_device";
+ field public static final java.lang.String COMPANION_DEVICE_SERVICE = "companiondevice";
field public static final java.lang.String CONNECTIVITY_SERVICE = "connectivity";
field public static final java.lang.String CONSUMER_IR_SERVICE = "consumer_ir";
field public static final int CONTEXT_IGNORE_SECURITY = 2; // 0x2
@@ -8948,7 +8952,6 @@
field public static final java.lang.String HARDWARE_PROPERTIES_SERVICE = "hardware_properties";
field public static final java.lang.String INPUT_METHOD_SERVICE = "input_method";
field public static final java.lang.String INPUT_SERVICE = "input";
- field public static final java.lang.String IPSEC_SERVICE = "ipsec";
field public static final java.lang.String JOB_SCHEDULER_SERVICE = "jobscheduler";
field public static final java.lang.String KEYGUARD_SERVICE = "keyguard";
field public static final java.lang.String LAUNCHER_APPS_SERVICE = "launcherapps";
@@ -9325,15 +9328,12 @@
field public static final java.lang.String ACTION_CAMERA_BUTTON = "android.intent.action.CAMERA_BUTTON";
field public static final java.lang.String ACTION_CARRIER_SETUP = "android.intent.action.CARRIER_SETUP";
field public static final java.lang.String ACTION_CHOOSER = "android.intent.action.CHOOSER";
- field public static final java.lang.String ACTION_CLEAR_PACKAGE = "android.intent.action.CLEAR_PACKAGE";
field public static final java.lang.String ACTION_CLOSE_SYSTEM_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS";
field public static final java.lang.String ACTION_CONFIGURATION_CHANGED = "android.intent.action.CONFIGURATION_CHANGED";
field public static final java.lang.String ACTION_CREATE_DOCUMENT = "android.intent.action.CREATE_DOCUMENT";
field public static final java.lang.String ACTION_CREATE_SHORTCUT = "android.intent.action.CREATE_SHORTCUT";
field public static final java.lang.String ACTION_DATE_CHANGED = "android.intent.action.DATE_CHANGED";
field public static final java.lang.String ACTION_DEFAULT = "android.intent.action.VIEW";
- field public static final java.lang.String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED = "android.intent.action.ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED";
- field public static final java.lang.String ACTION_DEFAULT_SUBSCRIPTION_CHANGED = "android.intent.action.ACTION_DEFAULT_SUBSCRIPTION_CHANGED";
field public static final java.lang.String ACTION_DELETE = "android.intent.action.DELETE";
field public static final deprecated java.lang.String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
field public static final deprecated java.lang.String ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK";
@@ -9491,6 +9491,7 @@
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_COMPONENT_NAME = "android.intent.extra.COMPONENT_NAME";
field public static final java.lang.String EXTRA_CONTENT_ANNOTATIONS = "android.intent.extra.CONTENT_ANNOTATIONS";
field public static final java.lang.String EXTRA_DATA_REMOVED = "android.intent.extra.DATA_REMOVED";
field public static final java.lang.String EXTRA_DOCK_STATE = "android.intent.extra.DOCK_STATE";
@@ -9536,7 +9537,6 @@
field public static final java.lang.String EXTRA_SHUTDOWN_USERSPACE_ONLY = "android.intent.extra.SHUTDOWN_USERSPACE_ONLY";
field public static final java.lang.String EXTRA_STREAM = "android.intent.extra.STREAM";
field public static final java.lang.String EXTRA_SUBJECT = "android.intent.extra.SUBJECT";
- field public static final java.lang.String EXTRA_SUBSCRIPTION_INDEX = "android.intent.extra.SUBSCRIPTION_INDEX";
field public static final java.lang.String EXTRA_TEMPLATE = "android.intent.extra.TEMPLATE";
field public static final java.lang.String EXTRA_TEXT = "android.intent.extra.TEXT";
field public static final java.lang.String EXTRA_TITLE = "android.intent.extra.TITLE";
@@ -10314,7 +10314,7 @@
field public java.lang.String[] splitPublicSourceDirs;
field public java.lang.String[] splitSourceDirs;
field public java.lang.String targetPackage;
- field public java.lang.String targetProcess;
+ field public java.lang.String targetProcesses;
}
public class LabeledIntent extends android.content.Intent {
@@ -11034,7 +11034,7 @@
ctor public VersionedPackage(java.lang.String, int);
method public int describeContents();
method public java.lang.String getPackageName();
- method public long getVersionCode();
+ method public int getVersionCode();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.VersionedPackage> CREATOR;
}
@@ -13280,7 +13280,7 @@
method public void setFilterBitmap(boolean);
method public void setFlags(int);
method public void setFontFeatureSettings(java.lang.String);
- method public boolean setFontVariationSettings(java.lang.String) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
+ method public boolean setFontVariationSettings(java.lang.String);
method public void setHinting(int);
method public void setLetterSpacing(float);
method public void setLinearText(boolean);
@@ -13756,6 +13756,7 @@
method public void detachFromGLContext();
method public long getTimestamp();
method public void getTransformMatrix(float[]);
+ method public boolean isReleased();
method public void release();
method public void releaseTexImage();
method public void setDefaultBufferSize(int, int);
@@ -13779,7 +13780,6 @@
}
public class Typeface {
- method public static deprecated void create(android.graphics.fonts.FontRequest, android.graphics.Typeface.FontRequestCallback);
method public static android.graphics.Typeface create(java.lang.String, int);
method public static android.graphics.Typeface create(android.graphics.Typeface, int);
method public static android.graphics.Typeface createFromAsset(android.content.res.AssetManager, java.lang.String);
@@ -13807,24 +13807,13 @@
ctor public Typeface.Builder(android.content.res.AssetManager, java.lang.String);
method public android.graphics.Typeface build();
method public android.graphics.Typeface.Builder setFallback(java.lang.String);
- method public android.graphics.Typeface.Builder setFontVariationSettings(java.lang.String) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
+ method public android.graphics.Typeface.Builder setFontVariationSettings(java.lang.String);
method public android.graphics.Typeface.Builder setFontVariationSettings(android.graphics.fonts.FontVariationAxis[]);
method public android.graphics.Typeface.Builder setItalic(boolean);
method public android.graphics.Typeface.Builder setTtcIndex(int);
method public android.graphics.Typeface.Builder setWeight(int);
}
- public static abstract deprecated interface Typeface.FontRequestCallback {
- method public abstract void onTypefaceRequestFailed(int);
- method public abstract void onTypefaceRetrieved(android.graphics.Typeface);
- field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
- field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
- field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
- field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
- field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
- field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
- }
-
public class Xfermode {
ctor public Xfermode();
}
@@ -14401,30 +14390,14 @@
package android.graphics.fonts {
- public final class FontRequest implements android.os.Parcelable {
- ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String);
- ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String, java.util.List<java.util.List<byte[]>>);
- method public int describeContents();
- method public java.util.List<java.util.List<byte[]>> getCertificates();
- method public java.lang.String getProviderAuthority();
- method public java.lang.String getProviderPackage();
- method public java.lang.String getQuery();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.graphics.fonts.FontRequest> CREATOR;
- }
-
public final class FontVariationAxis {
- ctor public FontVariationAxis(java.lang.String, float) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
- method public static android.graphics.fonts.FontVariationAxis[] fromFontVariationSettings(java.lang.String) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
+ ctor public FontVariationAxis(java.lang.String, float);
+ method public static android.graphics.fonts.FontVariationAxis[] fromFontVariationSettings(java.lang.String);
method public float getStyleValue();
method public java.lang.String getTag();
method public static java.lang.String toFontVariationSettings(android.graphics.fonts.FontVariationAxis[]);
}
- public static class FontVariationAxis.InvalidFormatException extends java.lang.Exception {
- ctor public FontVariationAxis.InvalidFormatException(java.lang.String);
- }
-
}
package android.graphics.pdf {
@@ -14512,7 +14485,7 @@
method public final void takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback);
method public final void unlock();
field public static final java.lang.String ACTION_NEW_PICTURE = "android.hardware.action.NEW_PICTURE";
- field public static final deprecated java.lang.String ACTION_NEW_VIDEO = "android.hardware.action.NEW_VIDEO";
+ field public static final java.lang.String ACTION_NEW_VIDEO = "android.hardware.action.NEW_VIDEO";
field public static final int CAMERA_ERROR_EVICTED = 2; // 0x2
field public static final int CAMERA_ERROR_SERVER_DIED = 100; // 0x64
field public static final int CAMERA_ERROR_UNKNOWN = 1; // 0x1
@@ -14773,18 +14746,16 @@
field public static final int RGBX_8888 = 2; // 0x2
field public static final int RGB_565 = 4; // 0x4
field public static final int RGB_888 = 3; // 0x3
- field public static final long USAGE0_CPU_READ = 2L; // 0x2L
- field public static final long USAGE0_CPU_READ_OFTEN = 6L; // 0x6L
- field public static final long USAGE0_CPU_WRITE = 32L; // 0x20L
- field public static final long USAGE0_CPU_WRITE_OFTEN = 96L; // 0x60L
- field public static final long USAGE0_GPU_COLOR_OUTPUT = 2048L; // 0x800L
- field public static final long USAGE0_GPU_CUBEMAP = 8192L; // 0x2000L
- field public static final long USAGE0_GPU_DATA_BUFFER = 16384L; // 0x4000L
- field public static final long USAGE0_GPU_SAMPLED_IMAGE = 1024L; // 0x400L
- field public static final long USAGE0_GPU_STORAGE_IMAGE = 3072L; // 0xc00L
- field public static final long USAGE0_PROTECTED_CONTENT = 262144L; // 0x40000L
- field public static final long USAGE0_SENSOR_DIRECT_DATA = 536870912L; // 0x20000000L
- field public static final long USAGE0_VIDEO_ENCODE = 2097152L; // 0x200000L
+ field public static final long USAGE_CPU_READ_OFTEN = 3L; // 0x3L
+ field public static final long USAGE_CPU_READ_RARELY = 2L; // 0x2L
+ field public static final long USAGE_CPU_WRITE_OFTEN = 48L; // 0x30L
+ field public static final long USAGE_CPU_WRITE_RARELY = 32L; // 0x20L
+ field public static final long USAGE_GPU_COLOR_OUTPUT = 512L; // 0x200L
+ field public static final long USAGE_GPU_DATA_BUFFER = 16777216L; // 0x1000000L
+ field public static final long USAGE_GPU_SAMPLED_IMAGE = 256L; // 0x100L
+ field public static final long USAGE_PROTECTED_CONTENT = 16384L; // 0x4000L
+ field public static final long USAGE_SENSOR_DIRECT_DATA = 8388608L; // 0x800000L
+ field public static final long USAGE_VIDEO_ENCODE = 65536L; // 0x10000L
}
public final class Sensor {
@@ -19283,9 +19254,9 @@
method protected final void computeGregorianFields(int);
method protected int computeGregorianMonthStart(int, int);
method protected int computeJulianDay();
- method protected int computeMillisInDay();
+ method protected deprecated int computeMillisInDay();
method protected void computeTime();
- method protected int computeZoneOffset(long, int);
+ method protected deprecated int computeZoneOffset(long, int);
method public int fieldDifference(java.util.Date, int);
method protected java.lang.String fieldName(int);
method protected static final long floorDivide(long, long);
@@ -21027,6 +20998,7 @@
method public android.media.AudioFocusRequest.Builder setAcceptsDelayedFocusGain(boolean);
method public android.media.AudioFocusRequest.Builder setAudioAttributes(android.media.AudioAttributes);
method public android.media.AudioFocusRequest.Builder setFocusGain(int);
+ method public android.media.AudioFocusRequest.Builder setOnAudioFocusChangeListener(android.media.AudioManager.OnAudioFocusChangeListener);
method public android.media.AudioFocusRequest.Builder setOnAudioFocusChangeListener(android.media.AudioManager.OnAudioFocusChangeListener, android.os.Handler);
method public android.media.AudioFocusRequest.Builder setWillPauseWhenDucked(boolean);
}
@@ -23646,7 +23618,7 @@
public static final class VolumeShaper.Configuration implements android.os.Parcelable {
method public int describeContents();
- method public double getDurationMillis();
+ method public long getDuration();
method public int getInterpolatorType();
method public static int getMaximumCurvePoints();
method public float[] getTimes();
@@ -23672,7 +23644,7 @@
method public android.media.VolumeShaper.Configuration.Builder scaleToEndVolume(float);
method public android.media.VolumeShaper.Configuration.Builder scaleToStartVolume(float);
method public android.media.VolumeShaper.Configuration.Builder setCurve(float[], float[]);
- method public android.media.VolumeShaper.Configuration.Builder setDurationMillis(double);
+ method public android.media.VolumeShaper.Configuration.Builder setDuration(long);
method public android.media.VolumeShaper.Configuration.Builder setInterpolatorType(int);
}
@@ -24787,7 +24759,6 @@
}
public static final class TvContract.WatchNextPrograms implements android.media.tv.TvContract.BaseTvColumns {
- ctor public TvContract.WatchNextPrograms();
field public static final int ASPECT_RATIO_16_9 = 0; // 0x0
field public static final int ASPECT_RATIO_1_1 = 3; // 0x3
field public static final int ASPECT_RATIO_2_3 = 4; // 0x4
@@ -25417,8 +25388,8 @@
method public boolean requestBandwidthUpdate(android.net.Network);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
- method public void requestNetwork(android.net.NetworkRequest, int, android.net.ConnectivityManager.NetworkCallback);
- method public void requestNetwork(android.net.NetworkRequest, int, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
+ method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, int);
+ method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, android.os.Handler, int);
method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent);
method public deprecated void setNetworkPreference(int);
method public static deprecated boolean setProcessDefaultNetwork(android.net.Network);
@@ -25503,66 +25474,6 @@
field public static final android.os.Parcelable.Creator<android.net.IpPrefix> CREATOR;
}
- public final class IpSecAlgorithm implements android.os.Parcelable {
- ctor public IpSecAlgorithm(java.lang.String, byte[]);
- ctor public IpSecAlgorithm(java.lang.String, byte[], int);
- method public int describeContents();
- method public byte[] getKey();
- method public java.lang.String getName();
- method public int getTruncationLengthBits();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final java.lang.String AUTH_HMAC_MD5 = "hmac(md5)";
- field public static final java.lang.String AUTH_HMAC_SHA1 = "hmac(sha1)";
- field public static final java.lang.String AUTH_HMAC_SHA256 = "hmac(sha256)";
- field public static final java.lang.String AUTH_HMAC_SHA384 = "hmac(sha384)";
- field public static final java.lang.String AUTH_HMAC_SHA512 = "hmac(sha512)";
- field public static final android.os.Parcelable.Creator<android.net.IpSecAlgorithm> CREATOR;
- field public static final java.lang.String CRYPT_AES_CBC = "cbc(aes)";
- }
-
- public final class IpSecManager {
- method public void applyTransportModeTransform(java.io.FileDescriptor, android.net.IpSecTransform) throws java.io.IOException;
- method public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket(int) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
- method public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket() throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
- method public void removeTransportModeTransform(java.io.FileDescriptor, android.net.IpSecTransform) throws java.io.IOException;
- method public android.net.IpSecManager.SecurityParameterIndex reserveSecurityParameterIndex(int, java.net.InetAddress) throws android.net.IpSecManager.ResourceUnavailableException;
- method public android.net.IpSecManager.SecurityParameterIndex reserveSecurityParameterIndex(int, java.net.InetAddress, int) throws android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
- field public static final int INVALID_SECURITY_PARAMETER_INDEX = 0; // 0x0
- }
-
- public static final class IpSecManager.ResourceUnavailableException extends android.util.AndroidException {
- }
-
- public static final class IpSecManager.SecurityParameterIndex implements java.lang.AutoCloseable {
- method public void close();
- method public int getSpi();
- }
-
- public static final class IpSecManager.SpiUnavailableException extends android.util.AndroidException {
- method public int getSpi();
- }
-
- public static final class IpSecManager.UdpEncapsulationSocket implements java.lang.AutoCloseable {
- method public void close() throws java.io.IOException;
- method public int getPort();
- method public java.io.FileDescriptor getSocket();
- }
-
- public final class IpSecTransform implements java.lang.AutoCloseable {
- method public void close();
- field public static final int DIRECTION_IN = 0; // 0x0
- field public static final int DIRECTION_OUT = 1; // 0x1
- }
-
- public static class IpSecTransform.Builder {
- ctor public IpSecTransform.Builder(android.content.Context);
- method public android.net.IpSecTransform buildTransportModeTransform(java.net.InetAddress) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
- method public android.net.IpSecTransform.Builder setAuthentication(int, android.net.IpSecAlgorithm);
- method public android.net.IpSecTransform.Builder setEncryption(int, android.net.IpSecAlgorithm);
- method public android.net.IpSecTransform.Builder setIpv4Encapsulation(android.net.IpSecManager.UdpEncapsulationSocket, int);
- method public android.net.IpSecTransform.Builder setSpi(int, android.net.IpSecManager.SecurityParameterIndex);
- }
-
public class LinkAddress implements android.os.Parcelable {
method public int describeContents();
method public java.net.InetAddress getAddress();
@@ -26740,10 +26651,10 @@
field public static final android.os.Parcelable.Creator<android.net.wifi.aware.Characteristics> CREATOR;
}
- public class DiscoverySession {
+ public class DiscoverySession implements java.lang.AutoCloseable {
+ method public void close();
method public android.net.NetworkSpecifier createNetworkSpecifierOpen(android.net.wifi.aware.PeerHandle);
method public android.net.NetworkSpecifier createNetworkSpecifierPassphrase(android.net.wifi.aware.PeerHandle, java.lang.String);
- method public void destroy();
method public void sendMessage(android.net.wifi.aware.PeerHandle, int, byte[]);
}
@@ -26795,8 +26706,6 @@
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.aware.SubscribeConfig> CREATOR;
- field public static final int MATCH_STYLE_ALL = 1; // 0x1
- field public static final int MATCH_STYLE_FIRST_ONLY = 0; // 0x0
field public static final int SUBSCRIBE_TYPE_ACTIVE = 1; // 0x1
field public static final int SUBSCRIBE_TYPE_PASSIVE = 0; // 0x0
}
@@ -26805,7 +26714,6 @@
ctor public SubscribeConfig.Builder();
method public android.net.wifi.aware.SubscribeConfig build();
method public android.net.wifi.aware.SubscribeConfig.Builder setMatchFilter(java.util.List<byte[]>);
- method public android.net.wifi.aware.SubscribeConfig.Builder setMatchStyle(int);
method public android.net.wifi.aware.SubscribeConfig.Builder setServiceName(java.lang.String);
method public android.net.wifi.aware.SubscribeConfig.Builder setServiceSpecificInfo(byte[]);
method public android.net.wifi.aware.SubscribeConfig.Builder setSubscribeType(int);
@@ -26827,10 +26735,10 @@
field public static final int WIFI_AWARE_DATA_PATH_ROLE_RESPONDER = 1; // 0x1
}
- public class WifiAwareSession {
+ public class WifiAwareSession implements java.lang.AutoCloseable {
+ method public void close();
method public android.net.NetworkSpecifier createNetworkSpecifierOpen(int, byte[]);
method public android.net.NetworkSpecifier createNetworkSpecifierPassphrase(int, byte[], java.lang.String);
- method public void destroy();
method public void publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler);
method public void subscribe(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler);
}
@@ -30760,7 +30668,6 @@
method public android.util.SizeF getSizeF(java.lang.String);
method public <T extends android.os.Parcelable> android.util.SparseArray<T> getSparseParcelableArray(java.lang.String);
method public java.util.ArrayList<java.lang.String> getStringArrayList(java.lang.String);
- method public java.util.UUID getUuid(java.lang.String);
method public boolean hasFileDescriptors();
method public void putAll(android.os.Bundle);
method public void putBinder(java.lang.String, android.os.IBinder);
@@ -30785,7 +30692,6 @@
method public void putSizeF(java.lang.String, android.util.SizeF);
method public void putSparseParcelableArray(java.lang.String, android.util.SparseArray<? extends android.os.Parcelable>);
method public void putStringArrayList(java.lang.String, java.util.ArrayList<java.lang.String>);
- method public void putUuid(java.lang.String, java.util.UUID);
method public void readFromParcel(android.os.Parcel);
method public void setClassLoader(java.lang.ClassLoader);
method public void writeToParcel(android.os.Parcel, int);
@@ -31315,7 +31221,6 @@
method public final <T> void readTypedArray(T[], android.os.Parcelable.Creator<T>);
method public final <T> void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>);
method public final <T> T readTypedObject(android.os.Parcelable.Creator<T>);
- method public final java.util.UUID readUuid();
method public final java.lang.Object readValue(java.lang.ClassLoader);
method public final void recycle();
method public final void setDataCapacity(int);
@@ -31361,7 +31266,6 @@
method public final <T extends android.os.Parcelable> void writeTypedArray(T[], int);
method public final <T extends android.os.Parcelable> void writeTypedList(java.util.List<T>);
method public final <T extends android.os.Parcelable> void writeTypedObject(T, int);
- method public final void writeUuid(java.util.UUID);
method public final void writeValue(java.lang.Object);
field public static final android.os.Parcelable.Creator<java.lang.String> STRING_CREATOR;
}
@@ -31764,6 +31668,7 @@
field public static final java.lang.String DISALLOW_APPS_CONTROL = "no_control_apps";
field public static final java.lang.String DISALLOW_AUTOFILL = "no_autofill";
field public static final java.lang.String DISALLOW_BLUETOOTH = "no_bluetooth";
+ field public static final java.lang.String DISALLOW_BLUETOOTH_SHARING = "no_bluetooth_sharing";
field public static final java.lang.String DISALLOW_CONFIG_BLUETOOTH = "no_config_bluetooth";
field public static final java.lang.String DISALLOW_CONFIG_CELL_BROADCASTS = "no_config_cell_broadcasts";
field public static final java.lang.String DISALLOW_CONFIG_CREDENTIALS = "no_config_credentials";
@@ -31992,9 +31897,9 @@
}
public class StorageManager {
- method public void allocateBytes(java.util.UUID, long, int) throws java.io.IOException;
- method public void allocateBytes(java.io.FileDescriptor, long, int) throws java.io.IOException;
- method public long getAllocatableBytes(java.util.UUID, int) throws java.io.IOException;
+ method public void allocateBytes(java.util.UUID, long) throws java.io.IOException;
+ method public void allocateBytes(java.io.FileDescriptor, long) throws java.io.IOException;
+ method public long getAllocatableBytes(java.util.UUID) throws java.io.IOException;
method public long getCacheQuotaBytes(java.util.UUID) throws java.io.IOException;
method public long getCacheSizeBytes(java.util.UUID) throws java.io.IOException;
method public java.lang.String getMountedObbPath(java.lang.String);
@@ -32007,7 +31912,6 @@
method public boolean isEncrypted(java.io.File);
method public boolean isObbMounted(java.lang.String);
method public boolean mountObb(java.lang.String, java.lang.String, android.os.storage.OnObbStateChangeListener);
- method public android.os.ParcelFileDescriptor openProxyFileDescriptor(int, android.os.ProxyFileDescriptorCallback) throws java.io.IOException;
method public android.os.ParcelFileDescriptor openProxyFileDescriptor(int, android.os.ProxyFileDescriptorCallback, android.os.Handler) throws java.io.IOException;
method public void setCacheBehaviorGroup(java.io.File, boolean) throws java.io.IOException;
method public void setCacheBehaviorTombstone(java.io.File, boolean) throws java.io.IOException;
@@ -32015,7 +31919,6 @@
field public static final java.lang.String ACTION_MANAGE_STORAGE = "android.os.storage.action.MANAGE_STORAGE";
field public static final java.lang.String EXTRA_REQUESTED_BYTES = "android.os.storage.extra.REQUESTED_BYTES";
field public static final java.lang.String EXTRA_UUID = "android.os.storage.extra.UUID";
- field public static final int FLAG_ALLOCATE_AGGRESSIVE = 1; // 0x1
field public static final java.util.UUID UUID_DEFAULT;
}
@@ -34496,11 +34399,19 @@
method public final int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
}
+ public final class FontRequest {
+ ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String);
+ ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String, java.util.List<java.util.List<byte[]>>);
+ method public java.util.List<java.util.List<byte[]>> getCertificates();
+ method public java.lang.String getProviderAuthority();
+ method public java.lang.String getProviderPackage();
+ method public java.lang.String getQuery();
+ }
+
public class FontsContract {
- method public static android.graphics.Typeface buildTypeface(android.content.Context, android.os.CancellationSignal, android.provider.FontsContract.FontInfo[], int, boolean, java.lang.String);
method public static android.graphics.Typeface buildTypeface(android.content.Context, android.os.CancellationSignal, android.provider.FontsContract.FontInfo[]);
- method public static android.provider.FontsContract.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal, android.graphics.fonts.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
- method public static void requestFont(android.content.Context, android.graphics.fonts.FontRequest, android.provider.FontsContract.FontRequestCallback, android.os.Handler);
+ method public static android.provider.FontsContract.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal, android.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static void requestFonts(android.content.Context, android.provider.FontRequest, android.os.Handler, android.os.CancellationSignal, android.provider.FontsContract.FontRequestCallback);
}
public static final class FontsContract.Columns implements android.provider.BaseColumns {
@@ -34945,6 +34856,7 @@
field public static final java.lang.String ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS";
field public static final java.lang.String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS";
field public static final java.lang.String ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
+ field public static final java.lang.String ACTION_REQUEST_SET_AUTOFILL_SERVICE = "android.settings.REQUEST_SET_AUTOFILL_SERVICE";
field public static final java.lang.String ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS";
field public static final java.lang.String ACTION_SECURITY_SETTINGS = "android.settings.SECURITY_SETTINGS";
field public static final java.lang.String ACTION_SETTINGS = "android.settings.SETTINGS";
@@ -37036,15 +36948,12 @@
public abstract class AutofillService extends android.app.Service {
ctor public AutofillService();
- method public final deprecated void disableSelf();
method public final android.service.autofill.FillEventHistory getFillEventHistory();
method public final android.os.IBinder onBind(android.content.Intent);
method public void onConnected();
method public void onDisconnected();
- method public void onFillRequest(android.service.autofill.FillRequest, android.os.CancellationSignal, android.service.autofill.FillCallback);
- method public abstract deprecated void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, int, android.os.CancellationSignal, android.service.autofill.FillCallback);
- method public void onSaveRequest(android.service.autofill.SaveRequest, android.service.autofill.SaveCallback);
- method public abstract deprecated void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.service.autofill.SaveCallback);
+ method public abstract void onFillRequest(android.service.autofill.FillRequest, android.os.CancellationSignal, android.service.autofill.FillCallback);
+ method public abstract void onSaveRequest(android.service.autofill.SaveRequest, android.service.autofill.SaveCallback);
field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutofillService";
field public static final java.lang.String SERVICE_META_DATA = "android.autofill";
}
@@ -37098,9 +37007,9 @@
public final class FillRequest implements android.os.Parcelable {
method public int describeContents();
method public android.os.Bundle getClientState();
+ method public java.util.ArrayList<android.service.autofill.FillContext> getFillContexts();
method public int getFlags();
method public int getId();
- method public android.app.assist.AssistStructure getStructure();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.FillRequest> CREATOR;
field public static final int FLAG_MANUAL_REQUEST = 1; // 0x1
@@ -37118,7 +37027,6 @@
method public android.service.autofill.FillResponse build();
method public android.service.autofill.FillResponse.Builder setAuthentication(android.view.autofill.AutofillId[], android.content.IntentSender, android.widget.RemoteViews);
method public android.service.autofill.FillResponse.Builder setClientState(android.os.Bundle);
- method public deprecated android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle);
method public android.service.autofill.FillResponse.Builder setIgnoredIds(android.view.autofill.AutofillId...);
method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo);
}
@@ -37133,6 +37041,8 @@
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.SaveInfo> CREATOR;
field public static final int FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE = 1; // 0x1
+ field public static final int NEGATIVE_BUTTON_STYLE_CANCEL = 0; // 0x0
+ field public static final int NEGATIVE_BUTTON_STYLE_REJECT = 1; // 0x1
field public static final int SAVE_DATA_TYPE_ADDRESS = 2; // 0x2
field public static final int SAVE_DATA_TYPE_CREDIT_CARD = 4; // 0x4
field public static final int SAVE_DATA_TYPE_EMAIL_ADDRESS = 16; // 0x10
@@ -37146,7 +37056,7 @@
method public android.service.autofill.SaveInfo build();
method public android.service.autofill.SaveInfo.Builder setDescription(java.lang.CharSequence);
method public android.service.autofill.SaveInfo.Builder setFlags(int);
- method public android.service.autofill.SaveInfo.Builder setNegativeAction(java.lang.CharSequence, android.content.IntentSender);
+ method public android.service.autofill.SaveInfo.Builder setNegativeAction(int, android.content.IntentSender);
method public android.service.autofill.SaveInfo.Builder setOptionalIds(android.view.autofill.AutofillId[]);
}
@@ -37560,7 +37470,6 @@
method public final void unlockAndRun(java.lang.Runnable);
field public static final java.lang.String ACTION_QS_TILE = "android.service.quicksettings.action.QS_TILE";
field public static final java.lang.String ACTION_QS_TILE_PREFERENCES = "android.service.quicksettings.action.QS_TILE_PREFERENCES";
- field public static final java.lang.String EXTRA_COMPONENT = "android.service.quicksettings.extra.COMPONENT";
field public static final java.lang.String META_DATA_ACTIVE_TILE = "android.service.quicksettings.ACTIVE_TILE";
}
@@ -37790,12 +37699,10 @@
method public int getDesiredMinimumHeight();
method public int getDesiredMinimumWidth();
method public android.view.SurfaceHolder getSurfaceHolder();
- method public void invalidateColors();
method public boolean isPreview();
method public boolean isVisible();
method public void onApplyWindowInsets(android.view.WindowInsets);
method public android.os.Bundle onCommand(java.lang.String, int, int, int, android.os.Bundle, boolean);
- method public android.app.WallpaperColors onComputeWallpaperColors();
method public void onCreate(android.view.SurfaceHolder);
method public void onDesiredSizeChanged(int, int);
method public void onDestroy();
@@ -39090,7 +38997,6 @@
}
public static final class Connection.RttModifyStatus {
- ctor public Connection.RttModifyStatus();
field public static final int SESSION_MODIFY_REQUEST_FAIL = 2; // 0x2
field public static final int SESSION_MODIFY_REQUEST_INVALID = 3; // 0x3
field public static final int SESSION_MODIFY_REQUEST_REJECTED_BY_REMOTE = 5; // 0x5
@@ -40164,8 +40070,11 @@
method public static int getDefaultVoiceSubscriptionId();
method public boolean isNetworkRoaming(int);
method public void removeOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener);
+ field public static final java.lang.String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED";
+ field public static final java.lang.String ACTION_DEFAULT_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED";
field public static final int DATA_ROAMING_DISABLE = 0; // 0x0
field public static final int DATA_ROAMING_ENABLE = 1; // 0x1
+ field public static final java.lang.String EXTRA_SUBSCRIPTION_INDEX = "android.telephony.extra.SUBSCRIPTION_INDEX";
field public static final int INVALID_SUBSCRIPTION_ID = -1; // 0xffffffff
}
@@ -40240,10 +40149,12 @@
method public void sendDialerSpecialCode(java.lang.String);
method public java.lang.String sendEnvelopeWithStatus(java.lang.String);
method public void sendUssdRequest(java.lang.String, android.telephony.TelephonyManager.UssdResponseCallback, android.os.Handler);
+ method public void sendVisualVoicemailSms(java.lang.String, int, java.lang.String, android.app.PendingIntent);
method public void setDataEnabled(boolean);
method public boolean setLine1NumberForDisplay(java.lang.String, java.lang.String);
method public boolean setOperatorBrandOverride(java.lang.String);
method public boolean setPreferredNetworkTypeToGlobal();
+ method public void setVisualVoicemailSmsFilterSettings(android.telephony.VisualVoicemailSmsFilterSettings);
method public boolean setVoiceMailNumber(java.lang.String, java.lang.String);
method public void setVoicemailRingtoneUri(android.telecom.PhoneAccountHandle, android.net.Uri);
method public void setVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle, boolean);
@@ -40334,8 +40245,6 @@
method public abstract void onSimRemoved(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telecom.PhoneAccountHandle);
method public abstract void onSmsReceived(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telephony.VisualVoicemailSms);
method public abstract void onStopped(android.telephony.VisualVoicemailService.VisualVoicemailTask);
- method public static final void sendVisualVoicemailSms(android.content.Context, android.telecom.PhoneAccountHandle, java.lang.String, short, java.lang.String, android.app.PendingIntent);
- method public static final void setSmsFilterSettings(android.content.Context, android.telecom.PhoneAccountHandle, android.telephony.VisualVoicemailSmsFilterSettings);
field public static final java.lang.String SERVICE_INTERFACE = "android.telephony.VisualVoicemailService";
}
@@ -45427,6 +45336,7 @@
method public android.view.animation.Animation getAnimation();
method public android.os.IBinder getApplicationWindowToken();
method public java.lang.String[] getAutofillHints();
+ method public final android.view.autofill.AutofillId getAutofillId();
method public int getAutofillType();
method public android.view.autofill.AutofillValue getAutofillValue();
method public android.graphics.drawable.Drawable getBackground();
@@ -45669,7 +45579,6 @@
method public boolean onKeyUp(int, android.view.KeyEvent);
method protected void onLayout(boolean, int, int, int, int);
method protected void onMeasure(int, int);
- method public void onMovedToDisplay(int, android.content.res.Configuration);
method protected void onOverScrolled(int, int, boolean, boolean);
method public void onPointerCaptureChange(boolean);
method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
@@ -45889,6 +45798,7 @@
field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA;
+ field public static final int AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 1; // 0x1
field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE = "creditCardExpirationDate";
field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY = "creditCardExpirationDay";
field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH = "creditCardExpirationMonth";
@@ -46549,6 +46459,7 @@
method public abstract int addChildCount(int);
method public abstract void asyncCommit();
method public abstract android.view.ViewStructure asyncNewChild(int);
+ method public abstract android.view.autofill.AutofillId getAutofillId();
method public abstract int getChildCount();
method public abstract android.os.Bundle getExtras();
method public abstract java.lang.CharSequence getHint();
@@ -46562,7 +46473,8 @@
method public abstract void setActivated(boolean);
method public abstract void setAlpha(float);
method public abstract void setAutofillHints(java.lang.String[]);
- method public abstract void setAutofillId(android.view.ViewStructure, int);
+ method public abstract void setAutofillId(android.view.autofill.AutofillId);
+ method public abstract void setAutofillId(android.view.autofill.AutofillId, int);
method public abstract void setAutofillOptions(java.lang.CharSequence[]);
method public abstract void setAutofillType(int);
method public abstract void setAutofillValue(android.view.autofill.AutofillValue);
@@ -46592,14 +46504,13 @@
method public abstract void setTextLines(int[], int[]);
method public abstract void setTextStyle(float, int, int, int);
method public abstract void setTransformation(android.graphics.Matrix);
- method public abstract deprecated void setUrl(java.lang.String);
method public abstract void setVisibility(int);
method public abstract void setWebDomain(java.lang.String);
}
public static abstract class ViewStructure.HtmlInfo {
ctor public ViewStructure.HtmlInfo();
- method public abstract java.util.ArrayList<android.util.Pair<java.lang.String, java.lang.String>> getAttributes();
+ method public abstract java.util.List<android.util.Pair<java.lang.String, java.lang.String>> getAttributes();
method public abstract java.lang.String getTag();
}
@@ -47157,7 +47068,9 @@
public final class AccessibilityManager {
method public boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener);
+ method public void addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener, android.os.Handler);
method public boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener);
+ method public void addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener, android.os.Handler);
method public deprecated java.util.List<android.content.pm.ServiceInfo> getAccessibilityServiceList();
method public java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int);
method public java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList();
@@ -47309,8 +47222,8 @@
field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
- field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_X = "android.view.accessibility.action.ARGUMENT_MOVE_WINDOW_X";
- field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_Y = "android.view.accessibility.action.ARGUMENT_MOVE_WINDOW_Y";
+ field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+ field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
field public static final java.lang.String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
field public static final java.lang.String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
@@ -47492,10 +47405,10 @@
method public android.view.accessibility.AccessibilityNodeInfo getRoot();
method public java.lang.CharSequence getTitle();
method public int getType();
- method public boolean inPictureInPicture();
method public boolean isAccessibilityFocused();
method public boolean isActive();
method public boolean isFocused();
+ method public boolean isInPictureInPictureMode();
method public static android.view.accessibility.AccessibilityWindowInfo obtain();
method public static android.view.accessibility.AccessibilityWindowInfo obtain(android.view.accessibility.AccessibilityWindowInfo);
method public void recycle();
@@ -47837,7 +47750,9 @@
public final class AutofillManager {
method public void cancel();
method public void commit();
- method public void disableOwnedAutofillServices();
+ method public void disableAutofillServices();
+ method public boolean hasEnabledAutofillServices();
+ method public boolean isAutofillSupported();
method public boolean isEnabled();
method public void notifyValueChanged(android.view.View);
method public void notifyValueChanged(android.view.View, int, android.view.autofill.AutofillValue);
@@ -47851,8 +47766,7 @@
method public void unregisterCallback(android.view.autofill.AutofillManager.AutofillCallback);
field public static final java.lang.String EXTRA_ASSIST_STRUCTURE = "android.view.autofill.extra.ASSIST_STRUCTURE";
field public static final java.lang.String EXTRA_AUTHENTICATION_RESULT = "android.view.autofill.extra.AUTHENTICATION_RESULT";
- field public static final java.lang.String EXTRA_DATA_EXTRAS = "android.view.autofill.extra.DATA_EXTRAS";
- field public static final deprecated int FLAG_MANUAL_REQUEST = 1; // 0x1
+ field public static final java.lang.String EXTRA_CLIENT_STATE = "android.view.autofill.extra.EXTRA_CLIENT_STATE";
}
public static abstract class AutofillManager.AutofillCallback {
@@ -48286,12 +48200,7 @@
package android.view.textclassifier {
- public final class TextClassificationManager {
- method public android.view.textclassifier.TextClassifier getTextClassifier();
- method public void setTextClassifier(android.view.textclassifier.TextClassifier);
- }
-
- public final class TextClassificationResult {
+ public final class TextClassification {
method public float getConfidenceScore(java.lang.String);
method public java.lang.String getEntity(int);
method public int getEntityCount();
@@ -48302,19 +48211,24 @@
method public java.lang.String getText();
}
- public static final class TextClassificationResult.Builder {
- ctor public TextClassificationResult.Builder();
- method public android.view.textclassifier.TextClassificationResult build();
- method public android.view.textclassifier.TextClassificationResult.Builder setEntityType(java.lang.String, float);
- method public android.view.textclassifier.TextClassificationResult.Builder setIcon(android.graphics.drawable.Drawable);
- method public android.view.textclassifier.TextClassificationResult.Builder setIntent(android.content.Intent);
- method public android.view.textclassifier.TextClassificationResult.Builder setLabel(java.lang.String);
- method public android.view.textclassifier.TextClassificationResult.Builder setOnClickListener(android.view.View.OnClickListener);
- method public android.view.textclassifier.TextClassificationResult.Builder setText(java.lang.String);
+ public static final class TextClassification.Builder {
+ ctor public TextClassification.Builder();
+ method public android.view.textclassifier.TextClassification build();
+ method public android.view.textclassifier.TextClassification.Builder setEntityType(java.lang.String, float);
+ method public android.view.textclassifier.TextClassification.Builder setIcon(android.graphics.drawable.Drawable);
+ method public android.view.textclassifier.TextClassification.Builder setIntent(android.content.Intent);
+ method public android.view.textclassifier.TextClassification.Builder setLabel(java.lang.String);
+ method public android.view.textclassifier.TextClassification.Builder setOnClickListener(android.view.View.OnClickListener);
+ method public android.view.textclassifier.TextClassification.Builder setText(java.lang.String);
+ }
+
+ public final class TextClassificationManager {
+ method public android.view.textclassifier.TextClassifier getTextClassifier();
+ method public void setTextClassifier(android.view.textclassifier.TextClassifier);
}
public abstract interface TextClassifier {
- method public abstract android.view.textclassifier.TextClassificationResult getTextClassificationResult(java.lang.CharSequence, int, int, android.os.LocaleList);
+ method public abstract android.view.textclassifier.TextClassification classifyText(java.lang.CharSequence, int, int, android.os.LocaleList);
method public abstract android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int, android.os.LocaleList);
field public static final android.view.textclassifier.TextClassifier NO_OP;
field public static final java.lang.String TYPE_ADDRESS = "address";
@@ -48993,7 +48907,6 @@
method public int getRendererRequestedPriority();
method public deprecated float getScale();
method public android.webkit.WebSettings getSettings();
- method public android.view.textclassifier.TextClassifier getTextClassifier();
method public java.lang.String getTitle();
method public java.lang.String getUrl();
method public android.webkit.WebChromeClient getWebChromeClient();
@@ -49040,7 +48953,6 @@
method public void setNetworkAvailable(boolean);
method public deprecated void setPictureListener(android.webkit.WebView.PictureListener);
method public void setRendererPriorityPolicy(int, boolean);
- method public void setTextClassifier(android.view.textclassifier.TextClassifier);
method public deprecated void setVerticalScrollbarOverlay(boolean);
method public void setWebChromeClient(android.webkit.WebChromeClient);
method public static void setWebContentsDebuggingEnabled(boolean);
@@ -51500,7 +51412,7 @@
method public void setExtractedText(android.view.inputmethod.ExtractedText);
method public void setFilters(android.text.InputFilter[]);
method public void setFontFeatureSettings(java.lang.String);
- method public boolean setFontVariationSettings(java.lang.String) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
+ method public boolean setFontVariationSettings(java.lang.String);
method protected boolean setFrame(int, int, int, int);
method public void setFreezesText(boolean);
method public void setGravity(int);
@@ -52185,15 +52097,15 @@
ctor public DexClassLoader(java.lang.String, java.lang.String, java.lang.String, java.lang.ClassLoader);
}
- public final class DexFile {
- ctor public DexFile(java.io.File) throws java.io.IOException;
- ctor public DexFile(java.lang.String) throws java.io.IOException;
+ public final deprecated class DexFile {
+ ctor public deprecated DexFile(java.io.File) throws java.io.IOException;
+ ctor public deprecated DexFile(java.lang.String) throws java.io.IOException;
method public void close() throws java.io.IOException;
method public java.util.Enumeration<java.lang.String> entries();
method public java.lang.String getName();
method public static boolean isDexOptNeeded(java.lang.String) throws java.io.FileNotFoundException, java.io.IOException;
method public java.lang.Class loadClass(java.lang.String, java.lang.ClassLoader);
- method public static dalvik.system.DexFile loadDex(java.lang.String, java.lang.String, int) throws java.io.IOException;
+ method public static deprecated dalvik.system.DexFile loadDex(java.lang.String, java.lang.String, int) throws java.io.IOException;
}
public final class InMemoryDexClassLoader extends dalvik.system.BaseDexClassLoader {
diff --git a/api/removed.txt b/api/removed.txt
index dc9c54e..779ff7c 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -1,7 +1,6 @@
package android.app {
public class Notification implements android.os.Parcelable {
- method public deprecated int getBadgeIcon();
method public deprecated void setLatestEventInfo(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
}
@@ -18,12 +17,18 @@
method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
method public deprecated java.lang.String getDeviceInitializerApp();
method public deprecated android.content.ComponentName getDeviceInitializerComponent();
+ method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>);
+ field public static final deprecated int FLAG_EVICT_CE_KEY = 1; // 0x1
}
}
package android.app.usage {
+ public final class StorageStats implements android.os.Parcelable {
+ method public deprecated long getCodeBytes();
+ }
+
public class StorageStatsManager {
method public deprecated long getFreeBytes(java.lang.String) throws java.io.IOException;
method public deprecated long getTotalBytes(java.lang.String) throws java.io.IOException;
@@ -38,6 +43,10 @@
package android.content {
+ public class ClipData implements android.os.Parcelable {
+ method public deprecated void addItem(android.content.ClipData.Item, android.content.ContentResolver);
+ }
+
public abstract class Context {
method public abstract android.content.SharedPreferences getSharedPreferences(java.io.File, int);
method public abstract java.io.File getSharedPreferencesPath(java.lang.String);
@@ -351,10 +360,6 @@
field public static final deprecated java.lang.String TIMESTAMP = "timestamp";
}
- public static final class FontsContract.Columns implements android.provider.BaseColumns {
- field public static final java.lang.String STYLE = "font_style";
- }
-
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
field public static final deprecated java.lang.String CONTACT_METADATA_SYNC = "contact_metadata_sync";
}
@@ -447,6 +452,14 @@
}
+package android.view.accessibility {
+
+ public final class AccessibilityWindowInfo implements android.os.Parcelable {
+ method public boolean inPictureInPicture();
+ }
+
+}
+
package android.webkit {
public class WebViewClient {
diff --git a/api/system-current.txt b/api/system-current.txt
index bb653fe..e5e0e0f 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -30,8 +30,7 @@
field public static final java.lang.String BATTERY_STATS = "android.permission.BATTERY_STATS";
field public static final java.lang.String BIND_ACCESSIBILITY_SERVICE = "android.permission.BIND_ACCESSIBILITY_SERVICE";
field public static final java.lang.String BIND_APPWIDGET = "android.permission.BIND_APPWIDGET";
- field public static final java.lang.String BIND_AUTOFILL = "android.permission.BIND_AUTOFILL";
- field public static final java.lang.String BIND_AUTO_FILL = "android.permission.BIND_AUTO_FILL";
+ field public static final java.lang.String BIND_AUTOFILL_SERVICE = "android.permission.BIND_AUTOFILL_SERVICE";
field public static final deprecated java.lang.String BIND_CARRIER_MESSAGING_SERVICE = "android.permission.BIND_CARRIER_MESSAGING_SERVICE";
field public static final java.lang.String BIND_CARRIER_SERVICES = "android.permission.BIND_CARRIER_SERVICES";
field public static final java.lang.String BIND_CHOOSER_TARGET_SERVICE = "android.permission.BIND_CHOOSER_TARGET_SERVICE";
@@ -212,6 +211,8 @@
field public static final java.lang.String REGISTER_SIM_SUBSCRIPTION = "android.permission.REGISTER_SIM_SUBSCRIPTION";
field public static final java.lang.String REMOVE_DRM_CERTIFICATES = "android.permission.REMOVE_DRM_CERTIFICATES";
field public static final java.lang.String REORDER_TASKS = "android.permission.REORDER_TASKS";
+ field public static final java.lang.String REQUEST_COMPANION_RUN_IN_BACKGROUND = "android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND";
+ field public static final java.lang.String REQUEST_COMPANION_USE_DATA_IN_BACKGROUND = "android.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND";
field public static final java.lang.String REQUEST_DELETE_PACKAGES = "android.permission.REQUEST_DELETE_PACKAGES";
field public static final java.lang.String REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
field public static final java.lang.String REQUEST_INSTALL_PACKAGES = "android.permission.REQUEST_INSTALL_PACKAGES";
@@ -219,7 +220,6 @@
field public static final java.lang.String RESTRICTED_VR_ACCESS = "android.permission.RESTRICTED_VR_ACCESS";
field public static final java.lang.String RETRIEVE_WINDOW_CONTENT = "android.permission.RETRIEVE_WINDOW_CONTENT";
field public static final java.lang.String REVOKE_RUNTIME_PERMISSIONS = "android.permission.REVOKE_RUNTIME_PERMISSIONS";
- field public static final java.lang.String RUN_IN_BACKGROUND = "android.permission.RUN_IN_BACKGROUND";
field public static final java.lang.String SCORE_NETWORKS = "android.permission.SCORE_NETWORKS";
field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";
field public static final java.lang.String SEND_SMS = "android.permission.SEND_SMS";
@@ -257,7 +257,6 @@
field public static final java.lang.String UPDATE_DEVICE_STATS = "android.permission.UPDATE_DEVICE_STATS";
field public static final java.lang.String UPDATE_LOCK = "android.permission.UPDATE_LOCK";
field public static final java.lang.String USER_ACTIVITY = "android.permission.USER_ACTIVITY";
- field public static final java.lang.String USE_DATA_IN_BACKGROUND = "android.permission.USE_DATA_IN_BACKGROUND";
field public static final java.lang.String USE_FINGERPRINT = "android.permission.USE_FINGERPRINT";
field public static final java.lang.String USE_SIP = "android.permission.USE_SIP";
field public static final java.lang.String VIBRATE = "android.permission.VIBRATE";
@@ -433,6 +432,7 @@
field public static final int autoUrlDetect = 16843404; // 0x101028c
field public static final int autoVerify = 16844014; // 0x10104ee
field public static final int autofillHints = 16844121; // 0x1010559
+ field public static final int autofilledHighlight = 16844139; // 0x101056b
field public static final int background = 16842964; // 0x10100d4
field public static final int backgroundDimAmount = 16842802; // 0x1010032
field public static final int backgroundDimEnabled = 16843295; // 0x101021f
@@ -477,12 +477,12 @@
field public static final int calendarTextColor = 16843931; // 0x101049b
field public static final int calendarViewShown = 16843596; // 0x101034c
field public static final int calendarViewStyle = 16843613; // 0x101035d
- field public static final int canCaptureFingerprintGestures = 16844111; // 0x101054f
field public static final int canControlMagnification = 16844039; // 0x1010507
field public static final int canPerformGestures = 16844045; // 0x101050d
field public static final int canRecord = 16844060; // 0x101051c
- field public static final int canRequestEnhancedWebAccessibility = 16843736; // 0x10103d8
+ field public static final deprecated int canRequestEnhancedWebAccessibility = 16843736; // 0x10103d8
field public static final int canRequestFilterKeyEvents = 16843737; // 0x10103d9
+ field public static final int canRequestFingerprintGestures = 16844111; // 0x101054f
field public static final int canRequestTouchExplorationMode = 16843735; // 0x10103d7
field public static final int canRetrieveWindowContent = 16843653; // 0x1010385
field public static final int candidatesTextStyleSpans = 16843312; // 0x1010230
@@ -1113,7 +1113,7 @@
field public static final int persistableMode = 16843821; // 0x101042d
field public static final int persistent = 16842765; // 0x101000d
field public static final int persistentDrawingCache = 16842990; // 0x10100ee
- field public static final int persistentFeature = 16844134; // 0x1010566
+ field public static final int persistentWhenFeatureAvailable = 16844134; // 0x1010566
field public static final deprecated int phoneNumber = 16843111; // 0x1010167
field public static final int pivotX = 16843189; // 0x10101b5
field public static final int pivotY = 16843190; // 0x10101b6
@@ -1423,7 +1423,7 @@
field public static final int targetId = 16843740; // 0x10103dc
field public static final int targetName = 16843853; // 0x101044d
field public static final int targetPackage = 16842785; // 0x1010021
- field public static final int targetProcess = 16844097; // 0x1010541
+ field public static final int targetProcesses = 16844097; // 0x1010541
field public static final int targetSandboxVersion = 16844110; // 0x101054e
field public static final int targetSdkVersion = 16843376; // 0x1010270
field public static final int taskAffinity = 16842770; // 0x1010012
@@ -1738,7 +1738,6 @@
field public static final int alert_light_frame = 17301505; // 0x1080001
field public static final int arrow_down_float = 17301506; // 0x1080002
field public static final int arrow_up_float = 17301507; // 0x1080003
- field public static final int autofilled_highlight = 17301684; // 0x10800b4
field public static final int bottom_bar = 17301658; // 0x108009a
field public static final int btn_default = 17301508; // 0x1080004
field public static final int btn_default_small = 17301509; // 0x1080005
@@ -1836,7 +1835,6 @@
field public static final int ic_notification_clear_all = 17301594; // 0x108005a
field public static final int ic_notification_overlay = 17301595; // 0x108005b
field public static final int ic_partial_secure = 17301596; // 0x108005c
- field public static final int ic_picture_in_picture = 17301685; // 0x10800b5
field public static final int ic_popup_disk_full = 17301597; // 0x108005d
field public static final int ic_popup_reminder = 17301598; // 0x108005e
field public static final int ic_popup_sync = 17301599; // 0x108005f
@@ -2960,13 +2958,13 @@
method public android.content.pm.ResolveInfo getResolveInfo();
method public java.lang.String getSettingsActivityName();
method public java.lang.String loadDescription(android.content.pm.PackageManager);
- method public java.lang.String loadSummary(android.content.pm.PackageManager);
+ method public java.lang.CharSequence loadSummary(android.content.pm.PackageManager);
method public void writeToParcel(android.os.Parcel, int);
- field public static final int CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES = 64; // 0x40
field public static final int CAPABILITY_CAN_CONTROL_MAGNIFICATION = 16; // 0x10
field public static final int CAPABILITY_CAN_PERFORM_GESTURES = 32; // 0x20
- field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+ field public static final deprecated int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
field public static final int CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS = 8; // 0x8
+ field public static final int CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES = 64; // 0x40
field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
field public static final android.os.Parcelable.Creator<android.accessibilityservice.AccessibilityServiceInfo> CREATOR;
@@ -2978,13 +2976,13 @@
field public static final int FEEDBACK_HAPTIC = 2; // 0x2
field public static final int FEEDBACK_SPOKEN = 1; // 0x1
field public static final int FEEDBACK_VISUAL = 8; // 0x8
- field public static final int FLAG_CAPTURE_FINGERPRINT_GESTURES = 512; // 0x200
field public static final int FLAG_ENABLE_ACCESSIBILITY_VOLUME = 128; // 0x80
field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
field public static final int FLAG_REQUEST_ACCESSIBILITY_BUTTON = 256; // 0x100
- field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+ field public static final deprecated int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+ field public static final int FLAG_REQUEST_FINGERPRINT_GESTURES = 512; // 0x200
field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
field public static final int FLAG_RETRIEVE_INTERACTIVE_WINDOWS = 64; // 0x40
field public int eventTypes;
@@ -3006,7 +3004,7 @@
public static abstract class FingerprintGestureController.FingerprintGestureCallback {
ctor public FingerprintGestureController.FingerprintGestureCallback();
- method public void onGesture(int);
+ method public void onGestureDetected(int);
method public void onGestureDetectionAvailabilityChanged(boolean);
}
@@ -3025,14 +3023,12 @@
public static class GestureDescription.StrokeDescription {
ctor public GestureDescription.StrokeDescription(android.graphics.Path, long, long);
- ctor public GestureDescription.StrokeDescription(android.graphics.Path, long, long, int, boolean);
- method public int getContinuedStrokeId();
+ ctor public GestureDescription.StrokeDescription(android.graphics.Path, long, long, boolean);
+ method public android.accessibilityservice.GestureDescription.StrokeDescription continueStroke(android.graphics.Path, long, long, boolean);
method public long getDuration();
- method public int getId();
method public android.graphics.Path getPath();
method public long getStartTime();
- method public boolean isContinued();
- field public static final int INVALID_STROKE_ID = -1; // 0xffffffff
+ method public boolean willContinue();
}
}
@@ -3165,8 +3161,8 @@
field public static final java.lang.String KEY_PASSWORD = "password";
field public static final java.lang.String KEY_USERDATA = "userdata";
field public static final deprecated java.lang.String LOGIN_ACCOUNTS_CHANGED_ACTION = "android.accounts.LOGIN_ACCOUNTS_CHANGED";
- field public static final java.lang.String PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE = "android.accounts.key_legacy_not_visible";
- field public static final java.lang.String PACKAGE_NAME_KEY_LEGACY_VISIBLE = "android.accounts.key_legacy_visible";
+ field public static final java.lang.String PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE = "android:accounts:key_legacy_not_visible";
+ field public static final java.lang.String PACKAGE_NAME_KEY_LEGACY_VISIBLE = "android:accounts:key_legacy_visible";
field public static final int VISIBILITY_NOT_VISIBLE = 3; // 0x3
field public static final int VISIBILITY_UNDEFINED = 0; // 0x0
field public static final int VISIBILITY_USER_MANAGED_NOT_VISIBLE = 4; // 0x4
@@ -3715,8 +3711,9 @@
method public boolean dispatchTouchEvent(android.view.MotionEvent);
method public boolean dispatchTrackballEvent(android.view.MotionEvent);
method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- method public void enterPictureInPictureMode();
- method public boolean enterPictureInPictureMode(android.app.PictureInPictureArgs);
+ method public deprecated void enterPictureInPictureMode();
+ method public deprecated boolean enterPictureInPictureMode(android.app.PictureInPictureArgs);
+ method public boolean enterPictureInPictureMode(android.app.PictureInPictureParams);
method public <T extends android.view.View> T findViewById(int);
method public void finish();
method public void finishActivity(int);
@@ -3740,6 +3737,7 @@
method public android.view.LayoutInflater getLayoutInflater();
method public android.app.LoaderManager getLoaderManager();
method public java.lang.String getLocalClassName();
+ method public int getMaxNumPictureInPictureActions();
method public final android.media.session.MediaController getMediaController();
method public android.view.MenuInflater getMenuInflater();
method public final android.app.Activity getParent();
@@ -3767,7 +3765,6 @@
method public boolean isInMultiWindowMode();
method public boolean isInPictureInPictureMode();
method public boolean isLocalVoiceInteractionSupported();
- method public boolean isOverlayWithDecorCaptionEnabled();
method public boolean isTaskRoot();
method public boolean isVoiceInteraction();
method public boolean isVoiceInteractionRoot();
@@ -3815,7 +3812,6 @@
method public void onLowMemory();
method public boolean onMenuItemSelected(int, android.view.MenuItem);
method public boolean onMenuOpened(int, android.view.Menu);
- method public void onMovedToDisplay(int, android.content.res.Configuration);
method public void onMultiWindowModeChanged(boolean, android.content.res.Configuration);
method public deprecated void onMultiWindowModeChanged(boolean);
method public boolean onNavigateUp();
@@ -3894,8 +3890,8 @@
method public void setImmersive(boolean);
method public void setIntent(android.content.Intent);
method public final void setMediaController(android.media.session.MediaController);
- method public void setOverlayWithDecorCaptionEnabled(boolean);
method public void setPictureInPictureArgs(android.app.PictureInPictureArgs);
+ method public void setPictureInPictureParams(android.app.PictureInPictureParams);
method public final deprecated void setProgress(int);
method public final deprecated void setProgressBarIndeterminate(boolean);
method public final deprecated void setProgressBarIndeterminateVisibility(boolean);
@@ -3981,7 +3977,7 @@
method public int getLauncherLargeIconDensity();
method public int getLauncherLargeIconSize();
method public int getLockTaskModeState();
- method public static int getMaxNumPictureInPictureActions();
+ method public static deprecated int getMaxNumPictureInPictureActions();
method public int getMemoryClass();
method public void getMemoryInfo(android.app.ActivityManager.MemoryInfo);
method public static void getMyMemoryState(android.app.ActivityManager.RunningAppProcessInfo);
@@ -4093,7 +4089,7 @@
field public static final int IMPORTANCE_FOREGROUND_SERVICE = 125; // 0x7d
field public static final int IMPORTANCE_GONE = 1000; // 0x3e8
field public static final int IMPORTANCE_PERCEPTIBLE = 230; // 0xe6
- field public static final deprecated int IMPORTANCE_PERCEPTIBLE_DEPRECATED = 130; // 0x82
+ field public static final int IMPORTANCE_PERCEPTIBLE_PRE_26 = 130; // 0x82
field public static final int IMPORTANCE_SERVICE = 300; // 0x12c
field public static final int IMPORTANCE_TOP_SLEEPING = 150; // 0x96
field public static final int IMPORTANCE_VISIBLE = 200; // 0xc8
@@ -4180,6 +4176,7 @@
method public static android.app.ActivityOptions makeTaskLaunchBehind();
method public static android.app.ActivityOptions makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
method public void requestUsageTimeReport(android.app.PendingIntent);
+ method public android.app.ActivityOptions setAppVerificationBundle(android.os.Bundle);
method public android.app.ActivityOptions setLaunchBounds(android.graphics.Rect);
method public android.app.ActivityOptions setLaunchDisplayId(int);
method public android.os.Bundle toBundle();
@@ -4986,6 +4983,7 @@
method public void onFragmentDetached(android.app.FragmentManager, android.app.Fragment);
method public void onFragmentPaused(android.app.FragmentManager, android.app.Fragment);
method public void onFragmentPreAttached(android.app.FragmentManager, android.app.Fragment, android.content.Context);
+ method public void onFragmentPreCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
method public void onFragmentResumed(android.app.FragmentManager, android.app.Fragment);
method public void onFragmentSaveInstanceState(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
method public void onFragmentStarted(android.app.FragmentManager, android.app.Fragment);
@@ -5018,11 +5016,10 @@
method public abstract android.app.FragmentTransaction hide(android.app.Fragment);
method public abstract boolean isAddToBackStackAllowed();
method public abstract boolean isEmpty();
- method public abstract android.app.FragmentTransaction postOnCommit(java.lang.Runnable);
method public abstract android.app.FragmentTransaction remove(android.app.Fragment);
method public abstract android.app.FragmentTransaction replace(int, android.app.Fragment);
method public abstract android.app.FragmentTransaction replace(int, android.app.Fragment, java.lang.String);
- method public abstract android.app.FragmentTransaction setAllowOptimization(boolean);
+ method public abstract android.app.FragmentTransaction runOnCommit(java.lang.Runnable);
method public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(int);
method public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
method public abstract android.app.FragmentTransaction setBreadCrumbTitle(int);
@@ -5030,6 +5027,7 @@
method public abstract android.app.FragmentTransaction setCustomAnimations(int, int);
method public abstract android.app.FragmentTransaction setCustomAnimations(int, int, int, int);
method public abstract android.app.FragmentTransaction setPrimaryNavigationFragment(android.app.Fragment);
+ method public abstract android.app.FragmentTransaction setReorderingAllowed(boolean);
method public abstract android.app.FragmentTransaction setTransition(int);
method public abstract android.app.FragmentTransaction setTransitionStyle(int);
method public abstract android.app.FragmentTransaction show(android.app.Fragment);
@@ -5135,7 +5133,7 @@
method public final android.app.Activity getLastActivity();
method public final android.app.Instrumentation.ActivityResult getResult();
method public final boolean isBlocking();
- method public android.app.Instrumentation.ActivityResult onMatchIntent(android.content.Intent);
+ method public android.app.Instrumentation.ActivityResult onStartActivity(android.content.Intent);
method public final android.app.Activity waitForActivity();
method public final android.app.Activity waitForActivityWithTimeout(long);
}
@@ -5155,7 +5153,7 @@
public class KeyguardManager {
method public android.content.Intent createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence);
- method public void dismissKeyguard(android.app.Activity, android.app.KeyguardManager.KeyguardDismissCallback, android.os.Handler);
+ method public deprecated void dismissKeyguard(android.app.Activity, android.app.KeyguardManager.KeyguardDismissCallback, android.os.Handler);
method public deprecated void exitKeyguardSecurely(android.app.KeyguardManager.OnKeyguardExitResult);
method public boolean inKeyguardRestrictedInputMode();
method public boolean isDeviceLocked();
@@ -5163,6 +5161,7 @@
method public boolean isKeyguardLocked();
method public boolean isKeyguardSecure();
method public deprecated android.app.KeyguardManager.KeyguardLock newKeyguardLock(java.lang.String);
+ method public void requestDismissKeyguard(android.app.Activity, android.app.KeyguardManager.KeyguardDismissCallback);
}
public static abstract class KeyguardManager.KeyguardDismissCallback {
@@ -5304,7 +5303,9 @@
method public int describeContents();
method public int getBadgeIconType();
method public java.lang.String getChannel();
+ method public java.lang.String getChannelId();
method public java.lang.String getGroup();
+ method public int getGroupAlertBehavior();
method public android.graphics.drawable.Icon getLargeIcon();
method public static java.lang.Class<? extends android.app.Notification.Style> getNotificationStyleClass(java.lang.String);
method public java.lang.CharSequence getSettingsText();
@@ -5312,6 +5313,7 @@
method public android.graphics.drawable.Icon getSmallIcon();
method public java.lang.String getSortKey();
method public long getTimeout();
+ method public long getTimeoutAfter();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.media.AudioAttributes AUDIO_ATTRIBUTES_DEFAULT;
field public static final int BADGE_ICON_LARGE = 2; // 0x2
@@ -5384,6 +5386,9 @@
field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
field public static final deprecated int FLAG_SHOW_LIGHTS = 1; // 0x1
+ field public static final int GROUP_ALERT_ALL = 0; // 0x0
+ field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+ field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
field public static final java.lang.String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
field public static final deprecated int PRIORITY_DEFAULT = 0; // 0x0
field public static final deprecated int PRIORITY_HIGH = 1; // 0x1
@@ -5514,6 +5519,7 @@
method public android.app.Notification.Builder setBadgeIconType(int);
method public android.app.Notification.Builder setCategory(java.lang.String);
method public android.app.Notification.Builder setChannel(java.lang.String);
+ method public android.app.Notification.Builder setChannelId(java.lang.String);
method public android.app.Notification.Builder setChronometerCountDown(boolean);
method public android.app.Notification.Builder setColor(int);
method public android.app.Notification.Builder setColorized(boolean);
@@ -5530,6 +5536,7 @@
method public android.app.Notification.Builder setExtras(android.os.Bundle);
method public android.app.Notification.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
method public android.app.Notification.Builder setGroup(java.lang.String);
+ method public android.app.Notification.Builder setGroupAlertBehavior(int);
method public android.app.Notification.Builder setGroupSummary(boolean);
method public android.app.Notification.Builder setLargeIcon(android.graphics.Bitmap);
method public android.app.Notification.Builder setLargeIcon(android.graphics.drawable.Icon);
@@ -5557,6 +5564,7 @@
method public android.app.Notification.Builder setTicker(java.lang.CharSequence);
method public deprecated android.app.Notification.Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
method public android.app.Notification.Builder setTimeout(long);
+ method public android.app.Notification.Builder setTimeoutAfter(long);
method public android.app.Notification.Builder setUsesChronometer(boolean);
method public deprecated android.app.Notification.Builder setVibrate(long[]);
method public android.app.Notification.Builder setVisibility(int);
@@ -5661,10 +5669,12 @@
ctor public Notification.TvExtender(android.app.Notification);
method public android.app.Notification.Builder extend(android.app.Notification.Builder);
method public java.lang.String getChannel();
+ method public java.lang.String getChannelId();
method public android.app.PendingIntent getContentIntent();
method public android.app.PendingIntent getDeleteIntent();
method public boolean isAvailableOnTv();
method public android.app.Notification.TvExtender setChannel(java.lang.String);
+ method public android.app.Notification.TvExtender setChannelId(java.lang.String);
method public android.app.Notification.TvExtender setContentIntent(android.app.PendingIntent);
method public android.app.Notification.TvExtender setDeleteIntent(android.app.PendingIntent);
}
@@ -5731,7 +5741,6 @@
public final class NotificationChannel implements android.os.Parcelable {
ctor public NotificationChannel(java.lang.String, java.lang.CharSequence, int);
- ctor protected NotificationChannel(android.os.Parcel);
method public boolean canBypassDnd();
method public boolean canShowBadge();
method public int describeContents();
@@ -5771,7 +5780,6 @@
public final class NotificationChannelGroup implements android.os.Parcelable {
ctor public NotificationChannelGroup(java.lang.String, java.lang.CharSequence);
- ctor protected NotificationChannelGroup(android.os.Parcel);
method public android.app.NotificationChannelGroup clone();
method public int describeContents();
method public java.util.List<android.app.NotificationChannel> getChannels();
@@ -5895,16 +5903,29 @@
method public abstract void onSendFinished(android.app.PendingIntent, android.content.Intent, int, java.lang.String, android.os.Bundle);
}
- public final class PictureInPictureArgs implements android.os.Parcelable {
- ctor public PictureInPictureArgs();
- ctor public PictureInPictureArgs(float, java.util.List<android.app.RemoteAction>);
- method public android.app.PictureInPictureArgs clone();
+ public final deprecated class PictureInPictureArgs extends android.app.PictureInPictureParams {
+ ctor public deprecated PictureInPictureArgs();
+ ctor public deprecated PictureInPictureArgs(float, java.util.List<android.app.RemoteAction>);
+ method public deprecated void setActions(java.util.List<android.app.RemoteAction>);
+ method public deprecated void setAspectRatio(float);
+ method public deprecated void setSourceRectHint(android.graphics.Rect);
+ }
+
+ public class PictureInPictureParams implements android.os.Parcelable {
method public int describeContents();
- method public void setActions(java.util.List<android.app.RemoteAction>);
- method public void setAspectRatio(float);
- method public void setSourceRectHint(android.graphics.Rect);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.app.PictureInPictureArgs> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.PictureInPictureParams> CREATOR;
+ field protected android.util.Rational mAspectRatio;
+ field protected android.graphics.Rect mSourceRectHint;
+ field protected java.util.List<android.app.RemoteAction> mUserActions;
+ }
+
+ public static class PictureInPictureParams.Builder {
+ ctor public PictureInPictureParams.Builder();
+ method public android.app.PictureInPictureParams build();
+ method public android.app.PictureInPictureParams.Builder setActions(java.util.List<android.app.RemoteAction>);
+ method public android.app.PictureInPictureParams.Builder setAspectRatio(android.util.Rational);
+ method public android.app.PictureInPictureParams.Builder setSourceRectHint(android.graphics.Rect);
}
public class Presentation extends android.app.Dialog {
@@ -6300,17 +6321,6 @@
method public void setPersistentVrModeEnabled(boolean);
}
- public final class WallpaperColors implements android.os.Parcelable {
- ctor public WallpaperColors(android.os.Parcel);
- ctor public WallpaperColors(java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>>);
- ctor public WallpaperColors(java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>>, boolean);
- method public int describeContents();
- method public java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>> getColors();
- method public boolean supportsDarkText();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.app.WallpaperColors> CREATOR;
- }
-
public final class WallpaperInfo implements android.os.Parcelable {
ctor public WallpaperInfo(android.content.Context, android.content.pm.ResolveInfo) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public int describeContents();
@@ -6333,8 +6343,6 @@
}
public class WallpaperManager {
- method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener);
- method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener, android.os.Handler);
method public void clear() throws java.io.IOException;
method public void clear(int) throws java.io.IOException;
method public void clearWallpaper();
@@ -6351,7 +6359,6 @@
method public android.graphics.drawable.Drawable getDrawable();
method public android.graphics.drawable.Drawable getFastDrawable();
method public static android.app.WallpaperManager getInstance(android.content.Context);
- method public android.app.WallpaperColors getWallpaperColors(int);
method public android.os.ParcelFileDescriptor getWallpaperFile(int);
method public int getWallpaperId(int);
method public android.app.WallpaperInfo getWallpaperInfo();
@@ -6360,7 +6367,6 @@
method public boolean isWallpaperSupported();
method public android.graphics.drawable.Drawable peekDrawable();
method public android.graphics.drawable.Drawable peekFastDrawable();
- method public void removeOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener);
method public void sendWallpaperCommand(android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle);
method public void setBitmap(android.graphics.Bitmap) throws java.io.IOException;
method public int setBitmap(android.graphics.Bitmap, android.graphics.Rect, boolean) throws java.io.IOException;
@@ -6388,16 +6394,12 @@
field public static final java.lang.String WALLPAPER_PREVIEW_META_DATA = "android.wallpaper.preview";
}
- public static abstract interface WallpaperManager.OnColorsChangedListener {
- method public abstract void onColorsChanged(android.app.WallpaperColors, int);
- }
-
}
package android.app.admin {
public final class ConnectEvent extends android.app.admin.NetworkEvent implements android.os.Parcelable {
- method public java.lang.String getIpAddress();
+ method public java.net.InetAddress getInetAddress();
method public int getPort();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.admin.ConnectEvent> CREATOR;
@@ -6499,7 +6501,7 @@
method public int enableSystemApp(android.content.ComponentName, android.content.Intent);
method public java.lang.String[] getAccountTypesWithManagementDisabled();
method public java.util.List<android.content.ComponentName> getActiveAdmins();
- method public java.util.List<java.lang.String> getAffiliationIds(android.content.ComponentName);
+ method public java.util.Set<java.lang.String> getAffiliationIds(android.content.ComponentName);
method public java.lang.String getAlwaysOnVpnPackage(android.content.ComponentName);
method public android.os.Bundle getApplicationRestrictions(android.content.ComponentName, java.lang.String);
method public deprecated java.lang.String getApplicationRestrictionsManagingPackage(android.content.ComponentName);
@@ -6547,6 +6549,7 @@
method public int getPermissionPolicy(android.content.ComponentName);
method public java.util.List<java.lang.String> getPermittedAccessibilityServices(android.content.ComponentName);
method public java.util.List<java.lang.String> getPermittedAccessibilityServices(int);
+ method public java.util.List<java.lang.String> getPermittedCrossProfileNotificationListeners(android.content.ComponentName);
method public java.util.List<java.lang.String> getPermittedInputMethods(android.content.ComponentName);
method public java.util.List<java.lang.String> getPermittedInputMethodsForCurrentUser();
method public android.content.ComponentName getProfileOwner() throws java.lang.IllegalArgumentException;
@@ -6603,7 +6606,7 @@
method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrieveSecurityLogs(android.content.ComponentName);
method public void setAccountManagementDisabled(android.content.ComponentName, java.lang.String, boolean);
method public deprecated boolean setActiveProfileOwner(android.content.ComponentName, java.lang.String) throws java.lang.IllegalArgumentException;
- method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>);
+ method public void setAffiliationIds(android.content.ComponentName, java.util.Set<java.lang.String>);
method public void setAlwaysOnVpnPackage(android.content.ComponentName, java.lang.String, boolean) throws android.content.pm.PackageManager.NameNotFoundException, java.lang.UnsupportedOperationException;
method public boolean setApplicationHidden(android.content.ComponentName, java.lang.String, boolean);
method public void setApplicationRestrictions(android.content.ComponentName, java.lang.String, android.os.Bundle);
@@ -6643,6 +6646,7 @@
method public boolean setPermissionGrantState(android.content.ComponentName, java.lang.String, java.lang.String, int);
method public void setPermissionPolicy(android.content.ComponentName, int);
method public boolean setPermittedAccessibilityServices(android.content.ComponentName, java.util.List<java.lang.String>);
+ method public boolean setPermittedCrossProfileNotificationListeners(android.content.ComponentName, java.util.List<java.lang.String>);
method public boolean setPermittedInputMethods(android.content.ComponentName, java.util.List<java.lang.String>);
method public void setProfileEnabled(android.content.ComponentName);
method public void setProfileName(android.content.ComponentName, java.lang.String);
@@ -6731,7 +6735,7 @@
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_PROXY_PORT = "android.app.extra.PROVISIONING_WIFI_PROXY_PORT";
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SECURITY_TYPE = "android.app.extra.PROVISIONING_WIFI_SECURITY_TYPE";
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SSID = "android.app.extra.PROVISIONING_WIFI_SSID";
- field public static final int FLAG_EVICT_CE_KEY = 1; // 0x1
+ field public static final int FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY = 1; // 0x1
field public static final int FLAG_MANAGED_CAN_ACCESS_PARENT = 2; // 0x2
field public static final int FLAG_PARENT_CAN_ACCESS_MANAGED = 1; // 0x1
field public static final int KEYGUARD_DISABLE_FEATURES_ALL = 2147483647; // 0x7fffffff
@@ -6774,8 +6778,8 @@
public final class DnsEvent extends android.app.admin.NetworkEvent implements android.os.Parcelable {
method public java.lang.String getHostname();
- method public java.lang.String[] getIpAddresses();
- method public int getIpAddressesCount();
+ method public java.util.List<java.net.InetAddress> getInetAddresses();
+ method public int getTotalResolvedAddressCount();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.admin.DnsEvent> CREATOR;
}
@@ -6946,7 +6950,6 @@
public abstract class BackupAgent extends android.content.ContextWrapper {
ctor public BackupAgent();
method public final void fullBackupFile(java.io.File, android.app.backup.FullBackupDataOutput);
- method public long getBackupQuota();
method public abstract void onBackup(android.os.ParcelFileDescriptor, android.app.backup.BackupDataOutput, android.os.ParcelFileDescriptor) throws java.io.IOException;
method public void onCreate();
method public void onDestroy();
@@ -6983,6 +6986,8 @@
public class BackupDataOutput {
ctor public BackupDataOutput(java.io.FileDescriptor);
+ ctor public BackupDataOutput(java.io.FileDescriptor, long);
+ method public long getQuota();
method public int writeEntityData(byte[], int) throws java.io.IOException;
method public int writeEntityHeader(java.lang.String, int) throws java.io.IOException;
}
@@ -7159,6 +7164,7 @@
}
public class FullBackupDataOutput {
+ method public long getQuota();
}
public class RestoreDescription implements android.os.Parcelable {
@@ -7454,8 +7460,8 @@
public final class StorageStats implements android.os.Parcelable {
method public int describeContents();
+ method public long getAppBytes();
method public long getCacheBytes();
- method public long getCodeBytes();
method public long getDataBytes();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.usage.StorageStats> CREATOR;
@@ -8070,6 +8076,7 @@
method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback);
method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int);
method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int, int);
+ method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int, int, android.os.Handler);
method public boolean createBond();
method public android.bluetooth.BluetoothSocket createInsecureRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException;
method public android.bluetooth.BluetoothSocket createRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException;
@@ -8496,7 +8503,7 @@
method public void setAdvertisingData(android.bluetooth.le.AdvertiseData);
method public void setAdvertisingParameters(android.bluetooth.le.AdvertisingSetParameters);
method public void setPeriodicAdvertisingData(android.bluetooth.le.AdvertiseData);
- method public void setPeriodicAdvertisingEnable(boolean);
+ method public void setPeriodicAdvertisingEnabled(boolean);
method public void setPeriodicAdvertisingParameters(android.bluetooth.le.PeriodicAdvertisingParameters);
method public void setScanResponseData(android.bluetooth.le.AdvertiseData);
}
@@ -8684,8 +8691,10 @@
field public static final android.os.Parcelable.Creator<android.bluetooth.le.ScanResult> CREATOR;
field public static final int DATA_COMPLETE = 0; // 0x0
field public static final int DATA_TRUNCATED = 2; // 0x2
+ field public static final int PERIODIC_INTERVAL_NOT_PRESENT = 0; // 0x0
field public static final int PHY_UNUSED = 0; // 0x0
field public static final int SID_NOT_PRESENT = 255; // 0xff
+ field public static final int TX_POWER_NOT_PRESENT = 127; // 0x7f
}
public final class ScanSettings implements android.os.Parcelable {
@@ -8765,21 +8774,21 @@
method public android.companion.BluetoothDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
}
- public final class BluetoothLEDeviceFilter implements android.companion.DeviceFilter {
+ public final class BluetoothLeDeviceFilter implements android.companion.DeviceFilter {
method public int describeContents();
method public static int getRenamePrefixLengthLimit();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.companion.BluetoothLEDeviceFilter> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.companion.BluetoothLeDeviceFilter> CREATOR;
}
- public static final class BluetoothLEDeviceFilter.Builder {
- ctor public BluetoothLEDeviceFilter.Builder();
- method public android.companion.BluetoothLEDeviceFilter build();
- method public android.companion.BluetoothLEDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
- method public android.companion.BluetoothLEDeviceFilter.Builder setRawDataFilter(byte[], byte[]);
- method public android.companion.BluetoothLEDeviceFilter.Builder setRenameFromBytes(java.lang.String, java.lang.String, int, int, boolean);
- method public android.companion.BluetoothLEDeviceFilter.Builder setRenameFromName(java.lang.String, java.lang.String, int, int);
- method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
+ public static final class BluetoothLeDeviceFilter.Builder {
+ ctor public BluetoothLeDeviceFilter.Builder();
+ method public android.companion.BluetoothLeDeviceFilter build();
+ method public android.companion.BluetoothLeDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
+ method public android.companion.BluetoothLeDeviceFilter.Builder setRawDataFilter(byte[], byte[]);
+ method public android.companion.BluetoothLeDeviceFilter.Builder setRenameFromBytes(java.lang.String, java.lang.String, int, int, java.nio.ByteOrder);
+ method public android.companion.BluetoothLeDeviceFilter.Builder setRenameFromName(java.lang.String, java.lang.String, int, int);
+ method public android.companion.BluetoothLeDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
}
public final class CompanionDeviceManager {
@@ -8915,7 +8924,7 @@
ctor public ClipData(android.content.ClipDescription, android.content.ClipData.Item);
ctor public ClipData(android.content.ClipData);
method public void addItem(android.content.ClipData.Item);
- method public void addItem(android.content.ClipData.Item, android.content.ContentResolver);
+ method public void addItem(android.content.ContentResolver, android.content.ClipData.Item);
method public int describeContents();
method public android.content.ClipDescription getDescription();
method public android.content.ClipData.Item getItemAt(int);
@@ -9213,17 +9222,17 @@
field public static final java.lang.String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
field public static final java.lang.String EXTRA_REFRESH_SUPPORTED = "android.content.extra.REFRESH_SUPPORTED";
field public static final java.lang.String EXTRA_SIZE = "android.content.extra.SIZE";
- field public static final java.lang.String EXTRA_TOTAL_SIZE = "android.content.extra.TOTAL_SIZE";
+ field public static final java.lang.String EXTRA_TOTAL_COUNT = "android.content.extra.TOTAL_COUNT";
field public static final int NOTIFY_SKIP_NOTIFY_FOR_DESCENDANTS = 2; // 0x2
field public static final int NOTIFY_SYNC_TO_NETWORK = 1; // 0x1
- field public static final java.lang.String QUERY_ARG_LIMIT = "android:query-page-limit";
- field public static final java.lang.String QUERY_ARG_OFFSET = "android:query-page-offset";
- field public static final java.lang.String QUERY_ARG_SORT_COLLATION = "android:query-sort-collation";
- field public static final java.lang.String QUERY_ARG_SORT_COLUMNS = "android:query-sort-columns";
- field public static final java.lang.String QUERY_ARG_SORT_DIRECTION = "android:query-sort-direction";
- field public static final java.lang.String QUERY_ARG_SQL_SELECTION = "android:query-sql-selection";
- field public static final java.lang.String QUERY_ARG_SQL_SELECTION_ARGS = "android:query-sql-selection-args";
- field public static final java.lang.String QUERY_ARG_SQL_SORT_ORDER = "android:query-sql-sort-order";
+ field public static final java.lang.String QUERY_ARG_LIMIT = "android:query-arg-limit";
+ field public static final java.lang.String QUERY_ARG_OFFSET = "android:query-arg-offset";
+ field public static final java.lang.String QUERY_ARG_SORT_COLLATION = "android:query-arg-sort-collation";
+ field public static final java.lang.String QUERY_ARG_SORT_COLUMNS = "android:query-arg-sort-columns";
+ field public static final java.lang.String QUERY_ARG_SORT_DIRECTION = "android:query-arg-sort-direction";
+ field public static final java.lang.String QUERY_ARG_SQL_SELECTION = "android:query-arg-sql-selection";
+ field public static final java.lang.String QUERY_ARG_SQL_SELECTION_ARGS = "android:query-arg-sql-selection-args";
+ field public static final java.lang.String QUERY_ARG_SQL_SORT_ORDER = "android:query-arg-sql-sort-order";
field public static final int QUERY_SORT_DIRECTION_ASCENDING = 0; // 0x0
field public static final int QUERY_SORT_DIRECTION_DESCENDING = 1; // 0x1
field public static final java.lang.String SCHEME_ANDROID_RESOURCE = "android.resource";
@@ -9439,7 +9448,7 @@
field public static final java.lang.String CAPTIONING_SERVICE = "captioning";
field public static final java.lang.String CARRIER_CONFIG_SERVICE = "carrier_config";
field public static final java.lang.String CLIPBOARD_SERVICE = "clipboard";
- field public static final java.lang.String COMPANION_DEVICE_SERVICE = "companion_device";
+ field public static final java.lang.String COMPANION_DEVICE_SERVICE = "companiondevice";
field public static final java.lang.String CONNECTIVITY_SERVICE = "connectivity";
field public static final java.lang.String CONSUMER_IR_SERVICE = "consumer_ir";
field public static final java.lang.String CONTEXTHUB_SERVICE = "contexthub";
@@ -9455,7 +9464,6 @@
field public static final java.lang.String HDMI_CONTROL_SERVICE = "hdmi_control";
field public static final java.lang.String INPUT_METHOD_SERVICE = "input_method";
field public static final java.lang.String INPUT_SERVICE = "input";
- field public static final java.lang.String IPSEC_SERVICE = "ipsec";
field public static final java.lang.String JOB_SCHEDULER_SERVICE = "jobscheduler";
field public static final java.lang.String KEYGUARD_SERVICE = "keyguard";
field public static final java.lang.String LAUNCHER_APPS_SERVICE = "launcherapps";
@@ -9846,15 +9854,12 @@
field public static final java.lang.String ACTION_CAMERA_BUTTON = "android.intent.action.CAMERA_BUTTON";
field public static final java.lang.String ACTION_CARRIER_SETUP = "android.intent.action.CARRIER_SETUP";
field public static final java.lang.String ACTION_CHOOSER = "android.intent.action.CHOOSER";
- field public static final java.lang.String ACTION_CLEAR_PACKAGE = "android.intent.action.CLEAR_PACKAGE";
field public static final java.lang.String ACTION_CLOSE_SYSTEM_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS";
field public static final java.lang.String ACTION_CONFIGURATION_CHANGED = "android.intent.action.CONFIGURATION_CHANGED";
field public static final java.lang.String ACTION_CREATE_DOCUMENT = "android.intent.action.CREATE_DOCUMENT";
field public static final java.lang.String ACTION_CREATE_SHORTCUT = "android.intent.action.CREATE_SHORTCUT";
field public static final java.lang.String ACTION_DATE_CHANGED = "android.intent.action.DATE_CHANGED";
field public static final java.lang.String ACTION_DEFAULT = "android.intent.action.VIEW";
- field public static final java.lang.String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED = "android.intent.action.ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED";
- field public static final java.lang.String ACTION_DEFAULT_SUBSCRIPTION_CHANGED = "android.intent.action.ACTION_DEFAULT_SUBSCRIPTION_CHANGED";
field public static final java.lang.String ACTION_DELETE = "android.intent.action.DELETE";
field public static final deprecated java.lang.String ACTION_DEVICE_INITIALIZATION_WIZARD = "android.intent.action.DEVICE_INITIALIZATION_WIZARD";
field public static final deprecated java.lang.String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
@@ -9871,6 +9876,7 @@
field public static final java.lang.String ACTION_FACTORY_TEST = "android.intent.action.FACTORY_TEST";
field public static final java.lang.String ACTION_GET_CONTENT = "android.intent.action.GET_CONTENT";
field public static final java.lang.String ACTION_GET_RESTRICTION_ENTRIES = "android.intent.action.GET_RESTRICTION_ENTRIES";
+ field public static final java.lang.String ACTION_GLOBAL_BUTTON = "android.intent.action.GLOBAL_BUTTON";
field public static final java.lang.String ACTION_GTALK_SERVICE_CONNECTED = "android.intent.action.GTALK_CONNECTED";
field public static final java.lang.String ACTION_GTALK_SERVICE_DISCONNECTED = "android.intent.action.GTALK_DISCONNECTED";
field public static final java.lang.String ACTION_HEADSET_PLUG = "android.intent.action.HEADSET_PLUG";
@@ -10037,6 +10043,7 @@
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_COMPONENT_NAME = "android.intent.extra.COMPONENT_NAME";
field public static final java.lang.String EXTRA_CONTENT_ANNOTATIONS = "android.intent.extra.CONTENT_ANNOTATIONS";
field public static final deprecated java.lang.String EXTRA_CSS_INDICATOR = "cssIndicator";
field public static final deprecated java.lang.String EXTRA_DATA_OPERATOR_ALPHA_LONG = "data-operator-alpha-long";
@@ -10105,7 +10112,6 @@
field public static final java.lang.String EXTRA_SPLIT_NAME = "android.intent.extra.SPLIT_NAME";
field public static final java.lang.String EXTRA_STREAM = "android.intent.extra.STREAM";
field public static final java.lang.String EXTRA_SUBJECT = "android.intent.extra.SUBJECT";
- field public static final java.lang.String EXTRA_SUBSCRIPTION_INDEX = "android.intent.extra.SUBSCRIPTION_INDEX";
field public static final deprecated java.lang.String EXTRA_SYSTEM_ID = "systemId";
field public static final java.lang.String EXTRA_TEMPLATE = "android.intent.extra.TEMPLATE";
field public static final java.lang.String EXTRA_TEXT = "android.intent.extra.TEXT";
@@ -10971,7 +10977,7 @@
field public java.lang.String[] splitPublicSourceDirs;
field public java.lang.String[] splitSourceDirs;
field public java.lang.String targetPackage;
- field public java.lang.String targetProcess;
+ field public java.lang.String targetProcesses;
}
public final class IntentFilterVerificationInfo implements android.os.Parcelable {
@@ -11795,7 +11801,7 @@
ctor public VersionedPackage(java.lang.String, int);
method public int describeContents();
method public java.lang.String getPackageName();
- method public long getVersionCode();
+ method public int getVersionCode();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.VersionedPackage> CREATOR;
}
@@ -14055,7 +14061,7 @@
method public void setFilterBitmap(boolean);
method public void setFlags(int);
method public void setFontFeatureSettings(java.lang.String);
- method public boolean setFontVariationSettings(java.lang.String) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
+ method public boolean setFontVariationSettings(java.lang.String);
method public void setHinting(int);
method public void setLetterSpacing(float);
method public void setLinearText(boolean);
@@ -14531,6 +14537,7 @@
method public void detachFromGLContext();
method public long getTimestamp();
method public void getTransformMatrix(float[]);
+ method public boolean isReleased();
method public void release();
method public void releaseTexImage();
method public void setDefaultBufferSize(int, int);
@@ -14554,7 +14561,6 @@
}
public class Typeface {
- method public static deprecated void create(android.graphics.fonts.FontRequest, android.graphics.Typeface.FontRequestCallback);
method public static android.graphics.Typeface create(java.lang.String, int);
method public static android.graphics.Typeface create(android.graphics.Typeface, int);
method public static android.graphics.Typeface createFromAsset(android.content.res.AssetManager, java.lang.String);
@@ -14582,24 +14588,13 @@
ctor public Typeface.Builder(android.content.res.AssetManager, java.lang.String);
method public android.graphics.Typeface build();
method public android.graphics.Typeface.Builder setFallback(java.lang.String);
- method public android.graphics.Typeface.Builder setFontVariationSettings(java.lang.String) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
+ method public android.graphics.Typeface.Builder setFontVariationSettings(java.lang.String);
method public android.graphics.Typeface.Builder setFontVariationSettings(android.graphics.fonts.FontVariationAxis[]);
method public android.graphics.Typeface.Builder setItalic(boolean);
method public android.graphics.Typeface.Builder setTtcIndex(int);
method public android.graphics.Typeface.Builder setWeight(int);
}
- public static abstract deprecated interface Typeface.FontRequestCallback {
- method public abstract void onTypefaceRequestFailed(int);
- method public abstract void onTypefaceRetrieved(android.graphics.Typeface);
- field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
- field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
- field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
- field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
- field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
- field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
- }
-
public class Xfermode {
ctor public Xfermode();
}
@@ -15176,30 +15171,14 @@
package android.graphics.fonts {
- public final class FontRequest implements android.os.Parcelable {
- ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String);
- ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String, java.util.List<java.util.List<byte[]>>);
- method public int describeContents();
- method public java.util.List<java.util.List<byte[]>> getCertificates();
- method public java.lang.String getProviderAuthority();
- method public java.lang.String getProviderPackage();
- method public java.lang.String getQuery();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.graphics.fonts.FontRequest> CREATOR;
- }
-
public final class FontVariationAxis {
- ctor public FontVariationAxis(java.lang.String, float) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
- method public static android.graphics.fonts.FontVariationAxis[] fromFontVariationSettings(java.lang.String) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
+ ctor public FontVariationAxis(java.lang.String, float);
+ method public static android.graphics.fonts.FontVariationAxis[] fromFontVariationSettings(java.lang.String);
method public float getStyleValue();
method public java.lang.String getTag();
method public static java.lang.String toFontVariationSettings(android.graphics.fonts.FontVariationAxis[]);
}
- public static class FontVariationAxis.InvalidFormatException extends java.lang.Exception {
- ctor public FontVariationAxis.InvalidFormatException(java.lang.String);
- }
-
}
package android.graphics.pdf {
@@ -15287,7 +15266,7 @@
method public final void takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback);
method public final void unlock();
field public static final java.lang.String ACTION_NEW_PICTURE = "android.hardware.action.NEW_PICTURE";
- field public static final deprecated java.lang.String ACTION_NEW_VIDEO = "android.hardware.action.NEW_VIDEO";
+ field public static final java.lang.String ACTION_NEW_VIDEO = "android.hardware.action.NEW_VIDEO";
field public static final int CAMERA_ERROR_EVICTED = 2; // 0x2
field public static final int CAMERA_ERROR_SERVER_DIED = 100; // 0x64
field public static final int CAMERA_ERROR_UNKNOWN = 1; // 0x1
@@ -15548,18 +15527,16 @@
field public static final int RGBX_8888 = 2; // 0x2
field public static final int RGB_565 = 4; // 0x4
field public static final int RGB_888 = 3; // 0x3
- field public static final long USAGE0_CPU_READ = 2L; // 0x2L
- field public static final long USAGE0_CPU_READ_OFTEN = 6L; // 0x6L
- field public static final long USAGE0_CPU_WRITE = 32L; // 0x20L
- field public static final long USAGE0_CPU_WRITE_OFTEN = 96L; // 0x60L
- field public static final long USAGE0_GPU_COLOR_OUTPUT = 2048L; // 0x800L
- field public static final long USAGE0_GPU_CUBEMAP = 8192L; // 0x2000L
- field public static final long USAGE0_GPU_DATA_BUFFER = 16384L; // 0x4000L
- field public static final long USAGE0_GPU_SAMPLED_IMAGE = 1024L; // 0x400L
- field public static final long USAGE0_GPU_STORAGE_IMAGE = 3072L; // 0xc00L
- field public static final long USAGE0_PROTECTED_CONTENT = 262144L; // 0x40000L
- field public static final long USAGE0_SENSOR_DIRECT_DATA = 536870912L; // 0x20000000L
- field public static final long USAGE0_VIDEO_ENCODE = 2097152L; // 0x200000L
+ field public static final long USAGE_CPU_READ_OFTEN = 3L; // 0x3L
+ field public static final long USAGE_CPU_READ_RARELY = 2L; // 0x2L
+ field public static final long USAGE_CPU_WRITE_OFTEN = 48L; // 0x30L
+ field public static final long USAGE_CPU_WRITE_RARELY = 32L; // 0x20L
+ field public static final long USAGE_GPU_COLOR_OUTPUT = 512L; // 0x200L
+ field public static final long USAGE_GPU_DATA_BUFFER = 16777216L; // 0x1000000L
+ field public static final long USAGE_GPU_SAMPLED_IMAGE = 256L; // 0x100L
+ field public static final long USAGE_PROTECTED_CONTENT = 16384L; // 0x4000L
+ field public static final long USAGE_SENSOR_DIRECT_DATA = 8388608L; // 0x800000L
+ field public static final long USAGE_VIDEO_ENCODE = 65536L; // 0x10000L
}
public final class Sensor {
@@ -20786,9 +20763,9 @@
method protected final void computeGregorianFields(int);
method protected int computeGregorianMonthStart(int, int);
method protected int computeJulianDay();
- method protected int computeMillisInDay();
+ method protected deprecated int computeMillisInDay();
method protected void computeTime();
- method protected int computeZoneOffset(long, int);
+ method protected deprecated int computeZoneOffset(long, int);
method public int fieldDifference(java.util.Date, int);
method protected java.lang.String fieldName(int);
method protected static final long floorDivide(long, long);
@@ -22832,6 +22809,7 @@
method public android.media.AudioFocusRequest.Builder setAudioAttributes(android.media.AudioAttributes);
method public android.media.AudioFocusRequest.Builder setFocusGain(int);
method public android.media.AudioFocusRequest.Builder setLocksFocus(boolean);
+ method public android.media.AudioFocusRequest.Builder setOnAudioFocusChangeListener(android.media.AudioManager.OnAudioFocusChangeListener);
method public android.media.AudioFocusRequest.Builder setOnAudioFocusChangeListener(android.media.AudioManager.OnAudioFocusChangeListener, android.os.Handler);
method public android.media.AudioFocusRequest.Builder setWillPauseWhenDucked(boolean);
}
@@ -25494,7 +25472,7 @@
public static final class VolumeShaper.Configuration implements android.os.Parcelable {
method public int describeContents();
- method public double getDurationMillis();
+ method public long getDuration();
method public int getInterpolatorType();
method public static int getMaximumCurvePoints();
method public float[] getTimes();
@@ -25520,7 +25498,7 @@
method public android.media.VolumeShaper.Configuration.Builder scaleToEndVolume(float);
method public android.media.VolumeShaper.Configuration.Builder scaleToStartVolume(float);
method public android.media.VolumeShaper.Configuration.Builder setCurve(float[], float[]);
- method public android.media.VolumeShaper.Configuration.Builder setDurationMillis(double);
+ method public android.media.VolumeShaper.Configuration.Builder setDuration(long);
method public android.media.VolumeShaper.Configuration.Builder setInterpolatorType(int);
}
@@ -26785,7 +26763,6 @@
}
public static final class TvContract.WatchNextPrograms implements android.media.tv.TvContract.BaseTvColumns {
- ctor public TvContract.WatchNextPrograms();
field public static final int ASPECT_RATIO_16_9 = 0; // 0x0
field public static final int ASPECT_RATIO_1_1 = 3; // 0x3
field public static final int ASPECT_RATIO_2_3 = 4; // 0x4
@@ -27289,6 +27266,7 @@
method public java.lang.Object getTaggedData(int);
method public long getTimestamp();
method public int getType();
+ method public int getUid();
method public boolean isLongCounterBucket();
method public boolean isSubsetOf(android.metrics.LogMaker);
method public boolean isValidValue(java.lang.Object);
@@ -27595,8 +27573,8 @@
method public boolean requestBandwidthUpdate(android.net.Network);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
- method public void requestNetwork(android.net.NetworkRequest, int, android.net.ConnectivityManager.NetworkCallback);
- method public void requestNetwork(android.net.NetworkRequest, int, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
+ method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, int);
+ method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, android.os.Handler, int);
method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent);
method public deprecated void setNetworkPreference(int);
method public static deprecated boolean setProcessDefaultNetwork(android.net.Network);
@@ -27693,68 +27671,6 @@
field public static final android.os.Parcelable.Creator<android.net.IpPrefix> CREATOR;
}
- public final class IpSecAlgorithm implements android.os.Parcelable {
- ctor public IpSecAlgorithm(java.lang.String, byte[]);
- ctor public IpSecAlgorithm(java.lang.String, byte[], int);
- method public int describeContents();
- method public byte[] getKey();
- method public java.lang.String getName();
- method public int getTruncationLengthBits();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final java.lang.String AUTH_HMAC_MD5 = "hmac(md5)";
- field public static final java.lang.String AUTH_HMAC_SHA1 = "hmac(sha1)";
- field public static final java.lang.String AUTH_HMAC_SHA256 = "hmac(sha256)";
- field public static final java.lang.String AUTH_HMAC_SHA384 = "hmac(sha384)";
- field public static final java.lang.String AUTH_HMAC_SHA512 = "hmac(sha512)";
- field public static final android.os.Parcelable.Creator<android.net.IpSecAlgorithm> CREATOR;
- field public static final java.lang.String CRYPT_AES_CBC = "cbc(aes)";
- }
-
- public final class IpSecManager {
- method public void applyTransportModeTransform(java.io.FileDescriptor, android.net.IpSecTransform) throws java.io.IOException;
- method public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket(int) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
- method public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket() throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
- method public void removeTransportModeTransform(java.io.FileDescriptor, android.net.IpSecTransform) throws java.io.IOException;
- method public android.net.IpSecManager.SecurityParameterIndex reserveSecurityParameterIndex(int, java.net.InetAddress) throws android.net.IpSecManager.ResourceUnavailableException;
- method public android.net.IpSecManager.SecurityParameterIndex reserveSecurityParameterIndex(int, java.net.InetAddress, int) throws android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
- field public static final int INVALID_SECURITY_PARAMETER_INDEX = 0; // 0x0
- }
-
- public static final class IpSecManager.ResourceUnavailableException extends android.util.AndroidException {
- }
-
- public static final class IpSecManager.SecurityParameterIndex implements java.lang.AutoCloseable {
- method public void close();
- method public int getSpi();
- }
-
- public static final class IpSecManager.SpiUnavailableException extends android.util.AndroidException {
- method public int getSpi();
- }
-
- public static final class IpSecManager.UdpEncapsulationSocket implements java.lang.AutoCloseable {
- method public void close() throws java.io.IOException;
- method public int getPort();
- method public java.io.FileDescriptor getSocket();
- }
-
- public final class IpSecTransform implements java.lang.AutoCloseable {
- method public void close();
- field public static final int DIRECTION_IN = 0; // 0x0
- field public static final int DIRECTION_OUT = 1; // 0x1
- }
-
- public static class IpSecTransform.Builder {
- ctor public IpSecTransform.Builder(android.content.Context);
- method public android.net.IpSecTransform buildTransportModeTransform(java.net.InetAddress) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
- method public android.net.IpSecTransform.Builder setAuthentication(int, android.net.IpSecAlgorithm);
- method public android.net.IpSecTransform.Builder setEncryption(int, android.net.IpSecAlgorithm);
- method public android.net.IpSecTransform.Builder setIpv4Encapsulation(android.net.IpSecManager.UdpEncapsulationSocket, int);
- method public android.net.IpSecTransform.Builder setNattKeepalive(int);
- method public android.net.IpSecTransform.Builder setSpi(int, android.net.IpSecManager.SecurityParameterIndex);
- method public android.net.IpSecTransform.Builder setUnderlyingNetwork(android.net.Network);
- }
-
public class LinkAddress implements android.os.Parcelable {
method public int describeContents();
method public java.net.InetAddress getAddress();
@@ -27968,13 +27884,13 @@
ctor public deprecated NetworkRecommendationProvider(android.os.Handler);
ctor public NetworkRecommendationProvider(android.content.Context, java.util.concurrent.Executor);
method public final android.os.IBinder getBinder();
- method public abstract void onRequestRecommendation(android.net.RecommendationRequest, android.net.NetworkRecommendationProvider.ResultCallback);
+ method public deprecated void onRequestRecommendation(android.net.RecommendationRequest, android.net.NetworkRecommendationProvider.ResultCallback);
method public abstract void onRequestScores(android.net.NetworkKey[]);
- field public static final java.lang.String EXTRA_RECOMMENDATION_RESULT = "android.net.extra.RECOMMENDATION_RESULT";
- field public static final java.lang.String EXTRA_SEQUENCE = "android.net.extra.SEQUENCE";
+ field public static final deprecated java.lang.String EXTRA_RECOMMENDATION_RESULT = "android.net.extra.RECOMMENDATION_RESULT";
+ field public static final deprecated java.lang.String EXTRA_SEQUENCE = "android.net.extra.SEQUENCE";
}
- public static class NetworkRecommendationProvider.ResultCallback {
+ public static deprecated class NetworkRecommendationProvider.ResultCallback {
method public void onResult(android.net.RecommendationResult);
}
@@ -28041,7 +27957,7 @@
field public static final android.os.Parcelable.Creator<android.net.ProxyInfo> CREATOR;
}
- public final class RecommendationRequest implements android.os.Parcelable {
+ public final deprecated class RecommendationRequest implements android.os.Parcelable {
ctor protected RecommendationRequest(android.os.Parcel);
method public int describeContents();
method public android.net.wifi.WifiConfiguration[] getConnectableConfigs();
@@ -28056,7 +27972,7 @@
field public static final android.os.Parcelable.Creator<android.net.RecommendationRequest> CREATOR;
}
- public static final class RecommendationRequest.Builder {
+ public static final deprecated class RecommendationRequest.Builder {
ctor public RecommendationRequest.Builder();
method public android.net.RecommendationRequest build();
method public android.net.RecommendationRequest.Builder setConnectableConfigs(android.net.wifi.WifiConfiguration[]);
@@ -28066,7 +27982,7 @@
method public android.net.RecommendationRequest.Builder setScanResults(android.net.wifi.ScanResult[]);
}
- public final class RecommendationResult implements android.os.Parcelable {
+ public final deprecated class RecommendationResult implements android.os.Parcelable {
method public static android.net.RecommendationResult createConnectRecommendation(android.net.wifi.WifiConfiguration);
method public static android.net.RecommendationResult createDoNotConnectRecommendation();
method public int describeContents();
@@ -29484,11 +29400,11 @@
field public static final android.os.Parcelable.Creator<android.net.wifi.aware.Characteristics> CREATOR;
}
- public class DiscoverySession {
+ public class DiscoverySession implements java.lang.AutoCloseable {
+ method public void close();
method public android.net.NetworkSpecifier createNetworkSpecifierOpen(android.net.wifi.aware.PeerHandle);
method public android.net.NetworkSpecifier createNetworkSpecifierPassphrase(android.net.wifi.aware.PeerHandle, java.lang.String);
method public android.net.NetworkSpecifier createNetworkSpecifierPmk(android.net.wifi.aware.PeerHandle, byte[]);
- method public void destroy();
method public void sendMessage(android.net.wifi.aware.PeerHandle, int, byte[]);
}
@@ -29540,8 +29456,6 @@
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.aware.SubscribeConfig> CREATOR;
- field public static final int MATCH_STYLE_ALL = 1; // 0x1
- field public static final int MATCH_STYLE_FIRST_ONLY = 0; // 0x0
field public static final int SUBSCRIBE_TYPE_ACTIVE = 1; // 0x1
field public static final int SUBSCRIBE_TYPE_PASSIVE = 0; // 0x0
}
@@ -29550,7 +29464,6 @@
ctor public SubscribeConfig.Builder();
method public android.net.wifi.aware.SubscribeConfig build();
method public android.net.wifi.aware.SubscribeConfig.Builder setMatchFilter(java.util.List<byte[]>);
- method public android.net.wifi.aware.SubscribeConfig.Builder setMatchStyle(int);
method public android.net.wifi.aware.SubscribeConfig.Builder setServiceName(java.lang.String);
method public android.net.wifi.aware.SubscribeConfig.Builder setServiceSpecificInfo(byte[]);
method public android.net.wifi.aware.SubscribeConfig.Builder setSubscribeType(int);
@@ -29572,11 +29485,11 @@
field public static final int WIFI_AWARE_DATA_PATH_ROLE_RESPONDER = 1; // 0x1
}
- public class WifiAwareSession {
+ public class WifiAwareSession implements java.lang.AutoCloseable {
+ method public void close();
method public android.net.NetworkSpecifier createNetworkSpecifierOpen(int, byte[]);
method public android.net.NetworkSpecifier createNetworkSpecifierPassphrase(int, byte[], java.lang.String);
method public android.net.NetworkSpecifier createNetworkSpecifierPmk(int, byte[], byte[]);
- method public void destroy();
method public void publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler);
method public void subscribe(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler);
}
@@ -33520,7 +33433,6 @@
method public android.util.SizeF getSizeF(java.lang.String);
method public <T extends android.os.Parcelable> android.util.SparseArray<T> getSparseParcelableArray(java.lang.String);
method public java.util.ArrayList<java.lang.String> getStringArrayList(java.lang.String);
- method public java.util.UUID getUuid(java.lang.String);
method public boolean hasFileDescriptors();
method public void putAll(android.os.Bundle);
method public void putBinder(java.lang.String, android.os.IBinder);
@@ -33545,7 +33457,6 @@
method public void putSizeF(java.lang.String, android.util.SizeF);
method public void putSparseParcelableArray(java.lang.String, android.util.SparseArray<? extends android.os.Parcelable>);
method public void putStringArrayList(java.lang.String, java.util.ArrayList<java.lang.String>);
- method public void putUuid(java.lang.String, java.util.UUID);
method public void readFromParcel(android.os.Parcel);
method public void setClassLoader(java.lang.ClassLoader);
method public void writeToParcel(android.os.Parcel, int);
@@ -34107,7 +34018,6 @@
method public final <T> void readTypedArray(T[], android.os.Parcelable.Creator<T>);
method public final <T> void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>);
method public final <T> T readTypedObject(android.os.Parcelable.Creator<T>);
- method public final java.util.UUID readUuid();
method public final java.lang.Object readValue(java.lang.ClassLoader);
method public final void recycle();
method public final void setDataCapacity(int);
@@ -34153,7 +34063,6 @@
method public final <T extends android.os.Parcelable> void writeTypedArray(T[], int);
method public final <T extends android.os.Parcelable> void writeTypedList(java.util.List<T>);
method public final <T extends android.os.Parcelable> void writeTypedObject(T, int);
- method public final void writeUuid(java.util.UUID);
method public final void writeValue(java.lang.Object);
field public static final android.os.Parcelable.Creator<java.lang.String> STRING_CREATOR;
}
@@ -34646,6 +34555,7 @@
field public static final java.lang.String DISALLOW_APPS_CONTROL = "no_control_apps";
field public static final java.lang.String DISALLOW_AUTOFILL = "no_autofill";
field public static final java.lang.String DISALLOW_BLUETOOTH = "no_bluetooth";
+ field public static final java.lang.String DISALLOW_BLUETOOTH_SHARING = "no_bluetooth_sharing";
field public static final java.lang.String DISALLOW_CONFIG_BLUETOOTH = "no_config_bluetooth";
field public static final java.lang.String DISALLOW_CONFIG_CELL_BROADCASTS = "no_config_cell_broadcasts";
field public static final java.lang.String DISALLOW_CONFIG_CREDENTIALS = "no_config_credentials";
@@ -34890,8 +34800,11 @@
}
public class StorageManager {
+ method public void allocateBytes(java.util.UUID, long) throws java.io.IOException;
method public void allocateBytes(java.util.UUID, long, int) throws java.io.IOException;
+ method public void allocateBytes(java.io.FileDescriptor, long) throws java.io.IOException;
method public void allocateBytes(java.io.FileDescriptor, long, int) throws java.io.IOException;
+ method public long getAllocatableBytes(java.util.UUID) throws java.io.IOException;
method public long getAllocatableBytes(java.util.UUID, int) throws java.io.IOException;
method public long getCacheQuotaBytes(java.util.UUID) throws java.io.IOException;
method public long getCacheSizeBytes(java.util.UUID) throws java.io.IOException;
@@ -34905,7 +34818,6 @@
method public boolean isEncrypted(java.io.File);
method public boolean isObbMounted(java.lang.String);
method public boolean mountObb(java.lang.String, java.lang.String, android.os.storage.OnObbStateChangeListener);
- method public android.os.ParcelFileDescriptor openProxyFileDescriptor(int, android.os.ProxyFileDescriptorCallback) throws java.io.IOException;
method public android.os.ParcelFileDescriptor openProxyFileDescriptor(int, android.os.ProxyFileDescriptorCallback, android.os.Handler) throws java.io.IOException;
method public void setCacheBehaviorGroup(java.io.File, boolean) throws java.io.IOException;
method public void setCacheBehaviorTombstone(java.io.File, boolean) throws java.io.IOException;
@@ -37486,11 +37398,19 @@
method public final int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
}
+ public final class FontRequest {
+ ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String);
+ ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String, java.util.List<java.util.List<byte[]>>);
+ method public java.util.List<java.util.List<byte[]>> getCertificates();
+ method public java.lang.String getProviderAuthority();
+ method public java.lang.String getProviderPackage();
+ method public java.lang.String getQuery();
+ }
+
public class FontsContract {
- method public static android.graphics.Typeface buildTypeface(android.content.Context, android.os.CancellationSignal, android.provider.FontsContract.FontInfo[], int, boolean, java.lang.String);
method public static android.graphics.Typeface buildTypeface(android.content.Context, android.os.CancellationSignal, android.provider.FontsContract.FontInfo[]);
- method public static android.provider.FontsContract.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal, android.graphics.fonts.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
- method public static void requestFont(android.content.Context, android.graphics.fonts.FontRequest, android.provider.FontsContract.FontRequestCallback, android.os.Handler);
+ method public static android.provider.FontsContract.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal, android.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static void requestFonts(android.content.Context, android.provider.FontRequest, android.os.Handler, android.os.CancellationSignal, android.provider.FontsContract.FontRequestCallback);
}
public static final class FontsContract.Columns implements android.provider.BaseColumns {
@@ -38038,6 +37958,7 @@
field public static final java.lang.String ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS";
field public static final java.lang.String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS";
field public static final java.lang.String ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
+ field public static final java.lang.String ACTION_REQUEST_SET_AUTOFILL_SERVICE = "android.settings.REQUEST_SET_AUTOFILL_SERVICE";
field public static final java.lang.String ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS";
field public static final java.lang.String ACTION_SECURITY_SETTINGS = "android.settings.SECURITY_SETTINGS";
field public static final java.lang.String ACTION_SETTINGS = "android.settings.SETTINGS";
@@ -38098,7 +38019,6 @@
field public static final java.lang.String BOOT_COUNT = "boot_count";
field public static final java.lang.String CONTACT_METADATA_SYNC_ENABLED = "contact_metadata_sync_enabled";
field public static final android.net.Uri CONTENT_URI;
- field public static final java.lang.String CURATE_SAVED_OPEN_NETWORKS = "curate_saved_open_networks";
field public static final java.lang.String DATA_ROAMING = "data_roaming";
field public static final java.lang.String DEBUG_APP = "debug_app";
field public static final java.lang.String DEVELOPMENT_SETTINGS_ENABLED = "development_settings_enabled";
@@ -40152,15 +40072,12 @@
public abstract class AutofillService extends android.app.Service {
ctor public AutofillService();
- method public final deprecated void disableSelf();
method public final android.service.autofill.FillEventHistory getFillEventHistory();
method public final android.os.IBinder onBind(android.content.Intent);
method public void onConnected();
method public void onDisconnected();
- method public void onFillRequest(android.service.autofill.FillRequest, android.os.CancellationSignal, android.service.autofill.FillCallback);
- method public abstract deprecated void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, int, android.os.CancellationSignal, android.service.autofill.FillCallback);
- method public void onSaveRequest(android.service.autofill.SaveRequest, android.service.autofill.SaveCallback);
- method public abstract deprecated void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.service.autofill.SaveCallback);
+ method public abstract void onFillRequest(android.service.autofill.FillRequest, android.os.CancellationSignal, android.service.autofill.FillCallback);
+ method public abstract void onSaveRequest(android.service.autofill.SaveRequest, android.service.autofill.SaveCallback);
field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutofillService";
field public static final java.lang.String SERVICE_META_DATA = "android.autofill";
}
@@ -40214,9 +40131,9 @@
public final class FillRequest implements android.os.Parcelable {
method public int describeContents();
method public android.os.Bundle getClientState();
+ method public java.util.ArrayList<android.service.autofill.FillContext> getFillContexts();
method public int getFlags();
method public int getId();
- method public android.app.assist.AssistStructure getStructure();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.FillRequest> CREATOR;
field public static final int FLAG_MANUAL_REQUEST = 1; // 0x1
@@ -40234,7 +40151,6 @@
method public android.service.autofill.FillResponse build();
method public android.service.autofill.FillResponse.Builder setAuthentication(android.view.autofill.AutofillId[], android.content.IntentSender, android.widget.RemoteViews);
method public android.service.autofill.FillResponse.Builder setClientState(android.os.Bundle);
- method public deprecated android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle);
method public android.service.autofill.FillResponse.Builder setIgnoredIds(android.view.autofill.AutofillId...);
method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo);
}
@@ -40249,6 +40165,8 @@
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.SaveInfo> CREATOR;
field public static final int FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE = 1; // 0x1
+ field public static final int NEGATIVE_BUTTON_STYLE_CANCEL = 0; // 0x0
+ field public static final int NEGATIVE_BUTTON_STYLE_REJECT = 1; // 0x1
field public static final int SAVE_DATA_TYPE_ADDRESS = 2; // 0x2
field public static final int SAVE_DATA_TYPE_CREDIT_CARD = 4; // 0x4
field public static final int SAVE_DATA_TYPE_EMAIL_ADDRESS = 16; // 0x10
@@ -40262,7 +40180,7 @@
method public android.service.autofill.SaveInfo build();
method public android.service.autofill.SaveInfo.Builder setDescription(java.lang.CharSequence);
method public android.service.autofill.SaveInfo.Builder setFlags(int);
- method public android.service.autofill.SaveInfo.Builder setNegativeAction(java.lang.CharSequence, android.content.IntentSender);
+ method public android.service.autofill.SaveInfo.Builder setNegativeAction(int, android.content.IntentSender);
method public android.service.autofill.SaveInfo.Builder setOptionalIds(android.view.autofill.AutofillId[]);
}
@@ -40756,7 +40674,6 @@
method public final void unlockAndRun(java.lang.Runnable);
field public static final java.lang.String ACTION_QS_TILE = "android.service.quicksettings.action.QS_TILE";
field public static final java.lang.String ACTION_QS_TILE_PREFERENCES = "android.service.quicksettings.action.QS_TILE_PREFERENCES";
- field public static final java.lang.String EXTRA_COMPONENT = "android.service.quicksettings.extra.COMPONENT";
field public static final java.lang.String META_DATA_ACTIVE_TILE = "android.service.quicksettings.ACTIVE_TILE";
}
@@ -41049,12 +40966,10 @@
method public int getDesiredMinimumHeight();
method public int getDesiredMinimumWidth();
method public android.view.SurfaceHolder getSurfaceHolder();
- method public void invalidateColors();
method public boolean isPreview();
method public boolean isVisible();
method public void onApplyWindowInsets(android.view.WindowInsets);
method public android.os.Bundle onCommand(java.lang.String, int, int, int, android.os.Bundle, boolean);
- method public android.app.WallpaperColors onComputeWallpaperColors();
method public void onCreate(android.view.SurfaceHolder);
method public void onDesiredSizeChanged(int, int);
method public void onDestroy();
@@ -42381,7 +42296,6 @@
}
public static final class Connection.RttModifyStatus {
- ctor public Connection.RttModifyStatus();
field public static final int SESSION_MODIFY_REQUEST_FAIL = 2; // 0x2
field public static final int SESSION_MODIFY_REQUEST_INVALID = 3; // 0x3
field public static final int SESSION_MODIFY_REQUEST_REJECTED_BY_REMOTE = 5; // 0x5
@@ -43643,8 +43557,11 @@
method public static int getDefaultVoiceSubscriptionId();
method public boolean isNetworkRoaming(int);
method public void removeOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener);
+ field public static final java.lang.String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED";
+ field public static final java.lang.String ACTION_DEFAULT_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED";
field public static final int DATA_ROAMING_DISABLE = 0; // 0x0
field public static final int DATA_ROAMING_ENABLE = 1; // 0x1
+ field public static final java.lang.String EXTRA_SUBSCRIPTION_INDEX = "android.telephony.extra.SUBSCRIPTION_INDEX";
field public static final int INVALID_SUBSCRIPTION_ID = -1; // 0xffffffff
}
@@ -43735,6 +43652,7 @@
method public java.lang.String getSubscriberId();
method public java.util.List<android.telephony.TelephonyHistogram> getTelephonyHistograms();
method public java.lang.String getVisualVoicemailPackageName();
+ method public android.os.Bundle getVisualVoicemailSettings();
method public java.lang.String getVoiceMailAlphaTag();
method public java.lang.String getVoiceMailNumber();
method public int getVoiceNetworkType();
@@ -43770,6 +43688,7 @@
method public void sendDialerSpecialCode(java.lang.String);
method public java.lang.String sendEnvelopeWithStatus(java.lang.String);
method public void sendUssdRequest(java.lang.String, android.telephony.TelephonyManager.UssdResponseCallback, android.os.Handler);
+ method public void sendVisualVoicemailSms(java.lang.String, int, java.lang.String, android.app.PendingIntent);
method public int setAllowedCarriers(int, java.util.List<android.service.carrier.CarrierIdentifier>);
method public void setDataEnabled(boolean);
method public void setDataEnabled(int, boolean);
@@ -43779,6 +43698,7 @@
method public boolean setRadio(boolean);
method public boolean setRadioPower(boolean);
method public deprecated void setVisualVoicemailEnabled(android.telecom.PhoneAccountHandle, boolean);
+ method public void setVisualVoicemailSmsFilterSettings(android.telephony.VisualVoicemailSmsFilterSettings);
method public boolean setVoiceMailNumber(java.lang.String, java.lang.String);
method public void setVoicemailRingtoneUri(android.telecom.PhoneAccountHandle, android.net.Uri);
method public void setVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle, boolean);
@@ -43826,7 +43746,9 @@
field public static final java.lang.String EXTRA_STATE_IDLE;
field public static final java.lang.String EXTRA_STATE_OFFHOOK;
field public static final java.lang.String EXTRA_STATE_RINGING;
+ field public static final java.lang.String EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL = "android.telephony.extra.VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL";
field public static final java.lang.String EXTRA_VOICEMAIL_NUMBER = "android.telephony.extra.VOICEMAIL_NUMBER";
+ field public static final java.lang.String EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING = "android.telephony.extra.VOICEMAIL_SCRAMBLED_PIN_STRING";
field public static final java.lang.String METADATA_HIDE_VOICEMAIL_SETTINGS_MENU = "android.telephony.HIDE_VOICEMAIL_SETTINGS_MENU";
field public static final int NETWORK_TYPE_1xRTT = 7; // 0x7
field public static final int NETWORK_TYPE_CDMA = 4; // 0x4
@@ -46817,6 +46739,7 @@
method public int getTag();
method public int getThreadId();
method public long getTimeNanos();
+ method public int getUid();
}
public deprecated class EventLogTags {
@@ -49007,6 +48930,7 @@
method public android.view.animation.Animation getAnimation();
method public android.os.IBinder getApplicationWindowToken();
method public java.lang.String[] getAutofillHints();
+ method public final android.view.autofill.AutofillId getAutofillId();
method public int getAutofillType();
method public android.view.autofill.AutofillValue getAutofillValue();
method public android.graphics.drawable.Drawable getBackground();
@@ -49249,7 +49173,6 @@
method public boolean onKeyUp(int, android.view.KeyEvent);
method protected void onLayout(boolean, int, int, int, int);
method protected void onMeasure(int, int);
- method public void onMovedToDisplay(int, android.content.res.Configuration);
method protected void onOverScrolled(int, int, boolean, boolean);
method public void onPointerCaptureChange(boolean);
method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
@@ -49469,6 +49392,7 @@
field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA;
+ field public static final int AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 1; // 0x1
field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE = "creditCardExpirationDate";
field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY = "creditCardExpirationDay";
field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH = "creditCardExpirationMonth";
@@ -50129,6 +50053,7 @@
method public abstract int addChildCount(int);
method public abstract void asyncCommit();
method public abstract android.view.ViewStructure asyncNewChild(int);
+ method public abstract android.view.autofill.AutofillId getAutofillId();
method public abstract int getChildCount();
method public abstract android.os.Bundle getExtras();
method public abstract java.lang.CharSequence getHint();
@@ -50142,7 +50067,8 @@
method public abstract void setActivated(boolean);
method public abstract void setAlpha(float);
method public abstract void setAutofillHints(java.lang.String[]);
- method public abstract void setAutofillId(android.view.ViewStructure, int);
+ method public abstract void setAutofillId(android.view.autofill.AutofillId);
+ method public abstract void setAutofillId(android.view.autofill.AutofillId, int);
method public abstract void setAutofillOptions(java.lang.CharSequence[]);
method public abstract void setAutofillType(int);
method public abstract void setAutofillValue(android.view.autofill.AutofillValue);
@@ -50172,14 +50098,13 @@
method public abstract void setTextLines(int[], int[]);
method public abstract void setTextStyle(float, int, int, int);
method public abstract void setTransformation(android.graphics.Matrix);
- method public abstract deprecated void setUrl(java.lang.String);
method public abstract void setVisibility(int);
method public abstract void setWebDomain(java.lang.String);
}
public static abstract class ViewStructure.HtmlInfo {
ctor public ViewStructure.HtmlInfo();
- method public abstract java.util.ArrayList<android.util.Pair<java.lang.String, java.lang.String>> getAttributes();
+ method public abstract java.util.List<android.util.Pair<java.lang.String, java.lang.String>> getAttributes();
method public abstract java.lang.String getTag();
}
@@ -50740,7 +50665,9 @@
public final class AccessibilityManager {
method public boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener);
+ method public void addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener, android.os.Handler);
method public boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener);
+ method public void addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener, android.os.Handler);
method public deprecated java.util.List<android.content.pm.ServiceInfo> getAccessibilityServiceList();
method public java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int);
method public java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList();
@@ -50892,8 +50819,8 @@
field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
- field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_X = "android.view.accessibility.action.ARGUMENT_MOVE_WINDOW_X";
- field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_Y = "android.view.accessibility.action.ARGUMENT_MOVE_WINDOW_Y";
+ field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+ field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
field public static final java.lang.String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
field public static final java.lang.String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
@@ -51075,10 +51002,10 @@
method public android.view.accessibility.AccessibilityNodeInfo getRoot();
method public java.lang.CharSequence getTitle();
method public int getType();
- method public boolean inPictureInPicture();
method public boolean isAccessibilityFocused();
method public boolean isActive();
method public boolean isFocused();
+ method public boolean isInPictureInPictureMode();
method public static android.view.accessibility.AccessibilityWindowInfo obtain();
method public static android.view.accessibility.AccessibilityWindowInfo obtain(android.view.accessibility.AccessibilityWindowInfo);
method public void recycle();
@@ -51420,7 +51347,9 @@
public final class AutofillManager {
method public void cancel();
method public void commit();
- method public void disableOwnedAutofillServices();
+ method public void disableAutofillServices();
+ method public boolean hasEnabledAutofillServices();
+ method public boolean isAutofillSupported();
method public boolean isEnabled();
method public void notifyValueChanged(android.view.View);
method public void notifyValueChanged(android.view.View, int, android.view.autofill.AutofillValue);
@@ -51434,8 +51363,7 @@
method public void unregisterCallback(android.view.autofill.AutofillManager.AutofillCallback);
field public static final java.lang.String EXTRA_ASSIST_STRUCTURE = "android.view.autofill.extra.ASSIST_STRUCTURE";
field public static final java.lang.String EXTRA_AUTHENTICATION_RESULT = "android.view.autofill.extra.AUTHENTICATION_RESULT";
- field public static final java.lang.String EXTRA_DATA_EXTRAS = "android.view.autofill.extra.DATA_EXTRAS";
- field public static final deprecated int FLAG_MANUAL_REQUEST = 1; // 0x1
+ field public static final java.lang.String EXTRA_CLIENT_STATE = "android.view.autofill.extra.EXTRA_CLIENT_STATE";
}
public static abstract class AutofillManager.AutofillCallback {
@@ -51869,12 +51797,7 @@
package android.view.textclassifier {
- public final class TextClassificationManager {
- method public android.view.textclassifier.TextClassifier getTextClassifier();
- method public void setTextClassifier(android.view.textclassifier.TextClassifier);
- }
-
- public final class TextClassificationResult {
+ public final class TextClassification {
method public float getConfidenceScore(java.lang.String);
method public java.lang.String getEntity(int);
method public int getEntityCount();
@@ -51885,19 +51808,24 @@
method public java.lang.String getText();
}
- public static final class TextClassificationResult.Builder {
- ctor public TextClassificationResult.Builder();
- method public android.view.textclassifier.TextClassificationResult build();
- method public android.view.textclassifier.TextClassificationResult.Builder setEntityType(java.lang.String, float);
- method public android.view.textclassifier.TextClassificationResult.Builder setIcon(android.graphics.drawable.Drawable);
- method public android.view.textclassifier.TextClassificationResult.Builder setIntent(android.content.Intent);
- method public android.view.textclassifier.TextClassificationResult.Builder setLabel(java.lang.String);
- method public android.view.textclassifier.TextClassificationResult.Builder setOnClickListener(android.view.View.OnClickListener);
- method public android.view.textclassifier.TextClassificationResult.Builder setText(java.lang.String);
+ public static final class TextClassification.Builder {
+ ctor public TextClassification.Builder();
+ method public android.view.textclassifier.TextClassification build();
+ method public android.view.textclassifier.TextClassification.Builder setEntityType(java.lang.String, float);
+ method public android.view.textclassifier.TextClassification.Builder setIcon(android.graphics.drawable.Drawable);
+ method public android.view.textclassifier.TextClassification.Builder setIntent(android.content.Intent);
+ method public android.view.textclassifier.TextClassification.Builder setLabel(java.lang.String);
+ method public android.view.textclassifier.TextClassification.Builder setOnClickListener(android.view.View.OnClickListener);
+ method public android.view.textclassifier.TextClassification.Builder setText(java.lang.String);
+ }
+
+ public final class TextClassificationManager {
+ method public android.view.textclassifier.TextClassifier getTextClassifier();
+ method public void setTextClassifier(android.view.textclassifier.TextClassifier);
}
public abstract interface TextClassifier {
- method public abstract android.view.textclassifier.TextClassificationResult getTextClassificationResult(java.lang.CharSequence, int, int, android.os.LocaleList);
+ method public abstract android.view.textclassifier.TextClassification classifyText(java.lang.CharSequence, int, int, android.os.LocaleList);
method public abstract android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int, android.os.LocaleList);
field public static final android.view.textclassifier.TextClassifier NO_OP;
field public static final java.lang.String TYPE_ADDRESS = "address";
@@ -52669,7 +52597,6 @@
method public int getRendererRequestedPriority();
method public deprecated float getScale();
method public android.webkit.WebSettings getSettings();
- method public android.view.textclassifier.TextClassifier getTextClassifier();
method public java.lang.String getTitle();
method public java.lang.String getUrl();
method public android.webkit.WebChromeClient getWebChromeClient();
@@ -52717,7 +52644,6 @@
method public void setNetworkAvailable(boolean);
method public deprecated void setPictureListener(android.webkit.WebView.PictureListener);
method public void setRendererPriorityPolicy(int, boolean);
- method public void setTextClassifier(android.view.textclassifier.TextClassifier);
method public deprecated void setVerticalScrollbarOverlay(boolean);
method public void setWebChromeClient(android.webkit.WebChromeClient);
method public static void setWebContentsDebuggingEnabled(boolean);
@@ -55448,7 +55374,7 @@
method public void setExtractedText(android.view.inputmethod.ExtractedText);
method public void setFilters(android.text.InputFilter[]);
method public void setFontFeatureSettings(java.lang.String);
- method public boolean setFontVariationSettings(java.lang.String) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
+ method public boolean setFontVariationSettings(java.lang.String);
method protected boolean setFrame(int, int, int, int);
method public void setFreezesText(boolean);
method public void setGravity(int);
@@ -56133,15 +56059,15 @@
ctor public DexClassLoader(java.lang.String, java.lang.String, java.lang.String, java.lang.ClassLoader);
}
- public final class DexFile {
- ctor public DexFile(java.io.File) throws java.io.IOException;
- ctor public DexFile(java.lang.String) throws java.io.IOException;
+ public final deprecated class DexFile {
+ ctor public deprecated DexFile(java.io.File) throws java.io.IOException;
+ ctor public deprecated DexFile(java.lang.String) throws java.io.IOException;
method public void close() throws java.io.IOException;
method public java.util.Enumeration<java.lang.String> entries();
method public java.lang.String getName();
method public static boolean isDexOptNeeded(java.lang.String) throws java.io.FileNotFoundException, java.io.IOException;
method public java.lang.Class loadClass(java.lang.String, java.lang.ClassLoader);
- method public static dalvik.system.DexFile loadDex(java.lang.String, java.lang.String, int) throws java.io.IOException;
+ method public static deprecated dalvik.system.DexFile loadDex(java.lang.String, java.lang.String, int) throws java.io.IOException;
}
public final class InMemoryDexClassLoader extends dalvik.system.BaseDexClassLoader {
diff --git a/api/system-removed.txt b/api/system-removed.txt
index 4862bb7..fe51248 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -1,7 +1,6 @@
package android.app {
public class Notification implements android.os.Parcelable {
- method public deprecated int getBadgeIcon();
method public deprecated void setLatestEventInfo(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
}
@@ -16,12 +15,18 @@
public class DevicePolicyManager {
method public deprecated android.os.UserHandle createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle);
method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
+ method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>);
+ field public static final deprecated int FLAG_EVICT_CE_KEY = 1; // 0x1
}
}
package android.app.usage {
+ public final class StorageStats implements android.os.Parcelable {
+ method public deprecated long getCodeBytes();
+ }
+
public class StorageStatsManager {
method public deprecated long getFreeBytes(java.lang.String) throws java.io.IOException;
method public deprecated long getTotalBytes(java.lang.String) throws java.io.IOException;
@@ -36,6 +41,10 @@
package android.content {
+ public class ClipData implements android.os.Parcelable {
+ method public deprecated void addItem(android.content.ClipData.Item, android.content.ContentResolver);
+ }
+
public abstract class Context {
method public abstract android.content.SharedPreferences getSharedPreferences(java.io.File, int);
method public abstract java.io.File getSharedPreferencesPath(java.lang.String);
@@ -345,10 +354,6 @@
field public static final deprecated java.lang.String TIMESTAMP = "timestamp";
}
- public static final class FontsContract.Columns implements android.provider.BaseColumns {
- field public static final java.lang.String STYLE = "font_style";
- }
-
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
field public static final deprecated java.lang.String CONTACT_METADATA_SYNC = "contact_metadata_sync";
}
@@ -441,6 +446,14 @@
}
+package android.view.accessibility {
+
+ public final class AccessibilityWindowInfo implements android.os.Parcelable {
+ method public boolean inPictureInPicture();
+ }
+
+}
+
package android.webkit {
public class WebViewClient {
diff --git a/api/test-current.txt b/api/test-current.txt
index eac5b80..0965b71 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -15,13 +15,11 @@
field public static final java.lang.String ACCESS_WIFI_STATE = "android.permission.ACCESS_WIFI_STATE";
field public static final java.lang.String ACCOUNT_MANAGER = "android.permission.ACCOUNT_MANAGER";
field public static final java.lang.String ADD_VOICEMAIL = "com.android.voicemail.permission.ADD_VOICEMAIL";
- field public static final java.lang.String ALLOCATE_AGGRESSIVE = "android.permission.ALLOCATE_AGGRESSIVE";
field public static final java.lang.String ANSWER_PHONE_CALLS = "android.permission.ANSWER_PHONE_CALLS";
field public static final java.lang.String BATTERY_STATS = "android.permission.BATTERY_STATS";
field public static final java.lang.String BIND_ACCESSIBILITY_SERVICE = "android.permission.BIND_ACCESSIBILITY_SERVICE";
field public static final java.lang.String BIND_APPWIDGET = "android.permission.BIND_APPWIDGET";
- field public static final java.lang.String BIND_AUTOFILL = "android.permission.BIND_AUTOFILL";
- field public static final java.lang.String BIND_AUTO_FILL = "android.permission.BIND_AUTO_FILL";
+ field public static final java.lang.String BIND_AUTOFILL_SERVICE = "android.permission.BIND_AUTOFILL_SERVICE";
field public static final deprecated java.lang.String BIND_CARRIER_MESSAGING_SERVICE = "android.permission.BIND_CARRIER_MESSAGING_SERVICE";
field public static final java.lang.String BIND_CARRIER_SERVICES = "android.permission.BIND_CARRIER_SERVICES";
field public static final java.lang.String BIND_CHOOSER_TARGET_SERVICE = "android.permission.BIND_CHOOSER_TARGET_SERVICE";
@@ -117,12 +115,12 @@
field public static final java.lang.String RECEIVE_WAP_PUSH = "android.permission.RECEIVE_WAP_PUSH";
field public static final java.lang.String RECORD_AUDIO = "android.permission.RECORD_AUDIO";
field public static final java.lang.String REORDER_TASKS = "android.permission.REORDER_TASKS";
+ field public static final java.lang.String REQUEST_COMPANION_RUN_IN_BACKGROUND = "android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND";
+ field public static final java.lang.String REQUEST_COMPANION_USE_DATA_IN_BACKGROUND = "android.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND";
field public static final java.lang.String REQUEST_DELETE_PACKAGES = "android.permission.REQUEST_DELETE_PACKAGES";
field public static final java.lang.String REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
field public static final java.lang.String REQUEST_INSTALL_PACKAGES = "android.permission.REQUEST_INSTALL_PACKAGES";
field public static final deprecated java.lang.String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES";
- field public static final java.lang.String RESTRICTED_VR_ACCESS = "android.permission.RESTRICTED_VR_ACCESS";
- field public static final java.lang.String RUN_IN_BACKGROUND = "android.permission.RUN_IN_BACKGROUND";
field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";
field public static final java.lang.String SEND_SMS = "android.permission.SEND_SMS";
field public static final java.lang.String SET_ALARM = "com.android.alarm.permission.SET_ALARM";
@@ -141,7 +139,6 @@
field public static final java.lang.String TRANSMIT_IR = "android.permission.TRANSMIT_IR";
field public static final java.lang.String UNINSTALL_SHORTCUT = "com.android.launcher.permission.UNINSTALL_SHORTCUT";
field public static final java.lang.String UPDATE_DEVICE_STATS = "android.permission.UPDATE_DEVICE_STATS";
- field public static final java.lang.String USE_DATA_IN_BACKGROUND = "android.permission.USE_DATA_IN_BACKGROUND";
field public static final java.lang.String USE_FINGERPRINT = "android.permission.USE_FINGERPRINT";
field public static final java.lang.String USE_SIP = "android.permission.USE_SIP";
field public static final java.lang.String VIBRATE = "android.permission.VIBRATE";
@@ -314,6 +311,7 @@
field public static final int autoUrlDetect = 16843404; // 0x101028c
field public static final int autoVerify = 16844014; // 0x10104ee
field public static final int autofillHints = 16844121; // 0x1010559
+ field public static final int autofilledHighlight = 16844139; // 0x101056b
field public static final int background = 16842964; // 0x10100d4
field public static final int backgroundDimAmount = 16842802; // 0x1010032
field public static final int backgroundDimEnabled = 16843295; // 0x101021f
@@ -358,12 +356,12 @@
field public static final int calendarTextColor = 16843931; // 0x101049b
field public static final int calendarViewShown = 16843596; // 0x101034c
field public static final int calendarViewStyle = 16843613; // 0x101035d
- field public static final int canCaptureFingerprintGestures = 16844111; // 0x101054f
field public static final int canControlMagnification = 16844039; // 0x1010507
field public static final int canPerformGestures = 16844045; // 0x101050d
field public static final int canRecord = 16844060; // 0x101051c
- field public static final int canRequestEnhancedWebAccessibility = 16843736; // 0x10103d8
+ field public static final deprecated int canRequestEnhancedWebAccessibility = 16843736; // 0x10103d8
field public static final int canRequestFilterKeyEvents = 16843737; // 0x10103d9
+ field public static final int canRequestFingerprintGestures = 16844111; // 0x101054f
field public static final int canRequestTouchExplorationMode = 16843735; // 0x10103d7
field public static final int canRetrieveWindowContent = 16843653; // 0x1010385
field public static final int candidatesTextStyleSpans = 16843312; // 0x1010230
@@ -994,7 +992,7 @@
field public static final int persistableMode = 16843821; // 0x101042d
field public static final int persistent = 16842765; // 0x101000d
field public static final int persistentDrawingCache = 16842990; // 0x10100ee
- field public static final int persistentFeature = 16844134; // 0x1010566
+ field public static final int persistentWhenFeatureAvailable = 16844134; // 0x1010566
field public static final deprecated int phoneNumber = 16843111; // 0x1010167
field public static final int pivotX = 16843189; // 0x10101b5
field public static final int pivotY = 16843190; // 0x10101b6
@@ -1298,7 +1296,7 @@
field public static final int targetId = 16843740; // 0x10103dc
field public static final int targetName = 16843853; // 0x101044d
field public static final int targetPackage = 16842785; // 0x1010021
- field public static final int targetProcess = 16844097; // 0x1010541
+ field public static final int targetProcesses = 16844097; // 0x1010541
field public static final int targetSandboxVersion = 16844110; // 0x101054e
field public static final int targetSdkVersion = 16843376; // 0x1010270
field public static final int taskAffinity = 16842770; // 0x1010012
@@ -1613,7 +1611,6 @@
field public static final int alert_light_frame = 17301505; // 0x1080001
field public static final int arrow_down_float = 17301506; // 0x1080002
field public static final int arrow_up_float = 17301507; // 0x1080003
- field public static final int autofilled_highlight = 17301684; // 0x10800b4
field public static final int bottom_bar = 17301658; // 0x108009a
field public static final int btn_default = 17301508; // 0x1080004
field public static final int btn_default_small = 17301509; // 0x1080005
@@ -1711,7 +1708,6 @@
field public static final int ic_notification_clear_all = 17301594; // 0x108005a
field public static final int ic_notification_overlay = 17301595; // 0x108005b
field public static final int ic_partial_secure = 17301596; // 0x108005c
- field public static final int ic_picture_in_picture = 17301685; // 0x10800b5
field public static final int ic_popup_disk_full = 17301597; // 0x108005d
field public static final int ic_popup_reminder = 17301598; // 0x108005e
field public static final int ic_popup_sync = 17301599; // 0x108005f
@@ -2832,13 +2828,13 @@
method public android.content.pm.ResolveInfo getResolveInfo();
method public java.lang.String getSettingsActivityName();
method public java.lang.String loadDescription(android.content.pm.PackageManager);
- method public java.lang.String loadSummary(android.content.pm.PackageManager);
+ method public java.lang.CharSequence loadSummary(android.content.pm.PackageManager);
method public void writeToParcel(android.os.Parcel, int);
- field public static final int CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES = 64; // 0x40
field public static final int CAPABILITY_CAN_CONTROL_MAGNIFICATION = 16; // 0x10
field public static final int CAPABILITY_CAN_PERFORM_GESTURES = 32; // 0x20
- field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+ field public static final deprecated int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
field public static final int CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS = 8; // 0x8
+ field public static final int CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES = 64; // 0x40
field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
field public static final android.os.Parcelable.Creator<android.accessibilityservice.AccessibilityServiceInfo> CREATOR;
@@ -2850,13 +2846,13 @@
field public static final int FEEDBACK_HAPTIC = 2; // 0x2
field public static final int FEEDBACK_SPOKEN = 1; // 0x1
field public static final int FEEDBACK_VISUAL = 8; // 0x8
- field public static final int FLAG_CAPTURE_FINGERPRINT_GESTURES = 512; // 0x200
field public static final int FLAG_ENABLE_ACCESSIBILITY_VOLUME = 128; // 0x80
field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
field public static final int FLAG_REQUEST_ACCESSIBILITY_BUTTON = 256; // 0x100
- field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+ field public static final deprecated int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+ field public static final int FLAG_REQUEST_FINGERPRINT_GESTURES = 512; // 0x200
field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
field public static final int FLAG_RETRIEVE_INTERACTIVE_WINDOWS = 64; // 0x40
field public int eventTypes;
@@ -2878,7 +2874,7 @@
public static abstract class FingerprintGestureController.FingerprintGestureCallback {
ctor public FingerprintGestureController.FingerprintGestureCallback();
- method public void onGesture(int);
+ method public void onGestureDetected(int);
method public void onGestureDetectionAvailabilityChanged(boolean);
}
@@ -2897,14 +2893,12 @@
public static class GestureDescription.StrokeDescription {
ctor public GestureDescription.StrokeDescription(android.graphics.Path, long, long);
- ctor public GestureDescription.StrokeDescription(android.graphics.Path, long, long, int, boolean);
- method public int getContinuedStrokeId();
+ ctor public GestureDescription.StrokeDescription(android.graphics.Path, long, long, boolean);
+ method public android.accessibilityservice.GestureDescription.StrokeDescription continueStroke(android.graphics.Path, long, long, boolean);
method public long getDuration();
- method public int getId();
method public android.graphics.Path getPath();
method public long getStartTime();
- method public boolean isContinued();
- field public static final int INVALID_STROKE_ID = -1; // 0xffffffff
+ method public boolean willContinue();
}
}
@@ -3036,8 +3030,8 @@
field public static final java.lang.String KEY_PASSWORD = "password";
field public static final java.lang.String KEY_USERDATA = "userdata";
field public static final deprecated java.lang.String LOGIN_ACCOUNTS_CHANGED_ACTION = "android.accounts.LOGIN_ACCOUNTS_CHANGED";
- field public static final java.lang.String PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE = "android.accounts.key_legacy_not_visible";
- field public static final java.lang.String PACKAGE_NAME_KEY_LEGACY_VISIBLE = "android.accounts.key_legacy_visible";
+ field public static final java.lang.String PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE = "android:accounts:key_legacy_not_visible";
+ field public static final java.lang.String PACKAGE_NAME_KEY_LEGACY_VISIBLE = "android:accounts:key_legacy_visible";
field public static final int VISIBILITY_NOT_VISIBLE = 3; // 0x3
field public static final int VISIBILITY_UNDEFINED = 0; // 0x0
field public static final int VISIBILITY_USER_MANAGED_NOT_VISIBLE = 4; // 0x4
@@ -3586,8 +3580,9 @@
method public boolean dispatchTouchEvent(android.view.MotionEvent);
method public boolean dispatchTrackballEvent(android.view.MotionEvent);
method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- method public void enterPictureInPictureMode();
- method public boolean enterPictureInPictureMode(android.app.PictureInPictureArgs);
+ method public deprecated void enterPictureInPictureMode();
+ method public deprecated boolean enterPictureInPictureMode(android.app.PictureInPictureArgs);
+ method public boolean enterPictureInPictureMode(android.app.PictureInPictureParams);
method public <T extends android.view.View> T findViewById(int);
method public void finish();
method public void finishActivity(int);
@@ -3611,6 +3606,7 @@
method public android.view.LayoutInflater getLayoutInflater();
method public android.app.LoaderManager getLoaderManager();
method public java.lang.String getLocalClassName();
+ method public int getMaxNumPictureInPictureActions();
method public final android.media.session.MediaController getMediaController();
method public android.view.MenuInflater getMenuInflater();
method public final android.app.Activity getParent();
@@ -3637,7 +3633,6 @@
method public boolean isInMultiWindowMode();
method public boolean isInPictureInPictureMode();
method public boolean isLocalVoiceInteractionSupported();
- method public boolean isOverlayWithDecorCaptionEnabled();
method public boolean isTaskRoot();
method public boolean isVoiceInteraction();
method public boolean isVoiceInteractionRoot();
@@ -3684,7 +3679,6 @@
method public void onLowMemory();
method public boolean onMenuItemSelected(int, android.view.MenuItem);
method public boolean onMenuOpened(int, android.view.Menu);
- method public void onMovedToDisplay(int, android.content.res.Configuration);
method public void onMultiWindowModeChanged(boolean, android.content.res.Configuration);
method public deprecated void onMultiWindowModeChanged(boolean);
method public boolean onNavigateUp();
@@ -3762,8 +3756,8 @@
method public void setImmersive(boolean);
method public void setIntent(android.content.Intent);
method public final void setMediaController(android.media.session.MediaController);
- method public void setOverlayWithDecorCaptionEnabled(boolean);
method public void setPictureInPictureArgs(android.app.PictureInPictureArgs);
+ method public void setPictureInPictureParams(android.app.PictureInPictureParams);
method public final deprecated void setProgress(int);
method public final deprecated void setProgressBarIndeterminate(boolean);
method public final deprecated void setProgressBarIndeterminateVisibility(boolean);
@@ -3843,7 +3837,7 @@
method public int getLauncherLargeIconDensity();
method public int getLauncherLargeIconSize();
method public int getLockTaskModeState();
- method public static int getMaxNumPictureInPictureActions();
+ method public static deprecated int getMaxNumPictureInPictureActions();
method public int getMemoryClass();
method public void getMemoryInfo(android.app.ActivityManager.MemoryInfo);
method public static void getMyMemoryState(android.app.ActivityManager.RunningAppProcessInfo);
@@ -3954,7 +3948,7 @@
field public static final int IMPORTANCE_FOREGROUND_SERVICE = 125; // 0x7d
field public static final int IMPORTANCE_GONE = 1000; // 0x3e8
field public static final int IMPORTANCE_PERCEPTIBLE = 230; // 0xe6
- field public static final deprecated int IMPORTANCE_PERCEPTIBLE_DEPRECATED = 130; // 0x82
+ field public static final int IMPORTANCE_PERCEPTIBLE_PRE_26 = 130; // 0x82
field public static final int IMPORTANCE_SERVICE = 300; // 0x12c
field public static final int IMPORTANCE_TOP_SLEEPING = 150; // 0x96
field public static final int IMPORTANCE_VISIBLE = 200; // 0xc8
@@ -4041,6 +4035,7 @@
method public static android.app.ActivityOptions makeTaskLaunchBehind();
method public static android.app.ActivityOptions makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
method public void requestUsageTimeReport(android.app.PendingIntent);
+ method public android.app.ActivityOptions setAppVerificationBundle(android.os.Bundle);
method public android.app.ActivityOptions setLaunchBounds(android.graphics.Rect);
method public android.app.ActivityOptions setLaunchDisplayId(int);
method public void setLaunchStackId(int);
@@ -4831,6 +4826,7 @@
method public void onFragmentDetached(android.app.FragmentManager, android.app.Fragment);
method public void onFragmentPaused(android.app.FragmentManager, android.app.Fragment);
method public void onFragmentPreAttached(android.app.FragmentManager, android.app.Fragment, android.content.Context);
+ method public void onFragmentPreCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
method public void onFragmentResumed(android.app.FragmentManager, android.app.Fragment);
method public void onFragmentSaveInstanceState(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
method public void onFragmentStarted(android.app.FragmentManager, android.app.Fragment);
@@ -4863,11 +4859,10 @@
method public abstract android.app.FragmentTransaction hide(android.app.Fragment);
method public abstract boolean isAddToBackStackAllowed();
method public abstract boolean isEmpty();
- method public abstract android.app.FragmentTransaction postOnCommit(java.lang.Runnable);
method public abstract android.app.FragmentTransaction remove(android.app.Fragment);
method public abstract android.app.FragmentTransaction replace(int, android.app.Fragment);
method public abstract android.app.FragmentTransaction replace(int, android.app.Fragment, java.lang.String);
- method public abstract android.app.FragmentTransaction setAllowOptimization(boolean);
+ method public abstract android.app.FragmentTransaction runOnCommit(java.lang.Runnable);
method public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(int);
method public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
method public abstract android.app.FragmentTransaction setBreadCrumbTitle(int);
@@ -4875,6 +4870,7 @@
method public abstract android.app.FragmentTransaction setCustomAnimations(int, int);
method public abstract android.app.FragmentTransaction setCustomAnimations(int, int, int, int);
method public abstract android.app.FragmentTransaction setPrimaryNavigationFragment(android.app.Fragment);
+ method public abstract android.app.FragmentTransaction setReorderingAllowed(boolean);
method public abstract android.app.FragmentTransaction setTransition(int);
method public abstract android.app.FragmentTransaction setTransitionStyle(int);
method public abstract android.app.FragmentTransaction show(android.app.Fragment);
@@ -4968,7 +4964,7 @@
method public final android.app.Activity getLastActivity();
method public final android.app.Instrumentation.ActivityResult getResult();
method public final boolean isBlocking();
- method public android.app.Instrumentation.ActivityResult onMatchIntent(android.content.Intent);
+ method public android.app.Instrumentation.ActivityResult onStartActivity(android.content.Intent);
method public final android.app.Activity waitForActivity();
method public final android.app.Activity waitForActivityWithTimeout(long);
}
@@ -4988,7 +4984,7 @@
public class KeyguardManager {
method public android.content.Intent createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence);
- method public void dismissKeyguard(android.app.Activity, android.app.KeyguardManager.KeyguardDismissCallback, android.os.Handler);
+ method public deprecated void dismissKeyguard(android.app.Activity, android.app.KeyguardManager.KeyguardDismissCallback, android.os.Handler);
method public deprecated void exitKeyguardSecurely(android.app.KeyguardManager.OnKeyguardExitResult);
method public boolean inKeyguardRestrictedInputMode();
method public boolean isDeviceLocked();
@@ -4996,6 +4992,7 @@
method public boolean isKeyguardLocked();
method public boolean isKeyguardSecure();
method public deprecated android.app.KeyguardManager.KeyguardLock newKeyguardLock(java.lang.String);
+ method public void requestDismissKeyguard(android.app.Activity, android.app.KeyguardManager.KeyguardDismissCallback);
}
public static abstract class KeyguardManager.KeyguardDismissCallback {
@@ -5137,13 +5134,16 @@
method public int describeContents();
method public int getBadgeIconType();
method public java.lang.String getChannel();
+ method public java.lang.String getChannelId();
method public java.lang.String getGroup();
+ method public int getGroupAlertBehavior();
method public android.graphics.drawable.Icon getLargeIcon();
method public java.lang.CharSequence getSettingsText();
method public java.lang.String getShortcutId();
method public android.graphics.drawable.Icon getSmallIcon();
method public java.lang.String getSortKey();
method public long getTimeout();
+ method public long getTimeoutAfter();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.media.AudioAttributes AUDIO_ATTRIBUTES_DEFAULT;
field public static final int BADGE_ICON_LARGE = 2; // 0x2
@@ -5213,6 +5213,9 @@
field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
field public static final deprecated int FLAG_SHOW_LIGHTS = 1; // 0x1
+ field public static final int GROUP_ALERT_ALL = 0; // 0x0
+ field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+ field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
field public static final java.lang.String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
field public static final deprecated int PRIORITY_DEFAULT = 0; // 0x0
field public static final deprecated int PRIORITY_HIGH = 1; // 0x1
@@ -5343,6 +5346,7 @@
method public android.app.Notification.Builder setBadgeIconType(int);
method public android.app.Notification.Builder setCategory(java.lang.String);
method public android.app.Notification.Builder setChannel(java.lang.String);
+ method public android.app.Notification.Builder setChannelId(java.lang.String);
method public android.app.Notification.Builder setChronometerCountDown(boolean);
method public android.app.Notification.Builder setColor(int);
method public android.app.Notification.Builder setColorized(boolean);
@@ -5359,6 +5363,7 @@
method public android.app.Notification.Builder setExtras(android.os.Bundle);
method public android.app.Notification.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
method public android.app.Notification.Builder setGroup(java.lang.String);
+ method public android.app.Notification.Builder setGroupAlertBehavior(int);
method public android.app.Notification.Builder setGroupSummary(boolean);
method public android.app.Notification.Builder setLargeIcon(android.graphics.Bitmap);
method public android.app.Notification.Builder setLargeIcon(android.graphics.drawable.Icon);
@@ -5386,6 +5391,7 @@
method public android.app.Notification.Builder setTicker(java.lang.CharSequence);
method public deprecated android.app.Notification.Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
method public android.app.Notification.Builder setTimeout(long);
+ method public android.app.Notification.Builder setTimeoutAfter(long);
method public android.app.Notification.Builder setUsesChronometer(boolean);
method public deprecated android.app.Notification.Builder setVibrate(long[]);
method public android.app.Notification.Builder setVisibility(int);
@@ -5547,7 +5553,6 @@
public final class NotificationChannel implements android.os.Parcelable {
ctor public NotificationChannel(java.lang.String, java.lang.CharSequence, int);
- ctor protected NotificationChannel(android.os.Parcel);
method public boolean canBypassDnd();
method public boolean canShowBadge();
method public int describeContents();
@@ -5582,7 +5587,6 @@
public final class NotificationChannelGroup implements android.os.Parcelable {
ctor public NotificationChannelGroup(java.lang.String, java.lang.CharSequence);
- ctor protected NotificationChannelGroup(android.os.Parcel);
method public android.app.NotificationChannelGroup clone();
method public int describeContents();
method public java.util.List<android.app.NotificationChannel> getChannels();
@@ -5706,16 +5710,29 @@
method public abstract void onSendFinished(android.app.PendingIntent, android.content.Intent, int, java.lang.String, android.os.Bundle);
}
- public final class PictureInPictureArgs implements android.os.Parcelable {
- ctor public PictureInPictureArgs();
- ctor public PictureInPictureArgs(float, java.util.List<android.app.RemoteAction>);
- method public android.app.PictureInPictureArgs clone();
+ public final deprecated class PictureInPictureArgs extends android.app.PictureInPictureParams {
+ ctor public deprecated PictureInPictureArgs();
+ ctor public deprecated PictureInPictureArgs(float, java.util.List<android.app.RemoteAction>);
+ method public deprecated void setActions(java.util.List<android.app.RemoteAction>);
+ method public deprecated void setAspectRatio(float);
+ method public deprecated void setSourceRectHint(android.graphics.Rect);
+ }
+
+ public class PictureInPictureParams implements android.os.Parcelable {
method public int describeContents();
- method public void setActions(java.util.List<android.app.RemoteAction>);
- method public void setAspectRatio(float);
- method public void setSourceRectHint(android.graphics.Rect);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.app.PictureInPictureArgs> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.PictureInPictureParams> CREATOR;
+ field protected android.util.Rational mAspectRatio;
+ field protected android.graphics.Rect mSourceRectHint;
+ field protected java.util.List<android.app.RemoteAction> mUserActions;
+ }
+
+ public static class PictureInPictureParams.Builder {
+ ctor public PictureInPictureParams.Builder();
+ method public android.app.PictureInPictureParams build();
+ method public android.app.PictureInPictureParams.Builder setActions(java.util.List<android.app.RemoteAction>);
+ method public android.app.PictureInPictureParams.Builder setAspectRatio(android.util.Rational);
+ method public android.app.PictureInPictureParams.Builder setSourceRectHint(android.graphics.Rect);
}
public class Presentation extends android.app.Dialog {
@@ -6113,17 +6130,6 @@
method public void onDetached();
}
- public final class WallpaperColors implements android.os.Parcelable {
- ctor public WallpaperColors(android.os.Parcel);
- ctor public WallpaperColors(java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>>);
- ctor public WallpaperColors(java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>>, boolean);
- method public int describeContents();
- method public java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>> getColors();
- method public boolean supportsDarkText();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.app.WallpaperColors> CREATOR;
- }
-
public final class WallpaperInfo implements android.os.Parcelable {
ctor public WallpaperInfo(android.content.Context, android.content.pm.ResolveInfo) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public int describeContents();
@@ -6146,8 +6152,6 @@
}
public class WallpaperManager {
- method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener);
- method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener, android.os.Handler);
method public void clear() throws java.io.IOException;
method public void clear(int) throws java.io.IOException;
method public void clearWallpaperOffsets(android.os.IBinder);
@@ -6162,7 +6166,6 @@
method public android.graphics.drawable.Drawable getDrawable();
method public android.graphics.drawable.Drawable getFastDrawable();
method public static android.app.WallpaperManager getInstance(android.content.Context);
- method public android.app.WallpaperColors getWallpaperColors(int);
method public android.os.ParcelFileDescriptor getWallpaperFile(int);
method public int getWallpaperId(int);
method public android.app.WallpaperInfo getWallpaperInfo();
@@ -6171,7 +6174,6 @@
method public boolean isWallpaperSupported();
method public android.graphics.drawable.Drawable peekDrawable();
method public android.graphics.drawable.Drawable peekFastDrawable();
- method public void removeOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener);
method public void sendWallpaperCommand(android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle);
method public void setBitmap(android.graphics.Bitmap) throws java.io.IOException;
method public int setBitmap(android.graphics.Bitmap, android.graphics.Rect, boolean) throws java.io.IOException;
@@ -6196,16 +6198,12 @@
field public static final java.lang.String WALLPAPER_PREVIEW_META_DATA = "android.wallpaper.preview";
}
- public static abstract interface WallpaperManager.OnColorsChangedListener {
- method public abstract void onColorsChanged(android.app.WallpaperColors, int);
- }
-
}
package android.app.admin {
public final class ConnectEvent extends android.app.admin.NetworkEvent implements android.os.Parcelable {
- method public java.lang.String getIpAddress();
+ method public java.net.InetAddress getInetAddress();
method public int getPort();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.admin.ConnectEvent> CREATOR;
@@ -6307,7 +6305,7 @@
method public int enableSystemApp(android.content.ComponentName, android.content.Intent);
method public java.lang.String[] getAccountTypesWithManagementDisabled();
method public java.util.List<android.content.ComponentName> getActiveAdmins();
- method public java.util.List<java.lang.String> getAffiliationIds(android.content.ComponentName);
+ method public java.util.Set<java.lang.String> getAffiliationIds(android.content.ComponentName);
method public java.lang.String getAlwaysOnVpnPackage(android.content.ComponentName);
method public android.os.Bundle getApplicationRestrictions(android.content.ComponentName, java.lang.String);
method public deprecated java.lang.String getApplicationRestrictionsManagingPackage(android.content.ComponentName);
@@ -6353,6 +6351,7 @@
method public int getPermissionGrantState(android.content.ComponentName, java.lang.String, java.lang.String);
method public int getPermissionPolicy(android.content.ComponentName);
method public java.util.List<java.lang.String> getPermittedAccessibilityServices(android.content.ComponentName);
+ method public java.util.List<java.lang.String> getPermittedCrossProfileNotificationListeners(android.content.ComponentName);
method public java.util.List<java.lang.String> getPermittedInputMethods(android.content.ComponentName);
method public long getRequiredStrongAuthTimeout(android.content.ComponentName);
method public boolean getScreenCaptureDisabled(android.content.ComponentName);
@@ -6400,7 +6399,7 @@
method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrievePreRebootSecurityLogs(android.content.ComponentName);
method public java.util.List<android.app.admin.SecurityLog.SecurityEvent> retrieveSecurityLogs(android.content.ComponentName);
method public void setAccountManagementDisabled(android.content.ComponentName, java.lang.String, boolean);
- method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>);
+ method public void setAffiliationIds(android.content.ComponentName, java.util.Set<java.lang.String>);
method public void setAlwaysOnVpnPackage(android.content.ComponentName, java.lang.String, boolean) throws android.content.pm.PackageManager.NameNotFoundException, java.lang.UnsupportedOperationException;
method public boolean setApplicationHidden(android.content.ComponentName, java.lang.String, boolean);
method public void setApplicationRestrictions(android.content.ComponentName, java.lang.String, android.os.Bundle);
@@ -6439,6 +6438,7 @@
method public boolean setPermissionGrantState(android.content.ComponentName, java.lang.String, java.lang.String, int);
method public void setPermissionPolicy(android.content.ComponentName, int);
method public boolean setPermittedAccessibilityServices(android.content.ComponentName, java.util.List<java.lang.String>);
+ method public boolean setPermittedCrossProfileNotificationListeners(android.content.ComponentName, java.util.List<java.lang.String>);
method public boolean setPermittedInputMethods(android.content.ComponentName, java.util.List<java.lang.String>);
method public void setProfileEnabled(android.content.ComponentName);
method public void setProfileName(android.content.ComponentName, java.lang.String);
@@ -6520,7 +6520,7 @@
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SECURITY_TYPE = "android.app.extra.PROVISIONING_WIFI_SECURITY_TYPE";
field public static final java.lang.String EXTRA_PROVISIONING_WIFI_SSID = "android.app.extra.PROVISIONING_WIFI_SSID";
field public static final java.lang.String EXTRA_RESTRICTION = "android.app.extra.RESTRICTION";
- field public static final int FLAG_EVICT_CE_KEY = 1; // 0x1
+ field public static final int FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY = 1; // 0x1
field public static final int FLAG_MANAGED_CAN_ACCESS_PARENT = 2; // 0x2
field public static final int FLAG_PARENT_CAN_ACCESS_MANAGED = 1; // 0x1
field public static final int KEYGUARD_DISABLE_FEATURES_ALL = 2147483647; // 0x7fffffff
@@ -6558,8 +6558,8 @@
public final class DnsEvent extends android.app.admin.NetworkEvent implements android.os.Parcelable {
method public java.lang.String getHostname();
- method public java.lang.String[] getIpAddresses();
- method public int getIpAddressesCount();
+ method public java.util.List<java.net.InetAddress> getInetAddresses();
+ method public int getTotalResolvedAddressCount();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.admin.DnsEvent> CREATOR;
}
@@ -6730,7 +6730,6 @@
public abstract class BackupAgent extends android.content.ContextWrapper {
ctor public BackupAgent();
method public final void fullBackupFile(java.io.File, android.app.backup.FullBackupDataOutput);
- method public long getBackupQuota();
method public abstract void onBackup(android.os.ParcelFileDescriptor, android.app.backup.BackupDataOutput, android.os.ParcelFileDescriptor) throws java.io.IOException;
method public void onCreate();
method public void onDestroy();
@@ -6765,6 +6764,7 @@
}
public class BackupDataOutput {
+ method public long getQuota();
method public int writeEntityData(byte[], int) throws java.io.IOException;
method public int writeEntityHeader(java.lang.String, int) throws java.io.IOException;
}
@@ -6793,6 +6793,7 @@
}
public class FullBackupDataOutput {
+ method public long getQuota();
}
public abstract class RestoreObserver {
@@ -7018,8 +7019,8 @@
public final class StorageStats implements android.os.Parcelable {
method public int describeContents();
+ method public long getAppBytes();
method public long getCacheBytes();
- method public long getCodeBytes();
method public long getDataBytes();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.usage.StorageStats> CREATOR;
@@ -7628,6 +7629,7 @@
method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback);
method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int);
method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int, int);
+ method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int, int, android.os.Handler);
method public boolean createBond();
method public android.bluetooth.BluetoothSocket createInsecureRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException;
method public android.bluetooth.BluetoothSocket createRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException;
@@ -8052,7 +8054,7 @@
method public void setAdvertisingData(android.bluetooth.le.AdvertiseData);
method public void setAdvertisingParameters(android.bluetooth.le.AdvertisingSetParameters);
method public void setPeriodicAdvertisingData(android.bluetooth.le.AdvertiseData);
- method public void setPeriodicAdvertisingEnable(boolean);
+ method public void setPeriodicAdvertisingEnabled(boolean);
method public void setPeriodicAdvertisingParameters(android.bluetooth.le.PeriodicAdvertisingParameters);
method public void setScanResponseData(android.bluetooth.le.AdvertiseData);
}
@@ -8227,8 +8229,10 @@
field public static final android.os.Parcelable.Creator<android.bluetooth.le.ScanResult> CREATOR;
field public static final int DATA_COMPLETE = 0; // 0x0
field public static final int DATA_TRUNCATED = 2; // 0x2
+ field public static final int PERIODIC_INTERVAL_NOT_PRESENT = 0; // 0x0
field public static final int PHY_UNUSED = 0; // 0x0
field public static final int SID_NOT_PRESENT = 255; // 0xff
+ field public static final int TX_POWER_NOT_PRESENT = 127; // 0x7f
}
public final class ScanSettings implements android.os.Parcelable {
@@ -8299,21 +8303,21 @@
method public android.companion.BluetoothDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
}
- public final class BluetoothLEDeviceFilter implements android.companion.DeviceFilter {
+ public final class BluetoothLeDeviceFilter implements android.companion.DeviceFilter {
method public int describeContents();
method public static int getRenamePrefixLengthLimit();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.companion.BluetoothLEDeviceFilter> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.companion.BluetoothLeDeviceFilter> CREATOR;
}
- public static final class BluetoothLEDeviceFilter.Builder {
- ctor public BluetoothLEDeviceFilter.Builder();
- method public android.companion.BluetoothLEDeviceFilter build();
- method public android.companion.BluetoothLEDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
- method public android.companion.BluetoothLEDeviceFilter.Builder setRawDataFilter(byte[], byte[]);
- method public android.companion.BluetoothLEDeviceFilter.Builder setRenameFromBytes(java.lang.String, java.lang.String, int, int, boolean);
- method public android.companion.BluetoothLEDeviceFilter.Builder setRenameFromName(java.lang.String, java.lang.String, int, int);
- method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
+ public static final class BluetoothLeDeviceFilter.Builder {
+ ctor public BluetoothLeDeviceFilter.Builder();
+ method public android.companion.BluetoothLeDeviceFilter build();
+ method public android.companion.BluetoothLeDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
+ method public android.companion.BluetoothLeDeviceFilter.Builder setRawDataFilter(byte[], byte[]);
+ method public android.companion.BluetoothLeDeviceFilter.Builder setRenameFromBytes(java.lang.String, java.lang.String, int, int, java.nio.ByteOrder);
+ method public android.companion.BluetoothLeDeviceFilter.Builder setRenameFromName(java.lang.String, java.lang.String, int, int);
+ method public android.companion.BluetoothLeDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
}
public final class CompanionDeviceManager {
@@ -8449,7 +8453,7 @@
ctor public ClipData(android.content.ClipDescription, android.content.ClipData.Item);
ctor public ClipData(android.content.ClipData);
method public void addItem(android.content.ClipData.Item);
- method public void addItem(android.content.ClipData.Item, android.content.ContentResolver);
+ method public void addItem(android.content.ContentResolver, android.content.ClipData.Item);
method public int describeContents();
method public android.content.ClipDescription getDescription();
method public android.content.ClipData.Item getItemAt(int);
@@ -8748,17 +8752,17 @@
field public static final java.lang.String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
field public static final java.lang.String EXTRA_REFRESH_SUPPORTED = "android.content.extra.REFRESH_SUPPORTED";
field public static final java.lang.String EXTRA_SIZE = "android.content.extra.SIZE";
- field public static final java.lang.String EXTRA_TOTAL_SIZE = "android.content.extra.TOTAL_SIZE";
+ field public static final java.lang.String EXTRA_TOTAL_COUNT = "android.content.extra.TOTAL_COUNT";
field public static final int NOTIFY_SKIP_NOTIFY_FOR_DESCENDANTS = 2; // 0x2
field public static final int NOTIFY_SYNC_TO_NETWORK = 1; // 0x1
- field public static final java.lang.String QUERY_ARG_LIMIT = "android:query-page-limit";
- field public static final java.lang.String QUERY_ARG_OFFSET = "android:query-page-offset";
- field public static final java.lang.String QUERY_ARG_SORT_COLLATION = "android:query-sort-collation";
- field public static final java.lang.String QUERY_ARG_SORT_COLUMNS = "android:query-sort-columns";
- field public static final java.lang.String QUERY_ARG_SORT_DIRECTION = "android:query-sort-direction";
- field public static final java.lang.String QUERY_ARG_SQL_SELECTION = "android:query-sql-selection";
- field public static final java.lang.String QUERY_ARG_SQL_SELECTION_ARGS = "android:query-sql-selection-args";
- field public static final java.lang.String QUERY_ARG_SQL_SORT_ORDER = "android:query-sql-sort-order";
+ field public static final java.lang.String QUERY_ARG_LIMIT = "android:query-arg-limit";
+ field public static final java.lang.String QUERY_ARG_OFFSET = "android:query-arg-offset";
+ field public static final java.lang.String QUERY_ARG_SORT_COLLATION = "android:query-arg-sort-collation";
+ field public static final java.lang.String QUERY_ARG_SORT_COLUMNS = "android:query-arg-sort-columns";
+ field public static final java.lang.String QUERY_ARG_SORT_DIRECTION = "android:query-arg-sort-direction";
+ field public static final java.lang.String QUERY_ARG_SQL_SELECTION = "android:query-arg-sql-selection";
+ field public static final java.lang.String QUERY_ARG_SQL_SELECTION_ARGS = "android:query-arg-sql-selection-args";
+ field public static final java.lang.String QUERY_ARG_SQL_SORT_ORDER = "android:query-arg-sql-sort-order";
field public static final int QUERY_SORT_DIRECTION_ASCENDING = 0; // 0x0
field public static final int QUERY_SORT_DIRECTION_DESCENDING = 1; // 0x1
field public static final java.lang.String SCHEME_ANDROID_RESOURCE = "android.resource";
@@ -8967,7 +8971,7 @@
field public static final java.lang.String CAPTIONING_SERVICE = "captioning";
field public static final java.lang.String CARRIER_CONFIG_SERVICE = "carrier_config";
field public static final java.lang.String CLIPBOARD_SERVICE = "clipboard";
- field public static final java.lang.String COMPANION_DEVICE_SERVICE = "companion_device";
+ field public static final java.lang.String COMPANION_DEVICE_SERVICE = "companiondevice";
field public static final java.lang.String CONNECTIVITY_SERVICE = "connectivity";
field public static final java.lang.String CONSUMER_IR_SERVICE = "consumer_ir";
field public static final int CONTEXT_IGNORE_SECURITY = 2; // 0x2
@@ -8981,7 +8985,6 @@
field public static final java.lang.String HARDWARE_PROPERTIES_SERVICE = "hardware_properties";
field public static final java.lang.String INPUT_METHOD_SERVICE = "input_method";
field public static final java.lang.String INPUT_SERVICE = "input";
- field public static final java.lang.String IPSEC_SERVICE = "ipsec";
field public static final java.lang.String JOB_SCHEDULER_SERVICE = "jobscheduler";
field public static final java.lang.String KEYGUARD_SERVICE = "keyguard";
field public static final java.lang.String LAUNCHER_APPS_SERVICE = "launcherapps";
@@ -9359,15 +9362,12 @@
field public static final java.lang.String ACTION_CAMERA_BUTTON = "android.intent.action.CAMERA_BUTTON";
field public static final java.lang.String ACTION_CARRIER_SETUP = "android.intent.action.CARRIER_SETUP";
field public static final java.lang.String ACTION_CHOOSER = "android.intent.action.CHOOSER";
- field public static final java.lang.String ACTION_CLEAR_PACKAGE = "android.intent.action.CLEAR_PACKAGE";
field public static final java.lang.String ACTION_CLOSE_SYSTEM_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS";
field public static final java.lang.String ACTION_CONFIGURATION_CHANGED = "android.intent.action.CONFIGURATION_CHANGED";
field public static final java.lang.String ACTION_CREATE_DOCUMENT = "android.intent.action.CREATE_DOCUMENT";
field public static final java.lang.String ACTION_CREATE_SHORTCUT = "android.intent.action.CREATE_SHORTCUT";
field public static final java.lang.String ACTION_DATE_CHANGED = "android.intent.action.DATE_CHANGED";
field public static final java.lang.String ACTION_DEFAULT = "android.intent.action.VIEW";
- field public static final java.lang.String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED = "android.intent.action.ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED";
- field public static final java.lang.String ACTION_DEFAULT_SUBSCRIPTION_CHANGED = "android.intent.action.ACTION_DEFAULT_SUBSCRIPTION_CHANGED";
field public static final java.lang.String ACTION_DELETE = "android.intent.action.DELETE";
field public static final deprecated java.lang.String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
field public static final deprecated java.lang.String ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK";
@@ -9525,6 +9525,7 @@
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_COMPONENT_NAME = "android.intent.extra.COMPONENT_NAME";
field public static final java.lang.String EXTRA_CONTENT_ANNOTATIONS = "android.intent.extra.CONTENT_ANNOTATIONS";
field public static final java.lang.String EXTRA_DATA_REMOVED = "android.intent.extra.DATA_REMOVED";
field public static final java.lang.String EXTRA_DOCK_STATE = "android.intent.extra.DOCK_STATE";
@@ -9570,7 +9571,6 @@
field public static final java.lang.String EXTRA_SHUTDOWN_USERSPACE_ONLY = "android.intent.extra.SHUTDOWN_USERSPACE_ONLY";
field public static final java.lang.String EXTRA_STREAM = "android.intent.extra.STREAM";
field public static final java.lang.String EXTRA_SUBJECT = "android.intent.extra.SUBJECT";
- field public static final java.lang.String EXTRA_SUBSCRIPTION_INDEX = "android.intent.extra.SUBSCRIPTION_INDEX";
field public static final java.lang.String EXTRA_TEMPLATE = "android.intent.extra.TEMPLATE";
field public static final java.lang.String EXTRA_TEXT = "android.intent.extra.TEXT";
field public static final java.lang.String EXTRA_TITLE = "android.intent.extra.TITLE";
@@ -10350,7 +10350,7 @@
field public java.lang.String[] splitPublicSourceDirs;
field public java.lang.String[] splitSourceDirs;
field public java.lang.String targetPackage;
- field public java.lang.String targetProcess;
+ field public java.lang.String targetProcesses;
}
public class LabeledIntent extends android.content.Intent {
@@ -11076,7 +11076,7 @@
ctor public VersionedPackage(java.lang.String, int);
method public int describeContents();
method public java.lang.String getPackageName();
- method public long getVersionCode();
+ method public int getVersionCode();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.VersionedPackage> CREATOR;
}
@@ -13322,7 +13322,7 @@
method public void setFilterBitmap(boolean);
method public void setFlags(int);
method public void setFontFeatureSettings(java.lang.String);
- method public boolean setFontVariationSettings(java.lang.String) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
+ method public boolean setFontVariationSettings(java.lang.String);
method public void setHinting(int);
method public void setLetterSpacing(float);
method public void setLinearText(boolean);
@@ -13798,6 +13798,7 @@
method public void detachFromGLContext();
method public long getTimestamp();
method public void getTransformMatrix(float[]);
+ method public boolean isReleased();
method public void release();
method public void releaseTexImage();
method public void setDefaultBufferSize(int, int);
@@ -13821,7 +13822,6 @@
}
public class Typeface {
- method public static deprecated void create(android.graphics.fonts.FontRequest, android.graphics.Typeface.FontRequestCallback);
method public static android.graphics.Typeface create(java.lang.String, int);
method public static android.graphics.Typeface create(android.graphics.Typeface, int);
method public static android.graphics.Typeface createFromAsset(android.content.res.AssetManager, java.lang.String);
@@ -13849,24 +13849,13 @@
ctor public Typeface.Builder(android.content.res.AssetManager, java.lang.String);
method public android.graphics.Typeface build();
method public android.graphics.Typeface.Builder setFallback(java.lang.String);
- method public android.graphics.Typeface.Builder setFontVariationSettings(java.lang.String) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
+ method public android.graphics.Typeface.Builder setFontVariationSettings(java.lang.String);
method public android.graphics.Typeface.Builder setFontVariationSettings(android.graphics.fonts.FontVariationAxis[]);
method public android.graphics.Typeface.Builder setItalic(boolean);
method public android.graphics.Typeface.Builder setTtcIndex(int);
method public android.graphics.Typeface.Builder setWeight(int);
}
- public static abstract deprecated interface Typeface.FontRequestCallback {
- method public abstract void onTypefaceRequestFailed(int);
- method public abstract void onTypefaceRetrieved(android.graphics.Typeface);
- field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
- field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
- field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
- field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
- field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
- field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
- }
-
public class Xfermode {
ctor public Xfermode();
}
@@ -14447,30 +14436,14 @@
package android.graphics.fonts {
- public final class FontRequest implements android.os.Parcelable {
- ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String);
- ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String, java.util.List<java.util.List<byte[]>>);
- method public int describeContents();
- method public java.util.List<java.util.List<byte[]>> getCertificates();
- method public java.lang.String getProviderAuthority();
- method public java.lang.String getProviderPackage();
- method public java.lang.String getQuery();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.graphics.fonts.FontRequest> CREATOR;
- }
-
public final class FontVariationAxis {
- ctor public FontVariationAxis(java.lang.String, float) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
- method public static android.graphics.fonts.FontVariationAxis[] fromFontVariationSettings(java.lang.String) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
+ ctor public FontVariationAxis(java.lang.String, float);
+ method public static android.graphics.fonts.FontVariationAxis[] fromFontVariationSettings(java.lang.String);
method public float getStyleValue();
method public java.lang.String getTag();
method public static java.lang.String toFontVariationSettings(android.graphics.fonts.FontVariationAxis[]);
}
- public static class FontVariationAxis.InvalidFormatException extends java.lang.Exception {
- ctor public FontVariationAxis.InvalidFormatException(java.lang.String);
- }
-
}
package android.graphics.pdf {
@@ -14558,7 +14531,7 @@
method public final void takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback);
method public final void unlock();
field public static final java.lang.String ACTION_NEW_PICTURE = "android.hardware.action.NEW_PICTURE";
- field public static final deprecated java.lang.String ACTION_NEW_VIDEO = "android.hardware.action.NEW_VIDEO";
+ field public static final java.lang.String ACTION_NEW_VIDEO = "android.hardware.action.NEW_VIDEO";
field public static final int CAMERA_ERROR_EVICTED = 2; // 0x2
field public static final int CAMERA_ERROR_SERVER_DIED = 100; // 0x64
field public static final int CAMERA_ERROR_UNKNOWN = 1; // 0x1
@@ -14819,18 +14792,16 @@
field public static final int RGBX_8888 = 2; // 0x2
field public static final int RGB_565 = 4; // 0x4
field public static final int RGB_888 = 3; // 0x3
- field public static final long USAGE0_CPU_READ = 2L; // 0x2L
- field public static final long USAGE0_CPU_READ_OFTEN = 6L; // 0x6L
- field public static final long USAGE0_CPU_WRITE = 32L; // 0x20L
- field public static final long USAGE0_CPU_WRITE_OFTEN = 96L; // 0x60L
- field public static final long USAGE0_GPU_COLOR_OUTPUT = 2048L; // 0x800L
- field public static final long USAGE0_GPU_CUBEMAP = 8192L; // 0x2000L
- field public static final long USAGE0_GPU_DATA_BUFFER = 16384L; // 0x4000L
- field public static final long USAGE0_GPU_SAMPLED_IMAGE = 1024L; // 0x400L
- field public static final long USAGE0_GPU_STORAGE_IMAGE = 3072L; // 0xc00L
- field public static final long USAGE0_PROTECTED_CONTENT = 262144L; // 0x40000L
- field public static final long USAGE0_SENSOR_DIRECT_DATA = 536870912L; // 0x20000000L
- field public static final long USAGE0_VIDEO_ENCODE = 2097152L; // 0x200000L
+ field public static final long USAGE_CPU_READ_OFTEN = 3L; // 0x3L
+ field public static final long USAGE_CPU_READ_RARELY = 2L; // 0x2L
+ field public static final long USAGE_CPU_WRITE_OFTEN = 48L; // 0x30L
+ field public static final long USAGE_CPU_WRITE_RARELY = 32L; // 0x20L
+ field public static final long USAGE_GPU_COLOR_OUTPUT = 512L; // 0x200L
+ field public static final long USAGE_GPU_DATA_BUFFER = 16777216L; // 0x1000000L
+ field public static final long USAGE_GPU_SAMPLED_IMAGE = 256L; // 0x100L
+ field public static final long USAGE_PROTECTED_CONTENT = 16384L; // 0x4000L
+ field public static final long USAGE_SENSOR_DIRECT_DATA = 8388608L; // 0x800000L
+ field public static final long USAGE_VIDEO_ENCODE = 65536L; // 0x10000L
}
public final class Sensor {
@@ -19333,9 +19304,9 @@
method protected final void computeGregorianFields(int);
method protected int computeGregorianMonthStart(int, int);
method protected int computeJulianDay();
- method protected int computeMillisInDay();
+ method protected deprecated int computeMillisInDay();
method protected void computeTime();
- method protected int computeZoneOffset(long, int);
+ method protected deprecated int computeZoneOffset(long, int);
method public int fieldDifference(java.util.Date, int);
method protected java.lang.String fieldName(int);
method protected static final long floorDivide(long, long);
@@ -21135,6 +21106,7 @@
method public android.media.AudioFocusRequest.Builder setAcceptsDelayedFocusGain(boolean);
method public android.media.AudioFocusRequest.Builder setAudioAttributes(android.media.AudioAttributes);
method public android.media.AudioFocusRequest.Builder setFocusGain(int);
+ method public android.media.AudioFocusRequest.Builder setOnAudioFocusChangeListener(android.media.AudioManager.OnAudioFocusChangeListener);
method public android.media.AudioFocusRequest.Builder setOnAudioFocusChangeListener(android.media.AudioManager.OnAudioFocusChangeListener, android.os.Handler);
method public android.media.AudioFocusRequest.Builder setWillPauseWhenDucked(boolean);
}
@@ -23754,7 +23726,7 @@
public static final class VolumeShaper.Configuration implements android.os.Parcelable {
method public int describeContents();
- method public double getDurationMillis();
+ method public long getDuration();
method public int getInterpolatorType();
method public static int getMaximumCurvePoints();
method public float[] getTimes();
@@ -23780,7 +23752,7 @@
method public android.media.VolumeShaper.Configuration.Builder scaleToEndVolume(float);
method public android.media.VolumeShaper.Configuration.Builder scaleToStartVolume(float);
method public android.media.VolumeShaper.Configuration.Builder setCurve(float[], float[]);
- method public android.media.VolumeShaper.Configuration.Builder setDurationMillis(double);
+ method public android.media.VolumeShaper.Configuration.Builder setDuration(long);
method public android.media.VolumeShaper.Configuration.Builder setInterpolatorType(int);
}
@@ -24895,7 +24867,6 @@
}
public static final class TvContract.WatchNextPrograms implements android.media.tv.TvContract.BaseTvColumns {
- ctor public TvContract.WatchNextPrograms();
field public static final int ASPECT_RATIO_16_9 = 0; // 0x0
field public static final int ASPECT_RATIO_1_1 = 3; // 0x3
field public static final int ASPECT_RATIO_2_3 = 4; // 0x4
@@ -25525,8 +25496,8 @@
method public boolean requestBandwidthUpdate(android.net.Network);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
- method public void requestNetwork(android.net.NetworkRequest, int, android.net.ConnectivityManager.NetworkCallback);
- method public void requestNetwork(android.net.NetworkRequest, int, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
+ method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, int);
+ method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, android.os.Handler, int);
method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent);
method public deprecated void setNetworkPreference(int);
method public static deprecated boolean setProcessDefaultNetwork(android.net.Network);
@@ -25611,66 +25582,6 @@
field public static final android.os.Parcelable.Creator<android.net.IpPrefix> CREATOR;
}
- public final class IpSecAlgorithm implements android.os.Parcelable {
- ctor public IpSecAlgorithm(java.lang.String, byte[]);
- ctor public IpSecAlgorithm(java.lang.String, byte[], int);
- method public int describeContents();
- method public byte[] getKey();
- method public java.lang.String getName();
- method public int getTruncationLengthBits();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final java.lang.String AUTH_HMAC_MD5 = "hmac(md5)";
- field public static final java.lang.String AUTH_HMAC_SHA1 = "hmac(sha1)";
- field public static final java.lang.String AUTH_HMAC_SHA256 = "hmac(sha256)";
- field public static final java.lang.String AUTH_HMAC_SHA384 = "hmac(sha384)";
- field public static final java.lang.String AUTH_HMAC_SHA512 = "hmac(sha512)";
- field public static final android.os.Parcelable.Creator<android.net.IpSecAlgorithm> CREATOR;
- field public static final java.lang.String CRYPT_AES_CBC = "cbc(aes)";
- }
-
- public final class IpSecManager {
- method public void applyTransportModeTransform(java.io.FileDescriptor, android.net.IpSecTransform) throws java.io.IOException;
- method public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket(int) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
- method public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket() throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
- method public void removeTransportModeTransform(java.io.FileDescriptor, android.net.IpSecTransform) throws java.io.IOException;
- method public android.net.IpSecManager.SecurityParameterIndex reserveSecurityParameterIndex(int, java.net.InetAddress) throws android.net.IpSecManager.ResourceUnavailableException;
- method public android.net.IpSecManager.SecurityParameterIndex reserveSecurityParameterIndex(int, java.net.InetAddress, int) throws android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
- field public static final int INVALID_SECURITY_PARAMETER_INDEX = 0; // 0x0
- }
-
- public static final class IpSecManager.ResourceUnavailableException extends android.util.AndroidException {
- }
-
- public static final class IpSecManager.SecurityParameterIndex implements java.lang.AutoCloseable {
- method public void close();
- method public int getSpi();
- }
-
- public static final class IpSecManager.SpiUnavailableException extends android.util.AndroidException {
- method public int getSpi();
- }
-
- public static final class IpSecManager.UdpEncapsulationSocket implements java.lang.AutoCloseable {
- method public void close() throws java.io.IOException;
- method public int getPort();
- method public java.io.FileDescriptor getSocket();
- }
-
- public final class IpSecTransform implements java.lang.AutoCloseable {
- method public void close();
- field public static final int DIRECTION_IN = 0; // 0x0
- field public static final int DIRECTION_OUT = 1; // 0x1
- }
-
- public static class IpSecTransform.Builder {
- ctor public IpSecTransform.Builder(android.content.Context);
- method public android.net.IpSecTransform buildTransportModeTransform(java.net.InetAddress) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
- method public android.net.IpSecTransform.Builder setAuthentication(int, android.net.IpSecAlgorithm);
- method public android.net.IpSecTransform.Builder setEncryption(int, android.net.IpSecAlgorithm);
- method public android.net.IpSecTransform.Builder setIpv4Encapsulation(android.net.IpSecManager.UdpEncapsulationSocket, int);
- method public android.net.IpSecTransform.Builder setSpi(int, android.net.IpSecManager.SecurityParameterIndex);
- }
-
public class LinkAddress implements android.os.Parcelable {
method public int describeContents();
method public java.net.InetAddress getAddress();
@@ -26848,10 +26759,10 @@
field public static final android.os.Parcelable.Creator<android.net.wifi.aware.Characteristics> CREATOR;
}
- public class DiscoverySession {
+ public class DiscoverySession implements java.lang.AutoCloseable {
+ method public void close();
method public android.net.NetworkSpecifier createNetworkSpecifierOpen(android.net.wifi.aware.PeerHandle);
method public android.net.NetworkSpecifier createNetworkSpecifierPassphrase(android.net.wifi.aware.PeerHandle, java.lang.String);
- method public void destroy();
method public void sendMessage(android.net.wifi.aware.PeerHandle, int, byte[]);
}
@@ -26903,8 +26814,6 @@
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.aware.SubscribeConfig> CREATOR;
- field public static final int MATCH_STYLE_ALL = 1; // 0x1
- field public static final int MATCH_STYLE_FIRST_ONLY = 0; // 0x0
field public static final int SUBSCRIBE_TYPE_ACTIVE = 1; // 0x1
field public static final int SUBSCRIBE_TYPE_PASSIVE = 0; // 0x0
}
@@ -26913,7 +26822,6 @@
ctor public SubscribeConfig.Builder();
method public android.net.wifi.aware.SubscribeConfig build();
method public android.net.wifi.aware.SubscribeConfig.Builder setMatchFilter(java.util.List<byte[]>);
- method public android.net.wifi.aware.SubscribeConfig.Builder setMatchStyle(int);
method public android.net.wifi.aware.SubscribeConfig.Builder setServiceName(java.lang.String);
method public android.net.wifi.aware.SubscribeConfig.Builder setServiceSpecificInfo(byte[]);
method public android.net.wifi.aware.SubscribeConfig.Builder setSubscribeType(int);
@@ -26935,10 +26843,10 @@
field public static final int WIFI_AWARE_DATA_PATH_ROLE_RESPONDER = 1; // 0x1
}
- public class WifiAwareSession {
+ public class WifiAwareSession implements java.lang.AutoCloseable {
+ method public void close();
method public android.net.NetworkSpecifier createNetworkSpecifierOpen(int, byte[]);
method public android.net.NetworkSpecifier createNetworkSpecifierPassphrase(int, byte[], java.lang.String);
- method public void destroy();
method public void publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler);
method public void subscribe(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler);
}
@@ -30868,7 +30776,6 @@
method public android.util.SizeF getSizeF(java.lang.String);
method public <T extends android.os.Parcelable> android.util.SparseArray<T> getSparseParcelableArray(java.lang.String);
method public java.util.ArrayList<java.lang.String> getStringArrayList(java.lang.String);
- method public java.util.UUID getUuid(java.lang.String);
method public boolean hasFileDescriptors();
method public void putAll(android.os.Bundle);
method public void putBinder(java.lang.String, android.os.IBinder);
@@ -30893,7 +30800,6 @@
method public void putSizeF(java.lang.String, android.util.SizeF);
method public void putSparseParcelableArray(java.lang.String, android.util.SparseArray<? extends android.os.Parcelable>);
method public void putStringArrayList(java.lang.String, java.util.ArrayList<java.lang.String>);
- method public void putUuid(java.lang.String, java.util.UUID);
method public void readFromParcel(android.os.Parcel);
method public void setClassLoader(java.lang.ClassLoader);
method public void writeToParcel(android.os.Parcel, int);
@@ -31444,7 +31350,6 @@
method public final <T> void readTypedArray(T[], android.os.Parcelable.Creator<T>);
method public final <T> void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>);
method public final <T> T readTypedObject(android.os.Parcelable.Creator<T>);
- method public final java.util.UUID readUuid();
method public final java.lang.Object readValue(java.lang.ClassLoader);
method public final void recycle();
method public final void setDataCapacity(int);
@@ -31490,7 +31395,6 @@
method public final <T extends android.os.Parcelable> void writeTypedArray(T[], int);
method public final <T extends android.os.Parcelable> void writeTypedList(java.util.List<T>);
method public final <T extends android.os.Parcelable> void writeTypedObject(T, int);
- method public final void writeUuid(java.util.UUID);
method public final void writeValue(java.lang.Object);
field public static final android.os.Parcelable.Creator<java.lang.String> STRING_CREATOR;
}
@@ -31897,6 +31801,7 @@
field public static final java.lang.String DISALLOW_APPS_CONTROL = "no_control_apps";
field public static final java.lang.String DISALLOW_AUTOFILL = "no_autofill";
field public static final java.lang.String DISALLOW_BLUETOOTH = "no_bluetooth";
+ field public static final java.lang.String DISALLOW_BLUETOOTH_SHARING = "no_bluetooth_sharing";
field public static final java.lang.String DISALLOW_CONFIG_BLUETOOTH = "no_config_bluetooth";
field public static final java.lang.String DISALLOW_CONFIG_CELL_BROADCASTS = "no_config_cell_broadcasts";
field public static final java.lang.String DISALLOW_CONFIG_CREDENTIALS = "no_config_credentials";
@@ -32125,9 +32030,9 @@
}
public class StorageManager {
- method public void allocateBytes(java.util.UUID, long, int) throws java.io.IOException;
- method public void allocateBytes(java.io.FileDescriptor, long, int) throws java.io.IOException;
- method public long getAllocatableBytes(java.util.UUID, int) throws java.io.IOException;
+ method public void allocateBytes(java.util.UUID, long) throws java.io.IOException;
+ method public void allocateBytes(java.io.FileDescriptor, long) throws java.io.IOException;
+ method public long getAllocatableBytes(java.util.UUID) throws java.io.IOException;
method public long getCacheQuotaBytes(java.util.UUID) throws java.io.IOException;
method public long getCacheSizeBytes(java.util.UUID) throws java.io.IOException;
method public java.lang.String getMountedObbPath(java.lang.String);
@@ -32140,7 +32045,6 @@
method public boolean isEncrypted(java.io.File);
method public boolean isObbMounted(java.lang.String);
method public boolean mountObb(java.lang.String, java.lang.String, android.os.storage.OnObbStateChangeListener);
- method public android.os.ParcelFileDescriptor openProxyFileDescriptor(int, android.os.ProxyFileDescriptorCallback) throws java.io.IOException;
method public android.os.ParcelFileDescriptor openProxyFileDescriptor(int, android.os.ProxyFileDescriptorCallback, android.os.Handler) throws java.io.IOException;
method public void setCacheBehaviorGroup(java.io.File, boolean) throws java.io.IOException;
method public void setCacheBehaviorTombstone(java.io.File, boolean) throws java.io.IOException;
@@ -32148,7 +32052,6 @@
field public static final java.lang.String ACTION_MANAGE_STORAGE = "android.os.storage.action.MANAGE_STORAGE";
field public static final java.lang.String EXTRA_REQUESTED_BYTES = "android.os.storage.extra.REQUESTED_BYTES";
field public static final java.lang.String EXTRA_UUID = "android.os.storage.extra.UUID";
- field public static final int FLAG_ALLOCATE_AGGRESSIVE = 1; // 0x1
field public static final java.util.UUID UUID_DEFAULT;
}
@@ -34632,11 +34535,19 @@
method public final int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
}
+ public final class FontRequest {
+ ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String);
+ ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String, java.util.List<java.util.List<byte[]>>);
+ method public java.util.List<java.util.List<byte[]>> getCertificates();
+ method public java.lang.String getProviderAuthority();
+ method public java.lang.String getProviderPackage();
+ method public java.lang.String getQuery();
+ }
+
public class FontsContract {
- method public static android.graphics.Typeface buildTypeface(android.content.Context, android.os.CancellationSignal, android.provider.FontsContract.FontInfo[], int, boolean, java.lang.String);
method public static android.graphics.Typeface buildTypeface(android.content.Context, android.os.CancellationSignal, android.provider.FontsContract.FontInfo[]);
- method public static android.provider.FontsContract.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal, android.graphics.fonts.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
- method public static void requestFont(android.content.Context, android.graphics.fonts.FontRequest, android.provider.FontsContract.FontRequestCallback, android.os.Handler);
+ method public static android.provider.FontsContract.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal, android.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static void requestFonts(android.content.Context, android.provider.FontRequest, android.os.Handler, android.os.CancellationSignal, android.provider.FontsContract.FontRequestCallback);
}
public static final class FontsContract.Columns implements android.provider.BaseColumns {
@@ -35082,6 +34993,7 @@
field public static final java.lang.String ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS";
field public static final java.lang.String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS";
field public static final java.lang.String ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
+ field public static final java.lang.String ACTION_REQUEST_SET_AUTOFILL_SERVICE = "android.settings.REQUEST_SET_AUTOFILL_SERVICE";
field public static final java.lang.String ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS";
field public static final java.lang.String ACTION_SECURITY_SETTINGS = "android.settings.SECURITY_SETTINGS";
field public static final java.lang.String ACTION_SETTINGS = "android.settings.SETTINGS";
@@ -37190,15 +37102,12 @@
public abstract class AutofillService extends android.app.Service {
ctor public AutofillService();
- method public final deprecated void disableSelf();
method public final android.service.autofill.FillEventHistory getFillEventHistory();
method public final android.os.IBinder onBind(android.content.Intent);
method public void onConnected();
method public void onDisconnected();
- method public void onFillRequest(android.service.autofill.FillRequest, android.os.CancellationSignal, android.service.autofill.FillCallback);
- method public abstract deprecated void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, int, android.os.CancellationSignal, android.service.autofill.FillCallback);
- method public void onSaveRequest(android.service.autofill.SaveRequest, android.service.autofill.SaveCallback);
- method public abstract deprecated void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.service.autofill.SaveCallback);
+ method public abstract void onFillRequest(android.service.autofill.FillRequest, android.os.CancellationSignal, android.service.autofill.FillCallback);
+ method public abstract void onSaveRequest(android.service.autofill.SaveRequest, android.service.autofill.SaveCallback);
field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutofillService";
field public static final java.lang.String SERVICE_META_DATA = "android.autofill";
}
@@ -37252,9 +37161,9 @@
public final class FillRequest implements android.os.Parcelable {
method public int describeContents();
method public android.os.Bundle getClientState();
+ method public java.util.ArrayList<android.service.autofill.FillContext> getFillContexts();
method public int getFlags();
method public int getId();
- method public android.app.assist.AssistStructure getStructure();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.FillRequest> CREATOR;
field public static final int FLAG_MANUAL_REQUEST = 1; // 0x1
@@ -37272,7 +37181,6 @@
method public android.service.autofill.FillResponse build();
method public android.service.autofill.FillResponse.Builder setAuthentication(android.view.autofill.AutofillId[], android.content.IntentSender, android.widget.RemoteViews);
method public android.service.autofill.FillResponse.Builder setClientState(android.os.Bundle);
- method public deprecated android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle);
method public android.service.autofill.FillResponse.Builder setIgnoredIds(android.view.autofill.AutofillId...);
method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo);
}
@@ -37287,6 +37195,8 @@
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.SaveInfo> CREATOR;
field public static final int FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE = 1; // 0x1
+ field public static final int NEGATIVE_BUTTON_STYLE_CANCEL = 0; // 0x0
+ field public static final int NEGATIVE_BUTTON_STYLE_REJECT = 1; // 0x1
field public static final int SAVE_DATA_TYPE_ADDRESS = 2; // 0x2
field public static final int SAVE_DATA_TYPE_CREDIT_CARD = 4; // 0x4
field public static final int SAVE_DATA_TYPE_EMAIL_ADDRESS = 16; // 0x10
@@ -37300,7 +37210,7 @@
method public android.service.autofill.SaveInfo build();
method public android.service.autofill.SaveInfo.Builder setDescription(java.lang.CharSequence);
method public android.service.autofill.SaveInfo.Builder setFlags(int);
- method public android.service.autofill.SaveInfo.Builder setNegativeAction(java.lang.CharSequence, android.content.IntentSender);
+ method public android.service.autofill.SaveInfo.Builder setNegativeAction(int, android.content.IntentSender);
method public android.service.autofill.SaveInfo.Builder setOptionalIds(android.view.autofill.AutofillId[]);
}
@@ -37755,7 +37665,6 @@
method public final void unlockAndRun(java.lang.Runnable);
field public static final java.lang.String ACTION_QS_TILE = "android.service.quicksettings.action.QS_TILE";
field public static final java.lang.String ACTION_QS_TILE_PREFERENCES = "android.service.quicksettings.action.QS_TILE_PREFERENCES";
- field public static final java.lang.String EXTRA_COMPONENT = "android.service.quicksettings.extra.COMPONENT";
field public static final java.lang.String META_DATA_ACTIVE_TILE = "android.service.quicksettings.ACTIVE_TILE";
}
@@ -37985,12 +37894,10 @@
method public int getDesiredMinimumHeight();
method public int getDesiredMinimumWidth();
method public android.view.SurfaceHolder getSurfaceHolder();
- method public void invalidateColors();
method public boolean isPreview();
method public boolean isVisible();
method public void onApplyWindowInsets(android.view.WindowInsets);
method public android.os.Bundle onCommand(java.lang.String, int, int, int, android.os.Bundle, boolean);
- method public android.app.WallpaperColors onComputeWallpaperColors();
method public void onCreate(android.view.SurfaceHolder);
method public void onDesiredSizeChanged(int, int);
method public void onDestroy();
@@ -39285,7 +39192,6 @@
}
public static final class Connection.RttModifyStatus {
- ctor public Connection.RttModifyStatus();
field public static final int SESSION_MODIFY_REQUEST_FAIL = 2; // 0x2
field public static final int SESSION_MODIFY_REQUEST_INVALID = 3; // 0x3
field public static final int SESSION_MODIFY_REQUEST_REJECTED_BY_REMOTE = 5; // 0x5
@@ -40359,8 +40265,11 @@
method public static int getDefaultVoiceSubscriptionId();
method public boolean isNetworkRoaming(int);
method public void removeOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener);
+ field public static final java.lang.String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED";
+ field public static final java.lang.String ACTION_DEFAULT_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED";
field public static final int DATA_ROAMING_DISABLE = 0; // 0x0
field public static final int DATA_ROAMING_ENABLE = 1; // 0x1
+ field public static final java.lang.String EXTRA_SUBSCRIPTION_INDEX = "android.telephony.extra.SUBSCRIPTION_INDEX";
field public static final int INVALID_SUBSCRIPTION_ID = -1; // 0xffffffff
}
@@ -40435,10 +40344,12 @@
method public void sendDialerSpecialCode(java.lang.String);
method public java.lang.String sendEnvelopeWithStatus(java.lang.String);
method public void sendUssdRequest(java.lang.String, android.telephony.TelephonyManager.UssdResponseCallback, android.os.Handler);
+ method public void sendVisualVoicemailSms(java.lang.String, int, java.lang.String, android.app.PendingIntent);
method public void setDataEnabled(boolean);
method public boolean setLine1NumberForDisplay(java.lang.String, java.lang.String);
method public boolean setOperatorBrandOverride(java.lang.String);
method public boolean setPreferredNetworkTypeToGlobal();
+ method public void setVisualVoicemailSmsFilterSettings(android.telephony.VisualVoicemailSmsFilterSettings);
method public boolean setVoiceMailNumber(java.lang.String, java.lang.String);
method public void setVoicemailRingtoneUri(android.telecom.PhoneAccountHandle, android.net.Uri);
method public void setVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle, boolean);
@@ -40529,8 +40440,6 @@
method public abstract void onSimRemoved(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telecom.PhoneAccountHandle);
method public abstract void onSmsReceived(android.telephony.VisualVoicemailService.VisualVoicemailTask, android.telephony.VisualVoicemailSms);
method public abstract void onStopped(android.telephony.VisualVoicemailService.VisualVoicemailTask);
- method public static final void sendVisualVoicemailSms(android.content.Context, android.telecom.PhoneAccountHandle, java.lang.String, short, java.lang.String, android.app.PendingIntent);
- method public static final void setSmsFilterSettings(android.content.Context, android.telecom.PhoneAccountHandle, android.telephony.VisualVoicemailSmsFilterSettings);
field public static final java.lang.String SERVICE_INTERFACE = "android.telephony.VisualVoicemailService";
}
@@ -45794,6 +45703,7 @@
method public android.view.animation.Animation getAnimation();
method public android.os.IBinder getApplicationWindowToken();
method public java.lang.String[] getAutofillHints();
+ method public final android.view.autofill.AutofillId getAutofillId();
method public int getAutofillType();
method public android.view.autofill.AutofillValue getAutofillValue();
method public android.graphics.drawable.Drawable getBackground();
@@ -46037,7 +45947,6 @@
method public boolean onKeyUp(int, android.view.KeyEvent);
method protected void onLayout(boolean, int, int, int, int);
method protected void onMeasure(int, int);
- method public void onMovedToDisplay(int, android.content.res.Configuration);
method protected void onOverScrolled(int, int, boolean, boolean);
method public void onPointerCaptureChange(boolean);
method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
@@ -46260,6 +46169,7 @@
field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA;
+ field public static final int AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 1; // 0x1
field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE = "creditCardExpirationDate";
field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY = "creditCardExpirationDay";
field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH = "creditCardExpirationMonth";
@@ -46924,6 +46834,7 @@
method public abstract int addChildCount(int);
method public abstract void asyncCommit();
method public abstract android.view.ViewStructure asyncNewChild(int);
+ method public abstract android.view.autofill.AutofillId getAutofillId();
method public abstract int getChildCount();
method public abstract android.os.Bundle getExtras();
method public abstract java.lang.CharSequence getHint();
@@ -46937,7 +46848,8 @@
method public abstract void setActivated(boolean);
method public abstract void setAlpha(float);
method public abstract void setAutofillHints(java.lang.String[]);
- method public abstract void setAutofillId(android.view.ViewStructure, int);
+ method public abstract void setAutofillId(android.view.autofill.AutofillId);
+ method public abstract void setAutofillId(android.view.autofill.AutofillId, int);
method public abstract void setAutofillOptions(java.lang.CharSequence[]);
method public abstract void setAutofillType(int);
method public abstract void setAutofillValue(android.view.autofill.AutofillValue);
@@ -46967,14 +46879,13 @@
method public abstract void setTextLines(int[], int[]);
method public abstract void setTextStyle(float, int, int, int);
method public abstract void setTransformation(android.graphics.Matrix);
- method public abstract deprecated void setUrl(java.lang.String);
method public abstract void setVisibility(int);
method public abstract void setWebDomain(java.lang.String);
}
public static abstract class ViewStructure.HtmlInfo {
ctor public ViewStructure.HtmlInfo();
- method public abstract java.util.ArrayList<android.util.Pair<java.lang.String, java.lang.String>> getAttributes();
+ method public abstract java.util.List<android.util.Pair<java.lang.String, java.lang.String>> getAttributes();
method public abstract java.lang.String getTag();
}
@@ -47534,7 +47445,9 @@
public final class AccessibilityManager {
method public boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener);
+ method public void addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener, android.os.Handler);
method public boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener);
+ method public void addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener, android.os.Handler);
method public deprecated java.util.List<android.content.pm.ServiceInfo> getAccessibilityServiceList();
method public java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int);
method public java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList();
@@ -47687,8 +47600,8 @@
field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
- field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_X = "android.view.accessibility.action.ARGUMENT_MOVE_WINDOW_X";
- field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_Y = "android.view.accessibility.action.ARGUMENT_MOVE_WINDOW_Y";
+ field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+ field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
field public static final java.lang.String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
field public static final java.lang.String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
@@ -47870,10 +47783,10 @@
method public android.view.accessibility.AccessibilityNodeInfo getRoot();
method public java.lang.CharSequence getTitle();
method public int getType();
- method public boolean inPictureInPicture();
method public boolean isAccessibilityFocused();
method public boolean isActive();
method public boolean isFocused();
+ method public boolean isInPictureInPictureMode();
method public static android.view.accessibility.AccessibilityWindowInfo obtain();
method public static android.view.accessibility.AccessibilityWindowInfo obtain(android.view.accessibility.AccessibilityWindowInfo);
method public void recycle();
@@ -48216,7 +48129,9 @@
public final class AutofillManager {
method public void cancel();
method public void commit();
- method public void disableOwnedAutofillServices();
+ method public void disableAutofillServices();
+ method public boolean hasEnabledAutofillServices();
+ method public boolean isAutofillSupported();
method public boolean isEnabled();
method public void notifyValueChanged(android.view.View);
method public void notifyValueChanged(android.view.View, int, android.view.autofill.AutofillValue);
@@ -48230,8 +48145,7 @@
method public void unregisterCallback(android.view.autofill.AutofillManager.AutofillCallback);
field public static final java.lang.String EXTRA_ASSIST_STRUCTURE = "android.view.autofill.extra.ASSIST_STRUCTURE";
field public static final java.lang.String EXTRA_AUTHENTICATION_RESULT = "android.view.autofill.extra.AUTHENTICATION_RESULT";
- field public static final java.lang.String EXTRA_DATA_EXTRAS = "android.view.autofill.extra.DATA_EXTRAS";
- field public static final deprecated int FLAG_MANUAL_REQUEST = 1; // 0x1
+ field public static final java.lang.String EXTRA_CLIENT_STATE = "android.view.autofill.extra.EXTRA_CLIENT_STATE";
}
public static abstract class AutofillManager.AutofillCallback {
@@ -48665,12 +48579,7 @@
package android.view.textclassifier {
- public final class TextClassificationManager {
- method public android.view.textclassifier.TextClassifier getTextClassifier();
- method public void setTextClassifier(android.view.textclassifier.TextClassifier);
- }
-
- public final class TextClassificationResult {
+ public final class TextClassification {
method public float getConfidenceScore(java.lang.String);
method public java.lang.String getEntity(int);
method public int getEntityCount();
@@ -48681,19 +48590,24 @@
method public java.lang.String getText();
}
- public static final class TextClassificationResult.Builder {
- ctor public TextClassificationResult.Builder();
- method public android.view.textclassifier.TextClassificationResult build();
- method public android.view.textclassifier.TextClassificationResult.Builder setEntityType(java.lang.String, float);
- method public android.view.textclassifier.TextClassificationResult.Builder setIcon(android.graphics.drawable.Drawable);
- method public android.view.textclassifier.TextClassificationResult.Builder setIntent(android.content.Intent);
- method public android.view.textclassifier.TextClassificationResult.Builder setLabel(java.lang.String);
- method public android.view.textclassifier.TextClassificationResult.Builder setOnClickListener(android.view.View.OnClickListener);
- method public android.view.textclassifier.TextClassificationResult.Builder setText(java.lang.String);
+ public static final class TextClassification.Builder {
+ ctor public TextClassification.Builder();
+ method public android.view.textclassifier.TextClassification build();
+ method public android.view.textclassifier.TextClassification.Builder setEntityType(java.lang.String, float);
+ method public android.view.textclassifier.TextClassification.Builder setIcon(android.graphics.drawable.Drawable);
+ method public android.view.textclassifier.TextClassification.Builder setIntent(android.content.Intent);
+ method public android.view.textclassifier.TextClassification.Builder setLabel(java.lang.String);
+ method public android.view.textclassifier.TextClassification.Builder setOnClickListener(android.view.View.OnClickListener);
+ method public android.view.textclassifier.TextClassification.Builder setText(java.lang.String);
+ }
+
+ public final class TextClassificationManager {
+ method public android.view.textclassifier.TextClassifier getTextClassifier();
+ method public void setTextClassifier(android.view.textclassifier.TextClassifier);
}
public abstract interface TextClassifier {
- method public abstract android.view.textclassifier.TextClassificationResult getTextClassificationResult(java.lang.CharSequence, int, int, android.os.LocaleList);
+ method public abstract android.view.textclassifier.TextClassification classifyText(java.lang.CharSequence, int, int, android.os.LocaleList);
method public abstract android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int, android.os.LocaleList);
field public static final android.view.textclassifier.TextClassifier NO_OP;
field public static final java.lang.String TYPE_ADDRESS = "address";
@@ -49372,7 +49286,6 @@
method public int getRendererRequestedPriority();
method public deprecated float getScale();
method public android.webkit.WebSettings getSettings();
- method public android.view.textclassifier.TextClassifier getTextClassifier();
method public java.lang.String getTitle();
method public java.lang.String getUrl();
method public android.webkit.WebChromeClient getWebChromeClient();
@@ -49419,7 +49332,6 @@
method public void setNetworkAvailable(boolean);
method public deprecated void setPictureListener(android.webkit.WebView.PictureListener);
method public void setRendererPriorityPolicy(int, boolean);
- method public void setTextClassifier(android.view.textclassifier.TextClassifier);
method public deprecated void setVerticalScrollbarOverlay(boolean);
method public void setWebChromeClient(android.webkit.WebChromeClient);
method public static void setWebContentsDebuggingEnabled(boolean);
@@ -51886,7 +51798,7 @@
method public void setExtractedText(android.view.inputmethod.ExtractedText);
method public void setFilters(android.text.InputFilter[]);
method public void setFontFeatureSettings(java.lang.String);
- method public boolean setFontVariationSettings(java.lang.String) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
+ method public boolean setFontVariationSettings(java.lang.String);
method protected boolean setFrame(int, int, int, int);
method public void setFreezesText(boolean);
method public void setGravity(int);
@@ -52579,15 +52491,15 @@
ctor public DexClassLoader(java.lang.String, java.lang.String, java.lang.String, java.lang.ClassLoader);
}
- public final class DexFile {
- ctor public DexFile(java.io.File) throws java.io.IOException;
- ctor public DexFile(java.lang.String) throws java.io.IOException;
+ public final deprecated class DexFile {
+ ctor public deprecated DexFile(java.io.File) throws java.io.IOException;
+ ctor public deprecated DexFile(java.lang.String) throws java.io.IOException;
method public void close() throws java.io.IOException;
method public java.util.Enumeration<java.lang.String> entries();
method public java.lang.String getName();
method public static boolean isDexOptNeeded(java.lang.String) throws java.io.FileNotFoundException, java.io.IOException;
method public java.lang.Class loadClass(java.lang.String, java.lang.ClassLoader);
- method public static dalvik.system.DexFile loadDex(java.lang.String, java.lang.String, int) throws java.io.IOException;
+ method public static deprecated dalvik.system.DexFile loadDex(java.lang.String, java.lang.String, int) throws java.io.IOException;
}
public final class InMemoryDexClassLoader extends dalvik.system.BaseDexClassLoader {
diff --git a/api/test-removed.txt b/api/test-removed.txt
index dc9c54e..779ff7c 100644
--- a/api/test-removed.txt
+++ b/api/test-removed.txt
@@ -1,7 +1,6 @@
package android.app {
public class Notification implements android.os.Parcelable {
- method public deprecated int getBadgeIcon();
method public deprecated void setLatestEventInfo(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
}
@@ -18,12 +17,18 @@
method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
method public deprecated java.lang.String getDeviceInitializerApp();
method public deprecated android.content.ComponentName getDeviceInitializerComponent();
+ method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>);
+ field public static final deprecated int FLAG_EVICT_CE_KEY = 1; // 0x1
}
}
package android.app.usage {
+ public final class StorageStats implements android.os.Parcelable {
+ method public deprecated long getCodeBytes();
+ }
+
public class StorageStatsManager {
method public deprecated long getFreeBytes(java.lang.String) throws java.io.IOException;
method public deprecated long getTotalBytes(java.lang.String) throws java.io.IOException;
@@ -38,6 +43,10 @@
package android.content {
+ public class ClipData implements android.os.Parcelable {
+ method public deprecated void addItem(android.content.ClipData.Item, android.content.ContentResolver);
+ }
+
public abstract class Context {
method public abstract android.content.SharedPreferences getSharedPreferences(java.io.File, int);
method public abstract java.io.File getSharedPreferencesPath(java.lang.String);
@@ -351,10 +360,6 @@
field public static final deprecated java.lang.String TIMESTAMP = "timestamp";
}
- public static final class FontsContract.Columns implements android.provider.BaseColumns {
- field public static final java.lang.String STYLE = "font_style";
- }
-
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
field public static final deprecated java.lang.String CONTACT_METADATA_SYNC = "contact_metadata_sync";
}
@@ -447,6 +452,14 @@
}
+package android.view.accessibility {
+
+ public final class AccessibilityWindowInfo implements android.os.Parcelable {
+ method public boolean inPictureInPicture();
+ }
+
+}
+
package android.webkit {
public class WebViewClient {
diff --git a/core/java/android/accessibilityservice/AccessibilityButtonController.java b/core/java/android/accessibilityservice/AccessibilityButtonController.java
index c3a5dab..ee19768 100644
--- a/core/java/android/accessibilityservice/AccessibilityButtonController.java
+++ b/core/java/android/accessibilityservice/AccessibilityButtonController.java
@@ -23,6 +23,8 @@
import android.util.ArrayMap;
import android.util.Slog;
+import com.android.internal.util.Preconditions;
+
/**
* Controller for the accessibility button within the system's navigation area
* <p>
@@ -89,7 +91,7 @@
* @param callback the callback to add, must be non-null
*/
public void registerAccessibilityButtonCallback(@NonNull AccessibilityButtonCallback callback) {
- registerAccessibilityButtonCallback(callback, null);
+ registerAccessibilityButtonCallback(callback, new Handler());
}
/**
@@ -99,11 +101,12 @@
* {@code null}.
*
* @param callback the callback to add, must be non-null
- * @param handler the handler on which to callback should execute, or {@code null} to
- * execute on the service's main thread
+ * @param handler the handler on which the callback should execute, must be non-null
*/
public void registerAccessibilityButtonCallback(@NonNull AccessibilityButtonCallback callback,
- @Nullable Handler handler) {
+ @NonNull Handler handler) {
+ Preconditions.checkNotNull(callback);
+ Preconditions.checkNotNull(handler);
synchronized (mLock) {
if (mCallbacks == null) {
mCallbacks = new ArrayMap<>();
@@ -121,6 +124,7 @@
*/
public void unregisterAccessibilityButtonCallback(
@NonNull AccessibilityButtonCallback callback) {
+ Preconditions.checkNotNull(callback);
synchronized (mLock) {
if (mCallbacks == null) {
return;
@@ -154,12 +158,7 @@
for (int i = 0, count = entries.size(); i < count; i++) {
final AccessibilityButtonCallback callback = entries.keyAt(i);
final Handler handler = entries.valueAt(i);
- if (handler != null) {
- handler.post(() -> callback.onClicked(this));
- } else {
- // We're already on the main thread, just run the callback.
- callback.onClicked(this);
- }
+ handler.post(() -> callback.onClicked(this));
}
}
@@ -184,12 +183,7 @@
for (int i = 0, count = entries.size(); i < count; i++) {
final AccessibilityButtonCallback callback = entries.keyAt(i);
final Handler handler = entries.valueAt(i);
- if (handler != null) {
- handler.post(() -> callback.onAvailabilityChanged(this, available));
- } else {
- // We're already on the main thread, just run the callback.
- callback.onAvailabilityChanged(this, available);
- }
+ handler.post(() -> callback.onAvailabilityChanged(this, available));
}
}
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index 64d7d4c..af0a204 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -619,20 +619,10 @@
* @return The controller for fingerprint gestures, or {@code null} if gestures are unavailable.
*/
@RequiresPermission(android.Manifest.permission.USE_FINGERPRINT)
- public final @Nullable FingerprintGestureController getFingerprintGestureController() {
- if ((mFingerprintGestureController == null)
- && getPackageManager().hasSystemFeature(FEATURE_FINGERPRINT)) {
- FingerprintManager fingerprintManager = getSystemService(FingerprintManager.class);
- if ((fingerprintManager != null) && fingerprintManager.isHardwareDetected()) {
- AccessibilityServiceInfo info = getServiceInfo();
- int fingerprintCapabilityMask =
- AccessibilityServiceInfo.CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES;
- if ((info.getCapabilities() & fingerprintCapabilityMask) != 0) {
- mFingerprintGestureController = new FingerprintGestureController(
- AccessibilityInteractionClient.getInstance()
- .getConnection(mConnectionId));
- }
- }
+ public final @NonNull FingerprintGestureController getFingerprintGestureController() {
+ if (mFingerprintGestureController == null) {
+ mFingerprintGestureController = new FingerprintGestureController(
+ AccessibilityInteractionClient.getInstance().getConnection(mConnectionId));
}
return mFingerprintGestureController;
}
diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
index 5937dd9..06a9b06 100644
--- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
+++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
@@ -95,9 +95,7 @@
public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 0x00000002;
/**
- * Capability: This accessibility service can request enhanced web accessibility
- * enhancements. For example, installing scripts to make app content more accessible.
- * @see android.R.styleable#AccessibilityService_canRequestEnhancedWebAccessibility
+ * @deprecated No longer used
*/
public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 0x00000004;
@@ -121,9 +119,9 @@
/**
* Capability: This accessibility service can capture gestures from the fingerprint sensor
- * @see android.R.styleable#AccessibilityService_canCaptureFingerprintGestures
+ * @see android.R.styleable#AccessibilityService_canRequestFingerprintGestures
*/
- public static final int CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES = 0x00000040;
+ public static final int CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES = 0x00000040;
private static SparseArray<CapabilityInfo> sAvailableCapabilityInfos;
@@ -237,22 +235,7 @@
public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 0x0000004;
/**
- * This flag requests from the system to enable web accessibility enhancing
- * extensions. Such extensions aim to provide improved accessibility support
- * for content presented in a {@link android.webkit.WebView}. An example of such
- * an extension is injecting JavaScript from a secure source. The system will enable
- * enhanced web accessibility if there is at least one accessibility service
- * that has this flag set. Hence, clearing this flag does not guarantee that the
- * device will not have enhanced web accessibility enabled since there may be
- * another enabled service that requested it.
- * <p>
- * Services that want to set this flag have to declare this capability
- * in their meta-data by setting the attribute {@link android.R.attr
- * #canRequestEnhancedWebAccessibility canRequestEnhancedWebAccessibility} to
- * true, otherwise this flag will be ignored. For how to declare the meta-data
- * of a service refer to {@value AccessibilityService#SERVICE_META_DATA}.
- * </p>
- * @see android.R.styleable#AccessibilityService_canRequestEnhancedWebAccessibility
+ * @deprecated No longer used
*/
public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 0x00000008;
@@ -318,7 +301,7 @@
* This flag requests that all fingerprint gestures be sent to the accessibility service.
* It is handled in {@link FingerprintGestureController}
*/
- public static final int FLAG_CAPTURE_FINGERPRINT_GESTURES = 0x00000200;
+ public static final int FLAG_REQUEST_FINGERPRINT_GESTURES = 0x00000200;
/** {@hide} */
public static final int FLAG_FORCE_DIRECT_BOOT_AWARE = 0x00010000;
@@ -526,10 +509,6 @@
mCapabilities |= CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION;
}
if (asAttributes.getBoolean(com.android.internal.R.styleable
- .AccessibilityService_canRequestEnhancedWebAccessibility, false)) {
- mCapabilities |= CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
- }
- if (asAttributes.getBoolean(com.android.internal.R.styleable
.AccessibilityService_canRequestFilterKeyEvents, false)) {
mCapabilities |= CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS;
}
@@ -542,8 +521,8 @@
mCapabilities |= CAPABILITY_CAN_PERFORM_GESTURES;
}
if (asAttributes.getBoolean(com.android.internal.R.styleable
- .AccessibilityService_canCaptureFingerprintGestures, false)) {
- mCapabilities |= CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES;
+ .AccessibilityService_canRequestFingerprintGestures, false)) {
+ mCapabilities |= CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES;
}
TypedValue peekedValue = asAttributes.peekValue(
com.android.internal.R.styleable.AccessibilityService_description);
@@ -659,7 +638,6 @@
*
* @see #CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT
* @see #CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION
- * @see #CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY
* @see #CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS
* @see #CAPABILITY_CAN_CONTROL_MAGNIFICATION
* @see #CAPABILITY_CAN_PERFORM_GESTURES
@@ -676,7 +654,6 @@
*
* @see #CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT
* @see #CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION
- * @see #CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY
* @see #CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS
* @see #CAPABILITY_CAN_CONTROL_MAGNIFICATION
* @see #CAPABILITY_CAN_PERFORM_GESTURES
@@ -693,9 +670,10 @@
* <strong>Statically set from
* {@link AccessibilityService#SERVICE_META_DATA meta-data}.</strong>
* </p>
- * @return The localized summary.
+ * @return The localized summary if available, and {@code null} if a summary
+ * has not been provided.
*/
- public String loadSummary(PackageManager packageManager) {
+ public CharSequence loadSummary(PackageManager packageManager) {
if (mSummaryResId == 0) {
return mNonLocalizedSummary;
}
@@ -994,8 +972,8 @@
return "FLAG_ENABLE_ACCESSIBILITY_VOLUME";
case FLAG_REQUEST_ACCESSIBILITY_BUTTON:
return "FLAG_REQUEST_ACCESSIBILITY_BUTTON";
- case FLAG_CAPTURE_FINGERPRINT_GESTURES:
- return "FLAG_CAPTURE_FINGERPRINT_GESTURES";
+ case FLAG_REQUEST_FINGERPRINT_GESTURES:
+ return "FLAG_REQUEST_FINGERPRINT_GESTURES";
default:
return null;
}
@@ -1023,8 +1001,8 @@
return "CAPABILITY_CAN_CONTROL_MAGNIFICATION";
case CAPABILITY_CAN_PERFORM_GESTURES:
return "CAPABILITY_CAN_PERFORM_GESTURES";
- case CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES:
- return "CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES";
+ case CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES:
+ return "CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES";
default:
return "UNKNOWN";
}
@@ -1074,10 +1052,6 @@
new CapabilityInfo(CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION,
R.string.capability_title_canRequestTouchExploration,
R.string.capability_desc_canRequestTouchExploration));
- sAvailableCapabilityInfos.put(CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY,
- new CapabilityInfo(CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY,
- R.string.capability_title_canRequestEnhancedWebAccessibility,
- R.string.capability_desc_canRequestEnhancedWebAccessibility));
sAvailableCapabilityInfos.put(CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS,
new CapabilityInfo(CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS,
R.string.capability_title_canRequestFilterKeyEvents,
@@ -1091,8 +1065,8 @@
R.string.capability_title_canPerformGestures,
R.string.capability_desc_canPerformGestures));
if ((context == null) || fingerprintAvailable(context)) {
- sAvailableCapabilityInfos.put(CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES,
- new CapabilityInfo(CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES,
+ sAvailableCapabilityInfos.put(CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES,
+ new CapabilityInfo(CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES,
R.string.capability_title_canCaptureFingerprintGestures,
R.string.capability_desc_canCaptureFingerprintGestures));
}
diff --git a/core/java/android/accessibilityservice/FingerprintGestureController.java b/core/java/android/accessibilityservice/FingerprintGestureController.java
index e203c6d..9f04cea 100644
--- a/core/java/android/accessibilityservice/FingerprintGestureController.java
+++ b/core/java/android/accessibilityservice/FingerprintGestureController.java
@@ -156,9 +156,9 @@
FingerprintGestureCallback callback = handlerMap.keyAt(i);
Handler handler = handlerMap.valueAt(i);
if (handler != null) {
- handler.post(() -> callback.onGesture(gesture));
+ handler.post(() -> callback.onGestureDetected(gesture));
} else {
- callback.onGesture(gesture);
+ callback.onGestureDetected(gesture);
}
}
}
@@ -180,6 +180,6 @@
* @param gesture The id of the gesture that was detected. For example,
* {@link #FINGERPRINT_GESTURE_SWIPE_RIGHT}.
*/
- public void onGesture(int gesture) {}
+ public void onGestureDetected(int gesture) {}
}
}
diff --git a/core/java/android/accessibilityservice/GestureDescription.java b/core/java/android/accessibilityservice/GestureDescription.java
index c9da152..92567d7 100644
--- a/core/java/android/accessibilityservice/GestureDescription.java
+++ b/core/java/android/accessibilityservice/GestureDescription.java
@@ -24,6 +24,8 @@
import android.os.Parcel;
import android.os.Parcelable;
+import com.android.internal.util.Preconditions;
+
import java.util.ArrayList;
import java.util.List;
@@ -130,7 +132,7 @@
touchPoints[numPointsFound].mIsStartOfPath =
(strokeDescription.getContinuedStrokeId() < 0)
&& (time == strokeDescription.mStartTime);
- touchPoints[numPointsFound].mIsEndOfPath = !strokeDescription.isContinued()
+ touchPoints[numPointsFound].mIsEndOfPath = !strokeDescription.willContinue()
&& (time == strokeDescription.mEndTime);
strokeDescription.getPosForTime(time, mTempPos);
touchPoints[numPointsFound].mX = Math.round(mTempPos[0]);
@@ -197,7 +199,7 @@
* Immutable description of stroke that can be part of a gesture.
*/
public static class StrokeDescription {
- public static final int INVALID_STROKE_ID = -1;
+ private static final int INVALID_STROKE_ID = -1;
static int sIdCounter;
@@ -210,7 +212,7 @@
float[] mTapLocation;
int mId;
boolean mContinued;
- int mContinuedStrokeId;
+ int mContinuedStrokeId = INVALID_STROKE_ID;
/**
* @param path The path to follow. Must have exactly one contour. The bounds of the path
@@ -219,12 +221,12 @@
* @param startTime The time, in milliseconds, from the time the gesture starts to the
* time the stroke should start. Must not be negative.
* @param duration The duration, in milliseconds, the stroke takes to traverse the path.
- * Must not be negative.
+ * Must be positive.
*/
public StrokeDescription(@NonNull Path path,
@IntRange(from = 0) long startTime,
@IntRange(from = 0) long duration) {
- this(path, startTime, duration, INVALID_STROKE_ID, false);
+ this(path, startTime, duration, false);
}
/**
@@ -235,36 +237,23 @@
* time the stroke should start. Must not be negative.
* @param duration The duration, in milliseconds, the stroke takes to traverse the path.
* Must be positive.
- * @param continuedStrokeId The ID of the stroke that this stroke continues, or
- * {@link #INVALID_STROKE_ID} if it continues no stroke. The stroke it
- * continues must have its isContinued flag set to {@code true} and must be in the
- * gesture dispatched immediately before the one containing this stroke.
- * @param isContinued {@code true} if this stroke will be continued by one in the
+ * @param willContinue {@code true} if this stroke will be continued by one in the
* next gesture {@code false} otherwise. Continued strokes keep their pointers down when
* the gesture completes.
*/
public StrokeDescription(@NonNull Path path,
@IntRange(from = 0) long startTime,
@IntRange(from = 0) long duration,
- @IntRange(from = 0) int continuedStrokeId,
- boolean isContinued) {
- mContinued = isContinued;
- mContinuedStrokeId = continuedStrokeId;
- if (duration <= 0) {
- throw new IllegalArgumentException("Duration must be positive");
- }
- if (startTime < 0) {
- throw new IllegalArgumentException("Start time must not be negative");
- }
+ boolean willContinue) {
+ mContinued = willContinue;
+ Preconditions.checkArgument(duration > 0, "Duration must be positive");
+ Preconditions.checkArgument(startTime >= 0, "Start time must not be negative");
+ Preconditions.checkArgument(!path.isEmpty(), "Path is empty");
RectF bounds = new RectF();
path.computeBounds(bounds, false /* unused */);
- if ((bounds.bottom < 0) || (bounds.top < 0) || (bounds.right < 0)
- || (bounds.left < 0)) {
- throw new IllegalArgumentException("Path bounds must not be negative");
- }
- if (path.isEmpty()) {
- throw new IllegalArgumentException("Path is empty");
- }
+ Preconditions.checkArgument((bounds.bottom >= 0) && (bounds.top >= 0)
+ && (bounds.right >= 0) && (bounds.left >= 0),
+ "Path bounds must not be negative");
mPath = new Path(path);
mPathMeasure = new PathMeasure(path, false);
if (mPathMeasure.getLength() == 0) {
@@ -321,17 +310,44 @@
* stroke in a future gesture.
*
* @return the ID of this stroke
+ * @hide
*/
public int getId() {
return mId;
}
/**
+ * Create a new stroke that will continue this one. This is only possible if this stroke
+ * will continue.
+ *
+ * @param path The path for the stroke that continues this one. The starting point of
+ * this path must match the ending point of the stroke it continues.
+ * @param startTime The time, in milliseconds, from the time the gesture starts to the
+ * time this stroke should start. Must not be negative. This time is from
+ * the start of the new gesture, not the one being continued.
+ * @param duration The duration for the new stroke. Must not be negative.
+ * @param willContinue {@code true} if this stroke will be continued by one in the
+ * next gesture {@code false} otherwise.
+ * @return
+ */
+ public StrokeDescription continueStroke(Path path, long startTime, long duration,
+ boolean willContinue) {
+ if (!mContinued) {
+ throw new IllegalStateException(
+ "Only strokes marked willContinue can be continued");
+ }
+ StrokeDescription strokeDescription =
+ new StrokeDescription(path, startTime, duration, willContinue);
+ strokeDescription.mContinuedStrokeId = mId;
+ return strokeDescription;
+ }
+
+ /**
* Check if this stroke is marked to continue in the next gesture.
*
* @return {@code true} if the stroke is to be continued.
*/
- public boolean isContinued() {
+ public boolean willContinue() {
return mContinued;
}
@@ -339,6 +355,7 @@
* Get the ID of the stroke that this one will continue.
*
* @return The ID of the stroke that this stroke continues, or 0 if no such stroke exists.
+ * @hide
*/
public int getContinuedStrokeId() {
return mContinuedStrokeId;
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index b320d5d..a5b37f3 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -345,7 +345,13 @@
"android.accounts.LOGIN_ACCOUNTS_CHANGED";
/**
- * Action sent as a broadcast Intent by the AccountsService when any account is removed.
+ * Action sent as a broadcast Intent by the AccountsService when any account is removed
+ * or renamed. Only applications which were able to see the account will receive the intent.
+ * Intent extra will include the following fields:
+ * <ul>
+ * <li> {@link #KEY_ACCOUNT_NAME} - the name of the removed account
+ * <li> {@link #KEY_ACCOUNT_TYPE} - the type of the account
+ * </ul>
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
@BroadcastBehavior(includeBackground = true)
@@ -370,7 +376,7 @@
* {@link #VISIBILITY_USER_MANAGED_NOT_VISIBLE} is used.
*/
public static final String PACKAGE_NAME_KEY_LEGACY_VISIBLE =
- "android.accounts.key_legacy_visible";
+ "android:accounts:key_legacy_visible";
/**
* Key to set visibility for applications which satisfy one of the following conditions:
@@ -389,7 +395,7 @@
* {@link #VISIBILITY_USER_MANAGED_VISIBLE} is used.
*/
public static final String PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE =
- "android.accounts.key_legacy_not_visible";
+ "android:accounts:key_legacy_not_visible";
/**
* @hide
diff --git a/core/java/android/animation/AnimatorSet.java b/core/java/android/animation/AnimatorSet.java
index cdeca13..ca4b4d5 100644
--- a/core/java/android/animation/AnimatorSet.java
+++ b/core/java/android/animation/AnimatorSet.java
@@ -930,12 +930,14 @@
}
/**
- * Gets the current position of the animation in time, which is equal to the current
- * time minus the time that the animation started. An animation that is not yet started will
- * return a value of zero, unless the animation has has its play time set via
- * {@link #setCurrentPlayTime(long)}, in which case it will return the time that was set.
+ * Returns the milliseconds elapsed since the start of the animation.
*
- * @return The current position in time of the animation.
+ * <p>For ongoing animations, this method returns the current progress of the animation in
+ * terms of play time. For an animation that has not yet been started: if the animation has been
+ * seeked to a certain time via {@link #setCurrentPlayTime(long)}, the seeked play time will
+ * be returned; otherwise, this method will return 0.
+ *
+ * @return the current position in time of the animation in milliseconds
*/
public long getCurrentPlayTime() {
if (mSeekState.isActive()) {
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index e4d2d13..ab4f33d 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -696,9 +696,6 @@
private static final String TAG = "Activity";
private static final boolean DEBUG_LIFECYCLE = false;
- // TODO(b/33197203): set to false once stable
- private static final boolean DEBUG_AUTO_FILL = true;
-
/** Standard activity result: operation canceled. */
public static final int RESULT_CANCELED = 0;
/** Standard activity result: operation succeeded. */
@@ -2042,35 +2039,27 @@
/**
* Puts the activity in picture-in-picture mode if possible in the current system state. Any
- * prior calls to {@link #setPictureInPictureArgs(PictureInPictureArgs)} will still apply when
- * entering picture-in-picture through this call.
+ * prior calls to {@link #setPictureInPictureParams(PictureInPictureParams)} will still apply
+ * when entering picture-in-picture through this call.
*
- * @see #enterPictureInPictureMode(PictureInPictureArgs)
+ * @see #enterPictureInPictureMode(PictureInPictureParams)
* @see android.R.attr#supportsPictureInPicture
*/
+ @Deprecated
public void enterPictureInPictureMode() {
- enterPictureInPictureMode(new PictureInPictureArgs());
+ enterPictureInPictureMode(new PictureInPictureParams.Builder().build());
}
/**
- * Puts the activity in picture-in-picture mode if possible in the current system state with
- * explicit given arguments. Only the set parameters in {@param args} will override prior calls
- * {@link #setPictureInPictureArgs(PictureInPictureArgs)}.
- *
- * The system may disallow entering picture-in-picture in various cases, including when the
- * activity is not visible.
- *
- * @see android.R.attr#supportsPictureInPicture
- *
- * @param args the explicit non-null arguments to use when entering picture-in-picture.
- * @return whether the system successfully entered picture-in-picture.
+ * TO BE REMOVED
*/
+ @Deprecated
public boolean enterPictureInPictureMode(@NonNull PictureInPictureArgs args) {
try {
if (args == null) {
throw new IllegalArgumentException("Expected non-null picture-in-picture args");
}
- updatePictureInPictureArgsForContentInsets(args);
+ updatePictureInPictureParamsForContentInsets(args);
return ActivityManagerNative.getDefault().enterPictureInPictureMode(mToken, args);
} catch (RemoteException e) {
return false;
@@ -2078,34 +2067,84 @@
}
/**
+ * Puts the activity in picture-in-picture mode if possible in the current system state. The
+ * set parameters in {@param params} will be combined with the parameters from prior calls to
+ * {@link #setPictureInPictureParams(PictureInPictureParams)}.
+ *
+ * The system may disallow entering picture-in-picture in various cases, including when the
+ * activity is not visible, if the screen is locked or if the user has an activity pinned.
+ *
+ * @see android.R.attr#supportsPictureInPicture
+ * @see PictureInPictureParams
+ *
+ * @param params non-null parameters to be combined with previously set parameters when entering
+ * picture-in-picture.
+ *
+ * @return true if the system puts this activity into picture-in-picture mode or was already
+ * in picture-in-picture mode (@see {@link #isInPictureInPictureMode())
+ */
+ public boolean enterPictureInPictureMode(@NonNull PictureInPictureParams params) {
+ try {
+ if (params == null) {
+ throw new IllegalArgumentException("Expected non-null picture-in-picture params");
+ }
+ updatePictureInPictureParamsForContentInsets(params);
+ return ActivityManagerNative.getDefault().enterPictureInPictureMode(mToken, params);
+ } catch (RemoteException e) {
+ return false;
+ }
+ }
+
+ /**
+ * TO BE REMOVED
+ */
+ public void setPictureInPictureArgs(@NonNull PictureInPictureArgs args) {
+ setPictureInPictureParams(args);
+ }
+
+ /**
* Updates the properties of the picture-in-picture activity, or sets it to be used later when
* {@link #enterPictureInPictureMode()} is called.
*
- * @param args the new properties of the picture-in-picture.
+ * @param params the new parameters for the picture-in-picture.
*/
- public void setPictureInPictureArgs(@NonNull PictureInPictureArgs args) {
+ public void setPictureInPictureParams(@NonNull PictureInPictureParams params) {
try {
- if (args == null) {
- throw new IllegalArgumentException("Expected non-null picture-in-picture args");
+ if (params == null) {
+ throw new IllegalArgumentException("Expected non-null picture-in-picture params");
}
- updatePictureInPictureArgsForContentInsets(args);
- ActivityManagerNative.getDefault().setPictureInPictureArgs(mToken, args);
+ updatePictureInPictureParamsForContentInsets(params);
+ ActivityManagerNative.getDefault().setPictureInPictureParams(mToken, params);
} catch (RemoteException e) {
}
}
/**
- * Updates the provided {@param args} with the last known content insets for this activity, to
+ * Return the number of actions that will be displayed in the picture-in-picture UI when the
+ * user interacts with the activity currently in picture-in-picture mode. This number may change
+ * if the global configuration changes (ie. if the device is plugged into an external display),
+ * but will always be larger than three.
+ */
+ public int getMaxNumPictureInPictureActions() {
+ try {
+ return ActivityManagerNative.getDefault().getMaxNumPictureInPictureActions(mToken);
+ } catch (RemoteException e) {
+ return 0;
+ }
+ }
+
+ /**
+ * Updates the provided {@param params} with the last known content insets for this activity, to
* be used with the source hint rect for the transition into PiP.
*/
- private void updatePictureInPictureArgsForContentInsets(PictureInPictureArgs args) {
- if (args != null && args.hasSourceBoundsHint() && getWindow() != null &&
+ private void updatePictureInPictureParamsForContentInsets(PictureInPictureParams params) {
+ if (params != null && params.hasSourceBoundsHint() && getWindow() != null &&
getWindow().peekDecorView() != null &&
getWindow().peekDecorView().getViewRootImpl() != null) {
- args.setSourceRectHintInsets(
+ params.setSourceRectHintInsets(
getWindow().peekDecorView().getViewRootImpl().getLastContentInsets());
} else {
- args.setSourceRectHintInsets(null);
+ params.setSourceRectHintInsets(null);
}
}
@@ -2133,6 +2172,7 @@
*
* @see #onConfigurationChanged(Configuration)
* @see View#onMovedToDisplay(int, Configuration)
+ * @hide
*/
public void onMovedToDisplay(int displayId, Configuration config) {
}
@@ -7323,6 +7363,7 @@
* @return True if caption is displayed on content, false if it pushes the content down.
*
* @see #setOverlayWithDecorCaptionEnabled(boolean)
+ * @hide
*/
public boolean isOverlayWithDecorCaptionEnabled() {
return mWindow.isOverlayWithDecorCaptionEnabled();
@@ -7334,6 +7375,7 @@
* This affects only freeform windows since they display the caption and only the main
* window of the activity. The caption is used to drag the window around and also shows
* maximize and close action buttons.
+ * @hide
*/
public void setOverlayWithDecorCaptionEnabled(boolean enabled) {
mWindow.setOverlayWithDecorCaptionEnabled(enabled);
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 1ab45b5..6bc59fc 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -122,8 +122,6 @@
private static int gMaxRecentTasks = -1;
- private static final int NUM_ALLOWED_PIP_ACTIONS = 3;
-
private final Context mContext;
private static volatile boolean sSystemReady = false;
@@ -460,42 +458,45 @@
/** @hide Process is important to the user, but not something they are aware of. */
public static final int PROCESS_STATE_IMPORTANT_BACKGROUND = 7;
+ /** @hide Process is in the background transient so we will try to keep running. */
+ public static final int PROCESS_STATE_TRANSIENT_BACKGROUND = 8;
+
/** @hide Process is in the background running a backup/restore operation. */
- public static final int PROCESS_STATE_BACKUP = 8;
+ public static final int PROCESS_STATE_BACKUP = 9;
/** @hide Process is in the background, but it can't restore its state so we want
* to try to avoid killing it. */
- public static final int PROCESS_STATE_HEAVY_WEIGHT = 9;
+ public static final int PROCESS_STATE_HEAVY_WEIGHT = 10;
/** @hide Process is in the background running a service. Unlike oom_adj, this level
* is used for both the normal running in background state and the executing
* operations state. */
- public static final int PROCESS_STATE_SERVICE = 10;
+ public static final int PROCESS_STATE_SERVICE = 11;
/** @hide Process is in the background running a receiver. Note that from the
* perspective of oom_adj receivers run at a higher foreground level, but for our
* prioritization here that is not necessary and putting them below services means
* many fewer changes in some process states as they receive broadcasts. */
- public static final int PROCESS_STATE_RECEIVER = 11;
+ public static final int PROCESS_STATE_RECEIVER = 12;
/** @hide Process is in the background but hosts the home activity. */
- public static final int PROCESS_STATE_HOME = 12;
+ public static final int PROCESS_STATE_HOME = 13;
/** @hide Process is in the background but hosts the last shown activity. */
- public static final int PROCESS_STATE_LAST_ACTIVITY = 13;
+ public static final int PROCESS_STATE_LAST_ACTIVITY = 14;
/** @hide Process is being cached for later use and contains activities. */
- public static final int PROCESS_STATE_CACHED_ACTIVITY = 14;
+ public static final int PROCESS_STATE_CACHED_ACTIVITY = 15;
/** @hide Process is being cached for later use and is a client of another cached
* process that contains activities. */
- public static final int PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 15;
+ public static final int PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 16;
/** @hide Process is being cached for later use and is empty. */
- public static final int PROCESS_STATE_CACHED_EMPTY = 16;
+ public static final int PROCESS_STATE_CACHED_EMPTY = 17;
/** @hide Process does not exist. */
- public static final int PROCESS_STATE_NONEXISTENT = 17;
+ public static final int PROCESS_STATE_NONEXISTENT = 18;
/** @hide The lowest process state number */
public static final int MIN_PROCESS_STATE = PROCESS_STATE_PERSISTENT;
@@ -505,7 +506,7 @@
/** @hide Should this process state be considered a background state? */
public static final boolean isProcStateBackground(int procState) {
- return procState >= PROCESS_STATE_BACKUP;
+ return procState >= PROCESS_STATE_TRANSIENT_BACKGROUND;
}
/** @hide requestType for assist context: only basic information. */
@@ -1127,11 +1128,15 @@
}
/**
- * Return the maximum number of actions that will be displayed in the picture-in-picture UI when
- * the user interacts with the activity currently in picture-in-picture mode.
+ * Return the number of actions that will be displayed in the picture-in-picture UI when the
+ * user interacts with the activity currently in picture-in-picture mode. This number may change
+ * if the global configuration changes (ie. if the device is plugged into an external display).
+ *
+ * TO BE REMOVED
*/
+ @Deprecated
public static int getMaxNumPictureInPictureActions() {
- return NUM_ALLOWED_PIP_ACTIONS;
+ return 3;
}
/**
@@ -3141,10 +3146,15 @@
* before {@link Build.VERSION_CODES#O}. Since the {@link Build.VERSION_CODES#O} SDK,
* the value of {@link #IMPORTANCE_PERCEPTIBLE} has been fixed.
*
- * @deprecated Use {@link #IMPORTANCE_PERCEPTIBLE} instead.
+ * <p>The system will return this value instead of {@link #IMPORTANCE_PERCEPTIBLE}
+ * on Android versions below {@link Build.VERSION_CODES#O}.
+ *
+ * <p>On Android version {@link Build.VERSION_CODES#O} and later, this value will still be
+ * returned for apps with the target API level below {@link Build.VERSION_CODES#O}.
+ * For apps targeting version {@link Build.VERSION_CODES#O} and later,
+ * the correct value {@link #IMPORTANCE_PERCEPTIBLE} will be returned.
*/
- @Deprecated
- public static final int IMPORTANCE_PERCEPTIBLE_DEPRECATED = 130;
+ public static final int IMPORTANCE_PERCEPTIBLE_PRE_26 = 130;
/**
* Constant for {@link #importance}: This process is not something the user
@@ -3158,11 +3168,17 @@
* before {@link Build.VERSION_CODES#O}. Since the {@link Build.VERSION_CODES#O} SDK,
* the value of {@link #IMPORTANCE_CANT_SAVE_STATE} has been fixed.
*
- * @deprecated Use {@link #IMPORTANCE_CANT_SAVE_STATE} instead.
+ * <p>The system will return this value instead of {@link #IMPORTANCE_CANT_SAVE_STATE}
+ * on Android versions below {@link Build.VERSION_CODES#O}.
+ *
+ * <p>On Android version {@link Build.VERSION_CODES#O} after, this value will still be
+ * returned for apps with the target API level below {@link Build.VERSION_CODES#O}.
+ * For apps targeting version {@link Build.VERSION_CODES#O} and later,
+ * the correct value {@link #IMPORTANCE_CANT_SAVE_STATE} will be returned.
+ *
* @hide
*/
- @Deprecated
- public static final int IMPORTANCE_CANT_SAVE_STATE_DEPRECATED = 170;
+ public static final int IMPORTANCE_CANT_SAVE_STATE_PRE_26 = 170;
/**
* Constant for {@link #importance}: This process is running an
@@ -3220,7 +3236,7 @@
return IMPORTANCE_SERVICE;
} else if (procState > PROCESS_STATE_HEAVY_WEIGHT) {
return IMPORTANCE_CANT_SAVE_STATE;
- } else if (procState >= PROCESS_STATE_IMPORTANT_BACKGROUND) {
+ } else if (procState >= PROCESS_STATE_TRANSIENT_BACKGROUND) {
return IMPORTANCE_PERCEPTIBLE;
} else if (procState >= PROCESS_STATE_IMPORTANT_FOREGROUND) {
return IMPORTANCE_VISIBLE;
@@ -3242,15 +3258,25 @@
*/
public static @Importance int procStateToImportanceForClient(int procState,
Context clientContext) {
+ return procStateToImportanceForTargetSdk(procState,
+ clientContext.getApplicationInfo().targetSdkVersion);
+ }
+
+ /**
+ * See {@link #procStateToImportanceForClient}.
+ * @hide
+ */
+ public static @Importance int procStateToImportanceForTargetSdk(int procState,
+ int targetSdkVersion) {
final int importance = procStateToImportance(procState);
// For pre O apps, convert to the old, wrong values.
- if (clientContext.getApplicationInfo().targetSdkVersion < VERSION_CODES.O) {
+ if (targetSdkVersion < VERSION_CODES.O) {
switch (importance) {
case IMPORTANCE_PERCEPTIBLE:
- return IMPORTANCE_PERCEPTIBLE_DEPRECATED;
+ return IMPORTANCE_PERCEPTIBLE_PRE_26;
case IMPORTANCE_CANT_SAVE_STATE:
- return IMPORTANCE_CANT_SAVE_STATE_DEPRECATED;
+ return IMPORTANCE_CANT_SAVE_STATE_PRE_26;
}
}
return importance;
@@ -3267,7 +3293,7 @@
} else if (importance > IMPORTANCE_CANT_SAVE_STATE) {
return PROCESS_STATE_HEAVY_WEIGHT;
} else if (importance >= IMPORTANCE_PERCEPTIBLE) {
- return PROCESS_STATE_IMPORTANT_BACKGROUND;
+ return PROCESS_STATE_TRANSIENT_BACKGROUND;
} else if (importance >= IMPORTANCE_VISIBLE) {
return PROCESS_STATE_IMPORTANT_FOREGROUND;
} else if (importance >= IMPORTANCE_TOP_SLEEPING) {
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index 63e8cc6..3eec596 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -211,6 +211,9 @@
private static final String KEY_USAGE_TIME_REPORT = "android:activity.usageTimeReport";
private static final String KEY_ROTATION_ANIMATION_HINT = "android:activity.rotationAnimationHint";
+ private static final String KEY_INSTANT_APP_VERIFICATION_BUNDLE
+ = "android:instantapps.installerbundle";
+
/** @hide */
public static final int ANIM_NONE = 0;
/** @hide */
@@ -264,6 +267,7 @@
private boolean mTaskOverlayCanResume;
private AppTransitionAnimationSpec mAnimSpecs[];
private int mRotationAnimationHint = -1;
+ private Bundle mAppVerificationBundle;
/**
* Create an ActivityOptions specifying a custom animation to run when
@@ -886,6 +890,7 @@
opts.getBinder(KEY_ANIMATION_FINISHED_LISTENER));
}
mRotationAnimationHint = opts.getInt(KEY_ROTATION_ANIMATION_HINT);
+ mAppVerificationBundle = opts.getBundle(KEY_INSTANT_APP_VERIFICATION_BUNDLE);
}
/**
@@ -1275,6 +1280,9 @@
b.putBinder(KEY_ANIMATION_FINISHED_LISTENER, mAnimationFinishedListener.asBinder());
}
b.putInt(KEY_ROTATION_ANIMATION_HINT, mRotationAnimationHint);
+ if (mAppVerificationBundle != null) {
+ b.putBundle(KEY_INSTANT_APP_VERIFICATION_BUNDLE, mAppVerificationBundle);
+ }
return b;
}
@@ -1342,6 +1350,30 @@
mRotationAnimationHint = hint;
}
+ /**
+ * Pop the extra verification bundle for the installer.
+ * This removes the bundle from the ActivityOptions to make sure the installer bundle
+ * is only available once.
+ * @hide
+ */
+ public Bundle popAppVerificationBundle() {
+ Bundle out = mAppVerificationBundle;
+ mAppVerificationBundle = null;
+ return out;
+ }
+
+ /**
+ * Set the {@link Bundle} that is provided to the app installer for additional verification
+ * if the call to {@link Context#startActivity} results in an app being installed.
+ *
+ * This Bundle is not provided to any other app besides the installer.
+ */
+ public ActivityOptions setAppVerificationBundle(Bundle bundle) {
+ mAppVerificationBundle = bundle;
+ return this;
+
+ }
+
/** @hide */
@Override
public String toString() {
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 5022d7d..dd9db8a 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -51,7 +51,6 @@
import android.database.sqlite.SQLiteDebug.DbStats;
import android.graphics.Bitmap;
import android.graphics.Canvas;
-import android.graphics.Typeface;
import android.hardware.display.DisplayManagerGlobal;
import android.net.ConnectivityManager;
import android.net.IConnectivityManager;
@@ -90,6 +89,7 @@
import android.provider.CallLog;
import android.provider.ContactsContract;
import android.provider.Downloads;
+import android.provider.FontsContract;
import android.provider.Settings;
import android.security.NetworkSecurityPolicy;
import android.security.net.config.NetworkSecurityConfigProvider;
@@ -670,6 +670,7 @@
IBinder requestToken;
int requestType;
int sessionId;
+ int flags;
}
static final class ActivityConfigChangeData {
@@ -1288,12 +1289,13 @@
@Override
public void requestAssistContextExtras(IBinder activityToken, IBinder requestToken,
- int requestType, int sessionId) {
+ int requestType, int sessionId, int flags) {
RequestAssistContextExtras cmd = new RequestAssistContextExtras();
cmd.activityToken = activityToken;
cmd.requestToken = requestToken;
cmd.requestType = requestType;
cmd.sessionId = sessionId;
+ cmd.flags = flags;
sendMessage(H.REQUEST_ASSIST_CONTEXT_EXTRAS, cmd);
}
@@ -3004,7 +3006,7 @@
// - it needs an IAutoFillCallback
boolean forAutofill = cmd.requestType == ActivityManager.ASSIST_CONTEXT_AUTOFILL;
- // TODO(b/33197203): decide if lastSessionId logic applies to autofill sessions
+ // TODO: decide if lastSessionId logic applies to autofill sessions
if (mLastSessionId != cmd.sessionId) {
// Clear the existing structures
mLastSessionId = cmd.sessionId;
@@ -3030,10 +3032,8 @@
referrer = r.activity.onProvideReferrer();
}
if (cmd.requestType == ActivityManager.ASSIST_CONTEXT_FULL || forAutofill) {
- structure = new AssistStructure(r.activity, forAutofill);
+ structure = new AssistStructure(r.activity, forAutofill, cmd.flags);
Intent activityIntent = r.activity.getIntent();
- // TODO(b/33197203): re-evaluate conditions below for autofill. In particular,
- // FLAG_SECURE might be allowed on AUTO_FILL but not on AUTO_FILL_SAVE)
boolean notSecure = r.window == null ||
(r.window.getAttributes().flags
& WindowManager.LayoutParams.FLAG_SECURE) == 0;
@@ -3059,7 +3059,7 @@
structure = new AssistStructure();
}
- // TODO(b/33197203): decide if lastSessionId logic applies to autofill sessions
+ // TODO: decide if lastSessionId logic applies to autofill sessions
structure.setAcquisitionStartTime(startTime);
structure.setAcquisitionEndTime(SystemClock.uptimeMillis());
@@ -5795,7 +5795,7 @@
}
// Preload fonts resources
- Typeface.setApplicationContext(appContext);
+ FontsContract.setApplicationContextForResources(appContext);
try {
final ApplicationInfo info =
getPackageManager().getApplicationInfo(
diff --git a/core/java/android/app/AlertDialog.java b/core/java/android/app/AlertDialog.java
index 7d81c4c..b7f1068 100644
--- a/core/java/android/app/AlertDialog.java
+++ b/core/java/android/app/AlertDialog.java
@@ -215,7 +215,8 @@
return R.style.Theme_DeviceDefault_Dialog_Alert;
} else if (themeResId == THEME_DEVICE_DEFAULT_LIGHT) {
return R.style.Theme_DeviceDefault_Light_Dialog_Alert;
- } else if (themeResId >= 0x01000000) { // start of real resource IDs.
+ } else if (Integer.compareUnsigned(themeResId, 0x01000000) >= 0) {
+ // start of real resource IDs.
return themeResId;
} else {
final TypedValue outValue = new TypedValue();
diff --git a/core/java/android/app/BackStackRecord.java b/core/java/android/app/BackStackRecord.java
index cf274b4..46e6def 100644
--- a/core/java/android/app/BackStackRecord.java
+++ b/core/java/android/app/BackStackRecord.java
@@ -16,8 +16,6 @@
package android.app;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
@@ -45,7 +43,7 @@
final CharSequence mBreadCrumbShortTitleText;
final ArrayList<String> mSharedElementSourceNames;
final ArrayList<String> mSharedElementTargetNames;
- final boolean mAllowOptimization;
+ final boolean mReorderingAllowed;
public BackStackState(FragmentManagerImpl fm, BackStackRecord bse) {
final int numOps = bse.mOps.size();
@@ -75,7 +73,7 @@
mBreadCrumbShortTitleText = bse.mBreadCrumbShortTitleText;
mSharedElementSourceNames = bse.mSharedElementSourceNames;
mSharedElementTargetNames = bse.mSharedElementTargetNames;
- mAllowOptimization = bse.mAllowOptimization;
+ mReorderingAllowed = bse.mReorderingAllowed;
}
public BackStackState(Parcel in) {
@@ -90,7 +88,7 @@
mBreadCrumbShortTitleText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
mSharedElementSourceNames = in.createStringArrayList();
mSharedElementTargetNames = in.createStringArrayList();
- mAllowOptimization = in.readInt() != 0;
+ mReorderingAllowed = in.readInt() != 0;
}
public BackStackRecord instantiate(FragmentManagerImpl fm) {
@@ -133,7 +131,7 @@
bse.mBreadCrumbShortTitleText = mBreadCrumbShortTitleText;
bse.mSharedElementSourceNames = mSharedElementSourceNames;
bse.mSharedElementTargetNames = mSharedElementTargetNames;
- bse.mAllowOptimization = mAllowOptimization;
+ bse.mReorderingAllowed = mReorderingAllowed;
bse.bumpBackStackNesting(1);
return bse;
}
@@ -154,7 +152,7 @@
TextUtils.writeToParcel(mBreadCrumbShortTitleText, dest, 0);
dest.writeStringList(mSharedElementSourceNames);
dest.writeStringList(mSharedElementTargetNames);
- dest.writeInt(mAllowOptimization ? 1 : 0);
+ dest.writeInt(mReorderingAllowed ? 1 : 0);
}
public static final Parcelable.Creator<BackStackState> CREATOR
@@ -218,7 +216,7 @@
String mName;
boolean mCommitted;
int mIndex = -1;
- boolean mAllowOptimization;
+ boolean mReorderingAllowed;
ArrayList<Runnable> mCommitRunnables;
@@ -370,7 +368,7 @@
public BackStackRecord(FragmentManagerImpl manager) {
mManager = manager;
- mAllowOptimization = mManager.getTargetSdk() > Build.VERSION_CODES.N_MR1;
+ mReorderingAllowed = mManager.getTargetSdk() > Build.VERSION_CODES.N_MR1;
}
public int getId() {
@@ -623,7 +621,7 @@
}
@Override
- public FragmentTransaction postOnCommit(Runnable runnable) {
+ public FragmentTransaction runOnCommit(Runnable runnable) {
if (runnable == null) {
throw new IllegalArgumentException("runnable cannot be null");
}
@@ -665,8 +663,8 @@
}
@Override
- public FragmentTransaction setAllowOptimization(boolean allowOptimization) {
- mAllowOptimization = allowOptimization;
+ public FragmentTransaction setReorderingAllowed(boolean reorderingAllowed) {
+ mReorderingAllowed = reorderingAllowed;
return this;
}
@@ -800,11 +798,11 @@
default:
throw new IllegalArgumentException("Unknown cmd: " + op.cmd);
}
- if (!mAllowOptimization && op.cmd != OP_ADD && f != null) {
+ if (!mReorderingAllowed && op.cmd != OP_ADD && f != null) {
mManager.moveFragmentToExpectedState(f);
}
}
- if (!mAllowOptimization) {
+ if (!mReorderingAllowed) {
// Added fragments are added at the end to comply with prior behavior.
mManager.moveToState(mManager.mCurState, true);
}
@@ -859,11 +857,11 @@
default:
throw new IllegalArgumentException("Unknown cmd: " + op.cmd);
}
- if (!mAllowOptimization && op.cmd != OP_REMOVE && f != null) {
+ if (!mReorderingAllowed && op.cmd != OP_REMOVE && f != null) {
mManager.moveFragmentToExpectedState(f);
}
}
- if (!mAllowOptimization && moveToState) {
+ if (!mReorderingAllowed && moveToState) {
mManager.moveToState(mManager.mCurState, true);
}
}
diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java
index 759efdb..c2fd007 100644
--- a/core/java/android/app/Fragment.java
+++ b/core/java/android/app/Fragment.java
@@ -2417,7 +2417,7 @@
* enabled.
*
* @see Activity#postponeEnterTransition()
- * @see FragmentTransaction#setAllowOptimization(boolean)
+ * @see FragmentTransaction#setReorderingAllowed(boolean)
*/
public void postponeEnterTransition() {
ensureAnimationInfo().mEnterTransitionPostponed = true;
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index 9e8809a..63c0ef3 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -54,7 +54,6 @@
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -453,6 +452,18 @@
public void onFragmentAttached(FragmentManager fm, Fragment f, Context context) {}
/**
+ * Called right before the fragment's {@link Fragment#onCreate(Bundle)} method is called.
+ * This is a good time to inject any required dependencies or perform other configuration
+ * for the fragment.
+ *
+ * @param fm Host FragmentManager
+ * @param f Fragment changing state
+ * @param savedInstanceState Saved instance bundle from a previous instance
+ */
+ public void onFragmentPreCreated(FragmentManager fm, Fragment f,
+ Bundle savedInstanceState) {}
+
+ /**
* Called after the fragment has returned from the FragmentManager's call to
* {@link Fragment#onCreate(Bundle)}. This will only happen once for any given
* fragment instance, though the fragment may be attached and detached multiple times.
@@ -682,7 +693,7 @@
String mNoTransactionsBecause;
boolean mHavePendingDeferredStart;
- // Temporary vars for optimizing execution of BackStackRecords:
+ // Temporary vars for removing redundant operations in BackStackRecords:
ArrayList<BackStackRecord> mTmpRecords;
ArrayList<Boolean> mTmpIsPop;
ArrayList<Fragment> mTmpAddedFragments;
@@ -853,7 +864,7 @@
if (executePop) {
mExecutingActions = true;
try {
- optimizeAndExecuteOps(mTmpRecords, mTmpIsPop);
+ removeRedundantOperationsAndExecute(mTmpRecords, mTmpIsPop);
} finally {
cleanupExec();
}
@@ -1219,6 +1230,7 @@
dispatchOnFragmentAttached(f, mHost.getContext(), false);
if (!f.mRetaining) {
+ dispatchOnFragmentPreCreated(f, f.mSavedFragmentState, false);
f.performCreate(f.mSavedFragmentState);
dispatchOnFragmentCreated(f, f.mSavedFragmentState, false);
} else {
@@ -2002,7 +2014,7 @@
if (action.generateOps(mTmpRecords, mTmpIsPop)) {
mExecutingActions = true;
try {
- optimizeAndExecuteOps(mTmpRecords, mTmpIsPop);
+ removeRedundantOperationsAndExecute(mTmpRecords, mTmpIsPop);
} finally {
cleanupExec();
}
@@ -2032,7 +2044,7 @@
while (generateOpsForPendingActions(mTmpRecords, mTmpIsPop)) {
mExecutingActions = true;
try {
- optimizeAndExecuteOps(mTmpRecords, mTmpIsPop);
+ removeRedundantOperationsAndExecute(mTmpRecords, mTmpIsPop);
} finally {
cleanupExec();
}
@@ -2080,19 +2092,20 @@
}
/**
- * Optimizes BackStackRecord operations. This method merges operations of proximate records
- * that allow optimization. See {@link FragmentTransaction#setAllowOptimization(boolean)}.
+ * Remove redundant BackStackRecord operations and executes them. This method merges operations
+ * of proximate records that allow reordering. See
+ * {@link FragmentTransaction#setReorderingAllowed(boolean)}.
* <p>
* For example, a transaction that adds to the back stack and then another that pops that
- * back stack record will be optimized.
+ * back stack record will be optimized to remove the unnecessary operation.
* <p>
* Likewise, two transactions committed that are executed at the same time will be optimized
- * as well as two pop operations executed together.
+ * to remove the redundant operations as well as two pop operations executed together.
*
* @param records The records pending execution
* @param isRecordPop The direction that these records are being run.
*/
- private void optimizeAndExecuteOps(ArrayList<BackStackRecord> records,
+ private void removeRedundantOperationsAndExecute(ArrayList<BackStackRecord> records,
ArrayList<Boolean> isRecordPop) {
if (records == null || records.isEmpty()) {
return;
@@ -2108,24 +2121,25 @@
final int numRecords = records.size();
int startIndex = 0;
for (int recordNum = 0; recordNum < numRecords; recordNum++) {
- final boolean canOptimize = records.get(recordNum).mAllowOptimization;
- if (!canOptimize) {
+ final boolean canReorder = records.get(recordNum).mReorderingAllowed;
+ if (!canReorder) {
// execute all previous transactions
if (startIndex != recordNum) {
executeOpsTogether(records, isRecordPop, startIndex, recordNum);
}
- // execute all unoptimized pop operations together or one add operation
- int optimizeEnd = recordNum + 1;
+ // execute all pop operations that don't allow reordering together or
+ // one add operation
+ int reorderingEnd = recordNum + 1;
if (isRecordPop.get(recordNum)) {
- while (optimizeEnd < numRecords
- && isRecordPop.get(optimizeEnd)
- && !records.get(optimizeEnd).mAllowOptimization) {
- optimizeEnd++;
+ while (reorderingEnd < numRecords
+ && isRecordPop.get(reorderingEnd)
+ && !records.get(reorderingEnd).mReorderingAllowed) {
+ reorderingEnd++;
}
}
- executeOpsTogether(records, isRecordPop, recordNum, optimizeEnd);
- startIndex = optimizeEnd;
- recordNum = optimizeEnd - 1;
+ executeOpsTogether(records, isRecordPop, recordNum, reorderingEnd);
+ startIndex = reorderingEnd;
+ recordNum = reorderingEnd - 1;
}
}
if (startIndex != numRecords) {
@@ -2134,16 +2148,16 @@
}
/**
- * Optimizes a subset of a list of BackStackRecords, all of which either allow optimization or
- * do not allow optimization.
- * @param records A list of BackStackRecords that are to be optimized
+ * Executes a subset of a list of BackStackRecords, all of which either allow reordering or
+ * do not allow ordering.
+ * @param records A list of BackStackRecords that are to be executed together
* @param isRecordPop The direction that these records are being run.
- * @param startIndex The index of the first record in <code>records</code> to be optimized
- * @param endIndex One more than the final record index in <code>records</code> to optimize.
+ * @param startIndex The index of the first record in <code>records</code> to be executed
+ * @param endIndex One more than the final record index in <code>records</code> to executed.
*/
private void executeOpsTogether(ArrayList<BackStackRecord> records,
ArrayList<Boolean> isRecordPop, int startIndex, int endIndex) {
- final boolean allowOptimization = records.get(startIndex).mAllowOptimization;
+ final boolean allowReordering = records.get(startIndex).mReorderingAllowed;
boolean addToBackStack = false;
if (mTmpAddedFragments == null) {
mTmpAddedFragments = new ArrayList<>();
@@ -2166,14 +2180,14 @@
}
mTmpAddedFragments.clear();
- if (!allowOptimization) {
+ if (!allowReordering) {
FragmentTransition.startTransitions(this, records, isRecordPop, startIndex, endIndex,
false);
}
executeOps(records, isRecordPop, startIndex, endIndex);
int postponeIndex = endIndex;
- if (allowOptimization) {
+ if (allowReordering) {
ArraySet<Fragment> addedFragments = new ArraySet<>();
addAddedFragments(addedFragments);
postponeIndex = postponePostponableTransactions(records, isRecordPop,
@@ -2181,7 +2195,7 @@
makeRemovedFragmentsInvisible(addedFragments);
}
- if (postponeIndex != startIndex && allowOptimization) {
+ if (postponeIndex != startIndex && allowReordering) {
// need to run something now
FragmentTransition.startTransitions(this, records, isRecordPop, startIndex,
postponeIndex, true);
@@ -3273,6 +3287,25 @@
}
}
+ void dispatchOnFragmentPreCreated(Fragment f, Bundle savedInstanceState,
+ boolean onlyRecursive) {
+ if (mParent != null) {
+ FragmentManager parentManager = mParent.getFragmentManager();
+ if (parentManager instanceof FragmentManagerImpl) {
+ ((FragmentManagerImpl) parentManager)
+ .dispatchOnFragmentPreCreated(f, savedInstanceState, true);
+ }
+ }
+ if (mLifecycleCallbacks == null) {
+ return;
+ }
+ for (Pair<FragmentLifecycleCallbacks, Boolean> p : mLifecycleCallbacks) {
+ if (!onlyRecursive || p.second) {
+ p.first.onFragmentPreCreated(this, f, savedInstanceState);
+ }
+ }
+ }
+
void dispatchOnFragmentCreated(Fragment f, Bundle savedInstanceState, boolean onlyRecursive) {
if (mParent != null) {
FragmentManager parentManager = mParent.getFragmentManager();
diff --git a/core/java/android/app/FragmentTransaction.java b/core/java/android/app/FragmentTransaction.java
index c938aa6..c910e90 100644
--- a/core/java/android/app/FragmentTransaction.java
+++ b/core/java/android/app/FragmentTransaction.java
@@ -6,6 +6,7 @@
import android.annotation.Nullable;
import android.annotation.StringRes;
import android.annotation.StyleRes;
+import android.os.Bundle;
import android.view.View;
import java.lang.annotation.Retention;
@@ -279,45 +280,57 @@
/**
* Sets whether or not to allow optimizing operations within and across
- * transactions. Optimizing fragment transaction's operations can eliminate
+ * transactions. This will remove redundant operations, eliminating
* operations that cancel. For example, if two transactions are executed
* together, one that adds a fragment A and the next replaces it with fragment B,
* the operations will cancel and only fragment B will be added. That means that
* fragment A may not go through the creation/destruction lifecycle.
* <p>
- * The side effect of optimization is that fragments may have state changes
+ * The side effect of removing redundant operations is that fragments may have state changes
* out of the expected order. For example, one transaction adds fragment A,
- * a second adds fragment B, then a third removes fragment A. Without optimization,
- * fragment B could expect that while it is being created, fragment A will also
+ * a second adds fragment B, then a third removes fragment A. Without removing the redundant
+ * operations, fragment B could expect that while it is being created, fragment A will also
* exist because fragment A will be removed after fragment B was added.
- * With optimization, fragment B cannot expect fragment A to exist when
+ * With removing redundant operations, fragment B cannot expect fragment A to exist when
* it has been created because fragment A's add/remove will be optimized out.
* <p>
+ * It can also reorder the state changes of Fragments to allow for better Transitions.
+ * Added Fragments may have {@link Fragment#onCreate(Bundle)} called before replaced
+ * Fragments have {@link Fragment#onDestroy()} called.
+ * <p>
* The default is {@code false} for applications targeting version
* versions prior to O and {@code true} for applications targeting O and
* later.
*
- * @param allowOptimization {@code true} to enable optimizing operations
- * or {@code false} to disable optimizing
+ * @param reorderingAllowed {@code true} to enable optimizing out redundant operations
+ * or {@code false} to disable optimizing out redundant
* operations on this transaction.
*/
- public abstract FragmentTransaction setAllowOptimization(boolean allowOptimization);
+ public abstract FragmentTransaction setReorderingAllowed(boolean reorderingAllowed);
/**
* Add a Runnable to this transaction that will be run after this transaction has
- * been committed. If fragment transactions are {@link #setAllowOptimization(boolean) optimized}
+ * been committed. If fragment transactions are {@link #setReorderingAllowed(boolean) optimized}
* this may be after other subsequent fragment operations have also taken place, or operations
* in this transaction may have been optimized out due to the presence of a subsequent
* fragment transaction in the batch.
*
- * <p><code>postOnCommit</code> may not be used with transactions
+ *
+ * <p>If a transaction is committed using {@link #commitAllowingStateLoss()} this runnable
+ * may be executed when the FragmentManager is in a state where new transactions may not
+ * be committed without allowing state loss.</p>
+ *
+ * <p><code>runOnCommit</code> may not be used with transactions
* {@link #addToBackStack(String) added to the back stack} as Runnables cannot be persisted
- * with back stack state.</p>
+ * with back stack state. {@link IllegalStateException} will be thrown if
+ * {@link #addToBackStack(String)} has been previously called for this transaction
+ * or if it is called after a call to <code>runOnCommit</code>.</p>
*
* @param runnable Runnable to add
* @return this FragmentTransaction
+ * @throws IllegalStateException if {@link #addToBackStack(String)} has been called
*/
- public abstract FragmentTransaction postOnCommit(Runnable runnable);
+ public abstract FragmentTransaction runOnCommit(Runnable runnable);
/**
* Schedules a commit of this transaction. The commit does
diff --git a/core/java/android/app/FragmentTransition.java b/core/java/android/app/FragmentTransition.java
index b4c6dce..ceb828b 100644
--- a/core/java/android/app/FragmentTransition.java
+++ b/core/java/android/app/FragmentTransition.java
@@ -34,9 +34,10 @@
import java.util.Map;
/**
- * Contains the Fragment Transition functionality for both optimized and unoptimized
- * Fragment Transactions. With optimized fragment transactions, all Views have been
- * added to the View hierarchy prior to calling startTransitions. With
+ * Contains the Fragment Transition functionality for both ordered and reordered
+ * Fragment Transactions. With reordered fragment transactions, all Views have been
+ * added to the View hierarchy prior to calling startTransitions. With ordered
+ * fragment transactions, Views will be removed and added after calling startTransitions.
*/
class FragmentTransition {
/**
@@ -65,9 +66,9 @@
* {@link Fragment#getSharedElementReturnTransition()} and the entering
* {@link Fragment#getReenterTransition()} will be run.
* <p>
- * With optimized Fragment Transitions, all Views have been added to the
+ * With reordered Fragment Transitions, all Views have been added to the
* View hierarchy prior to calling this method. The incoming Fragment's Views
- * will be INVISIBLE. With unoptimized Fragment Transitions, this method
+ * will be INVISIBLE. With ordered Fragment Transitions, this method
* is called before any change has been made to the hierarchy. That means
* that the added Fragments have not created their Views yet and the hierarchy
* is unknown.
@@ -79,13 +80,13 @@
* part of this transition.
* @param endIndex One past the last index into records and isRecordPop to execute
* as part of this transition.
- * @param isOptimized true if this is an optimized transaction, meaning that the
+ * @param isReordered true if this is a reordered transaction, meaning that the
* Views of incoming fragments have been added. false if the
* transaction has yet to be run and Views haven't been created.
*/
static void startTransitions(FragmentManagerImpl fragmentManager,
ArrayList<BackStackRecord> records, ArrayList<Boolean> isRecordPop,
- int startIndex, int endIndex, boolean isOptimized) {
+ int startIndex, int endIndex, boolean isReordered) {
if (fragmentManager.mCurState < Fragment.CREATED) {
return;
}
@@ -95,9 +96,9 @@
final BackStackRecord record = records.get(i);
final boolean isPop = isRecordPop.get(i);
if (isPop) {
- calculatePopFragments(record, transitioningFragments, isOptimized);
+ calculatePopFragments(record, transitioningFragments, isReordered);
} else {
- calculateFragments(record, transitioningFragments, isOptimized);
+ calculateFragments(record, transitioningFragments, isReordered);
}
}
@@ -111,11 +112,11 @@
FragmentContainerTransition containerTransition = transitioningFragments.valueAt(i);
- if (isOptimized) {
- configureTransitionsOptimized(fragmentManager, containerId,
+ if (isReordered) {
+ configureTransitionsReordered(fragmentManager, containerId,
containerTransition, nonExistentView, nameOverrides);
} else {
- configureTransitionsUnoptimized(fragmentManager, containerId,
+ configureTransitionsOrdered(fragmentManager, containerId,
containerTransition, nonExistentView, nameOverrides);
}
}
@@ -175,7 +176,7 @@
/**
* Configures a transition for a single fragment container for which the transaction was
- * optimized. That means that all Fragment Views have been added and incoming fragment
+ * reordered. That means that all Fragment Views have been added and incoming fragment
* Views are marked invisible.
*
* @param fragmentManager The executing FragmentManagerImpl
@@ -188,7 +189,7 @@
* the final fragment's Views as given in
* {@link FragmentTransaction#addSharedElement(View, String)}.
*/
- private static void configureTransitionsOptimized(FragmentManagerImpl fragmentManager,
+ private static void configureTransitionsReordered(FragmentManagerImpl fragmentManager,
int containerId, FragmentContainerTransition fragments,
View nonExistentView, ArrayMap<String, String> nameOverrides) {
ViewGroup sceneRoot = null;
@@ -208,7 +209,7 @@
Transition enterTransition = getEnterTransition(inFragment, inIsPop);
Transition exitTransition = getExitTransition(outFragment, outIsPop);
- TransitionSet sharedElementTransition = configureSharedElementsOptimized(sceneRoot,
+ TransitionSet sharedElementTransition = configureSharedElementsReordered(sceneRoot,
nonExistentView, nameOverrides, fragments, sharedElementsOut, sharedElementsIn,
enterTransition, exitTransition);
@@ -247,7 +248,7 @@
/**
* Configures a transition for a single fragment container for which the transaction was
- * not optimized. That means that the transaction has not been executed yet, so incoming
+ * ordered. That means that the transaction has not been executed yet, so incoming
* Views are not yet known.
*
* @param fragmentManager The executing FragmentManagerImpl
@@ -260,7 +261,7 @@
* the final fragment's Views as given in
* {@link FragmentTransaction#addSharedElement(View, String)}.
*/
- private static void configureTransitionsUnoptimized(FragmentManagerImpl fragmentManager,
+ private static void configureTransitionsOrdered(FragmentManagerImpl fragmentManager,
int containerId, FragmentContainerTransition fragments,
View nonExistentView, ArrayMap<String, String> nameOverrides) {
ViewGroup sceneRoot = null;
@@ -281,7 +282,7 @@
ArrayList<View> sharedElementsOut = new ArrayList<>();
ArrayList<View> sharedElementsIn = new ArrayList<>();
- TransitionSet sharedElementTransition = configureSharedElementsUnoptimized(sceneRoot,
+ TransitionSet sharedElementTransition = configureSharedElementsOrdered(sceneRoot,
nonExistentView, nameOverrides, fragments, sharedElementsOut, sharedElementsIn,
enterTransition, exitTransition);
@@ -345,7 +346,7 @@
}
/**
- * This method is used for fragment transitions for unoptimized transactions to change the
+ * This method is used for fragment transitions for ordered transactions to change the
* enter and exit transition targets after the call to
* {@link TransitionManager#beginDelayedTransition(ViewGroup, Transition)}. The exit transition
* must ensure that it does not target any Views and the enter transition must start targeting
@@ -448,7 +449,7 @@
}
/**
- * Configures the shared elements of an optimized fragment transaction's transition.
+ * Configures the shared elements of an reordered fragment transaction's transition.
* This retrieves the shared elements of the outgoing and incoming fragments, maps the
* views, and sets up the epicenter on the transitions.
* <p>
@@ -474,7 +475,7 @@
* epicenter
* @return The shared element transition or null if no shared elements exist
*/
- private static TransitionSet configureSharedElementsOptimized(final ViewGroup sceneRoot,
+ private static TransitionSet configureSharedElementsReordered(final ViewGroup sceneRoot,
final View nonExistentView, ArrayMap<String, String> nameOverrides,
final FragmentContainerTransition fragments,
final ArrayList<View> sharedElementsOut,
@@ -576,7 +577,7 @@
}
/**
- * Configures the shared elements of an unoptimized fragment transaction's transition.
+ * Configures the shared elements of an ordered fragment transaction's transition.
* This retrieves the shared elements of the incoming fragments, and schedules capturing
* the incoming fragment's shared elements. It also maps the views, and sets up the epicenter
* on the transitions.
@@ -603,7 +604,7 @@
* epicenter
* @return The shared element transition or null if no shared elements exist
*/
- private static TransitionSet configureSharedElementsUnoptimized(final ViewGroup sceneRoot,
+ private static TransitionSet configureSharedElementsOrdered(final ViewGroup sceneRoot,
final View nonExistentView, ArrayMap<String, String> nameOverrides,
final FragmentContainerTransition fragments,
final ArrayList<View> sharedElementsOut,
@@ -1195,11 +1196,11 @@
*/
public static void calculateFragments(BackStackRecord transaction,
SparseArray<FragmentContainerTransition> transitioningFragments,
- boolean isOptimized) {
+ boolean isReordered) {
final int numOps = transaction.mOps.size();
for (int opNum = 0; opNum < numOps; opNum++) {
final BackStackRecord.Op op = transaction.mOps.get(opNum);
- addToFirstInLastOut(transaction, op, transitioningFragments, false, isOptimized);
+ addToFirstInLastOut(transaction, op, transitioningFragments, false, isReordered);
}
}
@@ -1212,14 +1213,14 @@
* this method.
*/
public static void calculatePopFragments(BackStackRecord transaction,
- SparseArray<FragmentContainerTransition> transitioningFragments, boolean isOptimized) {
+ SparseArray<FragmentContainerTransition> transitioningFragments, boolean isReordered) {
if (!transaction.mManager.mContainer.onHasView()) {
return; // nothing to see, so no transitions
}
final int numOps = transaction.mOps.size();
for (int opNum = numOps - 1; opNum >= 0; opNum--) {
final BackStackRecord.Op op = transaction.mOps.get(opNum);
- addToFirstInLastOut(transaction, op, transitioningFragments, true, isOptimized);
+ addToFirstInLastOut(transaction, op, transitioningFragments, true, isReordered);
}
}
@@ -1232,14 +1233,14 @@
* @param transitioningFragments A structure holding the first in and last out fragments
* for each fragment container.
* @param isPop Is the operation a pop?
- * @param isOptimizedTransaction True if the operations have been partially executed and the
+ * @param isReorderedTransaction True if the operations have been partially executed and the
* added fragments have Views in the hierarchy or false if the
* operations haven't been executed yet.
*/
@SuppressWarnings("ReferenceEquality")
private static void addToFirstInLastOut(BackStackRecord transaction, BackStackRecord.Op op,
SparseArray<FragmentContainerTransition> transitioningFragments, boolean isPop,
- boolean isOptimizedTransaction) {
+ boolean isReorderedTransaction) {
final Fragment fragment = op.fragment;
if (fragment == null) {
return; // no fragment, no transition
@@ -1255,7 +1256,7 @@
boolean wasAdded = false;
switch (command) {
case BackStackRecord.OP_SHOW:
- if (isOptimizedTransaction) {
+ if (isReorderedTransaction) {
setLastIn = fragment.mHiddenChanged && !fragment.mHidden &&
fragment.mAdded;
} else {
@@ -1265,7 +1266,7 @@
break;
case BackStackRecord.OP_ADD:
case BackStackRecord.OP_ATTACH:
- if (isOptimizedTransaction) {
+ if (isReorderedTransaction) {
setLastIn = fragment.mIsNewlyAdded;
} else {
setLastIn = !fragment.mAdded && !fragment.mHidden;
@@ -1273,7 +1274,7 @@
wasAdded = true;
break;
case BackStackRecord.OP_HIDE:
- if (isOptimizedTransaction) {
+ if (isReorderedTransaction) {
setFirstOut = fragment.mHiddenChanged && fragment.mAdded &&
fragment.mHidden;
} else {
@@ -1283,7 +1284,7 @@
break;
case BackStackRecord.OP_REMOVE:
case BackStackRecord.OP_DETACH:
- if (isOptimizedTransaction) {
+ if (isReorderedTransaction) {
setFirstOut = !fragment.mAdded && fragment.mView != null
&& fragment.mView.getVisibility() == View.VISIBLE
&& fragment.mView.getTransitionAlpha() > 0;
@@ -1301,7 +1302,7 @@
containerTransition.lastInIsPop = isPop;
containerTransition.lastInTransaction = transaction;
}
- if (!isOptimizedTransaction && wasAdded) {
+ if (!isReorderedTransaction && wasAdded) {
if (containerTransition != null && containerTransition.firstOut == fragment) {
containerTransition.firstOut = null;
}
@@ -1313,7 +1314,7 @@
FragmentManagerImpl manager = transaction.mManager;
if (fragment.mState < Fragment.CREATED && manager.mCurState >= Fragment.CREATED &&
manager.mHost.getContext().getApplicationInfo().targetSdkVersion >=
- Build.VERSION_CODES.N && !transaction.mAllowOptimization) {
+ Build.VERSION_CODES.N && !transaction.mReorderingAllowed) {
manager.makeActive(fragment);
manager.moveToState(fragment, Fragment.CREATED, 0, 0, false);
}
@@ -1326,7 +1327,7 @@
containerTransition.firstOutTransaction = transaction;
}
- if (!isOptimizedTransaction && wasRemoved &&
+ if (!isReorderedTransaction && wasRemoved &&
(containerTransition != null && containerTransition.lastIn == fragment)) {
containerTransition.lastIn = null;
}
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index d1eea3b..aeccf56 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -34,7 +34,7 @@
import android.app.IUserSwitchObserver;
import android.app.Notification;
import android.app.PendingIntent;
-import android.app.PictureInPictureArgs;
+import android.app.PictureInPictureParams;
import android.app.ProfilerInfo;
import android.app.WaitResult;
import android.app.assist.AssistContent;
@@ -500,8 +500,9 @@
boolean isInMultiWindowMode(in IBinder token);
boolean isInPictureInPictureMode(in IBinder token);
void killPackageDependents(in String packageName, int userId);
- boolean enterPictureInPictureMode(in IBinder token, in PictureInPictureArgs args);
- void setPictureInPictureArgs(in IBinder token, in PictureInPictureArgs args);
+ boolean enterPictureInPictureMode(in IBinder token, in PictureInPictureParams params);
+ void setPictureInPictureParams(in IBinder token, in PictureInPictureParams params);
+ int getMaxNumPictureInPictureActions(in IBinder token);
void activityRelaunched(in IBinder token);
IBinder getUriPermissionOwnerForActivity(in IBinder activityToken);
/**
@@ -593,7 +594,7 @@
void unregisterTaskStackListener(ITaskStackListener listener);
void moveStackToDisplay(int stackId, int displayId);
boolean requestAutofillData(in IResultReceiver receiver, in Bundle receiverExtras,
- in IBinder activityToken);
+ in IBinder activityToken, int flags);
void dismissKeyguard(in IBinder token, in IKeyguardDismissCallback callback);
int restartUserInBackground(int userId);
@@ -604,7 +605,7 @@
void cancelTaskThumbnailTransition(int taskId);
/**
- * @param taskId the id of the task to retrieve the snapshots for
+ * @param taskId the id of the task to retrieve the sAutoapshots for
* @param reducedResolution if set, if the snapshot needs to be loaded from disk, this will load
* a reduced resolution of it, which is much faster
* @return a graphic buffer representing a screenshot of a task
diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl
index 1b3c00b..b3521c0 100644
--- a/core/java/android/app/IApplicationThread.aidl
+++ b/core/java/android/app/IApplicationThread.aidl
@@ -135,7 +135,7 @@
void dumpDbInfo(in ParcelFileDescriptor fd, in String[] args);
void unstableProviderDied(IBinder provider);
void requestAssistContextExtras(IBinder activityToken, IBinder requestToken,
- int requestType, int sessionId);
+ int requestType, int sessionId, int flags);
void scheduleTranslucentConversionComplete(IBinder token, boolean timeout);
void setProcessState(int state);
void scheduleInstallProvider(in ProviderInfo provider);
diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java
index 9377d35..69ed439 100644
--- a/core/java/android/app/Instrumentation.java
+++ b/core/java/android/app/Instrumentation.java
@@ -543,10 +543,10 @@
* Create a new ActivityMonitor that can be used for intercepting any activity to be
* started.
*
- * <p> When an activity is started, {@link #onMatchIntent(Intent)} will be called on
+ * <p> When an activity is started, {@link #onStartActivity(Intent)} will be called on
* instances created using this constructor to see if it is a hit.
*
- * @see #onMatchIntent(Intent)
+ * @see #onStartActivity(Intent)
*/
public ActivityMonitor() {
mWhich = null;
@@ -558,7 +558,7 @@
/**
* @return true if this monitor is used for intercepting any started activity by calling
- * into {@link #onMatchIntent(Intent)}, false if this monitor is only used
+ * into {@link #onStartActivity(Intent)}, false if this monitor is only used
* for specific intents corresponding to the intent filter or activity class
* passed in the constructor.
*/
@@ -665,7 +665,7 @@
* @param intent The intent used for starting the activity.
* @return The {@link ActivityResult} that needs to be used in case of a match.
*/
- public ActivityResult onMatchIntent(Intent intent) {
+ public ActivityResult onStartActivity(Intent intent) {
return null;
}
@@ -1589,7 +1589,7 @@
final ActivityMonitor am = mActivityMonitors.get(i);
ActivityResult result = null;
if (am.ignoreMatchingSpecificIntents()) {
- result = am.onMatchIntent(intent);
+ result = am.onStartActivity(intent);
}
if (result != null) {
am.mHits++;
@@ -1652,7 +1652,7 @@
final ActivityMonitor am = mActivityMonitors.get(i);
ActivityResult result = null;
if (am.ignoreMatchingSpecificIntents()) {
- result = am.onMatchIntent(intents[0]);
+ result = am.onStartActivity(intents[0]);
}
if (result != null) {
am.mHits++;
@@ -1722,7 +1722,7 @@
final ActivityMonitor am = mActivityMonitors.get(i);
ActivityResult result = null;
if (am.ignoreMatchingSpecificIntents()) {
- result = am.onMatchIntent(intent);
+ result = am.onStartActivity(intent);
}
if (result != null) {
am.mHits++;
@@ -1789,7 +1789,7 @@
final ActivityMonitor am = mActivityMonitors.get(i);
ActivityResult result = null;
if (am.ignoreMatchingSpecificIntents()) {
- result = am.onMatchIntent(intent);
+ result = am.onStartActivity(intent);
}
if (result != null) {
am.mHits++;
@@ -1835,7 +1835,7 @@
final ActivityMonitor am = mActivityMonitors.get(i);
ActivityResult result = null;
if (am.ignoreMatchingSpecificIntents()) {
- result = am.onMatchIntent(intent);
+ result = am.onStartActivity(intent);
}
if (result != null) {
am.mHits++;
@@ -1880,7 +1880,7 @@
final ActivityMonitor am = mActivityMonitors.get(i);
ActivityResult result = null;
if (am.ignoreMatchingSpecificIntents()) {
- result = am.onMatchIntent(intent);
+ result = am.onStartActivity(intent);
}
if (result != null) {
am.mHits++;
diff --git a/core/java/android/app/KeyguardManager.java b/core/java/android/app/KeyguardManager.java
index b8a5f57..4de6e44 100644
--- a/core/java/android/app/KeyguardManager.java
+++ b/core/java/android/app/KeyguardManager.java
@@ -381,27 +381,58 @@
* or {@code null} if the caller isn't interested in knowing the result.
* @param handler The handler to invoke the callback on, or {@code null} to use the main
* handler.
+ *
+ * TO BE REMOVED
*/
+ @Deprecated
public void dismissKeyguard(@NonNull Activity activity,
@Nullable KeyguardDismissCallback callback, @Nullable Handler handler) {
+ requestDismissKeyguard(activity, callback);
+ }
+
+ /**
+ * If the device is currently locked (see {@link #isKeyguardLocked()}, requests the Keyguard to
+ * be dismissed.
+ * <p>
+ * If the Keyguard is not secure or the device is currently in a trusted state, calling this
+ * method will immediately dismiss the Keyguard without any user interaction.
+ * <p>
+ * If the Keyguard is secure and the device is not in a trusted state, this will bring up the
+ * UI so the user can enter their credentials.
+ *
+ * @param activity The activity requesting the dismissal. The activity must be either visible
+ * by using {@link LayoutParams#FLAG_SHOW_WHEN_LOCKED} or must be in a state in
+ * which it would be visible if Keyguard would not be hiding it. If that's not
+ * the case, the request will fail immediately and
+ * {@link KeyguardDismissCallback#onDismissError} will be invoked.
+ * @param callback The callback to be called if the request to dismiss Keyguard was successful
+ * or {@code null} if the caller isn't interested in knowing the result. The
+ * callback will not be invoked if the activity was destroyed before the
+ * callback was received.
+ */
+ public void requestDismissKeyguard(@NonNull Activity activity,
+ @Nullable KeyguardDismissCallback callback) {
try {
- final Handler actualHandler = handler != null
- ? handler
- : new Handler(Looper.getMainLooper());
mAm.dismissKeyguard(activity.getActivityToken(), new IKeyguardDismissCallback.Stub() {
@Override
public void onDismissError() throws RemoteException {
- actualHandler.post(callback::onDismissError);
+ if (callback != null && !activity.isDestroyed()) {
+ activity.mHandler.post(callback::onDismissError);
+ }
}
@Override
public void onDismissSucceeded() throws RemoteException {
- actualHandler.post(callback::onDismissSucceeded);
+ if (callback != null && !activity.isDestroyed()) {
+ activity.mHandler.post(callback::onDismissSucceeded);
+ }
}
@Override
public void onDismissCancelled() throws RemoteException {
- actualHandler.post(callback::onDismissCancelled);
+ if (callback != null && !activity.isDestroyed()) {
+ activity.mHandler.post(callback::onDismissCancelled);
+ }
}
});
} catch (RemoteException e) {
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 2b4fb19..28fe319 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -239,16 +239,11 @@
* The number of events that this notification represents. For example, in a new mail
* notification, this could be the number of unread messages.
*
- * The system may or may not use this field to modify the appearance of the notification. For
- * example, before {@link android.os.Build.VERSION_CODES#HONEYCOMB}, this number was
- * superimposed over the icon in the status bar. Starting with
- * {@link android.os.Build.VERSION_CODES#HONEYCOMB}, the template used by
- * {@link Notification.Builder} has displayed the number in the expanded notification view.
+ * The system may or may not use this field to modify the appearance of the notification.
* Starting with {@link android.os.Build.VERSION_CODES#O}, the number may be displayed as a
* badge icon in Launchers that support badging.
- *
*/
- public int number = 1;
+ public int number = 0;
/**
* The intent to execute when the expanded status entry is clicked. If
@@ -1106,6 +1101,45 @@
private String mShortcutId;
private CharSequence mSettingsText;
+ /** @hide */
+ @IntDef(prefix = { "GROUP_ALERT_" }, value = {
+ GROUP_ALERT_ALL, GROUP_ALERT_CHILDREN, GROUP_ALERT_SUMMARY
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface GroupAlertBehavior {}
+
+ /**
+ * Constant for {@link Builder#setGroupAlertBehavior(int)}, meaning that all notifications in a
+ * group with sound or vibration ought to make sound or vibrate (respectively), so this
+ * notification will not be muted when it is in a group.
+ */
+ public static final int GROUP_ALERT_ALL = 0;
+
+ /**
+ * Constant for {@link Builder#setGroupAlertBehavior(int)}, meaning that all children
+ * notification in a group should be silenced (no sound or vibration) even if they are posted
+ * to a {@link NotificationChannel} that has sound and/or vibration. Use this constant to
+ * mute this notification if this notification is a group child.
+ *
+ * <p> For example, you might want to use this constant if you post a number of children
+ * notifications at once (say, after a periodic sync), and only need to notify the user
+ * audibly once.
+ */
+ public static final int GROUP_ALERT_SUMMARY = 1;
+
+ /**
+ * Constant for {@link Builder#setGroupAlertBehavior(int)}, meaning that the summary
+ * notification in a group should be silenced (no sound or vibration) even if they are
+ * posted to a {@link NotificationChannel} that has sound and/or vibration. Use this constant
+ * to mute this notification if this notification is a group summary.
+ *
+ * <p>For example, you might want to use this constant if only the children notifications
+ * in your group have content and the summary is only used to visually group notifications.
+ */
+ public static final int GROUP_ALERT_CHILDREN = 2;
+
+ private int mGroupAlertBehavior = GROUP_ALERT_ALL;
+
/**
* If this notification is being shown as a badge, always show as a number.
*/
@@ -1251,7 +1285,7 @@
* action is sent. These remote inputs are guaranteed to return true on a call to
* {@link RemoteInput#isDataOnly}.
*
- * May return null if no data-only remote inputs were added.
+ * Returns null if there are no data-only remote inputs.
*
* This method exists so that legacy RemoteInput collectors that pre-date the addition
* of non-textual RemoteInputs do not access these remote inputs.
@@ -1878,6 +1912,8 @@
if (parcel.readInt() != 0) {
mSettingsText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
}
+
+ mGroupAlertBehavior = parcel.readInt();
}
@Override
@@ -1990,6 +2026,7 @@
that.mShortcutId = this.mShortcutId;
that.mBadgeIcon = this.mBadgeIcon;
that.mSettingsText = this.mSettingsText;
+ that.mGroupAlertBehavior = this.mGroupAlertBehavior;
if (!heavy) {
that.lightenPayload(); // will clean out extras
@@ -2266,6 +2303,8 @@
} else {
parcel.writeInt(0);
}
+
+ parcel.writeInt(mGroupAlertBehavior);
}
/**
@@ -2349,7 +2388,7 @@
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Notification(channel=");
- sb.append(getChannel());
+ sb.append(getChannelId());
sb.append(" pri=");
sb.append(priority);
sb.append(" contentView=");
@@ -2463,6 +2502,13 @@
}
/**
+ * Returns the id of the channel this notification posts to.
+ */
+ public String getChannelId() {
+ return mChannelId;
+ }
+
+ /**
* Returns the time at which this notification should be canceled by the system, if it's not
* canceled already.
*/
@@ -2471,14 +2517,11 @@
}
/**
- * @removed
- * Returns what icon should be shown for this notification if it is being displayed in a
- * Launcher that supports badging. Will be one of {@link #BADGE_ICON_NONE},
- * {@link #BADGE_ICON_SMALL}, or {@link #BADGE_ICON_LARGE}.
+ * Returns the duration from posting after which this notification should be canceled by the
+ * system, if it's not canceled already.
*/
- @Deprecated
- public int getBadgeIcon() {
- return mBadgeIcon;
+ public long getTimeoutAfter() {
+ return mTimeout;
}
/**
@@ -2492,6 +2535,9 @@
/**
* Returns the {@link ShortcutInfo#getId() id} that this notification supersedes, if any.
+ *
+ * <p>Used by some Launchers that display notification content to hide shortcuts that duplicate
+ * notifications.
*/
public String getShortcutId() {
return mShortcutId;
@@ -2506,6 +2552,15 @@
}
/**
+ * Returns which type of notifications in a group are responsible for audibly alerting the
+ * user. See {@link #GROUP_ALERT_ALL}, {@link #GROUP_ALERT_CHILDREN},
+ * {@link #GROUP_ALERT_SUMMARY}.
+ */
+ public @GroupAlertBehavior int getGroupAlertBehavior() {
+ return mGroupAlertBehavior;
+ }
+
+ /**
* The small icon representing this notification in the status bar and content view.
*
* @return the small icon representing this notification.
@@ -2621,21 +2676,12 @@
private int mPrimaryTextColor = COLOR_INVALID;
private int mSecondaryTextColor = COLOR_INVALID;
private int mActionBarColor = COLOR_INVALID;
+ private int mBackgroundColor = COLOR_INVALID;
+ private int mForegroundColor = COLOR_INVALID;
/**
* Constructs a new Builder with the defaults:
*
-
- * <table>
- * <tr><th align=right>priority</th>
- * <td>{@link #PRIORITY_DEFAULT}</td></tr>
- * <tr><th align=right>when</th>
- * <td>now ({@link System#currentTimeMillis()})</td></tr>
- * <tr><th align=right>audio stream</th>
- * <td>{@link #STREAM_DEFAULT}</td></tr>
- * </table>
- *
-
* @param context
* A {@link Context} that will be used by the Builder to construct the
* RemoteViews. The Context will not be held past the lifetime of this Builder
@@ -2728,8 +2774,8 @@
* {@link ShortcutInfo#getId() id} of the shortcut, in case the Launcher wants to hide
* the shortcut.
*
- * This field will be ignored by Launchers that don't support badging or
- * {@link android.content.pm.ShortcutManager shortcuts}.
+ * This field will be ignored by Launchers that don't support badging, don't show
+ * notification content, or don't show {@link android.content.pm.ShortcutManager shortcuts}.
*
* @param shortcutId the {@link ShortcutInfo#getId() id} of the shortcut this notification
* supersedes
@@ -2753,6 +2799,19 @@
}
/**
+ * Sets the group alert behavior for this notification. Use this method to mute this
+ * notification if alerts for this notification's group should be handled by a different
+ * notification. This is only applicable for notifications that belong to a
+ * {@link #setGroup(String) group}.
+ *
+ * <p> The default value is {@link #GROUP_ALERT_ALL}.</p>
+ */
+ public Builder setGroupAlertBehavior(@GroupAlertBehavior int groupAlertBehavior) {
+ mN.mGroupAlertBehavior = groupAlertBehavior;
+ return this;
+ }
+
+ /**
* Specifies the channel the notification should be delivered on.
*/
public Builder setChannel(String channelId) {
@@ -2761,6 +2820,14 @@
}
/**
+ * Specifies the channel the notification should be delivered on.
+ */
+ public Builder setChannelId(String channelId) {
+ mN.mChannelId = channelId;
+ return this;
+ }
+
+ /**
* Specifies a duration in milliseconds after which this notification should be canceled,
* if it is not already canceled.
*/
@@ -2770,6 +2837,15 @@
}
/**
+ * Specifies a duration in milliseconds after which this notification should be canceled,
+ * if it is not already canceled.
+ */
+ public Builder setTimeoutAfter(long durationMs) {
+ mN.mTimeout = durationMs;
+ return this;
+ }
+
+ /**
* Add a timestamp pertaining to the notification (usually the time the event occurred).
*
* For apps targeting {@link android.os.Build.VERSION_CODES#N} and above, this time is not
@@ -3764,10 +3840,62 @@
|| mActionBarColor == COLOR_INVALID
|| mTextColorsAreForBackground != backgroundColor) {
mTextColorsAreForBackground = backgroundColor;
- mPrimaryTextColor = NotificationColorUtil.resolvePrimaryColor(
- mContext, backgroundColor);
- mSecondaryTextColor = NotificationColorUtil.resolveSecondaryColor(
- mContext, backgroundColor);
+ if (mForegroundColor == COLOR_INVALID || !isColorized()) {
+ mPrimaryTextColor = NotificationColorUtil.resolvePrimaryColor(mContext,
+ backgroundColor);
+ mSecondaryTextColor = NotificationColorUtil.resolveSecondaryColor(mContext,
+ backgroundColor);
+ } else {
+ double backLum = NotificationColorUtil.calculateLuminance(backgroundColor);
+ double textLum = NotificationColorUtil.calculateLuminance(mForegroundColor);
+ double contrast = NotificationColorUtil.calculateContrast(mForegroundColor,
+ backgroundColor);
+ boolean textDark = backLum > textLum;
+ if (contrast < 4.5f) {
+ if (textDark) {
+ mSecondaryTextColor = NotificationColorUtil.findContrastColor(
+ mForegroundColor,
+ backgroundColor,
+ true /* findFG */,
+ 4.5f);
+ mPrimaryTextColor = NotificationColorUtil.changeColorLightness(
+ mSecondaryTextColor, -20);
+ } else {
+ mSecondaryTextColor =
+ NotificationColorUtil.findContrastColorAgainstDark(
+ mForegroundColor,
+ backgroundColor,
+ true /* findFG */,
+ 4.5f);
+ mPrimaryTextColor = NotificationColorUtil.changeColorLightness(
+ mSecondaryTextColor, 10);
+ }
+ } else {
+ mPrimaryTextColor = mForegroundColor;
+ mSecondaryTextColor = NotificationColorUtil.changeColorLightness(
+ mPrimaryTextColor, textDark ? 10 : -20);
+ if (NotificationColorUtil.calculateContrast(mSecondaryTextColor,
+ backgroundColor) < 4.5f) {
+ // oh well the secondary is not good enough
+ if (textDark) {
+ mSecondaryTextColor = NotificationColorUtil.findContrastColor(
+ mSecondaryTextColor,
+ backgroundColor,
+ true /* findFG */,
+ 4.5f);
+ } else {
+ mSecondaryTextColor
+ = NotificationColorUtil.findContrastColorAgainstDark(
+ mSecondaryTextColor,
+ backgroundColor,
+ true /* findFG */,
+ 4.5f);
+ }
+ mPrimaryTextColor = NotificationColorUtil.changeColorLightness(
+ mSecondaryTextColor, textDark ? -20 : 10);
+ }
+ }
+ }
mActionBarColor = NotificationColorUtil.resolveActionBarColor(mContext,
backgroundColor);
}
@@ -4755,7 +4883,7 @@
private int getBackgroundColor() {
if (isColorized()) {
- return mN.color;
+ return mBackgroundColor != COLOR_INVALID ? mBackgroundColor : mN.color;
} else {
return COLOR_DEFAULT;
}
@@ -4773,6 +4901,21 @@
return targetSdkVersion > Build.VERSION_CODES.M
&& targetSdkVersion < Build.VERSION_CODES.O;
}
+
+ /**
+ * Set a color palette to be used as the background and textColors
+ *
+ * @param backgroundColor the color to be used as the background
+ * @param foregroundColor the color to be used as the foreground
+ *
+ * @hide
+ */
+ public void setColorPalette(int backgroundColor, int foregroundColor) {
+ mBackgroundColor = backgroundColor;
+ mForegroundColor = foregroundColor;
+ mTextColorsAreForBackground = COLOR_INVALID;
+ ensureColors();
+ }
}
/**
@@ -4809,6 +4952,18 @@
* @hide
*/
public boolean isColorized() {
+ if (isColorizedMedia()) {
+ return true;
+ }
+ return extras.getBoolean(EXTRA_COLORIZED) && isForegroundService();
+ }
+
+ /**
+ * @return true if this notification is colorized and it is a media notification
+ *
+ * @hide
+ */
+ public boolean isColorizedMedia() {
Class<? extends Style> style = getNotificationStyle();
if (MediaStyle.class.equals(style)) {
Boolean colorized = (Boolean) extras.get(EXTRA_COLORIZED);
@@ -4820,7 +4975,23 @@
return true;
}
}
- return extras.getBoolean(EXTRA_COLORIZED) && isForegroundService();
+ return false;
+ }
+
+
+ /**
+ * @return true if this is a media notification
+ *
+ * @hide
+ */
+ public boolean isMediaNotification() {
+ Class<? extends Style> style = getNotificationStyle();
+ if (MediaStyle.class.equals(style)) {
+ return true;
+ } else if (DecoratedMediaCustomViewStyle.class.equals(style)) {
+ return true;
+ }
+ return false;
}
private boolean hasLargeIcon() {
@@ -7860,6 +8031,16 @@
}
/**
+ * Specifies the channel the notification should be delivered on when shown on TV.
+ * It can be different from the channel that the notification is delivered to when
+ * posting on a non-TV device.
+ */
+ public TvExtender setChannelId(String channelId) {
+ mChannelId = channelId;
+ return this;
+ }
+
+ /**
* Returns the id of the channel this notification posts to on TV.
*/
public String getChannel() {
@@ -7867,6 +8048,13 @@
}
/**
+ * Returns the id of the channel this notification posts to on TV.
+ */
+ public String getChannelId() {
+ return mChannelId;
+ }
+
+ /**
* Supplies a {@link PendingIntent} to be sent when the notification is selected on TV.
* If provided, it is used instead of the content intent specified
* at the level of Notification.
diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java
index 2dd3301..704e912 100644
--- a/core/java/android/app/NotificationChannel.java
+++ b/core/java/android/app/NotificationChannel.java
@@ -40,8 +40,9 @@
public final class NotificationChannel implements Parcelable {
/**
- * The id of the default channel for an app. All notifications posted without a notification
- * channel specified are posted to this channel.
+ * The id of the default channel for an app. This id is reserved by the system. All
+ * notifications posted from apps targeting {@link android.os.Build.VERSION_CODES#N_MR1} or
+ * earlier without a notification channel specified are posted to this channel.
*/
public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
@@ -170,6 +171,9 @@
this.mImportance = importance;
}
+ /**
+ * @hide
+ */
protected NotificationChannel(Parcel in) {
if (in.readByte() != 0) {
mId = in.readString();
diff --git a/core/java/android/app/NotificationChannelGroup.java b/core/java/android/app/NotificationChannelGroup.java
index 852af8a..7e8f191a 100644
--- a/core/java/android/app/NotificationChannelGroup.java
+++ b/core/java/android/app/NotificationChannelGroup.java
@@ -69,6 +69,9 @@
this.mName = name != null ? getTrimmedString(name.toString()) : null;
}
+ /**
+ * @hide
+ */
protected NotificationChannelGroup(Parcel in) {
if (in.readByte() != 0) {
mId = in.readString();
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index 7c361b9..6c55548 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -422,7 +422,9 @@
* Creates a notification channel that notifications can be posted to.
*
* This can also be used to restore a deleted channel and to update an existing channel's
- * name and description. The name and description should only be changed if the locale changes
+ * name and description.
+ *
+ * <p>The name and description should only be changed if the locale changes
* or in response to the user renaming this channel. For example, if a user has a channel
* named 'John Doe' that represents messages from a 'John Doe', and 'John Doe' changes his name
* to 'John Smith,' the channel can be renamed to match.
@@ -454,6 +456,8 @@
/**
* Returns the notification channel settings for a given channel id.
+ *
+ * The channel must belong to your package, or it will not be returned.
*/
public NotificationChannel getNotificationChannel(String channelId) {
INotificationManager service = getService();
@@ -465,7 +469,7 @@
}
/**
- * Returns all notification channels belonging to the calling app.
+ * Returns all notification channels belonging to the calling package.
*/
public List<NotificationChannel> getNotificationChannels() {
INotificationManager service = getService();
@@ -478,6 +482,10 @@
/**
* Deletes the given notification channel.
+ *
+ * <p>If you {@link #createNotificationChannel(NotificationChannel) create} a new channel with
+ * this same id, the deleted channel will be un-deleted with all of the same settings it
+ * had before it was deleted.
*/
public void deleteNotificationChannel(String channelId) {
INotificationManager service = getService();
@@ -501,7 +509,8 @@
}
/**
- * Deletes the given notification channel group.
+ * Deletes the given notification channel group, and all notification channels that
+ * belong to it.
*/
public void deleteNotificationChannelGroup(String groupId) {
INotificationManager service = getService();
diff --git a/core/java/android/app/PictureInPictureArgs.java b/core/java/android/app/PictureInPictureArgs.java
index 2fa6360..63db86a 100644
--- a/core/java/android/app/PictureInPictureArgs.java
+++ b/core/java/android/app/PictureInPictureArgs.java
@@ -16,65 +16,24 @@
package android.app;
-import android.annotation.Nullable;
import android.graphics.Rect;
-import android.os.Parcel;
-import android.os.Parcelable;
+import android.util.Rational;
import java.util.ArrayList;
import java.util.List;
/**
- * Represents a set of arguments used to initialize the picture-in-picture mode.
+ * TO BE REMOVED
*/
-public final class PictureInPictureArgs implements Parcelable {
-
- /**
- * The expected aspect ratio of the picture-in-picture.
- */
- @Nullable
- private Float mAspectRatio;
-
- /**
- * The set of actions that are associated with this activity when in picture-in-picture.
- */
- @Nullable
- private List<RemoteAction> mUserActions;
-
- /**
- * The source bounds hint used when entering picture-in-picture, relative to the window bounds.
- * We can use this internally for the transition into picture-in-picture to ensure that a
- * particular source rect is visible throughout the whole transition.
- */
- @Nullable
- private Rect mSourceRectHint;
-
- /**
- * The content insets that are used with the source hint rect for the transition into PiP where
- * the insets are removed at the beginning of the transition.
- */
- @Nullable
- private Rect mSourceRectHintInsets;
-
- PictureInPictureArgs(Parcel in) {
- if (in.readInt() != 0) {
- mAspectRatio = in.readFloat();
- }
- if (in.readInt() != 0) {
- mUserActions = new ArrayList<>();
- in.readParcelableList(mUserActions, RemoteAction.class.getClassLoader());
- }
- if (in.readInt() != 0) {
- mSourceRectHint = Rect.CREATOR.createFromParcel(in);
- }
- if (in.readInt() != 0) {
- mSourceRectHintInsets = Rect.CREATOR.createFromParcel(in);
- }
- }
+@Deprecated
+public final class PictureInPictureArgs extends PictureInPictureParams {
/**
* Creates a new set of picture-in-picture arguments.
+ *
+ * TODO: Remove once we remove PictureInPictureArgs.
*/
+ @Deprecated
public PictureInPictureArgs() {
// Empty constructor
}
@@ -82,64 +41,43 @@
/**
* Creates a new set of picture-in-picture arguments from the given {@param aspectRatio} and
* {@param actions}.
+ *
+ * TODO: Remove once we remove PictureInPictureArgs.
*/
+ @Deprecated
public PictureInPictureArgs(float aspectRatio, List<RemoteAction> actions) {
- mAspectRatio = aspectRatio;
+ setAspectRatio(aspectRatio);
if (actions != null) {
- mUserActions = new ArrayList<>(actions);
- }
- }
-
- /**
- * Copies the set parameters from the other picture-in-picture args.
- * @hide
- */
- public void copyOnlySet(PictureInPictureArgs otherArgs) {
- if (otherArgs.hasSetAspectRatio()) {
- mAspectRatio = otherArgs.mAspectRatio;
- }
- if (otherArgs.hasSetActions()) {
- mUserActions = otherArgs.mUserActions;
- }
- if (otherArgs.hasSourceBoundsHint()) {
- mSourceRectHint = new Rect(otherArgs.getSourceRectHint());
- }
- if (otherArgs.hasSourceBoundsHintInsets()) {
- mSourceRectHintInsets = new Rect(otherArgs.getSourceRectHintInsets());
+ setActions(actions);
}
}
/**
* Sets the aspect ratio.
- * @param aspectRatio the new aspect ratio for picture-in-picture.
+ *
+ * @param aspectRatio the new aspect ratio for picture-in-picture, must be within 2.39:1 and
+ * 1:2.39.
+ *
+ * TODO: Remove once we remove PictureInPictureArgs.
*/
+ @Deprecated
public void setAspectRatio(float aspectRatio) {
- mAspectRatio = aspectRatio;
+ // Temporary workaround
+ mAspectRatio = new Rational((int) (aspectRatio * 1000000000), 1000000000);
}
/**
- * @return the aspect ratio. If none is set, return 0.
- * @hide
- */
- public float getAspectRatio() {
- if (mAspectRatio != null) {
- return mAspectRatio;
- }
- return 0f;
- }
-
- /**
- * @return whether the aspect ratio is set.
- * @hide
- */
- public boolean hasSetAspectRatio() {
- return mAspectRatio != null;
- }
-
- /**
- * Sets the user actions.
+ * Sets the user actions. If there are more than
+ * {@link ActivityManager#getMaxNumPictureInPictureActions()} actions, then the input will be
+ * truncated to that number.
+ *
* @param actions the new actions to show in the picture-in-picture menu.
+ *
+ * @see RemoteAction
+ *
+ * TODO: Remove once we remove PictureInPictureArgs.
*/
+ @Deprecated
public void setActions(List<RemoteAction> actions) {
if (mUserActions != null) {
mUserActions = null;
@@ -150,27 +88,14 @@
}
/**
- * @return the set of user actions.
- * @hide
- */
- public List<RemoteAction> getActions() {
- return mUserActions;
- }
-
- /**
- * @return whether the user actions are set.
- * @hide
- */
- public boolean hasSetActions() {
- return mUserActions != null;
- }
-
- /**
* Sets the source bounds hint. These bounds are only used when an activity first enters
* picture-in-picture, and describe the bounds in window coordinates of activity entering
* picture-in-picture that will be visible following the transition. For the best effect, these
* bounds should also match the aspect ratio in the arguments.
+ *
+ * TODO: Remove once we remove PictureInPictureArgs.
*/
+ @Deprecated
public void setSourceRectHint(Rect launchBounds) {
if (launchBounds == null) {
mSourceRectHint = null;
@@ -178,103 +103,4 @@
mSourceRectHint = new Rect(launchBounds);
}
}
-
- /**
- * Sets the insets to be used with the source rect hint bounds.
- * @hide
- */
- public void setSourceRectHintInsets(Rect insets) {
- if (insets == null) {
- mSourceRectHintInsets = null;
- } else {
- mSourceRectHintInsets = new Rect(insets);
- }
- }
-
- /**
- * @return the source rect hint
- * @hide
- */
- public Rect getSourceRectHint() {
- return mSourceRectHint;
- }
-
- /**
- * @return the source rect hint insets.
- * @hide
- */
- public Rect getSourceRectHintInsets() {
- return mSourceRectHintInsets;
- }
-
- /**
- * @return whether there are launch bounds set
- * @hide
- */
- public boolean hasSourceBoundsHint() {
- return mSourceRectHint != null && !mSourceRectHint.isEmpty();
- }
-
- /**
- * @return whether there are source rect hint insets set
- * @hide
- */
- public boolean hasSourceBoundsHintInsets() {
- return mSourceRectHintInsets != null;
- }
-
- @Override
- public PictureInPictureArgs clone() {
- PictureInPictureArgs args = new PictureInPictureArgs(mAspectRatio, mUserActions);
- if (mSourceRectHint != null) {
- args.setSourceRectHint(mSourceRectHint);
- }
- if (mSourceRectHintInsets != null) {
- args.setSourceRectHintInsets(mSourceRectHintInsets);
- }
- return args;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel out, int flags) {
- if (mAspectRatio != null) {
- out.writeInt(1);
- out.writeFloat(mAspectRatio);
- } else {
- out.writeInt(0);
- }
- if (mUserActions != null) {
- out.writeInt(1);
- out.writeParcelableList(mUserActions, 0);
- } else {
- out.writeInt(0);
- }
- if (mSourceRectHint != null) {
- out.writeInt(1);
- mSourceRectHint.writeToParcel(out, 0);
- } else {
- out.writeInt(0);
- }
- if (mSourceRectHintInsets != null) {
- out.writeInt(1);
- mSourceRectHintInsets.writeToParcel(out, 0);
- } else {
- out.writeInt(0);
- }
- }
-
- public static final Creator<PictureInPictureArgs> CREATOR =
- new Creator<PictureInPictureArgs>() {
- public PictureInPictureArgs createFromParcel(Parcel in) {
- return new PictureInPictureArgs(in);
- }
- public PictureInPictureArgs[] newArray(int size) {
- return new PictureInPictureArgs[size];
- }
- };
}
\ No newline at end of file
diff --git a/core/java/android/app/PictureInPictureArgs.aidl b/core/java/android/app/PictureInPictureParams.aidl
similarity index 94%
rename from core/java/android/app/PictureInPictureArgs.aidl
rename to core/java/android/app/PictureInPictureParams.aidl
index 49df39a..eaf5f06 100644
--- a/core/java/android/app/PictureInPictureArgs.aidl
+++ b/core/java/android/app/PictureInPictureParams.aidl
@@ -16,4 +16,4 @@
package android.app;
-parcelable PictureInPictureArgs;
+parcelable PictureInPictureParams;
diff --git a/core/java/android/app/PictureInPictureParams.java b/core/java/android/app/PictureInPictureParams.java
new file mode 100644
index 0000000..e1df33b
--- /dev/null
+++ b/core/java/android/app/PictureInPictureParams.java
@@ -0,0 +1,333 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app;
+
+import android.annotation.Nullable;
+import android.graphics.Rect;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.Rational;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents a set of parameters used to initialize and update an Activity in picture-in-picture
+ * mode.
+ *
+ * TODO: Make this final after we remove PictureInPictureArgs
+ */
+public class PictureInPictureParams implements Parcelable {
+
+ /**
+ * Builder class for {@link PictureInPictureParams} objects.
+ */
+ public static class Builder {
+
+ @Nullable
+ private Rational mAspectRatio;
+
+ @Nullable
+ private List<RemoteAction> mUserActions;
+
+ @Nullable
+ private Rect mSourceRectHint;
+
+ /**
+ * Sets the aspect ratio. This aspect ratio is defined as the desired width / height, and
+ * does not change upon device rotation.
+ *
+ * @param aspectRatio the new aspect ratio for the activity in picture-in-picture, must be
+ * between 2.39:1 and 1:2.39 (inclusive).
+ *
+ * @return this builder instance.
+ */
+ public Builder setAspectRatio(Rational aspectRatio) {
+ mAspectRatio = aspectRatio;
+ return this;
+ }
+
+ /**
+ * Sets the user actions. If there are more than
+ * {@link ActivityManager#getMaxNumPictureInPictureActions()} actions, then the input list
+ * will be truncated to that number.
+ *
+ * @param actions the new actions to show in the picture-in-picture menu.
+ *
+ * @return this builder instance.
+ *
+ * @see RemoteAction
+ */
+ public Builder setActions(List<RemoteAction> actions) {
+ if (mUserActions != null) {
+ mUserActions = null;
+ }
+ if (actions != null) {
+ mUserActions = new ArrayList<>(actions);
+ }
+ return this;
+ }
+
+ /**
+ * Sets the source bounds hint. These bounds are only used when an activity first enters
+ * picture-in-picture, and describe the bounds in window coordinates of activity entering
+ * picture-in-picture that will be visible following the transition. For the best effect,
+ * these bounds should also match the aspect ratio in the arguments.
+ *
+ * @param launchBounds window-coordinate bounds indicating the area of the activity that
+ * will still be visible following the transition into picture-in-picture (eg. the video
+ * view bounds in a video player)
+ *
+ * @return this builder instance.
+ */
+ public Builder setSourceRectHint(Rect launchBounds) {
+ if (launchBounds == null) {
+ mSourceRectHint = null;
+ } else {
+ mSourceRectHint = new Rect(launchBounds);
+ }
+ return this;
+ }
+
+ /**
+ * @return an immutable {@link PictureInPictureParams} to be used when entering or updating
+ * the activity in picture-in-picture.
+ *
+ * @see Activity#enterPictureInPictureMode(PictureInPictureParams)
+ * @see Activity#setPictureInPictureParams(PictureInPictureParams)
+ */
+ public PictureInPictureParams build() {
+ PictureInPictureParams params = new PictureInPictureParams(mAspectRatio, mUserActions,
+ mSourceRectHint);
+ return params;
+ }
+ }
+
+ /**
+ * The expected aspect ratio of the picture-in-picture.
+ */
+ // TODO: Make private once we removed PictureInPictureArgs
+ @Nullable
+ protected Rational mAspectRatio;
+
+ /**
+ * The set of actions that are associated with this activity when in picture-in-picture.
+ */
+ // TODO: Make private once we removed PictureInPictureArgs
+ @Nullable
+ protected List<RemoteAction> mUserActions;
+
+ /**
+ * The source bounds hint used when entering picture-in-picture, relative to the window bounds.
+ * We can use this internally for the transition into picture-in-picture to ensure that a
+ * particular source rect is visible throughout the whole transition.
+ */
+ // TODO: Make private once we removed PictureInPictureArgs
+ @Nullable
+ protected Rect mSourceRectHint;
+
+ /**
+ * The content insets that are used with the source hint rect for the transition into PiP where
+ * the insets are removed at the beginning of the transition.
+ */
+ @Nullable
+ private Rect mSourceRectHintInsets;
+
+ /**
+ * TO BE REMOVED
+ */
+ @Deprecated
+ PictureInPictureParams() {
+ // TODO: Remove once we remove PictureInPictureArgs
+ }
+
+ private PictureInPictureParams(Parcel in) {
+ if (in.readInt() != 0) {
+ mAspectRatio = new Rational(in.readInt(), in.readInt());
+ }
+ if (in.readInt() != 0) {
+ mUserActions = new ArrayList<>();
+ in.readParcelableList(mUserActions, RemoteAction.class.getClassLoader());
+ }
+ if (in.readInt() != 0) {
+ mSourceRectHint = Rect.CREATOR.createFromParcel(in);
+ }
+ if (in.readInt() != 0) {
+ mSourceRectHintInsets = Rect.CREATOR.createFromParcel(in);
+ }
+ }
+
+ private PictureInPictureParams(Rational aspectRatio, List<RemoteAction> actions,
+ Rect sourceRectHint) {
+ mAspectRatio = aspectRatio;
+ mUserActions = actions;
+ mSourceRectHint = sourceRectHint;
+ }
+
+ /**
+ * Copies the set parameters from the other picture-in-picture args.
+ * @hide
+ */
+ public void copyOnlySet(PictureInPictureParams otherArgs) {
+ if (otherArgs.hasSetAspectRatio()) {
+ mAspectRatio = otherArgs.mAspectRatio;
+ }
+ if (otherArgs.hasSetActions()) {
+ mUserActions = otherArgs.mUserActions;
+ }
+ if (otherArgs.hasSourceBoundsHint()) {
+ mSourceRectHint = new Rect(otherArgs.getSourceRectHint());
+ }
+ if (otherArgs.hasSourceBoundsHintInsets()) {
+ mSourceRectHintInsets = new Rect(otherArgs.getSourceRectHintInsets());
+ }
+ }
+
+ /**
+ * @return the aspect ratio. If none is set, return 0.
+ * @hide
+ */
+ public float getAspectRatio() {
+ if (mAspectRatio != null) {
+ return mAspectRatio.floatValue();
+ }
+ return 0f;
+ }
+
+ /**
+ * @return whether the aspect ratio is set.
+ * @hide
+ */
+ public boolean hasSetAspectRatio() {
+ return mAspectRatio != null;
+ }
+
+ /**
+ * @return the set of user actions.
+ * @hide
+ */
+ public List<RemoteAction> getActions() {
+ return mUserActions;
+ }
+
+ /**
+ * @return whether the user actions are set.
+ * @hide
+ */
+ public boolean hasSetActions() {
+ return mUserActions != null;
+ }
+
+ /**
+ * Truncates the set of actions to the given {@param size}.
+ * @hide
+ */
+ public void truncateActions(int size) {
+ if (hasSetActions()) {
+ mUserActions = mUserActions.subList(0, Math.min(mUserActions.size(), size));
+ }
+ }
+
+ /**
+ * Sets the insets to be used with the source rect hint bounds.
+ * @hide
+ */
+ @Deprecated
+ public void setSourceRectHintInsets(Rect insets) {
+ if (insets == null) {
+ mSourceRectHintInsets = null;
+ } else {
+ mSourceRectHintInsets = new Rect(insets);
+ }
+ }
+
+ /**
+ * @return the source rect hint
+ * @hide
+ */
+ public Rect getSourceRectHint() {
+ return mSourceRectHint;
+ }
+
+ /**
+ * @return the source rect hint insets.
+ * @hide
+ */
+ public Rect getSourceRectHintInsets() {
+ return mSourceRectHintInsets;
+ }
+
+ /**
+ * @return whether there are launch bounds set
+ * @hide
+ */
+ public boolean hasSourceBoundsHint() {
+ return mSourceRectHint != null && !mSourceRectHint.isEmpty();
+ }
+
+ /**
+ * @return whether there are source rect hint insets set
+ * @hide
+ */
+ public boolean hasSourceBoundsHintInsets() {
+ return mSourceRectHintInsets != null;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ if (mAspectRatio != null) {
+ out.writeInt(1);
+ out.writeInt(mAspectRatio.getNumerator());
+ out.writeInt(mAspectRatio.getDenominator());
+ } else {
+ out.writeInt(0);
+ }
+ if (mUserActions != null) {
+ out.writeInt(1);
+ out.writeParcelableList(mUserActions, 0);
+ } else {
+ out.writeInt(0);
+ }
+ if (mSourceRectHint != null) {
+ out.writeInt(1);
+ mSourceRectHint.writeToParcel(out, 0);
+ } else {
+ out.writeInt(0);
+ }
+ if (mSourceRectHintInsets != null) {
+ out.writeInt(1);
+ mSourceRectHintInsets.writeToParcel(out, 0);
+ } else {
+ out.writeInt(0);
+ }
+ }
+
+ public static final Creator<PictureInPictureParams> CREATOR =
+ new Creator<PictureInPictureParams>() {
+ public PictureInPictureParams createFromParcel(Parcel in) {
+ return new PictureInPictureParams(in);
+ }
+ public PictureInPictureParams[] newArray(int size) {
+ return new PictureInPictureParams[size];
+ }
+ };
+}
\ No newline at end of file
diff --git a/core/java/android/app/RemoteInput.java b/core/java/android/app/RemoteInput.java
index d1dc859..8ab19c0 100644
--- a/core/java/android/app/RemoteInput.java
+++ b/core/java/android/app/RemoteInput.java
@@ -118,6 +118,11 @@
return mChoices;
}
+ /**
+ * Get possible non-textual inputs that are accepted.
+ * This can be {@code null} if the input does not accept non-textual values.
+ * See {@link Builder#setAllowDataType}.
+ */
public Set<String> getAllowedDataTypes() {
return mAllowedDataTypes;
}
@@ -202,7 +207,9 @@
}
/**
- * Specifies whether the user can provide arbitrary values.
+ * Specifies whether the user can provide arbitrary values. This allows an input
+ * to accept non-textual values. Examples of usage are an input that wants audio
+ * or an image.
*
* @param mimeType A mime type that results are allowed to come in.
* Be aware that text results (see {@link #setAllowFreeFormInput}
@@ -374,7 +381,12 @@
}
/**
- * Same as {@link #addResultsToIntent} but for setting data results.
+ * Same as {@link #addResultsToIntent} but for setting data results. This is used
+ * for inputs that accept non-textual results (see {@link Builder#setAllowDataType}).
+ * Only one result can be provided for every mime type accepted by the RemoteInput.
+ * If multiple inputs of the same mime type are expected then multiple RemoteInputs
+ * should be used.
+ *
* @param remoteInput The remote input for which results are being provided
* @param intent The intent to add remote input results to. The {@link ClipData}
* field of the intent will be modified to contain the results.
diff --git a/core/java/android/app/WallpaperColors.java b/core/java/android/app/WallpaperColors.java
deleted file mode 100644
index 5ed66ca..0000000
--- a/core/java/android/app/WallpaperColors.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package android.app;
-
-import android.graphics.Color;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import android.util.Pair;
-
-import java.util.List;
-
-/**
- * A class containing information about the colors of a wallpaper.
- */
-public final class WallpaperColors implements Parcelable {
-
- public WallpaperColors(Parcel parcel) {
- }
-
- /**
- * Wallpaper color details containing a list of colors and their weights,
- * as if it were an histogram.
- * This list can be extracted from a bitmap by the Palette API.
- *
- * Dark text support will be calculated internally based on the histogram.
- *
- * @param colors list of pairs where each pair contains a color
- * and number of occurrences/influence.
- */
- public WallpaperColors(List<Pair<Color, Integer>> colors) {
- }
-
- /**
- * Wallpaper color details containing a list of colors and their weights,
- * as if it were an histogram.
- * Explicit dark text support.
- *
- * @param colors list of pairs where each pair contains a color
- * and number of occurrences/influence.
- * @param supportsDarkText can have dark text on top or not
- */
- public WallpaperColors(List<Pair<Color, Integer>> colors, boolean supportsDarkText) {
- }
-
- public static final Creator<WallpaperColors> CREATOR = new Creator<WallpaperColors>() {
- @Override
- public WallpaperColors createFromParcel(Parcel in) {
- return new WallpaperColors(in);
- }
-
- @Override
- public WallpaperColors[] newArray(int size) {
- return new WallpaperColors[size];
- }
- };
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- }
-
- /**
- * List of colors with their occurrences. The bigger the int, the more relevant the color.
- * @return list of colors paired with their weights.
- */
- public List<Pair<Color, Integer>> getColors() {
- return null;
- }
-
- /**
- * Whether or not dark text is legible on top of this wallpaper.
- *
- * @return true if dark text is supported
- */
- public boolean supportsDarkText() {
- return false;
- }
-}
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 0676bca..db2f937 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -17,10 +17,10 @@
package android.app;
import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.annotation.RawRes;
+import android.annotation.SdkConstant;
import android.annotation.SystemApi;
+import android.annotation.SdkConstant.SdkConstantType;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
@@ -103,6 +103,7 @@
* <p>Output: RESULT_OK if user decided to crop/set the wallpaper, RESULT_CANCEL otherwise
* Activities that support this intent should specify a MIME filter of "image/*"
*/
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_CROP_AND_SET_WALLPAPER =
"android.service.wallpaper.CROP_AND_SET_WALLPAPER";
@@ -743,43 +744,6 @@
return getWallpaperFile(which, mContext.getUserId());
}
-
- /**
- * Registers a listener to get notified when the wallpaper colors change.
- * Callback might be called from an arbitrary background thread.
- *
- * @param listener A listener to register
- */
- public void addOnColorsChangedListener(@NonNull OnColorsChangedListener listener) {
- }
-
- /**
- * Registers a listener to get notified when the wallpaper colors change
- * @param listener A listener to register
- * @param handler Where to call it from. Might be called from a background thread
- * if null.
- */
- public void addOnColorsChangedListener(@NonNull OnColorsChangedListener listener,
- @Nullable Handler handler) {
- }
-
- /**
- * Stop listening to color updates.
- * @param callback A callback to unsubscribe
- */
- public void removeOnColorsChangedListener(@NonNull OnColorsChangedListener callback) {
- }
-
- /**
- * Get the primary colors of a wallpaper
- * @param which wallpaper type. Must be either {@link #FLAG_SYSTEM} or
- * {@link #FLAG_LOCK}
- * @return a list of colors ordered by priority
- */
- public @Nullable WallpaperColors getWallpaperColors(int which) {
- return null;
- }
-
/**
* Version of {@link #getWallpaperFile(int)} that can access the wallpaper data
* for a given user. The caller must hold the INTERACT_ACROSS_USERS_FULL
@@ -1771,19 +1735,4 @@
mLatch.countDown();
}
}
-
- /**
- * Interface definition for a callback to be invoked when colors change on a wallpaper.
- */
- public interface OnColorsChangedListener {
- /**
- * Called when colors change.
- * A {@link android.app.WallpaperColors} object containing a simplified
- * color histogram will be given.
- *
- * @param colors Wallpaper color info
- * @param which A combination of {@link #FLAG_LOCK} and {@link #FLAG_SYSTEM}
- */
- void onColorsChanged(WallpaperColors colors, int which);
- }
}
diff --git a/core/java/android/app/admin/ConnectEvent.java b/core/java/android/app/admin/ConnectEvent.java
index 5111443..423ee52 100644
--- a/core/java/android/app/admin/ConnectEvent.java
+++ b/core/java/android/app/admin/ConnectEvent.java
@@ -19,6 +19,9 @@
import android.os.Parcel;
import android.os.Parcelable;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
/**
* A class that represents a connect library call event.
*/
@@ -44,8 +47,14 @@
this.timestamp = in.readLong();
}
- public String getIpAddress() {
- return ipAddress;
+ public InetAddress getInetAddress() {
+ try {
+ // ipAddress is already an address, not a host name, no DNS resolution will happen.
+ return InetAddress.getByName(ipAddress);
+ } catch (UnknownHostException e) {
+ // Should never happen as we aren't passing a host name.
+ return InetAddress.getLoopbackAddress();
+ }
}
public int getPort() {
diff --git a/core/java/android/app/admin/DeviceAdminService.java b/core/java/android/app/admin/DeviceAdminService.java
index cd0b1bf..04fff04 100644
--- a/core/java/android/app/admin/DeviceAdminService.java
+++ b/core/java/android/app/admin/DeviceAdminService.java
@@ -26,16 +26,25 @@
* <p>The system searches for it with an intent filter with the
* {@link DevicePolicyManager#ACTION_DEVICE_ADMIN_SERVICE} action, and tries to keep a bound
* connection as long as the hosting user is running, so that the device/profile owner is always
- * considered to be in the foreground.
+ * considered to be in the foreground. This is useful to receive implicit broadcasts that
+ * can no longer be received by manifest receivers by apps targeting Android version
+ * {@link android.os.Build.VERSION_CODES#O}. Device/profile owners can use a runtime-registered
+ * broadcast receiver instead, and have a {@link DeviceAdminService} so that the process is always
+ * running.
*
* <p>Device/profile owners can use
* {@link android.content.pm.PackageManager#setComponentEnabledSetting(ComponentName, int, int)}
* to disable/enable its own service. For example, when a device/profile owner no longer needs
* to be in the foreground, it can (and should) disable its service.
*
- * <p>The service must not be exported.
+ * <p>The service must be protected with the permission
+ * {@link android.Manifest.permission#BIND_DEVICE_ADMIN}. Otherwise the system would ignore it.
*
- * <p>TODO: Describe how the system handles crashes in DO/PO.
+ * <p>When the owner process crashes, the service will be re-bound automatically after a
+ * back-off.
+ *
+ * <p>Note the process may still be killed if the system is under heavy memory pressure, in which
+ * case the process will be re-started later.
*/
public class DeviceAdminService extends Service {
private final IDeviceAdminServiceImpl mImpl;
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 82ad825..9b1b6cd 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -56,6 +56,7 @@
import android.security.Credentials;
import android.service.restrictions.RestrictionsReceiver;
import android.telephony.TelephonyManager;
+import android.util.ArraySet;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
@@ -80,6 +81,7 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Set;
/**
* Public interface for managing policies enforced on a device. Most clients of this class must be
@@ -1518,7 +1520,8 @@
* Service action: Action for a service that device owner and profile owner can optionally
* own. If a device owner or a profile owner has such a service, the system tries to keep
* a bound connection to it, in order to keep their process always running.
- * The service must not be exported.
+ * The service must be protected with the {@link android.Manifest.permission#BIND_DEVICE_ADMIN}
+ * permission.
*/
@SdkConstant(SdkConstantType.SERVICE_ACTION)
public static final String ACTION_DEVICE_ADMIN_SERVICE
@@ -2753,8 +2756,8 @@
/**
* Called by a profile or device owner to provision a token which can later be used to reset the
- * device lockscreen password (if called by device owner), or work challenge (if called by
- * profile owner), via {@link #resetPasswordWithToken}.
+ * device lockscreen password (if called by device owner), or managed profile challenge (if
+ * called by profile owner), via {@link #resetPasswordWithToken}.
* <p>
* If the user currently has a lockscreen password, the provisioned token will not be
* immediately usable; it only becomes active after the user performs a confirm credential
@@ -2832,8 +2835,8 @@
}
/**
- * Called by device or profile owner to force set a new device unlock password or a work profile
- * challenge on current user. This takes effect immediately.
+ * Called by device or profile owner to force set a new device unlock password or a managed
+ * profile challenge on current user. This takes effect immediately.
* <p>
* Unlike {@link #resetPassword}, this API can change the password even before the user or
* device is unlocked or decrypted. The supplied token must have been previously provisioned via
@@ -2972,9 +2975,9 @@
* profile.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
- * @param timeoutMs The new timeout, after which the user will have to unlock with strong
- * authentication method. A value of 0 means the admin is not participating in
- * controlling the timeout.
+ * @param timeoutMs The new timeout in milliseconds, after which the user will have to unlock
+ * with strong authentication method. A value of 0 means the admin is not participating
+ * in controlling the timeout.
* The minimum and maximum timeouts are platform-defined and are typically 1 hour and
* 72 hours, respectively. Though discouraged, the admin may choose to require strong
* auth at all times using {@link #KEYGUARD_DISABLE_FINGERPRINT} and/or
@@ -3004,7 +3007,7 @@
*
* @param admin The name of the admin component to check, or {@code null} to aggregate
* accross all participating admins.
- * @return The timeout or 0 if not configured for the provided admin.
+ * @return The timeout in milliseconds or 0 if not configured for the provided admin.
*/
public long getRequiredStrongAuthTimeout(@Nullable ComponentName admin) {
return getRequiredStrongAuthTimeout(admin, myUserId());
@@ -3027,17 +3030,24 @@
* keyring. The user's credential will need to be entered again in order to derive the
* credential encryption key that will be stored back in the keyring for future use.
* <p>
- * This flag can only be used by a profile owner when locking a managed profile on an FBE
- * device.
+ * This flag can only be used by a profile owner when locking a managed profile when
+ * {@link #getStorageEncryptionStatus} returns {@link #ENCRYPTION_STATUS_ACTIVE_PER_USER}.
* <p>
* In order to secure user data, the user will be stopped and restarted so apps should wait
* until they are next run to perform further actions.
*/
+ public static final int FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY = 1;
+
+ /**
+ * Instead use {@link #FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY}.
+ * @removed
+ */
+ @Deprecated
public static final int FLAG_EVICT_CE_KEY = 1;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef(flag=true, value={FLAG_EVICT_CE_KEY})
+ @IntDef(flag=true, value={FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY})
public @interface LockNowFlag {}
/**
@@ -3069,15 +3079,17 @@
* This method can be called on the {@link DevicePolicyManager} instance returned by
* {@link #getParentProfileInstance(ComponentName)} in order to lock the parent profile.
*
- * @param flags May be 0 or {@link #FLAG_EVICT_CE_KEY}.
+ * @param flags May be 0 or {@link #FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY}.
* @throws SecurityException if the calling application does not own an active administrator
* that uses {@link DeviceAdminInfo#USES_POLICY_FORCE_LOCK} or the
- * {@link #FLAG_EVICT_CE_KEY} flag is passed by an application that is not a profile
+ * {@link #FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY} flag is passed by an application
+ * that is not a profile
* owner of a managed profile.
- * @throws IllegalArgumentException if the {@link #FLAG_EVICT_CE_KEY} flag is passed when
- * locking the parent profile.
- * @throws UnsupportedOperationException if the {@link #FLAG_EVICT_CE_KEY} flag is passed on a
- * non-FBE device.
+ * @throws IllegalArgumentException if the {@link #FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY} flag is
+ * passed when locking the parent profile.
+ * @throws UnsupportedOperationException if the {@link #FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY}
+ * flag is passed when {@link #getStorageEncryptionStatus} does not return
+ * {@link #ENCRYPTION_STATUS_ACTIVE_PER_USER}.
*/
public void lockNow(@LockNowFlag int flags) {
if (mService != null) {
@@ -5550,7 +5562,7 @@
* Calling with a null value for the list disables the restriction so that all services can be
* used, calling with an empty list only allows the builtin system's services.
* <p>
- * System accesibility services are always available to the user the list can't modify this.
+ * System accessibility services are always available to the user the list can't modify this.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param packageNames List of accessibility service package names.
@@ -5660,7 +5672,8 @@
* non-system input methods currently enabled that are not in the packageNames list.
* @throws SecurityException if {@code admin} is not a device or profile owner.
*/
- public boolean setPermittedInputMethods(@NonNull ComponentName admin, List<String> packageNames) {
+ public boolean setPermittedInputMethods(
+ @NonNull ComponentName admin, List<String> packageNames) {
throwIfParentInstance("setPermittedInputMethods");
if (mService != null) {
try {
@@ -5742,6 +5755,85 @@
}
/**
+ * Called by a profile owner of a managed profile to set the packages that are allowed to use
+ * a {@link android.service.notification.NotificationListenerService} in the primary user to
+ * see notifications from the managed profile. By default all packages are permitted by this
+ * policy. When zero or more packages have been added, notification listeners installed on the
+ * primary user that are not in the list and are not part of the system won't receive events
+ * for managed profile notifications.
+ * <p>
+ * Calling with a {@code null} value for the list disables the restriction so that all
+ * notification listener services be used. Calling with an empty list disables all but the
+ * system's own notification listeners. System notification listener services are always
+ * available to the user.
+ * <p>
+ * If a device or profile owner want to stop notification listeners in their user from seeing
+ * that user's notifications they should prevent that service from running instead (e.g. via
+ * {@link #setApplicationHidden(ComponentName, String, boolean)})
+ *
+ * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
+ * @param packageList List of package names to whitelist
+ * @return true if setting the restriction succeeded. It will fail if called outside a managed
+ * profile
+ * @throws SecurityException if {@code admin} is not a profile owner.
+ *
+ * @see android.service.notification.NotificationListenerService
+ */
+ public boolean setPermittedCrossProfileNotificationListeners(
+ @NonNull ComponentName admin, @Nullable List<String> packageList) {
+ throwIfParentInstance("setPermittedCrossProfileNotificationListeners");
+ if (mService != null) {
+ try {
+ return mService.setPermittedCrossProfileNotificationListeners(admin, packageList);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns the list of packages installed on the primary user that allowed to use a
+ * {@link android.service.notification.NotificationListenerService} to receive
+ * notifications from this managed profile, as set by the profile owner.
+ * <p>
+ * An empty list means no notification listener services except system ones are allowed.
+ * A {@code null} return value indicates that all notification listeners are allowed.
+ */
+ public @Nullable List<String> getPermittedCrossProfileNotificationListeners(
+ @NonNull ComponentName admin) {
+ throwIfParentInstance("getPermittedCrossProfileNotificationListeners");
+ if (mService != null) {
+ try {
+ return mService.getPermittedCrossProfileNotificationListeners(admin);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns true if {@code NotificationListenerServices} from the given package are allowed to
+ * receive events for notifications from the given user id. Can only be called by the system uid
+ *
+ * @see #setPermittedCrossProfileNotificationListeners(ComponentName, List)
+ *
+ * @hide
+ */
+ public boolean isNotificationListenerServicePermitted(
+ @NonNull String packageName, @UserIdInt int userId) {
+ if (mService != null) {
+ try {
+ return mService.isNotificationListenerServicePermitted(packageName, userId);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ return true;
+ }
+
+ /**
* Get the list of apps to keep around as APKs even if no user has currently installed it. This
* function can be called by a device owner or by a delegate given the
* {@link #DELEGATION_KEEP_UNINSTALLED_PACKAGES} scope via {@link #setDelegatedScopes}.
@@ -7507,13 +7599,31 @@
* created.
*
* @param admin Which profile or device owner this request is associated with.
- * @param ids A list of opaque non-empty affiliation ids. Duplicate elements will be ignored.
+ * @param ids A set of opaque non-empty affiliation ids.
*
- * @throws NullPointerException if {@code ids} is null or contains null elements.
- * @throws IllegalArgumentException if {@code ids} contains an empty string.
+ * @throws IllegalArgumentException if {@code ids} is null or contains an empty string.
+ */
+ public void setAffiliationIds(@NonNull ComponentName admin, @NonNull Set<String> ids) {
+ throwIfParentInstance("setAffiliationIds");
+ if (ids == null) {
+ throw new IllegalArgumentException("ids must not be null");
+ }
+ try {
+ mService.setAffiliationIds(admin, new ArrayList<>(ids));
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * STOPSHIP (b/37622682) Remove it before release.
+ * @removed
*/
public void setAffiliationIds(@NonNull ComponentName admin, @NonNull List<String> ids) {
throwIfParentInstance("setAffiliationIds");
+ if (ids == null) {
+ throw new IllegalArgumentException("ids must not be null");
+ }
try {
mService.setAffiliationIds(admin, ids);
} catch (RemoteException e) {
@@ -7522,13 +7632,12 @@
}
/**
- * Returns the list of affiliation ids previously set via {@link #setAffiliationIds}, or an
- * empty list if none have been set.
+ * Returns the set of affiliation ids previously set via {@link #setAffiliationIds}, or an
+ * empty set if none have been set.
*/
- public @NonNull List<String> getAffiliationIds(@NonNull ComponentName admin) {
- throwIfParentInstance("getAffiliationIds");
+ public @NonNull Set<String> getAffiliationIds(@NonNull ComponentName admin) {
try {
- return mService.getAffiliationIds(admin);
+ return new ArraySet<>(mService.getAffiliationIds(admin));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -7681,6 +7790,8 @@
*
* <p> Backup service is off by default when device owner is present.
*
+ * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
+ * @param enabled {@code true} to enable the backup service, {@code false} to disable it.
* @throws SecurityException if {@code admin} is not a device owner.
*/
public void setBackupServiceEnabled(@NonNull ComponentName admin, boolean enabled) {
@@ -7823,7 +7934,8 @@
* See {@link #getBindDeviceAdminTargetUsers} for a definition of which
* device/profile owners are allowed to bind to services of another profile/device owner.
* <p>
- * The service must be unexported. Note that the {@link Context} used to obtain this
+ * The service must be protected by {@link android.Manifest.permission#BIND_DEVICE_ADMIN}.
+ * Note that the {@link Context} used to obtain this
* {@link DevicePolicyManager} instance via {@link Context#getSystemService(Class)} will be used
* to bind to the {@link android.app.Service}.
*
diff --git a/core/java/android/app/admin/DnsEvent.java b/core/java/android/app/admin/DnsEvent.java
index a3a3f58..c21725f 100644
--- a/core/java/android/app/admin/DnsEvent.java
+++ b/core/java/android/app/admin/DnsEvent.java
@@ -19,6 +19,12 @@
import android.os.Parcel;
import android.os.Parcelable;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
/**
* A class that represents a DNS lookup event.
*/
@@ -59,15 +65,28 @@
}
/** Returns (possibly a subset of) the IP addresses returned. */
- public String[] getIpAddresses() {
- return ipAddresses;
+ public List<InetAddress> getInetAddresses() {
+ if (ipAddresses == null || ipAddresses.length == 0) {
+ return Collections.emptyList();
+ }
+ final List<InetAddress> inetAddresses = new ArrayList<>(ipAddresses.length);
+ for (final String ipAddress : ipAddresses) {
+ try {
+ // ipAddress is already an address, not a host name, no DNS resolution will happen.
+ inetAddresses.add(InetAddress.getByName(ipAddress));
+ } catch (UnknownHostException e) {
+ // Should never happen as we aren't passing a host name.
+ }
+ }
+ return inetAddresses;
}
/**
* Returns the number of IP addresses returned from the DNS lookup event. May be different from
- * the length of ipAddresses if there were too many addresses to log.
+ * the length of the list returned by {@link #getInetAddresses()} if there were too many
+ * addresses to log.
*/
- public int getIpAddressesCount() {
+ public int getTotalResolvedAddressCount() {
return ipAddressesCount;
}
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 8ea911f..e361d81 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -202,6 +202,10 @@
List getPermittedInputMethodsForCurrentUser();
boolean isInputMethodPermittedByAdmin(in ComponentName admin, String packageName, int userId);
+ boolean setPermittedCrossProfileNotificationListeners(in ComponentName admin, in List<String> packageList);
+ List<String> getPermittedCrossProfileNotificationListeners(in ComponentName admin);
+ boolean isNotificationListenerServicePermitted(in String packageName, int userId);
+
Intent createAdminSupportIntent(in String restriction);
boolean setApplicationHidden(in ComponentName admin, in String callerPackage, in String packageName, boolean hidden);
boolean isApplicationHidden(in ComponentName admin, in String callerPackage, in String packageName);
diff --git a/core/java/android/app/admin/SystemUpdateInfo.java b/core/java/android/app/admin/SystemUpdateInfo.java
index 6bb9f2d..fa31273 100644
--- a/core/java/android/app/admin/SystemUpdateInfo.java
+++ b/core/java/android/app/admin/SystemUpdateInfo.java
@@ -89,8 +89,9 @@
}
/**
- * Gets time when the update was first available.
- * @return Time as given by {@link System#currentTimeMillis()}
+ * Gets time when the update was first available in milliseconds since midnight, January 1,
+ * 1970 UTC.
+ * @return Time in milliseconds as given by {@link System#currentTimeMillis()}
*/
public long getReceivedTime() {
return mReceivedTime;
diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java
index 7c1bcf0..3353530 100644
--- a/core/java/android/app/assist/AssistStructure.java
+++ b/core/java/android/app/assist/AssistStructure.java
@@ -29,10 +29,12 @@
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.view.autofill.AutofillId;
+import android.view.autofill.AutofillManager;
import android.view.autofill.AutofillValue;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.List;
/**
* Assist data automatically created by the platform's implementation of Assist and Autofill.
@@ -62,6 +64,7 @@
ComponentName mActivityComponent;
private boolean mIsHomeActivity;
+ private int mFlags;
final ArrayList<WindowNode> mWindowNodes = new ArrayList<>();
@@ -184,6 +187,7 @@
mSanitizeOnWrite = as.mSanitizeOnWrite;
mWriteStructure = as.waitForReady();
ComponentName.writeToParcel(as.mActivityComponent, out);
+ out.writeInt(as.mFlags);
out.writeLong(as.mAcquisitionStartTime);
out.writeLong(as.mAcquisitionEndTime);
mNumWindows = as.mWindowNodes.size();
@@ -338,6 +342,7 @@
void go() {
fetchData();
mActivityComponent = ComponentName.readFromParcel(mCurParcel);
+ mFlags = mCurParcel.readInt();
mAcquisitionStartTime = mCurParcel.readLong();
mAcquisitionEndTime = mCurParcel.readLong();
final int N = mCurParcel.readInt();
@@ -473,7 +478,7 @@
final int mDisplayId;
final ViewNode mRoot;
- WindowNode(AssistStructure assist, ViewRootImpl root, boolean forAutoFill) {
+ WindowNode(AssistStructure assist, ViewRootImpl root, boolean forAutoFill, int flags) {
View view = root.getView();
Rect rect = new Rect();
view.getBoundsOnScreen(rect);
@@ -488,8 +493,9 @@
ViewNodeBuilder builder = new ViewNodeBuilder(assist, mRoot, false);
if ((root.getWindowFlags() & WindowManager.LayoutParams.FLAG_SECURE) != 0) {
if (forAutoFill) {
- // NOTE: flags are currently not supported, hence 0
- view.onProvideAutofillStructure(builder, 0);
+ final int autofillFlags = (flags & AutofillManager.FLAG_MANUAL_REQUEST) != 0
+ ? View.AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS : 0;
+ view.onProvideAutofillStructure(builder, autofillFlags);
} else {
// This is a secure window, so it doesn't want a screenshot, and that
// means we should also not copy out its view hierarchy for Assist
@@ -499,8 +505,9 @@
}
}
if (forAutoFill) {
- // NOTE: flags are currently not supported, hence 0
- view.dispatchProvideAutofillStructure(builder, 0);
+ final int autofillFlags = (flags & AutofillManager.FLAG_MANUAL_REQUEST) != 0
+ ? View.AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS : 0;
+ view.dispatchProvideAutofillStructure(builder, autofillFlags);
} else {
view.dispatchProvideStructure(builder);
}
@@ -600,7 +607,7 @@
String mIdType;
String mIdEntry;
- // TODO(b/33197203): once we have more flags, it might be better to store the individual
+ // TODO: once we have more flags, it might be better to store the individual
// fields (viewId and childId) of the field.
AutofillId mAutofillId;
@View.AutofillType int mAutofillType = View.AUTOFILL_TYPE_NONE;
@@ -639,7 +646,7 @@
static final int FLAGS_CONTEXT_CLICKABLE = 0x00004000;
static final int FLAGS_OPAQUE = 0x00008000;
- // TODO(b/33197203): autofill data is made of many fields and ideally we should verify
+ // TODO: autofill data is made of many fields and ideally we should verify
// one-by-one to optimize what's sent over, but there isn't enough flag bits for that, we'd
// need to create a 'flags2' or 'autoFillFlags' field and add these flags there.
// So, to keep thinkg simpler for now, let's just use on flag for all of them...
@@ -1043,8 +1050,6 @@
*/
public void updateAutofillValue(AutofillValue value) {
mAutofillValue = value;
- // TODO(b/33197203, b/33802548): decide whether to set text as well (so it would work
- // with "legacy" views) or just the autofill value
if (value.isText()) {
mText.mText = value.getTextValue();
}
@@ -1646,7 +1651,7 @@
@Override
public void setAutofillId(@NonNull ViewStructure parent, int virtualId) {
- mNode.mAutofillId = new AutofillId(parent.getAutofillId(), virtualId);
+ setAutofillId(parent.getAutofillId(), virtualId);
}
@Override
@@ -1687,8 +1692,13 @@
}
@Override
- public void setAutofillId(int viewId) {
- mNode.mAutofillId = new AutofillId(viewId);
+ public void setAutofillId(@NonNull AutofillId id) {
+ mNode.mAutofillId = id;
+ }
+
+ @Override
+ public void setAutofillId(@NonNull AutofillId parentId, int virtualId) {
+ mNode.mAutofillId = new AutofillId(parentId, virtualId);
}
@Override
@@ -1785,7 +1795,7 @@
}
@Override
- public ArrayList<Pair<String, String>> getAttributes() {
+ public List<Pair<String, String>> getAttributes() {
if (mAttributes == null && mNames != null) {
mAttributes = new ArrayList<>(mNames.length);
for (int i = 0; i < mNames.length; i++) {
@@ -1866,20 +1876,22 @@
}
/** @hide */
- public AssistStructure(Activity activity, boolean forAutoFill) {
+ public AssistStructure(Activity activity, boolean forAutoFill, int flags) {
mHaveData = true;
mActivityComponent = activity.getComponentName();
+ mFlags = flags;
ArrayList<ViewRootImpl> views = WindowManagerGlobal.getInstance().getRootViews(
activity.getActivityToken());
for (int i=0; i<views.size(); i++) {
ViewRootImpl root = views.get(i);
- mWindowNodes.add(new WindowNode(this, root, forAutoFill));
+ mWindowNodes.add(new WindowNode(this, root, forAutoFill, flags));
}
}
public AssistStructure() {
mHaveData = true;
mActivityComponent = null;
+ mFlags = 0;
}
/** @hide */
@@ -1906,6 +1918,7 @@
}
Log.i(TAG, "Activity: " + mActivityComponent.flattenToShortString());
Log.i(TAG, "Sanitize on write: " + mSanitizeOnWrite);
+ Log.i(TAG, "Flags: " + mFlags);
final int N = getWindowNodeCount();
for (int i=0; i<N; i++) {
WindowNode node = getWindowNodeAt(i);
@@ -2018,10 +2031,16 @@
return mActivityComponent;
}
+ /** @hide */
+ public int getFlags() {
+ return mFlags;
+ }
+
/**
* Returns whether the activity associated with this AssistStructure was the home activity
- * at the time the assist data was acquired.
+ * (Launcher) at the time the assist data was acquired.
* @return Whether the activity was the home activity.
+ * @see android.content.Intent#CATEGORY_HOME
*/
public boolean isHomeActivity() {
return mIsHomeActivity;
diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java
index 11636a5..5f92af9 100644
--- a/core/java/android/app/backup/BackupAgent.java
+++ b/core/java/android/app/backup/BackupAgent.java
@@ -133,8 +133,6 @@
Handler mHandler = null;
- private long mBackupQuotaBytes = -1;
-
Handler getHandler() {
if (mHandler == null) {
mHandler = new Handler(Looper.getMainLooper());
@@ -186,21 +184,6 @@
}
/**
- * Returns the quota in bytes for the currently requested backup operation. The value can
- * vary for each operation depending on the type of backup being done.
- *
- * <p>Can be called only from {@link BackupAgent#onFullBackup(FullBackupDataOutput)} or
- * {@link BackupAgent#onBackup(ParcelFileDescriptor, BackupDataOutput, ParcelFileDescriptor)}.
- */
- public long getBackupQuota() {
- if (mBackupQuotaBytes < 0) {
- throw new IllegalStateException(
- "Backup quota is available only during backup operations.");
- }
- return mBackupQuotaBytes;
- }
-
- /**
* The application is being asked to write any data changed since the last
* time it performed a backup operation. The state data recorded during the
* last backup pass is provided in the <code>oldState</code> file
@@ -918,10 +901,8 @@
// Ensure that we're running with the app's normal permission level
long ident = Binder.clearCallingIdentity();
- mBackupQuotaBytes = quotaBytes;
-
if (DEBUG) Log.v(TAG, "doBackup() invoked");
- BackupDataOutput output = new BackupDataOutput(data.getFileDescriptor());
+ BackupDataOutput output = new BackupDataOutput(data.getFileDescriptor(), quotaBytes);
try {
BackupAgent.this.onBackup(oldState, output, newState);
@@ -937,9 +918,6 @@
// guarantee themselves).
waitForSharedPrefs();
- // Unset quota after onBackup is done.
- mBackupQuotaBytes = -1;
-
Binder.restoreCallingIdentity(ident);
try {
callbackBinder.opComplete(token, 0);
@@ -997,8 +975,6 @@
// Ensure that we're running with the app's normal permission level
long ident = Binder.clearCallingIdentity();
- mBackupQuotaBytes = quotaBytes;
-
if (DEBUG) Log.v(TAG, "doFullBackup() invoked");
// Ensure that any SharedPreferences writes have landed *before*
@@ -1006,7 +982,7 @@
waitForSharedPrefs();
try {
- BackupAgent.this.onFullBackup(new FullBackupDataOutput(data));
+ BackupAgent.this.onFullBackup(new FullBackupDataOutput(data, quotaBytes));
} catch (IOException ex) {
Log.d(TAG, "onFullBackup (" + BackupAgent.this.getClass().getName() + ") threw", ex);
throw new RuntimeException(ex);
@@ -1017,9 +993,6 @@
// ... and then again after, as in the doBackup() case
waitForSharedPrefs();
- // Unset quota after onFullBackup is done.
- mBackupQuotaBytes = -1;
-
// Send the EOD marker indicating that there is no more data
// forthcoming from this agent.
try {
@@ -1046,9 +1019,7 @@
public void doMeasureFullBackup(long quotaBytes, int token, IBackupManager callbackBinder) {
// Ensure that we're running with the app's normal permission level
final long ident = Binder.clearCallingIdentity();
- FullBackupDataOutput measureOutput = new FullBackupDataOutput();
-
- mBackupQuotaBytes = quotaBytes;
+ FullBackupDataOutput measureOutput = new FullBackupDataOutput(quotaBytes);
waitForSharedPrefs();
try {
@@ -1060,8 +1031,6 @@
Log.d(TAG, "onFullBackup[M] (" + BackupAgent.this.getClass().getName() + ") threw", ex);
throw ex;
} finally {
- // Unset quota after onFullBackup is done.
- mBackupQuotaBytes = -1;
Binder.restoreCallingIdentity(ident);
try {
callbackBinder.opComplete(token, measureOutput.getSize());
diff --git a/core/java/android/app/backup/BackupDataOutput.java b/core/java/android/app/backup/BackupDataOutput.java
index 1fe63e7..c7586a2 100644
--- a/core/java/android/app/backup/BackupDataOutput.java
+++ b/core/java/android/app/backup/BackupDataOutput.java
@@ -62,12 +62,23 @@
* @see BackupAgent
*/
public class BackupDataOutput {
+ final long mQuota;
long mBackupWriter;
+ /**
+ * Construct a BackupDataOutput purely for data-stream manipulation. This instance will
+ * not report usable quota information.
+ * @hide */
+ @SystemApi
+ public BackupDataOutput(FileDescriptor fd) {
+ this(fd, -1);
+ }
+
/** @hide */
@SystemApi
- public BackupDataOutput(FileDescriptor fd) {
+ public BackupDataOutput(FileDescriptor fd, long quota) {
if (fd == null) throw new NullPointerException();
+ mQuota = quota;
mBackupWriter = ctor(fd);
if (mBackupWriter == 0) {
throw new RuntimeException("Native initialization failed with fd=" + fd);
@@ -75,6 +86,16 @@
}
/**
+ * Returns the quota in bytes for the application's current backup operation. The
+ * value can vary for each operation.
+ *
+ * @see FullBackupDataOutput#getQuota()
+ */
+ public long getQuota() {
+ return mQuota;
+ }
+
+ /**
* Mark the beginning of one record in the backup data stream. This must be called before
* {@link #writeEntityData}.
* @param key A string key that uniquely identifies the data record within the application.
diff --git a/core/java/android/app/backup/FullBackupDataOutput.java b/core/java/android/app/backup/FullBackupDataOutput.java
index 94704b9..5deedd0 100644
--- a/core/java/android/app/backup/FullBackupDataOutput.java
+++ b/core/java/android/app/backup/FullBackupDataOutput.java
@@ -10,17 +10,35 @@
public class FullBackupDataOutput {
// Currently a name-scoping shim around BackupDataOutput
private final BackupDataOutput mData;
+ private final long mQuota;
private long mSize;
+ /**
+ * Returns the quota in bytes for the application's current backup operation. The
+ * value can vary for each operation.
+ *
+ * @see BackupDataOutput#getQuota()
+ */
+ public long getQuota() {
+ return mQuota;
+ }
+
/** @hide - used only in measure operation */
- public FullBackupDataOutput() {
+ public FullBackupDataOutput(long quota) {
mData = null;
+ mQuota = quota;
mSize = 0;
}
/** @hide */
+ public FullBackupDataOutput(ParcelFileDescriptor fd, long quota) {
+ mData = new BackupDataOutput(fd.getFileDescriptor(), quota);
+ mQuota = quota;
+ }
+
+ /** @hide - used only internally to the backup manager service's stream construction */
public FullBackupDataOutput(ParcelFileDescriptor fd) {
- mData = new BackupDataOutput(fd.getFileDescriptor());
+ this(fd, -1);
}
/** @hide */
diff --git a/core/java/android/app/usage/ExternalStorageStats.java b/core/java/android/app/usage/ExternalStorageStats.java
index 10c9b5f..83ac779 100644
--- a/core/java/android/app/usage/ExternalStorageStats.java
+++ b/core/java/android/app/usage/ExternalStorageStats.java
@@ -16,6 +16,7 @@
package android.app.usage;
+import android.annotation.BytesLong;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.UserHandle;
@@ -37,7 +38,7 @@
* Return the total bytes used by all files in the shared/external storage
* hosted on this volume.
*/
- public long getTotalBytes() {
+ public @BytesLong long getTotalBytes() {
return totalBytes;
}
@@ -45,7 +46,7 @@
* Return the total bytes used by audio files in the shared/external storage
* hosted on this volume.
*/
- public long getAudioBytes() {
+ public @BytesLong long getAudioBytes() {
return audioBytes;
}
@@ -53,7 +54,7 @@
* Return the total bytes used by video files in the shared/external storage
* hosted on this volume.
*/
- public long getVideoBytes() {
+ public @BytesLong long getVideoBytes() {
return videoBytes;
}
@@ -61,7 +62,7 @@
* Return the total bytes used by image files in the shared/external storage
* hosted on this volume.
*/
- public long getImageBytes() {
+ public @BytesLong long getImageBytes() {
return imageBytes;
}
@@ -72,7 +73,7 @@
* This data is already accounted against individual apps as returned
* through {@link StorageStats}.
*/
- public long getAppBytes() {
+ public @BytesLong long getAppBytes() {
return appBytes;
}
diff --git a/core/java/android/app/usage/StorageStats.java b/core/java/android/app/usage/StorageStats.java
index 26c702c0..3a27751 100644
--- a/core/java/android/app/usage/StorageStats.java
+++ b/core/java/android/app/usage/StorageStats.java
@@ -16,6 +16,7 @@
package android.app.usage;
+import android.annotation.BytesLong;
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
@@ -33,18 +34,24 @@
/** {@hide} */ public long cacheBytes;
/**
- * Return the size of all code. This includes {@code APK} files and
- * optimized compiler output.
+ * Return the size of app. This includes {@code APK} files, optimized
+ * compiler output, and unpacked native libraries.
* <p>
* If the primary external/shared storage is hosted on this storage device,
* then this includes files stored under {@link Context#getObbDir()}.
* <p>
* Code is shared between all users on a multiuser device.
*/
- public long getCodeBytes() {
+ public @BytesLong long getAppBytes() {
return codeBytes;
}
+ /** @removed */
+ @Deprecated
+ public long getCodeBytes() {
+ return getAppBytes();
+ }
+
/**
* Return the size of all data. This includes files stored under
* {@link Context#getDataDir()}, {@link Context#getCacheDir()},
@@ -58,7 +65,7 @@
* <p>
* Data is isolated for each user on a multiuser device.
*/
- public long getDataBytes() {
+ public @BytesLong long getDataBytes() {
return dataBytes;
}
@@ -72,7 +79,7 @@
* <p>
* Cached data is isolated for each user on a multiuser device.
*/
- public long getCacheBytes() {
+ public @BytesLong long getCacheBytes() {
return cacheBytes;
}
diff --git a/core/java/android/app/usage/StorageStatsManager.java b/core/java/android/app/usage/StorageStatsManager.java
index 5497d57..d9d958c 100644
--- a/core/java/android/app/usage/StorageStatsManager.java
+++ b/core/java/android/app/usage/StorageStatsManager.java
@@ -18,6 +18,7 @@
import static android.os.storage.StorageManager.convert;
+import android.annotation.BytesLong;
import android.annotation.NonNull;
import android.annotation.TestApi;
import android.annotation.WorkerThread;
@@ -37,13 +38,16 @@
import java.util.UUID;
/**
- * Provides access to detailed storage statistics.
+ * Access to detailed storage statistics. This provides a summary of how apps,
+ * users, and external/shared storage is utilizing disk space.
* <p class="note">
- * Note: this API requires the permission
- * {@code android.permission.PACKAGE_USAGE_STATS}, which is a system-level
- * permission that will not be granted to normal apps. However, declaring the
- * permission expresses your intention to use this API and an end user can then
- * choose to grant this permission through the Settings application.
+ * Note: no permissions are required when calling these APIs for your own
+ * package or UID. However, requesting details for any other package requires
+ * the {@code android.Manifest.permission#PACKAGE_USAGE_STATS} permission, which
+ * is a system-level permission that will not be granted to normal apps.
+ * Declaring that permission expresses your intention to use this API and an end
+ * user can then choose to grant this permission through the Settings
+ * application.
* </p>
*/
public class StorageStatsManager {
@@ -73,19 +77,22 @@
}
/**
- * Return the total size of the underlying media that is hosting this
- * storage volume.
+ * Return the total size of the underlying physical media that is hosting
+ * this storage volume.
* <p>
- * To reduce end user confusion, this value matches the total storage size
- * advertised in a retail environment, which is typically larger than the
- * actual usable partition space.
+ * This value is best suited for visual display to end users, since it's
+ * designed to reflect the total storage size advertised in a retail
+ * environment.
+ * <p>
+ * Apps making logical decisions about disk space should always use
+ * {@link File#getTotalSpace()} instead of this value.
*
* @param storageUuid the UUID of the storage volume you're interested in,
* such as {@link StorageManager#UUID_DEFAULT}.
* @throws IOException when the storage device isn't present.
*/
@WorkerThread
- public long getTotalBytes(@NonNull UUID storageUuid) throws IOException {
+ public @BytesLong long getTotalBytes(@NonNull UUID storageUuid) throws IOException {
try {
return mService.getTotalBytes(convert(storageUuid), mContext.getOpPackageName());
} catch (ParcelableException e) {
@@ -105,19 +112,20 @@
/**
* Return the free space on the requested storage volume.
* <p>
- * The free space is equivalent to {@link File#getUsableSpace()} plus the
- * size of any cached data that can be automatically deleted by the system
- * as additional space is needed.
+ * This value is best suited for visual display to end users, since it's
+ * designed to reflect both unused space <em>and</em> and cached space that
+ * could be reclaimed by the system.
* <p>
- * This method may take several seconds to calculate the requested values,
- * so it should only be called from a worker thread.
+ * Apps making logical decisions about disk space should always use
+ * {@link StorageManager#getAllocatableBytes(UUID, int)} instead of this
+ * value.
*
* @param storageUuid the UUID of the storage volume you're interested in,
* such as {@link StorageManager#UUID_DEFAULT}.
* @throws IOException when the storage device isn't present.
*/
@WorkerThread
- public long getFreeBytes(@NonNull UUID storageUuid) throws IOException {
+ public @BytesLong long getFreeBytes(@NonNull UUID storageUuid) throws IOException {
try {
return mService.getFreeBytes(convert(storageUuid), mContext.getOpPackageName());
} catch (ParcelableException e) {
@@ -137,9 +145,15 @@
/**
* Return storage statistics for a specific package on the requested storage
* volume.
- * <p>
- * This method may take several seconds to calculate the requested values,
- * so it should only be called from a worker thread.
+ * <p class="note">
+ * Note: no permissions are required when calling this API for your own
+ * package. However, requesting details for any other package requires the
+ * {@code android.Manifest.permission#PACKAGE_USAGE_STATS} permission, which
+ * is a system-level permission that will not be granted to normal apps.
+ * Declaring that permission expresses your intention to use this API and an
+ * end user can then choose to grant this permission through the Settings
+ * application.
+ * </p>
* <p class="note">
* Note: if the requested package uses the {@code android:sharedUserId}
* manifest feature, this call will be forced into a slower manual
@@ -158,8 +172,9 @@
* @see PackageInfo#packageName
*/
@WorkerThread
- public @NonNull StorageStats queryStatsForPackage(@NonNull UUID storageUuid, String packageName,
- UserHandle user) throws PackageManager.NameNotFoundException, IOException {
+ public @NonNull StorageStats queryStatsForPackage(@NonNull UUID storageUuid,
+ @NonNull String packageName, @NonNull UserHandle user)
+ throws PackageManager.NameNotFoundException, IOException {
try {
return mService.queryStatsForPackage(convert(storageUuid), packageName,
user.getIdentifier(), mContext.getOpPackageName());
@@ -182,9 +197,15 @@
/**
* Return storage statistics for a specific UID on the requested storage
* volume.
- * <p>
- * This method may take several seconds to calculate the requested values,
- * so it should only be called from a worker thread.
+ * <p class="note">
+ * Note: no permissions are required when calling this API for your own UID.
+ * However, requesting details for any other UID requires the
+ * {@code android.Manifest.permission#PACKAGE_USAGE_STATS} permission, which
+ * is a system-level permission that will not be granted to normal apps.
+ * Declaring that permission expresses your intention to use this API and an
+ * end user can then choose to grant this permission through the Settings
+ * application.
+ * </p>
*
* @param storageUuid the UUID of the storage volume you're interested in,
* such as {@link StorageManager#UUID_DEFAULT}.
@@ -194,7 +215,8 @@
* @see ApplicationInfo#uid
*/
@WorkerThread
- public StorageStats queryStatsForUid(@NonNull UUID storageUuid, int uid) throws IOException {
+ public @NonNull StorageStats queryStatsForUid(@NonNull UUID storageUuid, int uid)
+ throws IOException {
try {
return mService.queryStatsForUid(convert(storageUuid), uid,
mContext.getOpPackageName());
@@ -215,9 +237,14 @@
/**
* Return storage statistics for a specific {@link UserHandle} on the
* requested storage volume.
- * <p>
- * This method may take several seconds to calculate the requested values,
- * so it should only be called from a worker thread.
+ * <p class="note">
+ * Note: this API requires the
+ * {@code android.Manifest.permission#PACKAGE_USAGE_STATS} permission, which
+ * is a system-level permission that will not be granted to normal apps.
+ * Declaring that permission expresses your intention to use this API and an
+ * end user can then choose to grant this permission through the Settings
+ * application.
+ * </p>
*
* @param storageUuid the UUID of the storage volume you're interested in,
* such as {@link StorageManager#UUID_DEFAULT}.
@@ -226,8 +253,8 @@
* @see android.os.Process#myUserHandle()
*/
@WorkerThread
- public StorageStats queryStatsForUser(@NonNull UUID storageUuid, UserHandle user)
- throws IOException {
+ public @NonNull StorageStats queryStatsForUser(@NonNull UUID storageUuid,
+ @NonNull UserHandle user) throws IOException {
try {
return mService.queryStatsForUser(convert(storageUuid), user.getIdentifier(),
mContext.getOpPackageName());
@@ -248,9 +275,14 @@
/**
* Return shared/external storage statistics for a specific
* {@link UserHandle} on the requested storage volume.
- * <p>
- * This method may take several seconds to calculate the requested values,
- * so it should only be called from a worker thread.
+ * <p class="note">
+ * Note: this API requires the
+ * {@code android.Manifest.permission#PACKAGE_USAGE_STATS} permission, which
+ * is a system-level permission that will not be granted to normal apps.
+ * Declaring that permission expresses your intention to use this API and an
+ * end user can then choose to grant this permission through the Settings
+ * application.
+ * </p>
*
* @param storageUuid the UUID of the storage volume you're interested in,
* such as {@link StorageManager#UUID_DEFAULT}.
@@ -258,8 +290,8 @@
* @see android.os.Process#myUserHandle()
*/
@WorkerThread
- public ExternalStorageStats queryExternalStatsForUser(@NonNull UUID storageUuid,
- UserHandle user) throws IOException {
+ public @NonNull ExternalStorageStats queryExternalStatsForUser(@NonNull UUID storageUuid,
+ @NonNull UserHandle user) throws IOException {
try {
return mService.queryExternalStatsForUser(convert(storageUuid), user.getIdentifier(),
mContext.getOpPackageName());
diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java
index 9f35e85..6327f34 100644
--- a/core/java/android/appwidget/AppWidgetManager.java
+++ b/core/java/android/appwidget/AppWidgetManager.java
@@ -712,12 +712,13 @@
*
* @param profile The profile for which to get providers. Passing null is equivalent
* to querying for only the calling user.
- * @return The installed providers.
+ * @return The installed providers, or an empty list if none are found for the given user.
*
* @see android.os.Process#myUserHandle()
* @see android.os.UserManager#getUserProfiles()
*/
- public List<AppWidgetProviderInfo> getInstalledProvidersForProfile(@Nullable UserHandle profile) {
+ public @NonNull List<AppWidgetProviderInfo> getInstalledProvidersForProfile(
+ @Nullable UserHandle profile) {
if (mService == null) {
return Collections.emptyList();
}
@@ -735,13 +736,20 @@
* equivalent to {@link #getInstalledProvidersForProfile(UserHandle)}.
* @param profile The profile for which to get providers. Passing null is equivalent
* to querying for only the calling user.
- * @return The installed providers.
+ * @return The installed providers, or an empty list if none are found for the given
+ * package and user.
+ * @throws NullPointerException if the provided package name is null
*
* @see android.os.Process#myUserHandle()
* @see android.os.UserManager#getUserProfiles()
*/
- public List<AppWidgetProviderInfo> getInstalledProvidersForPackage(@Nullable String packageName,
- @Nullable UserHandle profile) {
+ public @NonNull List<AppWidgetProviderInfo> getInstalledProvidersForPackage(
+ @NonNull String packageName, @Nullable UserHandle profile) {
+ if (packageName == null) {
+ throw new NullPointerException("A non-null package must be passed to this method. " +
+ "If you want all widgets regardless of package, see " +
+ "getInstalledProvidersForProfile(UserHandle)");
+ }
if (mService == null) {
return Collections.emptyList();
}
diff --git a/core/java/android/appwidget/AppWidgetProviderInfo.java b/core/java/android/appwidget/AppWidgetProviderInfo.java
index 06fdb32..52fa8a6 100644
--- a/core/java/android/appwidget/AppWidgetProviderInfo.java
+++ b/core/java/android/appwidget/AppWidgetProviderInfo.java
@@ -368,11 +368,11 @@
try {
Resources resources = context.getPackageManager().getResourcesForApplication(
providerInfo.applicationInfo);
- if (resourceId > 0) {
- if (density <= 0) {
- density = context.getResources().getDisplayMetrics().densityDpi;
+ if (resourceId != 0) {
+ if (density < 0) {
+ density = 0;
}
- return resources.getDrawableForDensity(resourceId, density);
+ return resources.getDrawableForDensity(resourceId, density, null);
}
} catch (PackageManager.NameNotFoundException | Resources.NotFoundException e) {
/* ignore */
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index 639e056..c427268 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -22,6 +22,8 @@
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi;
import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.ParcelUuid;
@@ -593,32 +595,38 @@
public static final int TRANSPORT_LE = 2;
/**
- * Bluetooth LE 1M PHY.
+ * Bluetooth LE 1M PHY. Used to refer to LE 1M Physical Channel for advertising, scanning or
+ * connection.
*/
public static final int PHY_LE_1M = 1;
/**
- * Bluetooth LE 2M PHY.
+ * Bluetooth LE 2M PHY. Used to refer to LE 2M Physical Channel for advertising, scanning or
+ * connection.
*/
public static final int PHY_LE_2M = 2;
/**
- * Bluetooth LE Coded PHY.
+ * Bluetooth LE Coded PHY. Used to refer to LE Coded Physical Channel for advertising, scanning
+ * or connection.
*/
public static final int PHY_LE_CODED = 3;
/**
- * Bluetooth LE 1M PHY mask.
+ * Bluetooth LE 1M PHY mask. Used to specify LE 1M Physical Channel as one of many available
+ * options in a bitmask.
*/
public static final int PHY_LE_1M_MASK = 1;
/**
- * Bluetooth LE 2M PHY mask.
+ * Bluetooth LE 2M PHY mask. Used to specify LE 2M Physical Channel as one of many available
+ * options in a bitmask.
*/
public static final int PHY_LE_2M_MASK = 2;
/**
- * Bluetooth LE Coded PHY mask.
+ * Bluetooth LE Coded PHY mask. Used to specify LE Coded Physical Channel as one of many
+ * available options in a bitmask.
*/
public static final int PHY_LE_CODED_MASK = 4;
@@ -1668,12 +1676,45 @@
* {@link BluetoothDevice#TRANSPORT_BREDR} or {@link BluetoothDevice#TRANSPORT_LE}
* @param phy preferred PHY for connections to remote LE device. Bitwise OR of any of
* {@link BluetoothDevice#PHY_LE_1M_MASK}, {@link BluetoothDevice#PHY_LE_2M_MASK},
- * and {@link BluetoothDevice#PHY_LE_CODED_MASK}. This option does not take effect if
- * {@code autoConnect} is set to true.
- * @throws IllegalArgumentException if callback is null
+ * and {@link BluetoothDevice#PHY_LE_CODED_MASK}. This option does not take effect
+ * if {@code autoConnect} is set to true.
+ * @throws NullPointerException if callback is null
*/
public BluetoothGatt connectGatt(Context context, boolean autoConnect,
BluetoothGattCallback callback, int transport, int phy) {
+ return connectGatt(context, autoConnect,callback, TRANSPORT_AUTO, PHY_LE_1M_MASK, null);
+ }
+
+ /**
+ * Connect to GATT Server hosted by this device. Caller acts as GATT client.
+ * The callback is used to deliver results to Caller, such as connection status as well
+ * as any further GATT client operations.
+ * The method returns a BluetoothGatt instance. You can use BluetoothGatt to conduct
+ * GATT client operations.
+ * @param callback GATT callback handler that will receive asynchronous callbacks.
+ * @param autoConnect Whether to directly connect to the remote device (false)
+ * or to automatically connect as soon as the remote
+ * device becomes available (true).
+ * @param transport preferred transport for GATT connections to remote dual-mode devices
+ * {@link BluetoothDevice#TRANSPORT_AUTO} or
+ * {@link BluetoothDevice#TRANSPORT_BREDR} or {@link BluetoothDevice#TRANSPORT_LE}
+ * @param phy preferred PHY for connections to remote LE device. Bitwise OR of any of
+ * {@link BluetoothDevice#PHY_LE_1M_MASK}, {@link BluetoothDevice#PHY_LE_2M_MASK},
+ * an d{@link BluetoothDevice#PHY_LE_CODED_MASK}. This option does not take effect
+ * if {@code autoConnect} is set to true.
+ * @param handler The handler to use for the callback. If {@code null}, callbacks will happen
+ * on the service's main thread.
+ * @throws NullPointerException if callback is null
+ */
+ public BluetoothGatt connectGatt(Context context, boolean autoConnect,
+ BluetoothGattCallback callback, int transport, int phy,
+ Handler handler) {
+ if (callback == null)
+ throw new NullPointerException("callback is null");
+
+ if (handler == null)
+ handler = new Handler(Looper.getMainLooper());
+
// TODO(Bluetooth) check whether platform support BLE
// Do the check here or in GattServer?
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
@@ -1685,7 +1726,7 @@
return null;
}
BluetoothGatt gatt = new BluetoothGatt(iGatt, this, transport, phy);
- gatt.connect(autoConnect, callback);
+ gatt.connect(autoConnect, callback, handler);
return gatt;
} catch (RemoteException e) {Log.e(TAG, "", e);}
return null;
diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java
index 4aaf6bd..0f01d62 100644
--- a/core/java/android/bluetooth/BluetoothGatt.java
+++ b/core/java/android/bluetooth/BluetoothGatt.java
@@ -17,6 +17,7 @@
package android.bluetooth;
import android.content.Context;
+import android.os.Handler;
import android.os.ParcelUuid;
import android.os.RemoteException;
import android.util.Log;
@@ -43,6 +44,7 @@
private IBluetoothGatt mService;
private BluetoothGattCallback mCallback;
+ private Handler mHandler;
private int mClientIf;
private BluetoothDevice mDevice;
private boolean mAutoConnect;
@@ -154,8 +156,16 @@
}
mClientIf = clientIf;
if (status != GATT_SUCCESS) {
- mCallback.onConnectionStateChange(BluetoothGatt.this, GATT_FAILURE,
- BluetoothProfile.STATE_DISCONNECTED);
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mCallback != null) {
+ mCallback.onConnectionStateChange(BluetoothGatt.this, GATT_FAILURE,
+ BluetoothProfile.STATE_DISCONNECTED);
+ }
+ }
+ });
+
synchronized(mStateLock) {
mConnState = CONN_STATE_IDLE;
}
@@ -181,11 +191,14 @@
return;
}
- try {
- mCallback.onPhyUpdate(BluetoothGatt.this, txPhy, rxPhy, status);
- } catch (Exception ex) {
- Log.w(TAG, "Unhandled exception in callback", ex);
- }
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mCallback != null) {
+ mCallback.onPhyUpdate(BluetoothGatt.this, txPhy, rxPhy, status);
+ }
+ }
+ });
}
/**
@@ -200,11 +213,14 @@
return;
}
- try {
- mCallback.onPhyRead(BluetoothGatt.this, txPhy, rxPhy, status);
- } catch (Exception ex) {
- Log.w(TAG, "Unhandled exception in callback", ex);
- }
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mCallback != null) {
+ mCallback.onPhyRead(BluetoothGatt.this, txPhy, rxPhy, status);
+ }
+ }
+ });
}
/**
@@ -221,11 +237,16 @@
}
int profileState = connected ? BluetoothProfile.STATE_CONNECTED :
BluetoothProfile.STATE_DISCONNECTED;
- try {
- mCallback.onConnectionStateChange(BluetoothGatt.this, status, profileState);
- } catch (Exception ex) {
- Log.w(TAG, "Unhandled exception in callback", ex);
- }
+
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mCallback != null) {
+ mCallback.onConnectionStateChange(BluetoothGatt.this, status,
+ profileState);
+ }
+ }
+ });
synchronized(mStateLock) {
if (connected) {
@@ -279,11 +300,14 @@
}
}
- try {
- mCallback.onServicesDiscovered(BluetoothGatt.this, status);
- } catch (Exception ex) {
- Log.w(TAG, "Unhandled exception in callback", ex);
- }
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mCallback != null) {
+ mCallback.onServicesDiscovered(BluetoothGatt.this, status);
+ }
+ }
+ });
}
/**
@@ -328,11 +352,15 @@
if (status == 0) characteristic.setValue(value);
- try {
- mCallback.onCharacteristicRead(BluetoothGatt.this, characteristic, status);
- } catch (Exception ex) {
- Log.w(TAG, "Unhandled exception in callback", ex);
- }
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mCallback != null) {
+ mCallback.onCharacteristicRead(BluetoothGatt.this, characteristic,
+ status);
+ }
+ }
+ });
}
/**
@@ -373,11 +401,15 @@
mAuthRetryState = AUTH_RETRY_STATE_IDLE;
- try {
- mCallback.onCharacteristicWrite(BluetoothGatt.this, characteristic, status);
- } catch (Exception ex) {
- Log.w(TAG, "Unhandled exception in callback", ex);
- }
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mCallback != null) {
+ mCallback.onCharacteristicWrite(BluetoothGatt.this, characteristic,
+ status);
+ }
+ }
+ });
}
/**
@@ -398,11 +430,14 @@
characteristic.setValue(value);
- try {
- mCallback.onCharacteristicChanged(BluetoothGatt.this, characteristic);
- } catch (Exception ex) {
- Log.w(TAG, "Unhandled exception in callback", ex);
- }
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mCallback != null) {
+ mCallback.onCharacteristicChanged(BluetoothGatt.this, characteristic);
+ }
+ }
+ });
}
/**
@@ -442,11 +477,14 @@
mAuthRetryState = AUTH_RETRY_STATE_IDLE;
- try {
- mCallback.onDescriptorRead(BluetoothGatt.this, descriptor, status);
- } catch (Exception ex) {
- Log.w(TAG, "Unhandled exception in callback", ex);
- }
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mCallback != null) {
+ mCallback.onDescriptorRead(BluetoothGatt.this, descriptor, status);
+ }
+ }
+ });
}
/**
@@ -485,11 +523,14 @@
mAuthRetryState = AUTH_RETRY_STATE_IDLE;
- try {
- mCallback.onDescriptorWrite(BluetoothGatt.this, descriptor, status);
- } catch (Exception ex) {
- Log.w(TAG, "Unhandled exception in callback", ex);
- }
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mCallback != null) {
+ mCallback.onDescriptorWrite(BluetoothGatt.this, descriptor, status);
+ }
+ }
+ });
}
/**
@@ -508,11 +549,14 @@
mDeviceBusy = false;
}
- try {
- mCallback.onReliableWriteCompleted(BluetoothGatt.this, status);
- } catch (Exception ex) {
- Log.w(TAG, "Unhandled exception in callback", ex);
- }
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mCallback != null) {
+ mCallback.onReliableWriteCompleted(BluetoothGatt.this, status);
+ }
+ }
+ });
}
/**
@@ -526,11 +570,14 @@
if (!address.equals(mDevice.getAddress())) {
return;
}
- try {
- mCallback.onReadRemoteRssi(BluetoothGatt.this, rssi, status);
- } catch (Exception ex) {
- Log.w(TAG, "Unhandled exception in callback", ex);
- }
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mCallback != null) {
+ mCallback.onReadRemoteRssi(BluetoothGatt.this, rssi, status);
+ }
+ }
+ });
}
/**
@@ -544,11 +591,15 @@
if (!address.equals(mDevice.getAddress())) {
return;
}
- try {
- mCallback.onMtuChanged(BluetoothGatt.this, mtu, status);
- } catch (Exception ex) {
- Log.w(TAG, "Unhandled exception in callback", ex);
- }
+
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mCallback != null) {
+ mCallback.onMtuChanged(BluetoothGatt.this, mtu, status);
+ }
+ }
+ });
}
/**
@@ -564,12 +615,16 @@
if (!address.equals(mDevice.getAddress())) {
return;
}
- try {
- mCallback.onConnectionUpdated(BluetoothGatt.this, interval, latency,
- timeout, status);
- } catch (Exception ex) {
- Log.w(TAG, "Unhandled exception in callback", ex);
- }
+
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mCallback != null) {
+ mCallback.onConnectionUpdated(BluetoothGatt.this, interval, latency,
+ timeout, status);
+ }
+ }
+ });
}
};
@@ -659,11 +714,12 @@
* @return If true, the callback will be called to notify success or failure,
* false on immediate error
*/
- private boolean registerApp(BluetoothGattCallback callback) {
+ private boolean registerApp(BluetoothGattCallback callback, Handler handler) {
if (DBG) Log.d(TAG, "registerApp()");
if (mService == null) return false;
mCallback = callback;
+ mHandler = handler;
UUID uuid = UUID.randomUUID();
if (DBG) Log.d(TAG, "registerApp() - UUID=" + uuid);
@@ -716,7 +772,8 @@
* device becomes available (true).
* @return true, if the connection attempt was initiated successfully
*/
- /*package*/ boolean connect(Boolean autoConnect, BluetoothGattCallback callback) {
+ /*package*/ boolean connect(Boolean autoConnect, BluetoothGattCallback callback,
+ Handler handler) {
if (DBG) Log.d(TAG, "connect() - device: " + mDevice.getAddress() + ", auto: " + autoConnect);
synchronized(mStateLock) {
if (mConnState != CONN_STATE_IDLE) {
@@ -727,7 +784,7 @@
mAutoConnect = autoConnect;
- if (!registerApp(callback)) {
+ if (!registerApp(callback, handler)) {
synchronized(mStateLock) {
mConnState = CONN_STATE_IDLE;
}
@@ -947,6 +1004,41 @@
}
/**
+ * Reads the characteristic using its UUID from the associated remote device.
+ *
+ * <p>This is an asynchronous operation. The result of the read operation
+ * is reported by the {@link BluetoothGattCallback#onCharacteristicRead}
+ * callback.
+ *
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
+ *
+ * @param uuid UUID of characteristic to read from the remote device
+ * @return true, if the read operation was initiated successfully
+ * @hide
+ */
+ public boolean readUsingCharacteristicUuid(UUID uuid, int startHandle, int endHandle) {
+ if (VDBG) Log.d(TAG, "readUsingCharacteristicUuid() - uuid: " + uuid);
+ if (mService == null || mClientIf == 0) return false;
+
+ synchronized(mDeviceBusy) {
+ if (mDeviceBusy) return false;
+ mDeviceBusy = true;
+ }
+
+ try {
+ mService.readUsingCharacteristicUuid(mClientIf, mDevice.getAddress(),
+ new ParcelUuid(uuid), startHandle, endHandle, AUTHENTICATION_NONE);
+ } catch (RemoteException e) {
+ Log.e(TAG,"",e);
+ mDeviceBusy = false;
+ return false;
+ }
+
+ return true;
+ }
+
+
+ /**
* Writes a given characteristic and its values to the associated remote device.
*
* <p>Once the write operation has been completed, the
diff --git a/core/java/android/bluetooth/BluetoothGattCallback.java b/core/java/android/bluetooth/BluetoothGattCallback.java
index 11a15c6..c6f82ff 100644
--- a/core/java/android/bluetooth/BluetoothGattCallback.java
+++ b/core/java/android/bluetooth/BluetoothGattCallback.java
@@ -30,7 +30,8 @@
* {@link BluetoothDevice#PHY_LE_2M}, and {@link BluetoothDevice#PHY_LE_CODED}.
* @param rxPhy the receiver PHY in use. One of {@link BluetoothDevice#PHY_LE_1M},
* {@link BluetoothDevice#PHY_LE_2M}, and {@link BluetoothDevice#PHY_LE_CODED}.
- * @param status status of the operation
+ * @param status Status of the PHY update operation.
+ * {@link BluetoothGatt#GATT_SUCCESS} if the operation succeeds.
*/
public void onPhyUpdate(BluetoothGatt gatt, int txPhy, int rxPhy, int status) {
}
@@ -43,7 +44,8 @@
* {@link BluetoothDevice#PHY_LE_2M}, and {@link BluetoothDevice#PHY_LE_CODED}.
* @param rxPhy the receiver PHY in use. One of {@link BluetoothDevice#PHY_LE_1M},
* {@link BluetoothDevice#PHY_LE_2M}, and {@link BluetoothDevice#PHY_LE_CODED}.
- * @param status status of the operation
+ * @param status Status of the PHY read operation.
+ * {@link BluetoothGatt#GATT_SUCCESS} if the operation succeeds.
*/
public void onPhyRead(BluetoothGatt gatt, int txPhy, int rxPhy, int status) {
}
diff --git a/core/java/android/bluetooth/BluetoothGattServerCallback.java b/core/java/android/bluetooth/BluetoothGattServerCallback.java
index 3b8f962..02307bd 100644
--- a/core/java/android/bluetooth/BluetoothGattServerCallback.java
+++ b/core/java/android/bluetooth/BluetoothGattServerCallback.java
@@ -167,7 +167,8 @@
* {@link BluetoothDevice#PHY_LE_2M}, and {@link BluetoothDevice#PHY_LE_CODED}
* @param rxPhy the receiver PHY in use. One of {@link BluetoothDevice#PHY_LE_1M},
* {@link BluetoothDevice#PHY_LE_2M}, and {@link BluetoothDevice#PHY_LE_CODED}
- * @param status status of the operation
+ * @param status Status of the PHY update operation.
+ * {@link BluetoothGatt#GATT_SUCCESS} if the operation succeeds.
*/
public void onPhyUpdate(BluetoothDevice device, int txPhy, int rxPhy, int status) {
}
@@ -180,7 +181,8 @@
* {@link BluetoothDevice#PHY_LE_2M}, and {@link BluetoothDevice#PHY_LE_CODED}
* @param rxPhy the receiver PHY in use. One of {@link BluetoothDevice#PHY_LE_1M},
* {@link BluetoothDevice#PHY_LE_2M}, and {@link BluetoothDevice#PHY_LE_CODED}
- * @param status status of the operation
+ * @param status Status of the PHY read operation.
+ * {@link BluetoothGatt#GATT_SUCCESS} if the operation succeeds.
*/
public void onPhyRead(BluetoothDevice device, int txPhy, int rxPhy, int status) {
}
diff --git a/core/java/android/bluetooth/IBluetoothGatt.aidl b/core/java/android/bluetooth/IBluetoothGatt.aidl
index 582709c..e2d4f5b 100644
--- a/core/java/android/bluetooth/IBluetoothGatt.aidl
+++ b/core/java/android/bluetooth/IBluetoothGatt.aidl
@@ -32,7 +32,6 @@
import android.bluetooth.IBluetoothGattCallback;
import android.bluetooth.IBluetoothGattServerCallback;
-import android.bluetooth.le.IAdvertiserCallback;
import android.bluetooth.le.IAdvertisingSetCallback;
import android.bluetooth.le.IPeriodicAdvertisingCallback;
import android.bluetooth.le.IScannerCallback;
@@ -60,6 +59,7 @@
in IAdvertisingSetCallback callback);
void stopAdvertisingSet(in IAdvertisingSetCallback callback);
+ void getOwnAddress(in int advertiserId);
void enableAdvertisingSet(in int advertiserId, in boolean enable, in int duration, in int maxExtAdvEvents);
void setAdvertisingData(in int advertiserId, in AdvertiseData data);
void setScanResponseData(in int advertiserId, in AdvertiseData data);
@@ -81,6 +81,8 @@
void refreshDevice(in int clientIf, in String address);
void discoverServices(in int clientIf, in String address);
void readCharacteristic(in int clientIf, in String address, in int handle, in int authReq);
+ void readUsingCharacteristicUuid(in int clientIf, in String address, in ParcelUuid uuid,
+ in int startHandle, in int endHandle, in int authReq);
void writeCharacteristic(in int clientIf, in String address, in int handle,
in int writeType, in int authReq, in byte[] value);
void readDescriptor(in int clientIf, in String address, in int handle, in int authReq);
diff --git a/core/java/android/bluetooth/le/AdvertisingSet.java b/core/java/android/bluetooth/le/AdvertisingSet.java
index 51571b2..1bc211c 100644
--- a/core/java/android/bluetooth/le/AdvertisingSet.java
+++ b/core/java/android/bluetooth/le/AdvertisingSet.java
@@ -172,7 +172,7 @@
*
* @param enable whether the periodic advertising should be enabled (true), or disabled (false).
*/
- public void setPeriodicAdvertisingEnable(boolean enable) {
+ public void setPeriodicAdvertisingEnabled(boolean enable) {
try {
gatt.setPeriodicAdvertisingEnable(this.advertiserId, enable);
} catch (RemoteException e) {
@@ -181,7 +181,23 @@
}
/**
- * Returns advertiserId associated with thsi advertising set.
+ * Returns address associated with this advertising set.
+ * This method is exposed only for Bluetooth PTS tests, no app or system service
+ * should ever use it.
+ *
+ * This method requires {@link android.Manifest.permission#BLUETOOTH_PRIVILEGED} permission.
+ * @hide
+ */
+ public void getOwnAddress(){
+ try {
+ gatt.getOwnAddress(this.advertiserId);
+ } catch (RemoteException e) {
+ Log.e(TAG, "remote exception - ", e);
+ }
+ }
+
+ /**
+ * Returns advertiserId associated with this advertising set.
*
* @hide
*/
diff --git a/core/java/android/bluetooth/le/AdvertisingSetCallback.java b/core/java/android/bluetooth/le/AdvertisingSetCallback.java
index fe3b1cd..c3c16a4 100644
--- a/core/java/android/bluetooth/le/AdvertisingSetCallback.java
+++ b/core/java/android/bluetooth/le/AdvertisingSetCallback.java
@@ -135,7 +135,7 @@
int status) {}
/**
- * Callback triggered in response to {@link AdvertisingSet#setPeriodicAdvertisingEnable}
+ * Callback triggered in response to {@link AdvertisingSet#setPeriodicAdvertisingEnabled}
* indicating result of the operation.
*
* @param advertisingSet The advertising set.
@@ -143,4 +143,15 @@
*/
public void onPeriodicAdvertisingEnabled(AdvertisingSet advertisingSet, boolean enable,
int status) {}
+
+ /**
+ * Callback triggered in response to {@link AdvertisingSet#getOwnAddress()}
+ * indicating result of the operation.
+ *
+ * @param advertisingSet The advertising set.
+ * @param addressType type of address.
+ * @param address advertising set bluetooth address.
+ * @hide
+ */
+ public void onOwnAddressRead(AdvertisingSet advertisingSet, int addressType, String address) {}
}
\ No newline at end of file
diff --git a/core/java/android/bluetooth/le/AdvertisingSetParameters.java b/core/java/android/bluetooth/le/AdvertisingSetParameters.java
index 31d8f48..71c4484 100644
--- a/core/java/android/bluetooth/le/AdvertisingSetParameters.java
+++ b/core/java/android/bluetooth/le/AdvertisingSetParameters.java
@@ -242,7 +242,7 @@
* non-connectable.
* Legacy advertisements can be both connectable and scannable. Non-legacy
* advertisements can be only scannable or only connectable.
- * @param connectable Controls whether the advertisment type will be
+ * @param connectable Controls whether the advertisement type will be
* connectable (true) or non-connectable (false).
*/
public Builder setConnectable(boolean connectable) {
@@ -254,7 +254,7 @@
* Set whether the advertisement type should be scannable.
* Legacy advertisements can be both connectable and scannable. Non-legacy
* advertisements can be only scannable or only connectable.
- * @param scannable Controls whether the advertisment type will be
+ * @param scannable Controls whether the advertisement type will be
* scannable (true) or non-scannable (false).
*/
public Builder setScannable(boolean scannable) {
@@ -386,6 +386,7 @@
/**
* Build the {@link AdvertisingSetParameters} object.
+ * @throws IllegalStateException if invalid combination of parameters is used.
*/
public AdvertisingSetParameters build() {
if (isLegacy) {
@@ -394,22 +395,22 @@
}
if (connectable == true && scannable == false) {
- throw new IllegalArgumentException(
+ throw new IllegalStateException(
"Legacy advertisement can't be connectable and non-scannable");
}
if (includeTxPower) {
- throw new IllegalArgumentException(
+ throw new IllegalStateException(
"Legacy advertising can't include TX power level in header");
}
} else {
if (connectable && scannable) {
- throw new IllegalArgumentException(
+ throw new IllegalStateException(
"Advertising can't be both connectable and scannable");
}
if (isAnonymous && connectable) {
- throw new IllegalArgumentException(
+ throw new IllegalStateException(
"Advertising can't be both connectable and anonymous");
}
}
diff --git a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
index ea3031b..67d56d5 100644
--- a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
+++ b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
@@ -22,7 +22,6 @@
import android.bluetooth.BluetoothUuid;
import android.bluetooth.IBluetoothGatt;
import android.bluetooth.IBluetoothManager;
-import android.bluetooth.le.IAdvertiserCallback;
import android.os.Handler;
import android.os.Looper;
import android.os.ParcelUuid;
@@ -545,6 +544,17 @@
}
@Override
+ public void onOwnAddressRead(int advertiserId, int addressType, String address) {
+ handler.post(new Runnable() {
+ @Override
+ public void run() {
+ AdvertisingSet advertisingSet = mAdvertisingSets.get(advertiserId);
+ callback.onOwnAddressRead(advertisingSet, addressType, address);
+ }
+ });
+ }
+
+ @Override
public void onAdvertisingSetStopped(int advertiserId) {
handler.post(new Runnable() {
@Override
diff --git a/core/java/android/bluetooth/le/IAdvertiserCallback.aidl b/core/java/android/bluetooth/le/IAdvertiserCallback.aidl
deleted file mode 100644
index c58b1df..0000000
--- a/core/java/android/bluetooth/le/IAdvertiserCallback.aidl
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2016 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.bluetooth.le;
-
-import android.bluetooth.le.AdvertiseSettings;
-
-/**
- * Callback definitions for interacting with Advertiser
- * @hide
- */
-oneway interface IAdvertiserCallback {
- void onAdvertiserRegistered(in int status, in int advertiserId);
-
- void onMultiAdvertiseCallback(in int status, boolean isStart,
- in AdvertiseSettings advertiseSettings);
-}
diff --git a/core/java/android/bluetooth/le/IAdvertisingSetCallback.aidl b/core/java/android/bluetooth/le/IAdvertisingSetCallback.aidl
index 2c9f4ba..3628c77 100644
--- a/core/java/android/bluetooth/le/IAdvertisingSetCallback.aidl
+++ b/core/java/android/bluetooth/le/IAdvertisingSetCallback.aidl
@@ -21,6 +21,7 @@
*/
oneway interface IAdvertisingSetCallback {
void onAdvertisingSetStarted(in int advertiserId, in int tx_power, in int status);
+ void onOwnAddressRead(in int advertiserId, in int addressType, in String address);
void onAdvertisingSetStopped(in int advertiserId);
void onAdvertisingEnabled(in int advertiserId, in boolean enable, in int status);
void onAdvertisingDataSet(in int advertiserId, in int status);
diff --git a/core/java/android/bluetooth/le/ScanResult.java b/core/java/android/bluetooth/le/ScanResult.java
index 5b2fa40..e552398 100644
--- a/core/java/android/bluetooth/le/ScanResult.java
+++ b/core/java/android/bluetooth/le/ScanResult.java
@@ -52,6 +52,16 @@
public static final int SID_NOT_PRESENT = 0xFF;
/**
+ * TX power is not present in the packet.
+ */
+ public static final int TX_POWER_NOT_PRESENT = 0x7F;
+
+ /**
+ * Periodic advertising interval is not present in the packet.
+ */
+ public static final int PERIODIC_INTERVAL_NOT_PRESENT = 0x00;
+
+ /**
* Mask for checking whether event type represents legacy advertisement.
*/
private static final int ET_LEGACY_MASK = 0x10;
@@ -265,15 +275,16 @@
/**
* Returns the transmit power in dBm.
- * Valid range is [-127, 126]. A value of 127 indicates that the
- * advertisement did not indicate TX power.
+ * Valid range is [-127, 126]. A value of {@link ScanResult#TX_POWER_NOT_PRESENT}
+ * indicates that the TX power is not present.
*/
public int getTxPower() { return mTxPower; }
/**
* Returns the periodic advertising interval in units of 1.25ms.
- * Valid range is 6 (7.5ms) to 65536 (81918.75ms). A value of 0 means
- * periodic advertising is not used for this scan result.
+ * Valid range is 6 (7.5ms) to 65536 (81918.75ms). A value of
+ * {@link ScanResult#PERIODIC_INTERVAL_NOT_PRESENT} means periodic
+ * advertising interval is not present.
*/
public int getPeriodicAdvertisingInterval() {
return mPeriodicAdvertisingInterval;
diff --git a/core/java/android/companion/BluetoothLEDeviceFilter.java b/core/java/android/companion/BluetoothLeDeviceFilter.java
similarity index 82%
rename from core/java/android/companion/BluetoothLEDeviceFilter.java
rename to core/java/android/companion/BluetoothLeDeviceFilter.java
index e5ea4e9..7fb768c 100644
--- a/core/java/android/companion/BluetoothLEDeviceFilter.java
+++ b/core/java/android/companion/BluetoothLeDeviceFilter.java
@@ -38,6 +38,7 @@
import com.android.internal.util.ObjectUtils;
import com.android.internal.util.Preconditions;
+import java.nio.ByteOrder;
import java.util.Arrays;
import java.util.Objects;
import java.util.regex.Pattern;
@@ -47,10 +48,10 @@
*
* @see ScanFilter
*/
-public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> {
+public final class BluetoothLeDeviceFilter implements DeviceFilter<ScanResult> {
private static final boolean DEBUG = false;
- private static final String LOG_TAG = "BluetoothLEDeviceFilter";
+ private static final String LOG_TAG = "BluetoothLeDeviceFilter";
private static final int RENAME_PREFIX_LENGTH_LIMIT = 10;
@@ -61,15 +62,15 @@
private final String mRenamePrefix;
private final String mRenameSuffix;
private final int mRenameBytesFrom;
- private final int mRenameBytesTo;
+ private final int mRenameBytesLength;
private final int mRenameNameFrom;
- private final int mRenameNameTo;
+ private final int mRenameNameLength;
private final boolean mRenameBytesReverseOrder;
- private BluetoothLEDeviceFilter(Pattern namePattern, ScanFilter scanFilter,
+ private BluetoothLeDeviceFilter(Pattern namePattern, ScanFilter scanFilter,
byte[] rawDataFilter, byte[] rawDataFilterMask, String renamePrefix,
- String renameSuffix, int renameBytesFrom, int renameBytesTo,
- int renameNameFrom, int renameNameTo, boolean renameBytesReverseOrder) {
+ String renameSuffix, int renameBytesFrom, int renameBytesLength,
+ int renameNameFrom, int renameNameLength, boolean renameBytesReverseOrder) {
mNamePattern = namePattern;
mScanFilter = ObjectUtils.firstNotNull(scanFilter, ScanFilter.EMPTY);
mRawDataFilter = rawDataFilter;
@@ -77,9 +78,9 @@
mRenamePrefix = renamePrefix;
mRenameSuffix = renameSuffix;
mRenameBytesFrom = renameBytesFrom;
- mRenameBytesTo = renameBytesTo;
+ mRenameBytesLength = renameBytesLength;
mRenameNameFrom = renameNameFrom;
- mRenameNameTo = renameNameTo;
+ mRenameNameLength = renameNameLength;
mRenameBytesReverseOrder = renameBytesReverseOrder;
}
@@ -125,8 +126,8 @@
}
/** @hide */
- public int getRenameBytesTo() {
- return mRenameBytesTo;
+ public int getRenameBytesLength() {
+ return mRenameBytesLength;
}
/** @hide */
@@ -145,7 +146,7 @@
if (mRenameBytesFrom >= 0) {
final byte[] bytes = sr.getScanRecord().getBytes();
int startInclusive = mRenameBytesFrom;
- int endInclusive = mRenameBytesTo - 1;
+ int endInclusive = mRenameBytesFrom + mRenameBytesLength -1;
int initial = mRenameBytesReverseOrder ? endInclusive : startInclusive;
int step = mRenameBytesReverseOrder ? -1 : 1;
for (int i = initial; startInclusive <= i && i <= endInclusive; i += step) {
@@ -154,7 +155,7 @@
} else {
sb.append(
getDeviceDisplayNameInternal(sr.getDevice())
- .substring(mRenameNameFrom, mRenameNameTo));
+ .substring(mRenameNameFrom, mRenameNameFrom + mRenameNameLength));
}
return sb.append(TextUtils.emptyIfNull(mRenameSuffix)).toString();
}
@@ -186,9 +187,11 @@
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
- BluetoothLEDeviceFilter that = (BluetoothLEDeviceFilter) o;
+ BluetoothLeDeviceFilter that = (BluetoothLeDeviceFilter) o;
return mRenameBytesFrom == that.mRenameBytesFrom &&
- mRenameBytesTo == that.mRenameBytesTo &&
+ mRenameBytesLength == that.mRenameBytesLength &&
+ mRenameNameFrom == that.mRenameNameFrom &&
+ mRenameNameLength == that.mRenameNameLength &&
mRenameBytesReverseOrder == that.mRenameBytesReverseOrder &&
Objects.equals(mNamePattern, that.mNamePattern) &&
Objects.equals(mScanFilter, that.mScanFilter) &&
@@ -201,8 +204,8 @@
@Override
public int hashCode() {
return Objects.hash(mNamePattern, mScanFilter, mRawDataFilter, mRawDataFilterMask,
- mRenamePrefix, mRenameSuffix, mRenameBytesFrom, mRenameBytesTo,
- mRenameBytesReverseOrder);
+ mRenamePrefix, mRenameSuffix, mRenameBytesFrom, mRenameBytesLength,
+ mRenameNameFrom, mRenameNameLength, mRenameBytesReverseOrder);
}
@Override
@@ -214,9 +217,9 @@
dest.writeString(mRenamePrefix);
dest.writeString(mRenameSuffix);
dest.writeInt(mRenameBytesFrom);
- dest.writeInt(mRenameBytesTo);
+ dest.writeInt(mRenameBytesLength);
dest.writeInt(mRenameNameFrom);
- dest.writeInt(mRenameNameTo);
+ dest.writeInt(mRenameNameLength);
dest.writeBoolean(mRenameBytesReverseOrder);
}
@@ -235,17 +238,17 @@
", mRenamePrefix='" + mRenamePrefix + '\'' +
", mRenameSuffix='" + mRenameSuffix + '\'' +
", mRenameBytesFrom=" + mRenameBytesFrom +
- ", mRenameBytesTo=" + mRenameBytesTo +
+ ", mRenameBytesLength=" + mRenameBytesLength +
", mRenameNameFrom=" + mRenameNameFrom +
- ", mRenameNameTo=" + mRenameNameTo +
+ ", mRenameNameLength=" + mRenameNameLength +
", mRenameBytesReverseOrder=" + mRenameBytesReverseOrder +
'}';
}
- public static final Creator<BluetoothLEDeviceFilter> CREATOR
- = new Creator<BluetoothLEDeviceFilter>() {
+ public static final Creator<BluetoothLeDeviceFilter> CREATOR
+ = new Creator<BluetoothLeDeviceFilter>() {
@Override
- public BluetoothLEDeviceFilter createFromParcel(Parcel in) {
+ public BluetoothLeDeviceFilter createFromParcel(Parcel in) {
Builder builder = new Builder()
.setNamePattern(patternFromString(in.readString()))
.setScanFilter(in.readParcelable(null));
@@ -264,7 +267,7 @@
if (renamePrefix != null) {
if (bytesFrom >= 0) {
builder.setRenameFromBytes(renamePrefix, suffix, bytesFrom, bytesTo,
- bytesReverseOrder);
+ bytesReverseOrder ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN);
} else {
builder.setRenameFromName(renamePrefix, suffix, nameFrom, nameTo);
}
@@ -273,8 +276,8 @@
}
@Override
- public BluetoothLEDeviceFilter[] newArray(int size) {
- return new BluetoothLEDeviceFilter[size];
+ public BluetoothLeDeviceFilter[] newArray(int size) {
+ return new BluetoothLeDeviceFilter[size];
}
};
@@ -283,9 +286,9 @@
}
/**
- * Builder for {@link BluetoothLEDeviceFilter}
+ * Builder for {@link BluetoothLeDeviceFilter}
*/
- public static final class Builder extends OneTimeUseBuilder<BluetoothLEDeviceFilter> {
+ public static final class Builder extends OneTimeUseBuilder<BluetoothLeDeviceFilter> {
private ScanFilter mScanFilter;
private Pattern mNamePattern;
private byte[] mRawDataFilter;
@@ -293,9 +296,9 @@
private String mRenamePrefix;
private String mRenameSuffix;
private int mRenameBytesFrom = -1;
- private int mRenameBytesTo;
+ private int mRenameBytesLength;
private int mRenameNameFrom = -1;
- private int mRenameNameTo;
+ private int mRenameNameLength;
private boolean mRenameBytesReverseOrder = false;
/**
@@ -355,19 +358,19 @@
* @param prefix to be displayed before the byte data
* @param suffix to be displayed after the byte data
* @param bytesFrom the start byte index to be displayed (inclusive)
- * @param bytesTo the end byte index to be displayed (exclusive)
- * @param bytesReverseOrder if true, the byte order of the provided range will be flipped
- * when displaying
+ * @param bytesLength the number of bytes to be displayed from the given index
+ * @param byteOrder whether the given range of bytes is big endian (will be displayed
+ * in same order) or little endian (will be flipped before displaying)
* @return self for chaining
*/
@NonNull
public Builder setRenameFromBytes(@NonNull String prefix, @NonNull String suffix,
- int bytesFrom, int bytesTo, boolean bytesReverseOrder) {
+ int bytesFrom, int bytesLength, ByteOrder byteOrder) {
checkRenameNotSet();
- checkRangeNotEmpty(bytesFrom, bytesTo);
+ checkRangeNotEmpty(bytesLength);
mRenameBytesFrom = bytesFrom;
- mRenameBytesTo = bytesTo;
- mRenameBytesReverseOrder = bytesReverseOrder;
+ mRenameBytesLength = bytesLength;
+ mRenameBytesReverseOrder = byteOrder == ByteOrder.LITTLE_ENDIAN;
return setRename(prefix, suffix);
}
@@ -383,16 +386,16 @@
* @param prefix to be displayed before the byte data
* @param suffix to be displayed after the byte data
* @param nameFrom the start name character index to be displayed (inclusive)
- * @param nameTo the end name character index to be displayed (exclusive)
+ * @param nameLength the number of characters to be displayed from the given index
* @return self for chaining
*/
@NonNull
public Builder setRenameFromName(@NonNull String prefix, @NonNull String suffix,
- int nameFrom, int nameTo) {
+ int nameFrom, int nameLength) {
checkRenameNotSet();
- checkRangeNotEmpty(nameFrom, nameTo);
+ checkRangeNotEmpty(nameLength);
mRenameNameFrom = nameFrom;
- mRenameNameTo = nameTo;
+ mRenameNameLength = nameLength;
mRenameBytesReverseOrder = false;
return setRename(prefix, suffix);
}
@@ -401,8 +404,8 @@
checkState(mRenamePrefix == null, "Renaming rule can only be set once");
}
- private void checkRangeNotEmpty(int bytesFrom, int bytesTo) {
- checkArgument(bytesFrom < bytesTo, "Range must be non-empty");
+ private void checkRangeNotEmpty(int length) {
+ checkArgument(length > 0, "Range must be non-empty");
}
@NonNull
@@ -418,13 +421,13 @@
/** @inheritDoc */
@Override
@NonNull
- public BluetoothLEDeviceFilter build() {
+ public BluetoothLeDeviceFilter build() {
markUsed();
- return new BluetoothLEDeviceFilter(mNamePattern, mScanFilter,
+ return new BluetoothLeDeviceFilter(mNamePattern, mScanFilter,
mRawDataFilter, mRawDataFilterMask,
mRenamePrefix, mRenameSuffix,
- mRenameBytesFrom, mRenameBytesTo,
- mRenameNameFrom, mRenameNameTo,
+ mRenameBytesFrom, mRenameBytesLength,
+ mRenameNameFrom, mRenameNameLength,
mRenameBytesReverseOrder);
}
}
diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java
index e50b2a9..fac9e13 100644
--- a/core/java/android/companion/CompanionDeviceManager.java
+++ b/core/java/android/companion/CompanionDeviceManager.java
@@ -118,6 +118,9 @@
* association is no longer relevant to avoid unnecessary battery and/or data drain resulting
* from special privileges that the association provides</p>
*
+ * <p>Calling this API requires a uses-feature
+ * {@link PackageManager#FEATURE_COMPANION_DEVICE_SETUP} declaration in the manifest</p>
+ *
* @param request specific details about this request
* @param callback will be called once there's at least one device found for user to choose from
* @param handler A handler to control which thread the callback will be delivered on, or null,
@@ -160,6 +163,9 @@
}
/**
+ * <p>Calling this API requires a uses-feature
+ * {@link PackageManager#FEATURE_COMPANION_DEVICE_SETUP} declaration in the manifest</p>
+ *
* @return a list of MAC addresses of devices that have been previously associated with the
* current app. You can use these with {@link #disassociate}
*/
@@ -184,6 +190,9 @@
* association is no longer relevant to avoid unnecessary battery and/or data drain resulting
* from special privileges that the association provides</p>
*
+ * <p>Calling this API requires a uses-feature
+ * {@link PackageManager#FEATURE_COMPANION_DEVICE_SETUP} declaration in the manifest</p>
+ *
* @param deviceMacAddress the MAC address of device to disassociate from this app
*/
public void disassociate(@NonNull String deviceMacAddress) {
@@ -206,6 +215,9 @@
* are allowed.
*
* Your app must have an association with a device before calling this API
+ *
+ * <p>Calling this API requires a uses-feature
+ * {@link PackageManager#FEATURE_COMPANION_DEVICE_SETUP} declaration in the manifest</p>
*/
public void requestNotificationAccess(ComponentName component) {
if (!checkFeaturePresent()) {
@@ -226,6 +238,9 @@
*
* Your app must have an association with a device before calling this API
*
+ * <p>Calling this API requires a uses-feature
+ * {@link PackageManager#FEATURE_COMPANION_DEVICE_SETUP} declaration in the manifest</p>
+ *
* @param component the name of the component
* @return whether the given component has the notification listener permission
*/
diff --git a/core/java/android/content/ClipData.java b/core/java/android/content/ClipData.java
index 6703bd4..5bc1f18 100644
--- a/core/java/android/content/ClipData.java
+++ b/core/java/android/content/ClipData.java
@@ -846,7 +846,7 @@
* Add a new Item to the overall ClipData container.
* <p> This method will <em>not</em> update the list of available MIME types in the
* {@link ClipDescription}. It should be used only when adding items which do not add new
- * MIME types to this clip. If this is not the case, use {@link #addItem(Item, ContentResolver)}
+ * MIME types to this clip. If this is not the case, use {@link #addItem(ContentResolver, Item)}
* or call {@link #ClipData(CharSequence, String[], Item)} with a complete list of MIME types.
* @param item Item to be added.
*/
@@ -857,15 +857,21 @@
mItems.add(item);
}
+ /** @removed use #addItem(ContentResolver, Item) instead */
+ @Deprecated
+ public void addItem(Item item, ContentResolver resolver) {
+ addItem(resolver, item);
+ }
+
/**
* Add a new Item to the overall ClipData container.
* <p> Unlike {@link #addItem(Item)}, this method will update the list of available MIME types
* in the {@link ClipDescription}.
- * @param item Item to be added.
* @param resolver ContentResolver used to get information about the URI possibly contained in
* the item.
+ * @param item Item to be added.
*/
- public void addItem(Item item, ContentResolver resolver) {
+ public void addItem(ContentResolver resolver, Item item) {
addItem(item);
if (item.getHtmlText() != null) {
diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java
index d75c2ee0..9d46da1 100644
--- a/core/java/android/content/ContentProvider.java
+++ b/core/java/android/content/ContentProvider.java
@@ -46,6 +46,7 @@
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.Log;
+import android.util.MathUtils;
import java.io.File;
import java.io.FileDescriptor;
@@ -1066,14 +1067,65 @@
* <li>{@link ContentResolver#QUERY_ARG_SQL_SELECTION_ARGS}
* <li>{@link ContentResolver#QUERY_ARG_SQL_SORT_ORDER}
*
+ * <p>This method can be called from multiple threads, as described in
+ * <a href="{@docRoot}guide/topics/fundamentals/processes-and-threads.html#Threads">Processes
+ * and Threads</a>.
+ *
+ * <p>
+ * Example client call:<p>
+ * <pre>// Request 20 records starting at row index 30.
+ Bundle queryArgs = new Bundle();
+ queryArgs.putInt(ContentResolver.QUERY_ARG_OFFSET, 30);
+ queryArgs.putInt(ContentResolver.QUERY_ARG_LIMIT, 20);
+
+ Cursor cursor = getContentResolver().query(
+ contentUri, // Content Uri is specific to individual content providers.
+ projection, // String[] describing which columns to return.
+ queryArgs, // Query arguments.
+ null); // Cancellation signal.</pre>
+ *
+ * Example implementation:<p>
+ * <pre>
+
+ int recordsetSize = 0x1000; // Actual value is implementation specific.
+ queryArgs = queryArgs != null ? queryArgs : Bundle.EMPTY; // ensure queryArgs is non-null
+
+ int offset = queryArgs.getInt(ContentResolver.QUERY_ARG_OFFSET, 0);
+ int limit = queryArgs.getInt(ContentResolver.QUERY_ARG_LIMIT, Integer.MIN_VALUE);
+
+ MatrixCursor c = new MatrixCursor(PROJECTION, limit);
+
+ // Calculate the number of items to include in the cursor.
+ int numItems = MathUtils.constrain(recordsetSize - offset, 0, limit);
+
+ // Build the paged result set....
+ for (int i = offset; i < offset + numItems; i++) {
+ // populate row from your data.
+ }
+
+ Bundle extras = new Bundle();
+ c.setExtras(extras);
+
+ // Any QUERY_ARG_* key may be included if honored.
+ // In an actual implementation, include only keys that are both present in queryArgs
+ // and reflected in the Cursor output. For example, if QUERY_ARG_OFFSET were included
+ // in queryArgs, but was ignored because it contained an invalid value (like –273),
+ // then QUERY_ARG_OFFSET should be omitted.
+ extras.putStringArray(ContentResolver.EXTRA_HONORED_ARGS, new String[] {
+ ContentResolver.QUERY_ARG_OFFSET,
+ ContentResolver.QUERY_ARG_LIMIT
+ });
+
+ extras.putInt(ContentResolver.EXTRA_TOTAL_COUNT, recordsetSize);
+
+ cursor.setNotificationUri(getContext().getContentResolver(), uri);
+
+ return cursor;</pre>
+ * <p>
* @see #query(Uri, String[], String, String[], String, CancellationSignal) for
* implementation details.
*
* @param uri The URI to query. This will be the full URI sent by the client.
- * TODO: Me wonders about this use case, and how we adapt it.
- * If the client is requesting a specific record, the URI will end
- * in a record number that the implementation should parse and add
- * to a WHERE or HAVING clause, specifying that _id value.
* @param projection The list of columns to put into the cursor.
* If {@code null} provide a default set of columns.
* @param queryArgs A Bundle containing all additional information necessary for the query.
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 98ae132..309827c 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -36,7 +36,6 @@
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.net.Uri;
-import android.os.Build;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.DeadObjectException;
@@ -214,10 +213,12 @@
*
* <p><b>Apps targeting {@link android.os.Build.VERSION_CODES#O} or higher are strongly
* encourage to use structured query arguments in lieu of opaque SQL query clauses.</b>
- * See: {@link #QUERY_ARG_SORT_COLUMNS}, {@link #QUERY_ARG_SORT_DIRECTION}, and
- * {@link #QUERY_ARG_SORT_COLLATION}.
+ *
+ * @see #QUERY_ARG_SORT_COLUMNS
+ * @see #QUERY_ARG_SORT_DIRECTION
+ * @see #QUERY_ARG_SORT_COLLATION
*/
- public static final String QUERY_ARG_SQL_SELECTION = "android:query-sql-selection";
+ public static final String QUERY_ARG_SQL_SELECTION = "android:query-arg-sql-selection";
/**
* Key for SQL selection string arguments list.
@@ -229,10 +230,13 @@
*
* <p><b>Apps targeting {@link android.os.Build.VERSION_CODES#O} or higher are strongly
* encourage to use structured query arguments in lieu of opaque SQL query clauses.</b>
- * See: {@link #QUERY_ARG_SORT_COLUMNS}, {@link #QUERY_ARG_SORT_DIRECTION}, and
- * {@link #QUERY_ARG_SORT_COLLATION}.
+ *
+ * @see #QUERY_ARG_SORT_COLUMNS
+ * @see #QUERY_ARG_SORT_DIRECTION
+ * @see #QUERY_ARG_SORT_COLLATION
*/
- public static final String QUERY_ARG_SQL_SELECTION_ARGS = "android:query-sql-selection-args";
+ public static final String QUERY_ARG_SQL_SELECTION_ARGS =
+ "android:query-arg-sql-selection-args";
/**
* Key for an SQL style sort string that may be present in the query Bundle argument
@@ -241,10 +245,12 @@
*
* <p><b>Apps targeting {@link android.os.Build.VERSION_CODES#O} or higher are strongly
* encourage to use structured query arguments in lieu of opaque SQL query clauses.</b>
- * See: {@link #QUERY_ARG_SORT_COLUMNS}, {@link #QUERY_ARG_SORT_DIRECTION}, and
- * {@link #QUERY_ARG_SORT_COLLATION}.
+ *
+ * @see #QUERY_ARG_SORT_COLUMNS
+ * @see #QUERY_ARG_SORT_DIRECTION
+ * @see #QUERY_ARG_SORT_COLLATION
*/
- public static final String QUERY_ARG_SQL_SORT_ORDER = "android:query-sql-sort-order";
+ public static final String QUERY_ARG_SQL_SORT_ORDER = "android:query-arg-sql-sort-order";
/**
* Specifies the list of columns against which to sort results. When first column values
@@ -255,16 +261,17 @@
*
* <p>Apps targeting {@link android.os.Build.VERSION_CODES#O} or higher:
*
- * <li>When supplying data using a ContentProvider, it is strongly recommended that
- * an entry be included in the {@link Cursor} extras {@link Bundle} under this same key
- * (@link QUERY_ARG_SORT_COLUMNS}) to indicate which column sorting was applied
- * to the recordset, if any.
+ * <li>{@link ContentProvider} implementations: When preparing data in
+ * {@link ContentProvider#query(Uri, String[], Bundle, CancellationSignal)}, if sort columns
+ * is reflected in the returned Cursor, it is strongly recommended that
+ * {@link #QUERY_ARG_SORT_COLUMNS} then be included in the array of honored arguments
+ * reflected in {@link Cursor} extras {@link Bundle} under {@link #EXTRA_HONORED_ARGS}.
*
* <li>When querying a provider, where no QUERY_ARG_SQL* otherwise exists in the
* arguments {@link Bundle}, the Content framework will attempt to synthesize
* an QUERY_ARG_SQL* argument using the corresponding QUERY_ARG_SORT* values.
*/
- public static final String QUERY_ARG_SORT_COLUMNS = "android:query-sort-columns";
+ public static final String QUERY_ARG_SORT_COLUMNS = "android:query-arg-sort-columns";
/**
* Specifies desired sort order. When unspecified a provider may provide a default
@@ -272,50 +279,58 @@
*
* <p>Apps targeting {@link android.os.Build.VERSION_CODES#O} or higher:
*
- * <li>When supplying data using a ContentProvider, it is strongly recommended that
- * an entry be included in the {@link Cursor} extras {@link Bundle} under this same key
- * (@link QUERY_ARG_SORT_DIRECTION}) to indicate that sort direction was applied
- * to the recordset.
+ * <li>{@link ContentProvider} implementations: When preparing data in
+ * {@link ContentProvider#query(Uri, String[], Bundle, CancellationSignal)}, if sort direction
+ * is reflected in the returned Cursor, it is strongly recommended that
+ * {@link #QUERY_ARG_SORT_DIRECTION} then be included in the array of honored arguments
+ * reflected in {@link Cursor} extras {@link Bundle} under {@link #EXTRA_HONORED_ARGS}.
*
* <li>When querying a provider, where no QUERY_ARG_SQL* otherwise exists in the
* arguments {@link Bundle}, the Content framework will attempt to synthesize
- * an QUERY_ARG_SQL* argument using the corresponding QUERY_ARG_SORT* values.
+ * a QUERY_ARG_SQL* argument using the corresponding QUERY_ARG_SORT* values.
*
* @see #QUERY_SORT_DIRECTION_ASCENDING
* @see #QUERY_SORT_DIRECTION_DESCENDING
*/
- public static final String QUERY_ARG_SORT_DIRECTION = "android:query-sort-direction";
+ public static final String QUERY_ARG_SORT_DIRECTION = "android:query-arg-sort-direction";
/**
- * Allows client to specify a hint to the provider as to which collation
+ * Allows client to specify a hint to the provider declaring which collation
* to use when sorting text values.
*
- * <p>Providers may provide their own collators. When selecting a custom collator
- * the value will be determined by the Provider.
+ * <p>Providers may support custom collators. When specifying a custom collator
+ * the value is determined by the Provider.
*
- * <li>When supplying data using a ContentProvider, it is strongly recommended that
- * an entry be included in the {@link Cursor} extras {@link Bundle} under this same key
- * (@link QUERY_ARG_SORT_COLLATION}) to indicate that sort collation was applied
- * to the recordset.
+ * <li>{@link ContentProvider} implementations: When preparing data in
+ * {@link ContentProvider#query(Uri, String[], Bundle, CancellationSignal)}, if sort collation
+ * is reflected in the returned Cursor, it is strongly recommended that
+ * {@link #QUERY_ARG_SORT_COLLATION} then be included in the array of honored arguments
+ * reflected in {@link Cursor} extras {@link Bundle} under {@link #EXTRA_HONORED_ARGS}.
*
- * <p>When querying a provider, where no QUERY_ARG_SQL* otherwise exists in the
+ * <li>When querying a provider, where no QUERY_ARG_SQL* otherwise exists in the
* arguments {@link Bundle}, the Content framework will attempt to synthesize
- * an QUERY_ARG_SQL* argument using the corresponding QUERY_ARG_SORT* values.
+ * a QUERY_ARG_SQL* argument using the corresponding QUERY_ARG_SORT* values.
*
- * @see java.text.Collator#PRIMARY, java.text.Collator#SECONDARY,
- * java.text.Collator#TERTIARY, and java.text.Collator#IDENTICAL.
+ * @see java.text.Collator#PRIMARY
+ * @see java.text.Collator#SECONDARY
+ * @see java.text.Collator#TERTIARY
+ * @see java.text.Collator#IDENTICAL
*/
- public static final String QUERY_ARG_SORT_COLLATION = "android:query-sort-collation";
+ public static final String QUERY_ARG_SORT_COLLATION = "android:query-arg-sort-collation";
/**
- * Allows provider to report back to client which keys were honored.
+ * Allows provider to report back to client which query keys are honored in a Cursor.
*
- * Key identifying a {@code String[]} containing all QUERY_ARG_SORT* arguments
+ * <p>Key identifying a {@code String[]} containing all QUERY_ARG_SORT* arguments
* honored by the provider. Include this in {@link Cursor} extras {@link Bundle}
* when any QUERY_ARG_SORT* value was honored during the preparation of the
* results {@link Cursor}.
*
- * @see #QUERY_ARG_SORT_COLUMNS, #QUERY_ARG_SORT_DIRECTION, #QUERY_ARG_SORT_COLLATION.
+ * <p>If present, ALL honored arguments are enumerated in this extra’s payload.
+ *
+ * @see #QUERY_ARG_SORT_COLUMNS
+ * @see #QUERY_ARG_SORT_DIRECTION
+ * @see #QUERY_ARG_SORT_COLLATION
*/
public static final String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
@@ -343,41 +358,27 @@
public @interface QueryCollator {}
/**
- * Specifies the offset from which to load a recordset. Records prior to this
- * position should be omitted from results.
- *
- * <p>Providers are recommended to create a content notification Uri
- * that encapsulates QUERY_ARG_OFFSET and QUERY_ARG_LIMITS values reflected
- * in the recordset. This will allow a provider to notify clients of changes
- * to an individual recordset.
+ * Specifies the offset row index within a Cursor.
*/
- public static final String QUERY_ARG_OFFSET = "android:query-page-offset";
+ public static final String QUERY_ARG_OFFSET = "android:query-arg-offset";
/**
- * Specifies the max number of records to include in a recordset with respect
- * to the starting offset, which by default is 0. Records beyond starting offset + limit
- * should be omitted from results.
- *
- * <p>Providers are recommended to create a content notification Uri
- * that encapsulates QUERY_ARG_OFFSET and QUERY_ARG_LIMITS values reflected
- * in the recordset. This will allow a provider to notify clients of changes
- * to an individual recordset.
+ * Specifies the max number of rows to include in a Cursor.
*/
- public static final String QUERY_ARG_LIMIT = "android:query-page-limit";
+ public static final String QUERY_ARG_LIMIT = "android:query-arg-limit";
/**
- * Added to {@link Cursor} extras {@link Bundle} to indicate total size of
- * recordset when paging is active. Providers must include this when
+ * Added to {@link Cursor} extras {@link Bundle} to indicate total row count of
+ * recordset when paging is supported. Providers must include this when
* implementing paging support.
*
- * <p>When full size of the recordset is unknown a provider may return -1
- * to indicate this.
+ * <p>A provider may return -1 that row count of the recordset is unknown.
*
* <p>Providers having returned -1 in a previous query are recommended to
* send content change notification once (if) full recordset size becomes
* known.
*/
- public static final String EXTRA_TOTAL_SIZE = "android.content.extra.TOTAL_SIZE";
+ public static final String EXTRA_TOTAL_COUNT = "android.content.extra.TOTAL_COUNT";
/**
* This is the Android platform's base MIME type for a content: URI
@@ -514,12 +515,7 @@
public ContentResolver(Context context) {
mContext = context != null ? context : ActivityThread.currentApplication();
mPackageName = mContext.getOpPackageName();
- if (android.os.Process.myUid() == android.os.Process.PHONE_UID) {
- // STOPSHIP: Telephony needs to fix b/35792675
- mTargetSdkVersion = Build.VERSION_CODES.N_MR1;
- } else {
- mTargetSdkVersion = mContext.getApplicationInfo().targetSdkVersion;
- }
+ mTargetSdkVersion = mContext.getApplicationInfo().targetSdkVersion;
}
/** @hide */
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 42ef871..bf7af20 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -323,6 +323,12 @@
public static final int BIND_ADJUST_WITH_ACTIVITY = 0x0080;
/**
+ * @hide Flag for {@link #bindService}: like {@link #BIND_NOT_FOREGROUND}, but puts it
+ * up in to the important background state (instead of transient).
+ */
+ public static final int BIND_IMPORTANT_BACKGROUND = 0x00800000;
+
+ /**
* @hide Flag for {@link #bindService}: allows application hosting service to manage whitelists
* such as temporary allowing a {@code PendingIntent} to bypass Power Save mode.
*/
@@ -2967,9 +2973,6 @@
* <dt> {@link #CONNECTIVITY_SERVICE} ("connection")
* <dd> A {@link android.net.ConnectivityManager ConnectivityManager} for
* handling management of network connections.
- * <dt> {@link #IPSEC_SERVICE} ("ipsec")
- * <dd> A {@link android.net.IpSecManager IpSecManager} for managing IPSec on
- * sockets and networks.
* <dt> {@link #WIFI_SERVICE} ("wifi")
* <dd> A {@link android.net.wifi.WifiManager WifiManager} for management of Wi-Fi
* connectivity. On releases before NYC, it should only be obtained from an application
@@ -3314,6 +3317,7 @@
* {@link android.net.IpSecManager} for encrypting Sockets or Networks with
* IPSec.
*
+ * @hide
* @see #getSystemService
*/
public static final String IPSEC_SERVICE = "ipsec";
@@ -3769,7 +3773,7 @@
* @see #getSystemService
* @see android.companion.CompanionDeviceManager
*/
- public static final String COMPANION_DEVICE_SERVICE = "companion_device";
+ public static final String COMPANION_DEVICE_SERVICE = "companiondevice";
/**
* Use with {@link #getSystemService} to retrieve a
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 9c87ff2..1d879e9 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -1399,6 +1399,7 @@
* <p>Input: nothing
* <p>Output: nothing
*/
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_FACTORY_TEST = "android.intent.action.FACTORY_TEST";
/**
@@ -1709,19 +1710,6 @@
public static final String ACTION_UNINSTALL_PACKAGE = "android.intent.action.UNINSTALL_PACKAGE";
/**
- * Activity Action: Launch application uninstaller.
- * <p>
- * Input: The data must be a package: URI whose scheme specific part is
- * the package name of the current installed package to be uninstalled.
- * You can optionally supply {@link #EXTRA_RETURN_RESULT}.
- * <p>
- * Output: Nothing.
- * </p>
- */
- @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
- public static final String ACTION_CLEAR_PACKAGE = "android.intent.action.CLEAR_PACKAGE";
-
- /**
* Specify whether the package should be uninstalled for all users.
* @hide because these should not be part of normal application flow.
*/
@@ -1839,6 +1827,14 @@
public static final String EXTRA_SPLIT_NAME = "android.intent.extra.SPLIT_NAME";
/**
+ * Intent extra: A {@link ComponentName} value.
+ * <p>
+ * Type: String
+ * </p>
+ */
+ public static final String EXTRA_COMPONENT_NAME = "android.intent.extra.COMPONENT_NAME";
+
+ /**
* Intent extra: An extra for specifying whether a result is needed.
* <p>
* Type: boolean
@@ -2061,6 +2057,7 @@
* temporary system dialog to dismiss. Some examples of temporary system
* dialogs are the notification window-shade and the recent tasks dialog.
*/
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_CLOSE_SYSTEM_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS";
/**
* Broadcast Action: Trigger the download and eventual installation
@@ -2590,6 +2587,7 @@
* @deprecated replaced by android.os.storage.StorageEventListener
*/
@Deprecated
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_UMS_CONNECTED = "android.intent.action.UMS_CONNECTED";
/**
@@ -2600,6 +2598,7 @@
* @deprecated replaced by android.os.storage.StorageEventListener
*/
@Deprecated
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_UMS_DISCONNECTED = "android.intent.action.UMS_DISCONNECTED";
/**
@@ -3224,6 +3223,7 @@
* caused the broadcast.
* @hide
*/
+ @SystemApi
public static final String ACTION_GLOBAL_BUTTON = "android.intent.action.GLOBAL_BUTTON";
/**
@@ -3385,32 +3385,6 @@
ACTION_DYNAMIC_SENSOR_CHANGED = "android.intent.action.DYNAMIC_SENSOR_CHANGED";
/**
- * Broadcast Action: The default subscription has changed. This has the following
- * extra values:</p>
- * The {@link #EXTRA_SUBSCRIPTION_INDEX} extra indicates the current default subscription index
- */
- @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
- public static final String ACTION_DEFAULT_SUBSCRIPTION_CHANGED
- = "android.intent.action.ACTION_DEFAULT_SUBSCRIPTION_CHANGED";
-
- /**
- * Broadcast Action: The default sms subscription has changed. This has the following
- * extra values:</p>
- * {@link #EXTRA_SUBSCRIPTION_INDEX} extra indicates the current default sms
- * subscription index
- */
- @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
- public static final String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED
- = "android.intent.action.ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED";
-
- /**
- * Integer extra used with {@link #ACTION_DEFAULT_SUBSCRIPTION_CHANGED} and
- * {@link #ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED} to indicate the subscription
- * which has changed.
- */
- public static final String EXTRA_SUBSCRIPTION_INDEX = "android.intent.extra.SUBSCRIPTION_INDEX";
-
- /**
* Deprecated - use ACTION_FACTORY_RESET instead.
* @hide
*/
@@ -4307,9 +4281,10 @@
* <p>Annotations should describe the major components or topics of the content. It is up to
* apps initiating {@link #ACTION_CHOOSER} to learn and add annotations. Annotations should be
* learned in advance, e.g., when creating or saving content, to avoid increasing latency to
- * start {@link #ACTION_CHOOSER}. Performance on customized annotations can suffer, if they are
- * rarely used for {@link #ACTION_CHOOSER} in the past 14 days. Therefore, it is recommended to
- * use the following annotations when applicable.</p>
+ * start {@link #ACTION_CHOOSER}. Names of customized annotations should not contain the colon
+ * character. Performance on customized annotations can suffer, if they are rarely used for
+ * {@link #ACTION_CHOOSER} in the past 14 days. Therefore, it is recommended to use the
+ * following annotations when applicable.</p>
* <ul>
* <li>"product" represents that the topic of the content is mainly about products, e.g.,
* health & beauty, and office supplies.</li>
@@ -4417,6 +4392,21 @@
public static final String EXTRA_VERSION_CODE = "android.intent.extra.VERSION_CODE";
/**
+ * The app that triggered the ephemeral installation.
+ * @hide
+ */
+ public static final String EXTRA_CALLING_PACKAGE
+ = "android.intent.extra.CALLING_PACKAGE";
+
+ /**
+ * Optional calling app provided bundle containing additional launch information the
+ * installer may use.
+ * @hide
+ */
+ public static final String EXTRA_VERIFICATION_BUNDLE
+ = "android.intent.extra.VERIFICATION_BUNDLE";
+
+ /**
* 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/IntentFilter.java b/core/java/android/content/IntentFilter.java
index d64f018..c9bce53 100644
--- a/core/java/android/content/IntentFilter.java
+++ b/core/java/android/content/IntentFilter.java
@@ -16,6 +16,7 @@
package android.content;
+import android.annotation.IntDef;
import android.annotation.SystemApi;
import android.net.Uri;
import android.os.Parcel;
@@ -33,6 +34,8 @@
import org.xmlpull.v1.XmlSerializer;
import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Set;
@@ -283,9 +286,22 @@
private static final int STATE_VERIFIED = 0x00001000;
private int mVerifyState;
-
+ /** @hide */
+ public static final int VISIBILITY_NONE = 0;
+ /** @hide */
+ public static final int VISIBILITY_EXPLICIT = 1;
+ /** @hide */
+ public static final int VISIBILITY_IMPLICIT = 2;
+ /** @hide */
+ @IntDef(prefix = { "VISIBILITY_" }, value = {
+ VISIBILITY_NONE,
+ VISIBILITY_EXPLICIT,
+ VISIBILITY_IMPLICIT,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface InstantAppVisibility {}
/** Whether or not the intent filter is visible to instant apps. */
- private boolean mVisibleToInstantApp;
+ private @InstantAppVisibility int mInstantAppVisibility;
// These functions are the start of more optimized code for managing
// the string sets... not yet implemented.
@@ -452,7 +468,7 @@
}
mHasPartialTypes = o.mHasPartialTypes;
mVerifyState = o.mVerifyState;
- mVisibleToInstantApp = o.mVisibleToInstantApp;
+ mInstantAppVisibility = o.mInstantAppVisibility;
}
/**
@@ -655,12 +671,24 @@
}
/** @hide */
- public void setVisibleToInstantApp(boolean visibleToInstantApp) {
- mVisibleToInstantApp = visibleToInstantApp;
+ public void setVisibilityToInstantApp(@InstantAppVisibility int visibility) {
+ mInstantAppVisibility = visibility;
+ }
+ /** @hide */
+ public @InstantAppVisibility int getVisibilityToInstantApp() {
+ return mInstantAppVisibility;
}
/** @hide */
public boolean isVisibleToInstantApp() {
- return mVisibleToInstantApp;
+ return mInstantAppVisibility != VISIBILITY_NONE;
+ }
+ /** @hide */
+ public boolean isExplicitlyVisibleToInstantApp() {
+ return mInstantAppVisibility == VISIBILITY_EXPLICIT;
+ }
+ /** @hide */
+ public boolean isImplicitlyVisibleToInstantApp() {
+ return mInstantAppVisibility == VISIBILITY_IMPLICIT;
}
/**
@@ -1859,7 +1887,7 @@
dest.writeInt(mPriority);
dest.writeInt(mHasPartialTypes ? 1 : 0);
dest.writeInt(getAutoVerify() ? 1 : 0);
- dest.writeInt(isVisibleToInstantApp() ? 1 : 0);
+ dest.writeInt(mInstantAppVisibility);
}
/**
@@ -1928,7 +1956,7 @@
mPriority = source.readInt();
mHasPartialTypes = source.readInt() > 0;
setAutoVerify(source.readInt() > 0);
- setVisibleToInstantApp(source.readInt() > 0);
+ setVisibilityToInstantApp(source.readInt());
}
private final boolean findMimeType(String type) {
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index b01e6a1..0be0885 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -17,6 +17,7 @@
package android.content.pm;
import android.annotation.IntDef;
+import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Configuration.NativeConfig;
import android.os.Parcel;
@@ -412,17 +413,33 @@
public static final int FLAG_ALWAYS_FOCUSABLE = 0x40000;
/**
- * Bit in {@link #flags} indicating if the activity is visible to ephemeral applications.
+ * Bit in {@link #flags} indicating if the activity is visible to instant
+ * applications. The activity is visible if it's either implicitly or
+ * explicitly exposed.
* @hide
*/
- public static final int FLAG_VISIBLE_TO_EPHEMERAL = 0x100000;
+ public static final int FLAG_VISIBLE_TO_INSTANT_APP = 0x100000;
+
+ /**
+ * Bit in {@link #flags} indicating if the activity is implicitly visible
+ * to instant applications. Implicitly visible activities are those that
+ * implement certain intent-filters:
+ * <ul>
+ * <li>action {@link Intent#CATEGORY_BROWSABLE}</li>
+ * <li>action {@link Intent#ACTION_SEND}</li>
+ * <li>action {@link Intent#ACTION_SENDTO}</li>
+ * <li>action {@link Intent#ACTION_SEND_MULTIPLE}</li>
+ * </ul>
+ * @hide
+ */
+ public static final int FLAG_IMPLICITLY_VISIBLE_TO_INSTANT_APP = 0x200000;
/**
* Bit in {@link #flags} indicating if the activity supports picture-in-picture mode.
* See {@link android.R.attr#supportsPictureInPicture}.
* @hide
*/
- public static final int FLAG_SUPPORTS_PICTURE_IN_PICTURE = 0x200000;
+ public static final int FLAG_SUPPORTS_PICTURE_IN_PICTURE = 0x400000;
/**
* @hide Bit in {@link #flags}: If set, this component will only be seen
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 6c5d26a..06f7916 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -1205,7 +1205,8 @@
dest.writeInt(largestWidthLimitDp);
if (storageUuid != null) {
dest.writeInt(1);
- dest.writeUuid(storageUuid);
+ dest.writeLong(storageUuid.getMostSignificantBits());
+ dest.writeLong(storageUuid.getLeastSignificantBits());
} else {
dest.writeInt(0);
}
@@ -1271,7 +1272,7 @@
compatibleWidthLimitDp = source.readInt();
largestWidthLimitDp = source.readInt();
if (source.readInt() != 0) {
- storageUuid = source.readUuid();
+ storageUuid = new UUID(source.readLong(), source.readLong());
volumeUuid = StorageManager.convert(storageUuid);
}
scanSourceDir = source.readString();
diff --git a/core/java/android/content/pm/InstantAppRequest.java b/core/java/android/content/pm/InstantAppRequest.java
index b45169d..27d2828 100644
--- a/core/java/android/content/pm/InstantAppRequest.java
+++ b/core/java/android/content/pm/InstantAppRequest.java
@@ -17,6 +17,7 @@
package android.content.pm;
import android.content.Intent;
+import android.os.Bundle;
/**
* Information needed to make an instant application resolution request.
@@ -33,13 +34,18 @@
public final String callingPackage;
/** ID of the user requesting the instant application */
public final int userId;
+ /**
+ * Optional extra bundle provided by the source application to the installer for additional
+ * verification. */
+ public final Bundle verificationBundle;
public InstantAppRequest(AuxiliaryResolveInfo responseObj, Intent origIntent,
- String resolvedType, String callingPackage, int userId) {
+ String resolvedType, String callingPackage, int userId, Bundle verificationBundle) {
this.responseObj = responseObj;
this.origIntent = origIntent;
this.resolvedType = resolvedType;
this.callingPackage = callingPackage;
this.userId = userId;
+ this.verificationBundle = verificationBundle;
}
-}
\ No newline at end of file
+}
diff --git a/core/java/android/content/pm/InstrumentationInfo.java b/core/java/android/content/pm/InstrumentationInfo.java
index f6f1be6..3faa951 100644
--- a/core/java/android/content/pm/InstrumentationInfo.java
+++ b/core/java/android/content/pm/InstrumentationInfo.java
@@ -19,7 +19,6 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
-import android.util.SparseIntArray;
/**
* Information you can retrieve about a particular piece of test
@@ -38,7 +37,7 @@
* runs in the main process of the targetPackage. Can either be a comma-separated list
* of process names or '*' for any process that launches to run targetPackage code.
*/
- public String targetProcess;
+ public String targetProcesses;
/**
* Full path to the base APK for this application.
@@ -122,7 +121,7 @@
public InstrumentationInfo(InstrumentationInfo orig) {
super(orig);
targetPackage = orig.targetPackage;
- targetProcess = orig.targetProcess;
+ targetProcesses = orig.targetProcesses;
sourceDir = orig.sourceDir;
publicSourceDir = orig.publicSourceDir;
splitNames = orig.splitNames;
@@ -151,7 +150,7 @@
public void writeToParcel(Parcel dest, int parcelableFlags) {
super.writeToParcel(dest, parcelableFlags);
dest.writeString(targetPackage);
- dest.writeString(targetProcess);
+ dest.writeString(targetProcesses);
dest.writeString(sourceDir);
dest.writeString(publicSourceDir);
dest.writeStringArray(splitNames);
@@ -181,7 +180,7 @@
private InstrumentationInfo(Parcel source) {
super(source);
targetPackage = source.readString();
- targetProcess = source.readString();
+ targetProcesses = source.readString();
sourceDir = source.readString();
publicSourceDir = source.readString();
splitNames = source.readStringArray();
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index ecaf7eb..d2468d9 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -461,12 +461,20 @@
/**
* Internal {@link PackageInfo} flag: include only components that are exposed to
- * ephemeral apps.
+ * instant apps. Matched components may have been either explicitly or implicitly
+ * exposed.
* @hide
*/
public static final int MATCH_VISIBLE_TO_INSTANT_APP_ONLY = 0x01000000;
/**
+ * Internal {@link PackageInfo} flag: include only components that have been
+ * explicitly exposed to instant apps.
+ * @hide
+ */
+ public static final int MATCH_EXPLICITLY_VISIBLE_ONLY = 0x02000000;
+
+ /**
* Internal flag used to indicate that a system component has done their
* homework and verified that they correctly handle packages and components
* that come and go over time. In particular:
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index 7bfde75..426f3cf 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -19,6 +19,7 @@
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.Bundle;
import android.util.SparseArray;
import java.util.List;
@@ -215,11 +216,13 @@
* @param origIntent The original intent that triggered ephemeral resolution
* @param resolvedType The resolved type of the intent
* @param callingPackage The name of the package requesting the ephemeral application
+ * @param verificationBundle Optional bundle to pass to the installer for additional
+ * verification
* @param userId The ID of the user that triggered ephemeral resolution
*/
public abstract void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj,
Intent origIntent, String resolvedType, String callingPackage,
- int userId);
+ Bundle verificationBundle, int userId);
/**
* Grants access to the package metadata for an ephemeral application.
@@ -333,4 +336,9 @@
* @param isolatedUid isolated uid that is no longer being used.
*/
public abstract void removeIsolatedUid(int isolatedUid);
+
+ /**
+ * Return the taget SDK version for the app with the given UID.
+ */
+ public abstract int getUidTargetSdkVersion(int uid);
}
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 1f78bff..1013177 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -145,7 +145,12 @@
private static final boolean DEBUG_PARSER = false;
private static final boolean DEBUG_BACKUP = false;
- private static final boolean MULTI_PACKAGE_APK_ENABLED = false;
+ private static final String PROPERTY_CHILD_PACKAGES_ENABLED =
+ "persist.sys.child_packages_enabled";
+
+ private static final boolean MULTI_PACKAGE_APK_ENABLED = Build.IS_DEBUGGABLE &&
+ SystemProperties.getBoolean(PROPERTY_CHILD_PACKAGES_ENABLED, false);
+
private static final int MAX_PACKAGES_PER_APK = 5;
public static final int APK_SIGNING_UNKNOWN = 0;
@@ -542,6 +547,8 @@
*/
public interface Callback {
boolean hasFeature(String feature);
+ String[] getOverlayPaths(String targetPackageName, String targetPath);
+ String[] getOverlayApks(String targetPackageName);
}
/**
@@ -558,6 +565,14 @@
@Override public boolean hasFeature(String feature) {
return mPm.hasSystemFeature(feature);
}
+
+ @Override public String[] getOverlayPaths(String targetPackageName, String targetPath) {
+ return null;
+ }
+
+ @Override public String[] getOverlayApks(String targetPackageName) {
+ return null;
+ }
}
/**
@@ -1049,7 +1064,19 @@
try {
final byte[] bytes = IoUtils.readFileAsByteArray(cacheFile.getAbsolutePath());
- return fromCacheEntry(bytes);
+ Package p = fromCacheEntry(bytes);
+ if (mCallback != null) {
+ String[] overlayApks = mCallback.getOverlayApks(p.packageName);
+ if (overlayApks != null && overlayApks.length > 0) {
+ for (String overlayApk : overlayApks) {
+ // If a static RRO is updated, return null.
+ if (!isCacheUpToDate(new File(overlayApk), cacheFile)) {
+ return null;
+ }
+ }
+ }
+ }
+ return p;
} catch (Exception e) {
Slog.w(TAG, "Error reading package cache: ", e);
@@ -1233,7 +1260,7 @@
parser = assets.openXmlResourceParser(cookie, ANDROID_MANIFEST_FILENAME);
final String[] outError = new String[1];
- final Package pkg = parseBaseApk(res, parser, flags, outError);
+ final Package pkg = parseBaseApk(apkPath, res, parser, flags, outError);
if (pkg == null) {
throw new PackageParserException(mParseError,
apkPath + " (at " + parser.getPositionDescription() + "): " + outError[0]);
@@ -1933,6 +1960,7 @@
* need to consider whether they should be supported by split APKs and child
* packages.
*
+ * @param apkPath The package apk file path
* @param res The resources from which to resolve values
* @param parser The manifest parser
* @param flags Flags how to parse
@@ -1942,7 +1970,7 @@
* @throws XmlPullParserException
* @throws IOException
*/
- private Package parseBaseApk(Resources res, XmlResourceParser parser, int flags,
+ private Package parseBaseApk(String apkPath, Resources res, XmlResourceParser parser, int flags,
String[] outError) throws XmlPullParserException, IOException {
final String splitName;
final String pkgName;
@@ -1962,6 +1990,15 @@
return null;
}
+ if (mCallback != null) {
+ String[] overlayPaths = mCallback.getOverlayPaths(pkgName, apkPath);
+ if (overlayPaths != null && overlayPaths.length > 0) {
+ for (String overlayPath : overlayPaths) {
+ res.getAssets().addOverlayPath(overlayPath);
+ }
+ }
+ }
+
final Package pkg = new Package(pkgName);
TypedArray sa = res.obtainAttributes(parser,
@@ -3263,8 +3300,8 @@
a.info.targetPackage = str != null ? str.intern() : null;
str = sa.getNonResourceString(
- com.android.internal.R.styleable.AndroidManifestInstrumentation_targetProcess);
- a.info.targetProcess = str != null ? str.intern() : null;
+ com.android.internal.R.styleable.AndroidManifestInstrumentation_targetProcesses);
+ a.info.targetProcesses = str != null ? str.intern() : null;
a.info.handleProfiling = sa.getBoolean(
com.android.internal.R.styleable.AndroidManifestInstrumentation_handleProfiling,
@@ -3400,7 +3437,8 @@
false)) {
// Check if persistence is based on a feature being present
final String requiredFeature = sa.getNonResourceString(
- com.android.internal.R.styleable.AndroidManifestApplication_persistentFeature);
+ com.android.internal.R.styleable.
+ AndroidManifestApplication_persistentWhenFeatureAvailable);
if (requiredFeature == null || mCallback.hasFeature(requiredFeature)) {
ai.flags |= ApplicationInfo.FLAG_PERSISTENT;
}
@@ -4266,7 +4304,7 @@
boolean visibleToEphemeral =
sa.getBoolean(R.styleable.AndroidManifestActivity_visibleToInstantApps, false);
if (visibleToEphemeral) {
- a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL;
+ a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP;
owner.visibleToInstantApps = true;
}
@@ -4308,9 +4346,17 @@
a.intents.add(intent);
}
// adjust activity flags when we implicitly expose it via a browsable filter
- intent.setVisibleToInstantApp(visibleToEphemeral || isImplicitlyExposedIntent(intent));
+ final int visibility = visibleToEphemeral
+ ? IntentFilter.VISIBILITY_EXPLICIT
+ : !receiver && isImplicitlyExposedIntent(intent)
+ ? IntentFilter.VISIBILITY_IMPLICIT
+ : IntentFilter.VISIBILITY_NONE;
+ intent.setVisibilityToInstantApp(visibility);
if (intent.isVisibleToInstantApp()) {
- a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL;
+ a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP;
+ }
+ if (intent.isImplicitlyVisibleToInstantApp()) {
+ a.info.flags |= ActivityInfo.FLAG_IMPLICITLY_VISIBLE_TO_INSTANT_APP;
}
if (LOG_UNSAFE_BROADCASTS && receiver
&& (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.O)) {
@@ -4341,9 +4387,17 @@
owner.preferredActivityFilters.add(intent);
}
// adjust activity flags when we implicitly expose it via a browsable filter
- intent.setVisibleToInstantApp(visibleToEphemeral || isImplicitlyExposedIntent(intent));
+ final int visibility = visibleToEphemeral
+ ? IntentFilter.VISIBILITY_EXPLICIT
+ : !receiver && isImplicitlyExposedIntent(intent)
+ ? IntentFilter.VISIBILITY_IMPLICIT
+ : IntentFilter.VISIBILITY_NONE;
+ intent.setVisibilityToInstantApp(visibility);
if (intent.isVisibleToInstantApp()) {
- a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL;
+ a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP;
+ }
+ if (intent.isImplicitlyVisibleToInstantApp()) {
+ a.info.flags |= ActivityInfo.FLAG_IMPLICITLY_VISIBLE_TO_INSTANT_APP;
}
} else if (parser.getName().equals("meta-data")) {
if ((a.metaData = parseMetaData(res, parser, a.metaData,
@@ -4353,16 +4407,18 @@
// we don't have an attribute [or it's false], but, we have meta-data
if (!visibleToEphemeral && a.metaData.getBoolean(META_DATA_INSTANT_APPS)) {
visibleToEphemeral = true; // set in case there are more intent filters
- a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL;
+ a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP;
+ a.info.flags &= ~ActivityInfo.FLAG_IMPLICITLY_VISIBLE_TO_INSTANT_APP;
owner.visibleToInstantApps = true;
// cycle through any filters already seen
for (int i = a.intents.size() - 1; i >= 0; --i) {
- a.intents.get(i).setVisibleToInstantApp(true /*visibleToInstantApp*/);
+ a.intents.get(i)
+ .setVisibilityToInstantApp(IntentFilter.VISIBILITY_EXPLICIT);
}
if (owner.preferredActivityFilters != null) {
for (int i = owner.preferredActivityFilters.size() - 1; i >= 0; --i) {
owner.preferredActivityFilters.get(i)
- .setVisibleToInstantApp(true /*visibleToInstantApp*/);
+ .setVisibilityToInstantApp(IntentFilter.VISIBILITY_EXPLICIT);
}
}
}
@@ -4640,7 +4696,7 @@
// TODO add visibleToInstantApps attribute to activity alias
final boolean visibleToEphemeral =
- ((a.info.flags & ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL) != 0);
+ ((a.info.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0);
sa.recycle();
@@ -4668,13 +4724,20 @@
+ mArchiveSourcePath + " "
+ parser.getPositionDescription());
} else {
- intent.setVisibleToInstantApp(
- visibleToEphemeral || isImplicitlyExposedIntent(intent));
a.intents.add(intent);
}
// adjust activity flags when we implicitly expose it via a browsable filter
+ final int visibility = visibleToEphemeral
+ ? IntentFilter.VISIBILITY_EXPLICIT
+ : isImplicitlyExposedIntent(intent)
+ ? IntentFilter.VISIBILITY_IMPLICIT
+ : IntentFilter.VISIBILITY_NONE;
+ intent.setVisibilityToInstantApp(visibility);
if (intent.isVisibleToInstantApp()) {
- a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL;
+ a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP;
+ }
+ if (intent.isImplicitlyVisibleToInstantApp()) {
+ a.info.flags |= ActivityInfo.FLAG_IMPLICITLY_VISIBLE_TO_INSTANT_APP;
}
} else if (parser.getName().equals("meta-data")) {
if ((a.metaData=parseMetaData(res, parser, a.metaData,
@@ -4817,7 +4880,7 @@
final boolean visibleToEphemeral =
sa.getBoolean(R.styleable.AndroidManifestProvider_visibleToInstantApps, false);
if (visibleToEphemeral) {
- p.info.flags |= ProviderInfo.FLAG_VISIBLE_TO_EPHEMERAL;
+ p.info.flags |= ProviderInfo.FLAG_VISIBLE_TO_INSTANT_APP;
owner.visibleToInstantApps = true;
}
@@ -4869,12 +4932,11 @@
intent, outError)) {
return false;
}
- outInfo.intents.add(intent);
- // adjust provider flags when we implicitly expose it via a browsable filter
- intent.setVisibleToInstantApp(visibleToEphemeral || isImplicitlyExposedIntent(intent));
- if (intent.isVisibleToInstantApp()) {
- outInfo.info.flags |= ProviderInfo.FLAG_VISIBLE_TO_EPHEMERAL;
+ if (visibleToEphemeral) {
+ intent.setVisibilityToInstantApp(IntentFilter.VISIBILITY_EXPLICIT);
+ outInfo.info.flags |= ProviderInfo.FLAG_VISIBLE_TO_INSTANT_APP;
}
+ outInfo.intents.add(intent);
} else if (parser.getName().equals("meta-data")) {
if ((outInfo.metaData=parseMetaData(res, parser,
@@ -4884,11 +4946,12 @@
// we don't have an attribute [or it's false], but, we have meta-data
if (!visibleToEphemeral && outInfo.metaData.getBoolean(META_DATA_INSTANT_APPS)) {
visibleToEphemeral = true; // set in case there are more intent filters
- outInfo.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL;
+ outInfo.info.flags |= ProviderInfo.FLAG_VISIBLE_TO_INSTANT_APP;
owner.visibleToInstantApps = true;
// cycle through any filters already seen
for (int i = outInfo.intents.size() - 1; i >= 0; --i) {
- outInfo.intents.get(i).setVisibleToInstantApp(true /*visibleToInstantApp*/);
+ outInfo.intents.get(i)
+ .setVisibilityToInstantApp(IntentFilter.VISIBILITY_EXPLICIT);
}
}
@@ -5144,7 +5207,7 @@
boolean visibleToEphemeral =
sa.getBoolean(R.styleable.AndroidManifestService_visibleToInstantApps, false);
if (visibleToEphemeral) {
- s.info.flags |= ServiceInfo.FLAG_VISIBLE_TO_EPHEMERAL;
+ s.info.flags |= ServiceInfo.FLAG_VISIBLE_TO_INSTANT_APP;
owner.visibleToInstantApps = true;
}
@@ -5175,10 +5238,9 @@
intent, outError)) {
return null;
}
- // adjust activity flags when we implicitly expose it via a browsable filter
- intent.setVisibleToInstantApp(visibleToEphemeral || isImplicitlyExposedIntent(intent));
- if (intent.isVisibleToInstantApp()) {
- s.info.flags |= ServiceInfo.FLAG_VISIBLE_TO_EPHEMERAL;
+ if (visibleToEphemeral) {
+ intent.setVisibilityToInstantApp(IntentFilter.VISIBILITY_EXPLICIT);
+ s.info.flags |= ServiceInfo.FLAG_VISIBLE_TO_INSTANT_APP;
}
s.intents.add(intent);
} else if (parser.getName().equals("meta-data")) {
@@ -5189,11 +5251,12 @@
// we don't have an attribute [or it's false], but, we have meta-data
if (!visibleToEphemeral && s.metaData.getBoolean(META_DATA_INSTANT_APPS)) {
visibleToEphemeral = true; // set in case there are more intent filters
- s.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL;
+ s.info.flags |= ServiceInfo.FLAG_VISIBLE_TO_INSTANT_APP;
owner.visibleToInstantApps = true;
// cycle through any filters already seen
for (int i = s.intents.size() - 1; i >= 0; --i) {
- s.intents.get(i).setVisibleToInstantApp(true /*visibleToInstantApp*/);
+ s.intents.get(i)
+ .setVisibilityToInstantApp(IntentFilter.VISIBILITY_EXPLICIT);
}
}
} else {
@@ -7175,8 +7238,8 @@
info.targetPackage = info.targetPackage.intern();
}
- if (info.targetProcess != null) {
- info.targetProcess = info.targetProcess.intern();
+ if (info.targetProcesses != null) {
+ info.targetProcesses = info.targetProcesses.intern();
}
}
diff --git a/core/java/android/content/pm/ProviderInfo.java b/core/java/android/content/pm/ProviderInfo.java
index 8c21563..91dc06e 100644
--- a/core/java/android/content/pm/ProviderInfo.java
+++ b/core/java/android/content/pm/ProviderInfo.java
@@ -79,7 +79,7 @@
* Bit in {@link #flags} indicating if the provider is visible to ephemeral applications.
* @hide
*/
- public static final int FLAG_VISIBLE_TO_EPHEMERAL = 0x100000;
+ public static final int FLAG_VISIBLE_TO_INSTANT_APP = 0x100000;
/**
* Bit in {@link #flags}: If set, a single instance of the provider will
diff --git a/core/java/android/content/pm/ServiceInfo.java b/core/java/android/content/pm/ServiceInfo.java
index f0766be..c683ea5 100644
--- a/core/java/android/content/pm/ServiceInfo.java
+++ b/core/java/android/content/pm/ServiceInfo.java
@@ -59,7 +59,7 @@
* Bit in {@link #flags} indicating if the service is visible to ephemeral applications.
* @hide
*/
- public static final int FLAG_VISIBLE_TO_EPHEMERAL = 0x100000;
+ public static final int FLAG_VISIBLE_TO_INSTANT_APP = 0x100000;
/**
* Bit in {@link #flags}: If set, a single instance of the service will
diff --git a/core/java/android/content/pm/VersionedPackage.java b/core/java/android/content/pm/VersionedPackage.java
index 83e7815..29c5efe 100644
--- a/core/java/android/content/pm/VersionedPackage.java
+++ b/core/java/android/content/pm/VersionedPackage.java
@@ -28,7 +28,7 @@
*/
public final class VersionedPackage implements Parcelable {
private final String mPackageName;
- private final long mVersionCode;
+ private final int mVersionCode;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@@ -49,7 +49,7 @@
private VersionedPackage(Parcel parcel) {
mPackageName = parcel.readString();
- mVersionCode = parcel.readLong();
+ mVersionCode = parcel.readInt();
}
/**
@@ -66,7 +66,7 @@
*
* @return The version code.
*/
- public @VersionCode long getVersionCode() {
+ public @VersionCode int getVersionCode() {
return mVersionCode;
}
@@ -83,7 +83,7 @@
@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeString(mPackageName);
- parcel.writeLong(mVersionCode);
+ parcel.writeInt(mVersionCode);
}
public static final Creator<VersionedPackage> CREATOR = new Creator<VersionedPackage>() {
diff --git a/core/java/android/content/res/AssetManager.java b/core/java/android/content/res/AssetManager.java
index a044804..f0adcd6 100644
--- a/core/java/android/content/res/AssetManager.java
+++ b/core/java/android/content/res/AssetManager.java
@@ -788,8 +788,8 @@
/**
* Retrieve the resource identifier for the given resource name.
*/
- /*package*/ native final int getResourceIdentifier(String type,
- String name,
+ /*package*/ native final int getResourceIdentifier(String name,
+ String defType,
String defPackage);
/*package*/ native final String getResourceName(int resid);
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java
index 061346c..aa35a66 100644
--- a/core/java/android/hardware/Camera.java
+++ b/core/java/android/hardware/Camera.java
@@ -189,7 +189,7 @@
*
* <p>In {@link android.os.Build.VERSION_CODES#O Android O} this broadcast has been brought
* back, but only for <em>registered</em> receivers. Apps that are actively running can
- * against listen to the broadcast if they want an immediate clear signal about a picture
+ * again listen to the broadcast if they want an immediate clear signal about a picture
* being taken, however anything doing heavy work (or needing to be launched) as a result of
* this should still use JobScheduler.</p>
*/
@@ -208,12 +208,11 @@
*
* <p>In {@link android.os.Build.VERSION_CODES#O Android O} this broadcast has been brought
* back, but only for <em>registered</em> receivers. Apps that are actively running can
- * against listen to the broadcast if they want an immediate clear signal about a video
+ * again listen to the broadcast if they want an immediate clear signal about a video
* being taken, however anything doing heavy work (or needing to be launched) as a result of
* this should still use JobScheduler.</p>
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
- @Deprecated
public static final String ACTION_NEW_VIDEO = "android.hardware.action.NEW_VIDEO";
/**
diff --git a/core/java/android/hardware/HardwareBuffer.java b/core/java/android/hardware/HardwareBuffer.java
index 9d217d3..7049628 100644
--- a/core/java/android/hardware/HardwareBuffer.java
+++ b/core/java/android/hardware/HardwareBuffer.java
@@ -70,37 +70,34 @@
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef(flag = true, value = {USAGE0_CPU_READ, USAGE0_CPU_READ_OFTEN, USAGE0_CPU_WRITE,
- USAGE0_CPU_WRITE_OFTEN, USAGE0_GPU_SAMPLED_IMAGE, USAGE0_GPU_COLOR_OUTPUT,
- USAGE0_GPU_STORAGE_IMAGE, USAGE0_GPU_CUBEMAP, USAGE0_GPU_DATA_BUFFER,
- USAGE0_PROTECTED_CONTENT, USAGE0_SENSOR_DIRECT_DATA, USAGE0_VIDEO_ENCODE})
- public @interface Usage0 {};
+ @IntDef(flag = true, value = {USAGE_CPU_READ_RARELY, USAGE_CPU_READ_OFTEN,
+ USAGE_CPU_WRITE_RARELY, USAGE_CPU_WRITE_OFTEN, USAGE_GPU_SAMPLED_IMAGE,
+ USAGE_GPU_COLOR_OUTPUT, USAGE_PROTECTED_CONTENT, USAGE_VIDEO_ENCODE,
+ USAGE_GPU_DATA_BUFFER, USAGE_SENSOR_DIRECT_DATA})
+ public @interface Usage {};
- /** Usage0: the buffer will sometimes be read by the CPU */
- public static final long USAGE0_CPU_READ = (1 << 1);
- /** Usage0: the buffer will often be read by the CPU*/
- public static final long USAGE0_CPU_READ_OFTEN = (1 << 2 | USAGE0_CPU_READ);
- /** Usage0: the buffer will sometimes be written to by the CPU */
- public static final long USAGE0_CPU_WRITE = (1 << 5);
- /** Usage0: the buffer will often be written to by the CPU */
- public static final long USAGE0_CPU_WRITE_OFTEN = (1 << 6 | USAGE0_CPU_WRITE);
- /** Usage0: the buffer will be read from by the GPU */
- public static final long USAGE0_GPU_SAMPLED_IMAGE = (1 << 10);
- /** Usage0: the buffer will be written to by the GPU */
- public static final long USAGE0_GPU_COLOR_OUTPUT = (1 << 11);
- /** Usage0: the buffer will be read from and written to by the GPU */
- public static final long USAGE0_GPU_STORAGE_IMAGE = (USAGE0_GPU_SAMPLED_IMAGE |
- USAGE0_GPU_COLOR_OUTPUT);
- /** Usage0: the buffer will be used as a cubemap texture */
- public static final long USAGE0_GPU_CUBEMAP = (1 << 13);
- /** Usage0: the buffer will be used as a shader storage or uniform buffer object*/
- public static final long USAGE0_GPU_DATA_BUFFER = (1 << 14);
- /** Usage0: the buffer must not be used outside of a protected hardware path */
- public static final long USAGE0_PROTECTED_CONTENT = (1 << 18);
- /** Usage0: the buffer will be used for sensor direct data */
- public static final long USAGE0_SENSOR_DIRECT_DATA = (1 << 29);
- /** Usage0: the buffer will be read by a hardware video encoder */
- public static final long USAGE0_VIDEO_ENCODE = (1 << 21);
+ /** Usage: The buffer will sometimes be read by the CPU */
+ public static final long USAGE_CPU_READ_RARELY = 2;
+ /** Usage: The buffer will often be read by the CPU */
+ public static final long USAGE_CPU_READ_OFTEN = 3;
+
+ /** Usage: The buffer will sometimes be written to by the CPU */
+ public static final long USAGE_CPU_WRITE_RARELY = 2 << 4;
+ /** Usage: The buffer will often be written to by the CPU */
+ public static final long USAGE_CPU_WRITE_OFTEN = 3 << 4;
+
+ /** Usage: The buffer will be read from by the GPU */
+ public static final long USAGE_GPU_SAMPLED_IMAGE = 1 << 8;
+ /** Usage: The buffer will be written to by the GPU */
+ public static final long USAGE_GPU_COLOR_OUTPUT = 1 << 9;
+ /** Usage: The buffer must not be used outside of a protected hardware path */
+ public static final long USAGE_PROTECTED_CONTENT = 1 << 14;
+ /** Usage: The buffer will be read by a hardware video encoder */
+ public static final long USAGE_VIDEO_ENCODE = 1 << 16;
+ /** Usage: The buffer will be used for sensor direct data */
+ public static final long USAGE_SENSOR_DIRECT_DATA = 1 << 23;
+ /** Usage: The buffer will be used as a shader storage or uniform buffer object */
+ public static final long USAGE_GPU_DATA_BUFFER = 1 << 24;
// The approximate size of a native AHardwareBuffer object.
private static final long NATIVE_HARDWARE_BUFFER_SIZE = 232;
@@ -116,13 +113,11 @@
* {@link #RGBX_8888}, {@link #RGB_565}, {@link #RGB_888}, {@link #RGBA_1010102}, {@link #BLOB}
* @param layers The number of layers in the buffer
* @param usage Flags describing how the buffer will be used, one of
- * {@link #USAGE0_CPU_READ}, {@link #USAGE0_CPU_READ_OFTEN}, {@link #USAGE0_CPU_WRITE},
- * {@link #USAGE0_CPU_WRITE_OFTEN}, {@link #USAGE0_GPU_SAMPLED_IMAGE},
- * {@link #USAGE0_GPU_COLOR_OUTPUT},{@link #USAGE0_GPU_STORAGE_IMAGE},
- * {@link #USAGE0_GPU_CUBEMAP}, {@link #USAGE0_GPU_DATA_BUFFER},
- * {@link #USAGE0_PROTECTED_CONTENT}, {@link #USAGE0_SENSOR_DIRECT_DATA},
- * {@link #USAGE0_VIDEO_ENCODE}
- *
+ * {@link #USAGE_CPU_READ_RARELY}, {@link #USAGE_CPU_READ_OFTEN},
+ * {@link #USAGE_CPU_WRITE_RARELY}, {@link #USAGE_CPU_WRITE_OFTEN},
+ * {@link #USAGE_GPU_SAMPLED_IMAGE}, {@link #USAGE_GPU_COLOR_OUTPUT},
+ * {@link #USAGE_GPU_DATA_BUFFER}, {@link #USAGE_PROTECTED_CONTENT},
+ * {@link #USAGE_SENSOR_DIRECT_DATA}, {@link #USAGE_VIDEO_ENCODE}
* @return A <code>HardwareBuffer</code> instance if successful, or throws an
* IllegalArgumentException if the dimensions passed are invalid (either zero, negative, or
* too large to allocate), if the format is not supported, if the requested number of layers
@@ -130,7 +125,7 @@
*/
@NonNull
public static HardwareBuffer create(int width, int height, @Format int format, int layers,
- @Usage0 long usage) {
+ @Usage long usage) {
if (!HardwareBuffer.isSupportedFormat(format)) {
throw new IllegalArgumentException("Invalid pixel format " + format);
}
diff --git a/core/java/android/hardware/SystemSensorManager.java b/core/java/android/hardware/SystemSensorManager.java
index 10c4cb3..0dab5d7 100644
--- a/core/java/android/hardware/SystemSensorManager.java
+++ b/core/java/android/hardware/SystemSensorManager.java
@@ -16,12 +16,10 @@
package android.hardware;
-import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.Looper;
import android.os.MemoryFile;
@@ -51,8 +49,9 @@
*/
public class SystemSensorManager extends SensorManager {
//TODO: disable extra logging before release
- private static boolean DEBUG_DYNAMIC_SENSOR = true;
- private static int MIN_DIRECT_CHANNEL_BUFFER_SIZE = 104;
+ private static final boolean DEBUG_DYNAMIC_SENSOR = true;
+ private static final int MIN_DIRECT_CHANNEL_BUFFER_SIZE = 104;
+ private static final int MAX_LISTENER_COUNT = 128;
private static native void nativeClassInit();
private static native long nativeCreate(String opPackageName);
@@ -157,6 +156,11 @@
Log.e(TAG, "maxBatchReportLatencyUs and delayUs should be non-negative");
return false;
}
+ if (mSensorListeners.size() >= MAX_LISTENER_COUNT) {
+ throw new IllegalStateException("register failed, " +
+ "the sensor listeners size has exceeded the maximum limit " +
+ MAX_LISTENER_COUNT);
+ }
// Invariants to preserve:
// - one Looper per SensorEventListener
@@ -216,6 +220,12 @@
if (sensor.getReportingMode() != Sensor.REPORTING_MODE_ONE_SHOT) return false;
+ if (mTriggerListeners.size() >= MAX_LISTENER_COUNT) {
+ throw new IllegalStateException("request failed, " +
+ "the trigger listeners size has exceeded the maximum limit " +
+ MAX_LISTENER_COUNT);
+ }
+
synchronized (mTriggerListeners) {
TriggerEventQueue queue = mTriggerListeners.get(listener);
if (queue == null) {
@@ -285,17 +295,22 @@
}
// Initialize a client for data_injection.
if (sInjectEventQueue == null) {
- sInjectEventQueue = new InjectEventQueue(mMainLooper, this,
- mContext.getPackageName());
+ try {
+ sInjectEventQueue = new InjectEventQueue(
+ mMainLooper, this, mContext.getPackageName());
+ } catch (RuntimeException e) {
+ Log.e(TAG, "Cannot create InjectEventQueue: " + e);
+ }
}
+ return sInjectEventQueue != null;
} else {
// If data injection is being disabled clean up the native resources.
if (sInjectEventQueue != null) {
sInjectEventQueue.dispose();
sInjectEventQueue = null;
}
+ return true;
}
- return true;
}
}
@@ -322,7 +337,10 @@
if (sensor.getReportingMode() == Sensor.REPORTING_MODE_ONE_SHOT) {
synchronized(mTriggerListeners) {
- for (TriggerEventListener l: mTriggerListeners.keySet()) {
+ HashMap<TriggerEventListener, TriggerEventQueue> triggerListeners =
+ new HashMap<TriggerEventListener, TriggerEventQueue>(mTriggerListeners);
+
+ for (TriggerEventListener l: triggerListeners.keySet()) {
if (DEBUG_DYNAMIC_SENSOR){
Log.i(TAG, "removed trigger listener" + l.toString() +
" due to sensor disconnection");
@@ -332,7 +350,10 @@
}
} else {
synchronized(mSensorListeners) {
- for (SensorEventListener l: mSensorListeners.keySet()) {
+ HashMap<SensorEventListener, SensorEventQueue> sensorListeners =
+ new HashMap<SensorEventListener, SensorEventQueue>(mSensorListeners);
+
+ for (SensorEventListener l: sensorListeners.keySet()) {
if (DEBUG_DYNAMIC_SENSOR){
Log.i(TAG, "removed event listener" + l.toString() +
" due to sensor disconnection");
@@ -568,9 +589,9 @@
"Width if HaradwareBuffer must be greater than "
+ MIN_DIRECT_CHANNEL_BUFFER_SIZE);
}
- if ((hardwareBuffer.getUsage() & HardwareBuffer.USAGE0_SENSOR_DIRECT_DATA) == 0) {
+ if ((hardwareBuffer.getUsage() & HardwareBuffer.USAGE_SENSOR_DIRECT_DATA) == 0) {
throw new IllegalArgumentException(
- "HardwareBuffer must set usage flag USAGE0_SENSOR_DIRECT_DATA");
+ "HardwareBuffer must set usage flag USAGE_SENSOR_DIRECT_DATA");
}
size = hardwareBuffer.getWidth();
id = nativeCreateDirectChannel(
diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java
index 7bfb5d0..211d54d 100644
--- a/core/java/android/hardware/camera2/CameraDevice.java
+++ b/core/java/android/hardware/camera2/CameraDevice.java
@@ -135,7 +135,7 @@
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef(
+ @IntDef(prefix = {"TEMPLATE_"}, value =
{TEMPLATE_PREVIEW,
TEMPLATE_STILL_CAPTURE,
TEMPLATE_RECORD,
@@ -757,7 +757,7 @@
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef(
+ @IntDef(prefix = {"SESSION_OPERATION_MODE"}, value =
{SESSION_OPERATION_MODE_NORMAL,
SESSION_OPERATION_MODE_CONSTRAINED_HIGH_SPEED,
SESSION_OPERATION_MODE_VENDOR_START})
@@ -808,10 +808,9 @@
* create a builder specific for that device and template and override the
* settings as desired, instead.</p>
*
- * @param templateType An enumeration selecting the use case for this
- * request; one of the CameraDevice.TEMPLATE_ values. Not all template
- * types are supported on every device. See the documentation for each
- * template type for details.
+ * @param templateType An enumeration selecting the use case for this request. Not all template
+ * types are supported on every device. See the documentation for each template type for
+ * details.
* @return a builder for a capture request, initialized with default
* settings for that template, and no output streams
*
@@ -969,7 +968,7 @@
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef(
+ @IntDef(prefix = {"ERROR_"}, value =
{ERROR_CAMERA_IN_USE,
ERROR_MAX_CAMERAS_IN_USE,
ERROR_CAMERA_DISABLED,
@@ -1052,8 +1051,7 @@
* this happens. Further attempts at recovery are error-code specific.</p>
*
* @param camera The device reporting the error
- * @param error The error code, one of the
- * {@code StateCallback.ERROR_*} values.
+ * @param error The error code.
*
* @see #ERROR_CAMERA_IN_USE
* @see #ERROR_MAX_CAMERAS_IN_USE
diff --git a/core/java/android/hardware/camera2/CaptureFailure.java b/core/java/android/hardware/camera2/CaptureFailure.java
index 8bb33f1..fbe0839 100644
--- a/core/java/android/hardware/camera2/CaptureFailure.java
+++ b/core/java/android/hardware/camera2/CaptureFailure.java
@@ -51,7 +51,7 @@
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef(
+ @IntDef(prefix = {"REASON_"}, value =
{REASON_ERROR,
REASON_FLUSHED })
public @interface FailureReason {};
@@ -119,7 +119,7 @@
* Determine why the request was dropped, whether due to an error or to a user
* action.
*
- * @return int One of {@code REASON_*} integer constants.
+ * @return int The reason code.
*
* @see #REASON_ERROR
* @see #REASON_FLUSHED
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index 1cf8f03..279d73d 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -1662,9 +1662,13 @@
* <p>The output images for request B may have contents captured before the output images for
* request A, and the result metadata for request B may be older than the result metadata for
* request A.</p>
- * <p>Note that when enableZsl is <code>true</code>, it is not guaranteed to get output images captured in the
- * past for requests with STILL_CAPTURE capture intent.</p>
- * <p>The value of enableZsl in capture templates is always <code>false</code> if present.</p>
+ * <p>Note that when enableZsl is <code>true</code>, it is not guaranteed to get output images captured in
+ * the past for requests with STILL_CAPTURE capture intent.</p>
+ * <p>For applications targeting SDK versions O and newer, the value of enableZsl in
+ * TEMPLATE_STILL_CAPTURE template may be <code>true</code>. The value in other templates is always
+ * <code>false</code> if present.</p>
+ * <p>For applications targeting SDK versions older than O, the value of enableZsl in all
+ * capture templates is always <code>false</code> if present.</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
* @see CaptureRequest#CONTROL_CAPTURE_INTENT
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index 419e3e2..aedfc4b 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -2167,9 +2167,13 @@
* <p>The output images for request B may have contents captured before the output images for
* request A, and the result metadata for request B may be older than the result metadata for
* request A.</p>
- * <p>Note that when enableZsl is <code>true</code>, it is not guaranteed to get output images captured in the
- * past for requests with STILL_CAPTURE capture intent.</p>
- * <p>The value of enableZsl in capture templates is always <code>false</code> if present.</p>
+ * <p>Note that when enableZsl is <code>true</code>, it is not guaranteed to get output images captured in
+ * the past for requests with STILL_CAPTURE capture intent.</p>
+ * <p>For applications targeting SDK versions O and newer, the value of enableZsl in
+ * TEMPLATE_STILL_CAPTURE template may be <code>true</code>. The value in other templates is always
+ * <code>false</code> if present.</p>
+ * <p>For applications targeting SDK versions older than O, the value of enableZsl in all
+ * capture templates is always <code>false</code> if present.</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
* @see CaptureRequest#CONTROL_CAPTURE_INTENT
diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java
index ae92457..b2a2aaf 100644
--- a/core/java/android/hardware/usb/UsbManager.java
+++ b/core/java/android/hardware/usb/UsbManager.java
@@ -17,9 +17,9 @@
package android.hardware.usb;
-import com.android.internal.util.Preconditions;
-
import android.annotation.Nullable;
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
@@ -30,6 +30,8 @@
import android.os.RemoteException;
import android.util.Log;
+import com.android.internal.util.Preconditions;
+
import java.util.HashMap;
/**
@@ -109,6 +111,7 @@
* for the attached device
* </ul>
*/
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_USB_DEVICE_ATTACHED =
"android.hardware.usb.action.USB_DEVICE_ATTACHED";
@@ -121,6 +124,7 @@
* for the detached device
* </ul>
*/
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_USB_DEVICE_DETACHED =
"android.hardware.usb.action.USB_DEVICE_DETACHED";
@@ -133,6 +137,7 @@
* for the attached accessory
* </ul>
*/
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_USB_ACCESSORY_ATTACHED =
"android.hardware.usb.action.USB_ACCESSORY_ATTACHED";
@@ -145,6 +150,7 @@
* for the attached accessory that was detached
* </ul>
*/
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_USB_ACCESSORY_DETACHED =
"android.hardware.usb.action.USB_ACCESSORY_DETACHED";
diff --git a/core/java/android/metrics/LogMaker.java b/core/java/android/metrics/LogMaker.java
index 3c6baa7..2bb43bd 100644
--- a/core/java/android/metrics/LogMaker.java
+++ b/core/java/android/metrics/LogMaker.java
@@ -170,6 +170,27 @@
}
/**
+ * This will be set by the system when the log is persisted.
+ * Client-supplied values will be ignored.
+ *
+ * @param uid to replace the existing setting.
+ * @hide
+ */
+ public LogMaker setUid(int uid) {
+ entries.put(MetricsEvent.RESERVED_FOR_LOGBUILDER_UID, uid);
+ return this;
+ }
+
+ /**
+ * Remove the UID property.
+ * @hide
+ */
+ public LogMaker clearUid() {
+ entries.remove(MetricsEvent.RESERVED_FOR_LOGBUILDER_UID);
+ return this;
+ }
+
+ /**
* The name of the counter or histogram.
* Only useful for counter or histogram category objects.
* @param name to replace the existing setting.
@@ -319,6 +340,16 @@
}
}
+ /** @return the UID of the log, or -1. */
+ public int getUid() {
+ Object obj = entries.get(MetricsEvent.RESERVED_FOR_LOGBUILDER_UID);
+ if (obj instanceof Integer) {
+ return (Integer) obj;
+ } else {
+ return -1;
+ }
+ }
+
/** @return the name of the counter, or null. */
public String getCounterName() {
Object obj = entries.get(MetricsEvent.RESERVED_FOR_LOGBUILDER_NAME);
diff --git a/core/java/android/metrics/MetricsReader.java b/core/java/android/metrics/MetricsReader.java
index 5be977a..5f356ca 100644
--- a/core/java/android/metrics/MetricsReader.java
+++ b/core/java/android/metrics/MetricsReader.java
@@ -93,6 +93,7 @@
}
final LogMaker log = new LogMaker(objects)
.setTimestamp(eventTimestampMs)
+ .setUid(event.getUid())
.setProcessId(event.getProcessId());
if (log.getCategory() == MetricsEvent.METRICS_CHECKPOINT) {
if (log.getSubtype() == mCheckpointTag) {
@@ -155,11 +156,13 @@
public static class Event {
long mTimeMillis;
int mPid;
+ int mUid;
Object mData;
- public Event(long timeMillis, int pid, Object data) {
+ public Event(long timeMillis, int pid, int uid, Object data) {
mTimeMillis = timeMillis;
mPid = pid;
+ mUid = uid;
mData = data;
}
@@ -167,6 +170,7 @@
mTimeMillis = TimeUnit.MILLISECONDS.convert(
nativeEvent.getTimeNanos(), TimeUnit.NANOSECONDS);
mPid = nativeEvent.getProcessId();
+ mUid = nativeEvent.getUid();
mData = nativeEvent.getData();
}
@@ -178,6 +182,10 @@
return mPid;
}
+ public int getUid() {
+ return mUid;
+ }
+
public Object getData() {
return mData;
}
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index b854cbf..2f2e79a 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -2974,50 +2974,6 @@
}
/**
- * Note: this is a deprecated version of
- * {@link #requestNetwork(NetworkRequest, int, NetworkCallback)} - please transition code to use
- * the unhidden version of the function.
- * TODO: replace all callers with the new version of the API
- *
- * Request a network to satisfy a set of {@link android.net.NetworkCapabilities}, limited
- * by a timeout.
- *
- * This function behaves identically to the non-timed-out version
- * {@link #requestNetwork(NetworkRequest, NetworkCallback)}, but if a suitable network
- * is not found within the given time (in milliseconds) the
- * {@link NetworkCallback#onUnavailable()} callback is called. The request can still be
- * released normally by calling {@link #unregisterNetworkCallback(NetworkCallback)} but does
- * not have to be released if timed-out (it is automatically released). Unregistering a
- * request that timed out is not an error.
- *
- * <p>Do not use this method to poll for the existence of specific networks (e.g. with a small
- * timeout) - the {@link #registerNetworkCallback(NetworkRequest, NetworkCallback)} is provided
- * for that purpose. Calling this method will attempt to bring up the requested network.
- *
- * <p>This method requires the caller to hold either the
- * {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
- * or the ability to modify system settings as determined by
- * {@link android.provider.Settings.System#canWrite}.</p>
- *
- * @param request {@link NetworkRequest} describing this request.
- * @param networkCallback The callbacks to be utilized for this request. Note
- * the callbacks must not be shared - they uniquely specify
- * this request.
- * @param timeoutMs The time in milliseconds to attempt looking for a suitable network
- * before {@link NetworkCallback#onUnavailable()} is called. The timeout must
- * be a positive value (i.e. >0).
- * @hide
- */
- public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback,
- int timeoutMs) {
- if (timeoutMs <= 0) {
- throw new IllegalArgumentException("Non-positive timeoutMs: " + timeoutMs);
- }
- int legacyType = inferLegacyTypeForNetworkCapabilities(request.networkCapabilities);
- requestNetwork(request, networkCallback, timeoutMs, legacyType, getDefaultHandler());
- }
-
- /**
* Request a network to satisfy a set of {@link android.net.NetworkCapabilities}, limited
* by a timeout.
*
@@ -3039,14 +2995,14 @@
* {@link android.provider.Settings.System#canWrite}.</p>
*
* @param request {@link NetworkRequest} describing this request.
+ * @param networkCallback The {@link NetworkCallback} to be utilized for this request. Note
+ * the callback must not be shared - it uniquely specifies this request.
* @param timeoutMs The time in milliseconds to attempt looking for a suitable network
* before {@link NetworkCallback#onUnavailable()} is called. The timeout must
* be a positive value (i.e. >0).
- * @param networkCallback The {@link NetworkCallback} to be utilized for this request. Note
- * the callback must not be shared - it uniquely specifies this request.
*/
- public void requestNetwork(NetworkRequest request, int timeoutMs,
- NetworkCallback networkCallback) {
+ public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback,
+ int timeoutMs) {
if (timeoutMs <= 0) {
throw new IllegalArgumentException("Non-positive timeoutMs: " + timeoutMs);
}
@@ -3076,14 +3032,14 @@
* {@link android.provider.Settings.System#canWrite}.</p>
*
* @param request {@link NetworkRequest} describing this request.
- * @param timeoutMs The time in milliseconds to attempt looking for a suitable network
- * before {@link NetworkCallback#onUnavailable} is called.
* @param networkCallback The {@link NetworkCallback} to be utilized for this request. Note
* the callback must not be shared - it uniquely specifies this request.
* @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
+ * @param timeoutMs The time in milliseconds to attempt looking for a suitable network
+ * before {@link NetworkCallback#onUnavailable} is called.
*/
- public void requestNetwork(NetworkRequest request, int timeoutMs,
- NetworkCallback networkCallback, Handler handler) {
+ public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback,
+ Handler handler, int timeoutMs) {
if (timeoutMs <= 0) {
throw new IllegalArgumentException("Non-positive timeoutMs");
}
@@ -3402,8 +3358,8 @@
/**
* It is acceptable to briefly use multipath data to provide seamless connectivity for
* time-sensitive user-facing operations when the system default network is temporarily
- * unresponsive. The amount of data should be limited (less than one megabyte), and the
- * operation should be infrequent to ensure that data usage is limited.
+ * unresponsive. The amount of data should be limited (less than one megabyte for every call to
+ * this method), and the operation should be infrequent to ensure that data usage is limited.
*
* An example of such an operation might be a time-sensitive foreground activity, such as a
* voice command, that the user is performing while walking out of range of a Wi-Fi network.
diff --git a/core/java/android/net/INetworkRecommendationProvider.aidl b/core/java/android/net/INetworkRecommendationProvider.aidl
index 052c92c..cde0185 100644
--- a/core/java/android/net/INetworkRecommendationProvider.aidl
+++ b/core/java/android/net/INetworkRecommendationProvider.aidl
@@ -17,8 +17,6 @@
package android.net;
import android.net.NetworkKey;
-import android.net.RecommendationRequest;
-import android.os.IRemoteCallback;
/**
* The service responsible for answering network recommendation requests.
@@ -27,20 +25,6 @@
oneway interface INetworkRecommendationProvider {
/**
- * Request a recommendation for the best network to connect to
- * taking into account the inputs from the {@link RecommendationRequest}.
- *
- * @param request a {@link RecommendationRequest} instance containing the details of the request
- * @param callback a {@link IRemoteCallback} instance to invoke when the recommendation
- * is available
- * @param sequence an internal number used for tracking the request
- * @hide
- */
- void requestRecommendation(in RecommendationRequest request,
- in IRemoteCallback callback,
- int sequence);
-
- /**
* Request scoring for networks.
*
* Implementations should use {@link NetworkScoreManager#updateScores(ScoredNetwork[])} to
diff --git a/core/java/android/net/INetworkScoreService.aidl b/core/java/android/net/INetworkScoreService.aidl
index 362ea9d..73e52c8 100644
--- a/core/java/android/net/INetworkScoreService.aidl
+++ b/core/java/android/net/INetworkScoreService.aidl
@@ -19,10 +19,7 @@
import android.net.INetworkScoreCache;
import android.net.NetworkKey;
import android.net.NetworkScorerAppData;
-import android.net.RecommendationRequest;
-import android.net.RecommendationResult;
import android.net.ScoredNetwork;
-import android.os.RemoteCallback;
/**
* A service for updating network scores from a network scorer application.
@@ -81,16 +78,6 @@
void unregisterNetworkScoreCache(int networkType, INetworkScoreCache scoreCache);
/**
- * Request a recommendation for the best network to connect to
- * taking into account the inputs from the {@link RecommendationRequest}.
- *
- * @param request a {@link RecommendationRequest} instance containing the details of the request
- * @return a {@link RecommendationResult} containing the recommended network to connect to
- * @throws SecurityException if the caller is not the system
- */
- RecommendationResult requestRecommendation(in RecommendationRequest request);
-
- /**
* Request scoring for networks.
*
* Implementations should delegate to the registered network recommendation provider or
@@ -119,18 +106,6 @@
* scorer.
*/
String getActiveScorerPackage();
-
- /**
- * Request a recommendation for the best network to connect to
- * taking into account the inputs from the {@link RecommendationRequest}.
- *
- * @param request a {@link RecommendationRequest} instance containing the details of the request
- * @param remoteCallback a {@link RemoteCallback} instance to invoke when the recommendation
- * is available.
- * @throws SecurityException if the caller is not the system
- */
- oneway void requestRecommendationAsync(in RecommendationRequest request,
- in RemoteCallback remoteCallback);
/**
* Returns metadata about the active scorer or <code>null</code> if there is no active scorer.
diff --git a/core/java/android/net/IpSecAlgorithm.java b/core/java/android/net/IpSecAlgorithm.java
index ce7894f..48b095d 100644
--- a/core/java/android/net/IpSecAlgorithm.java
+++ b/core/java/android/net/IpSecAlgorithm.java
@@ -24,6 +24,8 @@
/**
* IpSecAlgorithm specifies a single algorithm that can be applied to an IpSec Transform. Refer to
* RFC 4301.
+ *
+ * @hide
*/
public final class IpSecAlgorithm implements Parcelable {
diff --git a/core/java/android/net/IpSecManager.java b/core/java/android/net/IpSecManager.java
index 375b7ee..114e46e 100644
--- a/core/java/android/net/IpSecManager.java
+++ b/core/java/android/net/IpSecManager.java
@@ -37,6 +37,8 @@
* <p>An IpSecManager may be obtained by calling {@link
* android.content.Context#getSystemService(String) Context#getSystemService(String)} with {@link
* android.content.Context#IPSEC_SERVICE Context#IPSEC_SERVICE}
+ *
+ * @hide
*/
public final class IpSecManager {
private static final String TAG = "IpSecManager";
diff --git a/core/java/android/net/IpSecTransform.java b/core/java/android/net/IpSecTransform.java
index 801e98c..639d1f2 100644
--- a/core/java/android/net/IpSecTransform.java
+++ b/core/java/android/net/IpSecTransform.java
@@ -45,6 +45,8 @@
*
* <p>An IpSecTransform may either represent a tunnel mode transform that operates on a wide array
* of traffic or may represent a transport mode transform operating on a Socket or Sockets.
+ *
+ * @hide
*/
public final class IpSecTransform implements AutoCloseable {
private static final String TAG = "IpSecTransform";
diff --git a/core/java/android/net/NetworkRecommendationProvider.java b/core/java/android/net/NetworkRecommendationProvider.java
index af0459d..1eaa1f9 100644
--- a/core/java/android/net/NetworkRecommendationProvider.java
+++ b/core/java/android/net/NetworkRecommendationProvider.java
@@ -39,10 +39,14 @@
public abstract class NetworkRecommendationProvider {
private static final String TAG = "NetworkRecProvider";
private static final boolean VERBOSE = Build.IS_DEBUGGABLE && Log.isLoggable(TAG, Log.VERBOSE);
- /** The key into the callback Bundle where the RecommendationResult will be found. */
+ /** The key into the callback Bundle where the RecommendationResult will be found.
+ * @deprecated to be removed.
+ */
public static final String EXTRA_RECOMMENDATION_RESULT =
"android.net.extra.RECOMMENDATION_RESULT";
- /** The key into the callback Bundle where the sequence will be found. */
+ /** The key into the callback Bundle where the sequence will be found.
+ * @deprecated to be removed.
+ */
public static final String EXTRA_SEQUENCE = "android.net.extra.SEQUENCE";
private final IBinder mService;
@@ -77,9 +81,9 @@
* @param callback a {@link ResultCallback} instance. When a {@link RecommendationResult} is
* available it must be passed into
* {@link ResultCallback#onResult(RecommendationResult)}.
+ * @deprecated to be removed.
*/
- public abstract void onRequestRecommendation(RecommendationRequest request,
- ResultCallback callback);
+ public void onRequestRecommendation(RecommendationRequest request, ResultCallback callback) {}
/**
* Invoked when network scores have been requested.
@@ -101,6 +105,8 @@
/**
* A callback implementing applications should invoke when a {@link RecommendationResult}
* is available.
+ *
+ * @deprecated to be removed.
*/
public static class ResultCallback {
private final IRemoteCallback mCallback;
@@ -176,23 +182,6 @@
}
@Override
- public void requestRecommendation(final RecommendationRequest request,
- final IRemoteCallback callback, final int sequence) throws RemoteException {
- enforceCallingPermission();
- if (VERBOSE) Log.v(TAG, "requestRecommendation(seq=" + sequence + ")");
- execute(new Runnable() {
- @Override
- public void run() {
- if (VERBOSE) {
- Log.v(TAG, "requestRecommendation(seq=" + sequence + ") running...");
- }
- ResultCallback resultCallback = new ResultCallback(callback, sequence);
- onRequestRecommendation(request, resultCallback);
- }
- });
- }
-
- @Override
public void requestScores(final NetworkKey[] networks) throws RemoteException {
enforceCallingPermission();
if (networks != null && networks.length > 0) {
diff --git a/core/java/android/net/NetworkScoreManager.java b/core/java/android/net/NetworkScoreManager.java
index 29483cd..eeb426a 100644
--- a/core/java/android/net/NetworkScoreManager.java
+++ b/core/java/android/net/NetworkScoreManager.java
@@ -428,14 +428,11 @@
* @throws SecurityException if the caller does not hold the
* {@link android.Manifest.permission#REQUEST_NETWORK_SCORES} permission.
* @hide
+ * @deprecated to be removed.
*/
public RecommendationResult requestRecommendation(RecommendationRequest request)
throws SecurityException {
- try {
- return mService.requestRecommendation(request);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return null;
}
/**
@@ -452,43 +449,4 @@
throw e.rethrowFromSystemServer();
}
}
-
- /**
- * Request a recommendation for which network to connect to.
- *
- * <p>The callback will be run on the thread associated with provided {@link Handler}.
- *
- * @param request a {@link RecommendationRequest} instance containing additional
- * request details
- * @param handler a {@link Handler} instance representing the thread to complete the future on.
- * If null the responding binder thread will be used.
- * @return a {@link CompletableFuture} instance that will eventually receive the
- * {@link RecommendationResult}.
- * @throws SecurityException
- * @hide
- */
- public CompletableFuture<RecommendationResult> requestRecommendation(
- final @NonNull RecommendationRequest request,
- final @Nullable Handler handler) {
- Preconditions.checkNotNull(request, "RecommendationRequest cannot be null.");
-
- final CompletableFuture<RecommendationResult> futureResult =
- new CompletableFuture<>();
-
- RemoteCallback remoteCallback = new RemoteCallback(new RemoteCallback.OnResultListener() {
- @Override
- public void onResult(Bundle data) {
- RecommendationResult result = data.getParcelable(EXTRA_RECOMMENDATION_RESULT);
- futureResult.complete(result);
- }
- }, handler);
-
- try {
- mService.requestRecommendationAsync(request, remoteCallback);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
-
- return futureResult;
- }
}
diff --git a/core/java/android/net/RecommendationRequest.aidl b/core/java/android/net/RecommendationRequest.aidl
deleted file mode 100644
index 76497b8..0000000
--- a/core/java/android/net/RecommendationRequest.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2016, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net;
-
-parcelable RecommendationRequest;
diff --git a/core/java/android/net/RecommendationRequest.java b/core/java/android/net/RecommendationRequest.java
index 9f97c5a..45ee3a5 100644
--- a/core/java/android/net/RecommendationRequest.java
+++ b/core/java/android/net/RecommendationRequest.java
@@ -30,6 +30,7 @@
*
* @see {@link NetworkScoreManager#requestRecommendation(RecommendationRequest)}.
* @hide
+ * @deprecated to be removed.
*/
@SystemApi
public final class RecommendationRequest implements Parcelable {
@@ -43,6 +44,7 @@
/**
* Builder class for constructing {@link RecommendationRequest} instances.
* @hide
+ * @deprecated to be removed.
*/
@SystemApi
public static final class Builder {
diff --git a/core/java/android/net/RecommendationResult.aidl b/core/java/android/net/RecommendationResult.aidl
deleted file mode 100644
index f36995b..0000000
--- a/core/java/android/net/RecommendationResult.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2016, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net;
-
-parcelable RecommendationResult;
diff --git a/core/java/android/net/RecommendationResult.java b/core/java/android/net/RecommendationResult.java
index 70cf09c..ce4d83a 100644
--- a/core/java/android/net/RecommendationResult.java
+++ b/core/java/android/net/RecommendationResult.java
@@ -31,6 +31,7 @@
*
* @see {@link NetworkScoreManager#requestRecommendation(RecommendationRequest)}.
* @hide
+ * @deprecated to be removed.
*/
@SystemApi
public final class RecommendationResult implements Parcelable {
diff --git a/core/java/android/os/Bundle.java b/core/java/android/os/Bundle.java
index 167c46d..9b5ff29 100644
--- a/core/java/android/os/Bundle.java
+++ b/core/java/android/os/Bundle.java
@@ -25,7 +25,6 @@
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
-import java.util.UUID;
/**
* A mapping from String keys to various {@link Parcelable} values.
@@ -477,18 +476,6 @@
}
/**
- * Inserts a UUID value into the mapping of this Bundle, replacing
- * any existing value for the given key. Either key or value may be null.
- *
- * @param key a String, or null
- * @param value a UUID object, or null
- */
- public void putUuid(@Nullable String key, @Nullable UUID value) {
- unparcel();
- mMap.put(key, value);
- }
-
- /**
* Inserts an array of Parcelable values into the mapping of this Bundle,
* replacing any existing value for the given key. Either key or value may
* be null.
@@ -871,26 +858,6 @@
* value is explicitly associated with the key.
*
* @param key a String, or null
- * @return a UUID value, or null
- */
- @Nullable
- public UUID getUuid(@Nullable String key) {
- unparcel();
- final Object o = mMap.get(key);
- try {
- return (UUID) o;
- } catch (ClassCastException e) {
- typeWarning(key, o, "UUID", e);
- return null;
- }
- }
-
- /**
- * Returns the value associated with the given key, or null if
- * no mapping of the desired type exists for the given key or a null
- * value is explicitly associated with the key.
- *
- * @param key a String, or null
* @return a Bundle value, or null
*/
@Nullable
diff --git a/core/java/android/os/DropBoxManager.java b/core/java/android/os/DropBoxManager.java
index cb85eef..db84b6f 100644
--- a/core/java/android/os/DropBoxManager.java
+++ b/core/java/android/os/DropBoxManager.java
@@ -16,6 +16,8 @@
package android.os;
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
import android.content.Context;
import android.util.Log;
@@ -67,6 +69,7 @@
* <p class="note">This is a protected intent that can only be sent
* by the system.
*/
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_DROPBOX_ENTRY_ADDED =
"android.intent.action.DROPBOX_ENTRY_ADDED";
diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl
index b715780..037cccf 100644
--- a/core/java/android/os/IPowerManager.aidl
+++ b/core/java/android/os/IPowerManager.aidl
@@ -55,6 +55,7 @@
void rebootSafeMode(boolean confirm, boolean wait);
void shutdown(boolean confirm, String reason, boolean wait);
void crash(String message);
+ int getLastShutdownReason();
void setStayOnSetting(int val);
void boostScreenBrightness(long time);
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index c1647c7..28bdacf 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -50,7 +50,6 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.UUID;
/**
* Container for a message (data and object references) that can
@@ -242,7 +241,6 @@
private static final int VAL_SIZE = 26;
private static final int VAL_SIZEF = 27;
private static final int VAL_DOUBLEARRAY = 28;
- private static final int VAL_UUID = 29;
// The initial int32 in a Binder call's reply Parcel header:
// Keep these in sync with libbinder's binder/Status.h.
@@ -831,15 +829,6 @@
}
/**
- * Flatten a UUID into the parcel at the current dataPosition(),
- * growing dataCapacity() if needed.
- */
- public final void writeUuid(UUID val) {
- writeLong(val.getMostSignificantBits());
- writeLong(val.getLeastSignificantBits());
- }
-
- /**
* Flatten a List into the parcel at the current dataPosition(), growing
* dataCapacity() if needed. The List values are written using
* {@link #writeValue} and must follow the specification there.
@@ -1687,9 +1676,6 @@
} else if (v instanceof double[]) {
writeInt(VAL_DOUBLEARRAY);
writeDoubleArray((double[]) v);
- } else if (v instanceof UUID) {
- writeInt(VAL_UUID);
- writeUuid((UUID) v);
} else {
Class<?> clazz = v.getClass();
if (clazz.isArray() && clazz.getComponentType() == Object.class) {
@@ -2194,13 +2180,6 @@
}
/**
- * Read a UUID from the parcel at the current dataPosition().
- */
- public final UUID readUuid() {
- return new UUID(readLong(), readLong());
- }
-
- /**
* Read and return a byte[] object from the parcel.
*/
public final byte[] createByteArray() {
@@ -2750,9 +2729,6 @@
case VAL_DOUBLEARRAY:
return createDoubleArray();
- case VAL_UUID:
- return readUuid();
-
default:
int off = dataPosition() - 4;
throw new RuntimeException(
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index a713eef..7d1369f 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -16,10 +16,13 @@
package android.os;
+import android.annotation.IntDef;
import android.annotation.SdkConstant;
import android.annotation.SystemApi;
import android.content.Context;
import android.util.Log;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
/**
* This class gives you control of the power state of the device.
@@ -432,6 +435,49 @@
*/
public static final String SHUTDOWN_USER_REQUESTED = "userrequested";
+ /**
+ * @hide
+ */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({
+ SHUTDOWN_REASON_UNKNOWN,
+ SHUTDOWN_REASON_SHUTDOWN,
+ SHUTDOWN_REASON_REBOOT,
+ SHUTDOWN_REASON_USER_REQUESTED,
+ SHUTDOWN_REASON_THERMAL_SHUTDOWN
+ })
+ public @interface ShutdownReason {}
+
+ /**
+ * constant for shutdown reason being unknown.
+ * @hide
+ */
+ public static final int SHUTDOWN_REASON_UNKNOWN = 0;
+
+ /**
+ * constant for shutdown reason being normal shutdown.
+ * @hide
+ */
+ public static final int SHUTDOWN_REASON_SHUTDOWN = 1;
+
+ /**
+ * constant for shutdown reason being reboot.
+ * @hide
+ */
+ public static final int SHUTDOWN_REASON_REBOOT = 2;
+
+ /**
+ * constant for shutdown reason being user requested.
+ * @hide
+ */
+ public static final int SHUTDOWN_REASON_USER_REQUESTED = 3;
+
+ /**
+ * constant for shutdown reason being overheating.
+ * @hide
+ */
+ public static final int SHUTDOWN_REASON_THERMAL_SHUTDOWN = 4;
+
final Context mContext;
final IPowerManager mService;
final Handler mHandler;
@@ -1085,6 +1131,22 @@
}
/**
+ * Returns the reason the phone was last shutdown. Calling app must have the
+ * {@link android.Manifest.permission#DEVICE_POWER} permission to request this information.
+ * @return Reason for shutdown as an int, {@link #SHUTDOWN_REASON_UNKNOWN} if the file could
+ * not be accessed.
+ * @hide
+ */
+ @ShutdownReason
+ public int getLastShutdownReason() {
+ try {
+ return mService.getLastShutdownReason();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Intent that is broadcast when the state of {@link #isPowerSaveMode()} changes.
* This broadcast is only sent to registered receivers.
*/
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index f95a34c..52b2f52 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -64,7 +64,7 @@
*/
public class UserManager {
- private static String TAG = "UserManager";
+ private static final String TAG = "UserManager";
private final IUserManager mService;
private final Context mContext;
@@ -218,6 +218,23 @@
public static final String DISALLOW_BLUETOOTH = "no_bluetooth";
/**
+ * Specifies if outgoing bluetooth sharing is disallowed on the device. Device owner and profile
+ * owner can set this restriction. When it is set by device owner, all users on this device will
+ * be affected.
+ *
+ * <p>Default is <code>true</code> for managed profiles and false for otherwise. When a device
+ * upgrades to {@link android.os.Build.VERSION_CODES#O}, the system sets it for all existing
+ * managed profiles.
+ *
+ * <p>Key for user restrictions.
+ * <p>Type: Boolean
+ * @see DevicePolicyManager#addUserRestriction(ComponentName, String)
+ * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
+ * @see #getUserRestrictions()
+ */
+ public static final String DISALLOW_BLUETOOTH_SHARING = "no_bluetooth_sharing";
+
+ /**
* Specifies if a user is disallowed from transferring files over
* USB. This can only be set by device owners and profile owners on the primary user.
* The default value is <code>false</code>.
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index baa29b0..bd43d6a 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -19,14 +19,18 @@
import static android.net.TrafficStats.GB_IN_BYTES;
import static android.net.TrafficStats.MB_IN_BYTES;
+import android.annotation.BytesLong;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
+import android.annotation.SystemApi;
+import android.annotation.WorkerThread;
import android.app.ActivityThread;
import android.content.ContentResolver;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageMoveObserver;
import android.content.pm.PackageManager;
@@ -135,6 +139,7 @@
* thus it cannot be used to uniquely identify a particular physical device.
*
* @see #getUuidForPath(File)
+ * @see ApplicationInfo#storageUuid
*/
public static final UUID UUID_DEFAULT = UUID
.fromString("41217664-9172-527a-b3d5-edabb50a7d69");
@@ -166,6 +171,7 @@
* @see #ACTION_MANAGE_STORAGE
* @see #UUID_DEFAULT
* @see #getUuidForPath(File)
+ * @see Intent#putExtra(String, java.io.Serializable)
*/
public static final String EXTRA_UUID = "android.os.storage.extra.UUID";
@@ -1414,6 +1420,7 @@
public @NonNull ParcelFileDescriptor openProxyFileDescriptor(
int mode, ProxyFileDescriptorCallback callback, Handler handler, ThreadFactory factory)
throws IOException {
+ Preconditions.checkNotNull(callback);
MetricsLogger.count(mContext, "storage_open_proxy_file_descriptor", 1);
// Retry is needed because the mount point mFuseAppLoop is using may be unmounted before
// invoking StorageManagerService#openProxyFileDescriptor. In this case, we need to re-mount
@@ -1460,19 +1467,7 @@
}
}
- /**
- * Opens seekable ParcelFileDescriptor that routes file operation requests to
- * ProxyFileDescriptorCallback.
- *
- * @param mode The desired access mode, must be one of
- * {@link ParcelFileDescriptor#MODE_READ_ONLY},
- * {@link ParcelFileDescriptor#MODE_WRITE_ONLY}, or
- * {@link ParcelFileDescriptor#MODE_READ_WRITE}
- * @param callback Callback to process file operation requests issued on returned file
- * descriptor.
- * @return Seekable ParcelFileDescriptor.
- * @throws IOException
- */
+ /** {@hide} */
public @NonNull ParcelFileDescriptor openProxyFileDescriptor(
int mode, ProxyFileDescriptorCallback callback)
throws IOException {
@@ -1496,6 +1491,7 @@
public @NonNull ParcelFileDescriptor openProxyFileDescriptor(
int mode, ProxyFileDescriptorCallback callback, Handler handler)
throws IOException {
+ Preconditions.checkNotNull(handler);
return openProxyFileDescriptor(mode, callback, handler, null);
}
@@ -1533,7 +1529,8 @@
* doesn't support cache quotas.
* @see #getCacheSizeBytes(UUID)
*/
- public long getCacheQuotaBytes(@NonNull UUID storageUuid) throws IOException {
+ @WorkerThread
+ public @BytesLong long getCacheQuotaBytes(@NonNull UUID storageUuid) throws IOException {
try {
final ApplicationInfo app = mContext.getApplicationInfo();
return mStorageManager.getCacheQuotaBytes(convert(storageUuid), app.uid);
@@ -1573,7 +1570,8 @@
* doesn't support cache quotas.
* @see #getCacheQuotaBytes(UUID)
*/
- public long getCacheSizeBytes(@NonNull UUID storageUuid) throws IOException {
+ @WorkerThread
+ public @BytesLong long getCacheSizeBytes(@NonNull UUID storageUuid) throws IOException {
try {
final ApplicationInfo app = mContext.getApplicationInfo();
return mStorageManager.getCacheSizeBytes(convert(storageUuid), app.uid);
@@ -1631,8 +1629,10 @@
* @see #getAllocatableBytes(UUID, int)
* @see #allocateBytes(UUID, long, int)
* @see #allocateBytes(FileDescriptor, long, int)
+ * @hide
*/
@RequiresPermission(android.Manifest.permission.ALLOCATE_AGGRESSIVE)
+ @SystemApi
public static final int FLAG_ALLOCATE_AGGRESSIVE = 1;
/** @hide */
@@ -1656,7 +1656,7 @@
* the returned value will fail.
* <p>
* If the returned value is not large enough for the data you'd like to
- * store, you can launch {@link #ACTION_MANAGE_STORAGE} with the
+ * persist, you can launch {@link #ACTION_MANAGE_STORAGE} with the
* {@link #EXTRA_UUID} and {@link #EXTRA_REQUESTED_BYTES} options to help
* involve the user in freeing up disk space.
* <p class="note">
@@ -1670,13 +1670,19 @@
* vary widely depending on the underlying storage device. The
* UUID for a specific path can be obtained using
* {@link #getUuidForPath(File)}.
- * @param flags to apply to the request.
* @return the maximum number of new bytes that the calling app can allocate
* using {@link #allocateBytes(UUID, long, int)} or
* {@link #allocateBytes(FileDescriptor, long, int)}.
* @throws IOException when the storage device isn't present, or when it
* doesn't support allocating space.
*/
+ public @BytesLong long getAllocatableBytes(@NonNull UUID storageUuid)
+ throws IOException {
+ return getAllocatableBytes(storageUuid, 0);
+ }
+
+ /** @hide */
+ @SystemApi
public long getAllocatableBytes(@NonNull UUID storageUuid, @AllocateFlags int flags)
throws IOException {
try {
@@ -1713,14 +1719,20 @@
* allocate disk space. The UUID for a specific path can be
* obtained using {@link #getUuidForPath(File)}.
* @param bytes the number of bytes to allocate.
- * @param flags to apply to the request.
* @throws IOException when the storage device isn't present, or when it
* doesn't support allocating space, or if the device had
* trouble allocating the requested space.
* @see #getAllocatableBytes(UUID, int)
*/
- public void allocateBytes(@NonNull UUID storageUuid, long bytes, @AllocateFlags int flags)
+ public void allocateBytes(@NonNull UUID storageUuid, @BytesLong long bytes)
throws IOException {
+ allocateBytes(storageUuid, bytes, 0);
+ }
+
+ /** @hide */
+ @SystemApi
+ public void allocateBytes(@NonNull UUID storageUuid, @BytesLong long bytes,
+ @AllocateFlags int flags) throws IOException {
try {
mStorageManager.allocateBytes(convert(storageUuid), bytes, flags);
} catch (ParcelableException e) {
@@ -1732,7 +1744,7 @@
/** @removed */
@Deprecated
- public void allocateBytes(@NonNull File path, long bytes, @AllocateFlags int flags)
+ public void allocateBytes(@NonNull File path, @BytesLong long bytes, @AllocateFlags int flags)
throws IOException {
allocateBytes(getUuidForPath(path), bytes, flags);
}
@@ -1756,14 +1768,19 @@
* requested size, it will be extended without modifying any
* existing contents. If the open file is larger than this
* requested size, it will be truncated.
- * @param flags to apply to the request.
* @throws IOException when the storage device isn't present, or when it
* doesn't support allocating space, or if the device had
* trouble allocating the requested space.
* @see #getAllocatableBytes(UUID, int)
* @see Environment#isExternalStorageEmulated(File)
*/
- public void allocateBytes(FileDescriptor fd, long bytes, @AllocateFlags int flags)
+ public void allocateBytes(FileDescriptor fd, @BytesLong long bytes) throws IOException {
+ allocateBytes(fd, bytes, 0);
+ }
+
+ /** @hide */
+ @SystemApi
+ public void allocateBytes(FileDescriptor fd, @BytesLong long bytes, @AllocateFlags int flags)
throws IOException {
final File file = ParcelFileDescriptor.getFile(fd);
for (int i = 0; i < 3; i++) {
diff --git a/core/java/android/preference/Preference.java b/core/java/android/preference/Preference.java
index 7496cb2..2179bd4 100644
--- a/core/java/android/preference/Preference.java
+++ b/core/java/android/preference/Preference.java
@@ -17,8 +17,6 @@
package android.preference;
import android.annotation.CallSuper;
-import com.android.internal.util.CharSequences;
-
import android.annotation.DrawableRes;
import android.annotation.LayoutRes;
import android.annotation.Nullable;
@@ -42,6 +40,8 @@
import android.widget.ListView;
import android.widget.TextView;
+import com.android.internal.util.CharSequences;
+
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@@ -650,7 +650,11 @@
final View imageFrame = view.findViewById(com.android.internal.R.id.icon_frame);
if (imageFrame != null) {
- imageFrame.setVisibility(mIcon != null ? View.VISIBLE : View.GONE);
+ if (mIcon != null) {
+ imageFrame.setVisibility(View.VISIBLE);
+ } else {
+ imageFrame.setVisibility(mIconSpaceReserved ? View.INVISIBLE : View.GONE);
+ }
}
if (mShouldDisableView) {
diff --git a/core/java/android/provider/Contacts.java b/core/java/android/provider/Contacts.java
index b31b295..42d5ce1 100644
--- a/core/java/android/provider/Contacts.java
+++ b/core/java/android/provider/Contacts.java
@@ -18,6 +18,8 @@
import com.android.internal.R;
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
@@ -2164,6 +2166,7 @@
* @deprecated Do not use. This is not supported.
*/
@Deprecated
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String FILTER_CONTACTS_ACTION =
"com.android.contacts.action.FILTER_CONTACTS";
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index b4f19d8..5408e13 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -17,6 +17,8 @@
package android.provider;
import android.accounts.Account;
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi;
import android.app.Activity;
import android.content.BroadcastReceiver;
@@ -8401,6 +8403,7 @@
* Action used to launch the system contacts application and bring up a QuickContact dialog
* for the provided {@link Contacts} entry.
*/
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_QUICK_CONTACT =
"android.provider.action.QUICK_CONTACT";
@@ -8924,6 +8927,7 @@
* @see #METADATA_ACCOUNT_TYPE
* @see #METADATA_MIMETYPE
*/
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_VOICE_SEND_MESSAGE_TO_CONTACTS =
"android.provider.action.VOICE_SEND_MESSAGE_TO_CONTACTS";
diff --git a/graphics/java/android/graphics/fonts/FontRequest.java b/core/java/android/provider/FontRequest.java
similarity index 80%
rename from graphics/java/android/graphics/fonts/FontRequest.java
rename to core/java/android/provider/FontRequest.java
index df3951c..34114bc 100644
--- a/graphics/java/android/graphics/fonts/FontRequest.java
+++ b/core/java/android/provider/FontRequest.java
@@ -13,11 +13,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package android.graphics.fonts;
+package android.provider;
import android.annotation.NonNull;
-import android.os.Parcel;
-import android.os.Parcelable;
import android.util.Base64;
import com.android.internal.util.Preconditions;
@@ -29,7 +27,7 @@
/**
* Information about a font request that may be sent to a Font Provider.
*/
-public final class FontRequest implements Parcelable {
+public final class FontRequest {
private final String mProviderAuthority;
private final String mProviderPackage;
private final String mQuery;
@@ -115,42 +113,6 @@
}
@Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(mProviderAuthority);
- dest.writeString(mProviderPackage);
- dest.writeString(mQuery);
- dest.writeList(mCertificates);
- }
-
- private FontRequest(Parcel in) {
- mProviderAuthority = in.readString();
- mProviderPackage = in.readString();
- mQuery = in.readString();
- mCertificates = new ArrayList<>();
- in.readList(mCertificates, null);
- mIdentifier = new StringBuilder(mProviderAuthority).append("-").append(mProviderPackage)
- .append("-").append(mQuery).toString();
- }
-
- public static final Parcelable.Creator<FontRequest> CREATOR =
- new Parcelable.Creator<FontRequest>() {
- @Override
- public FontRequest createFromParcel(Parcel in) {
- return new FontRequest(in);
- }
-
- @Override
- public FontRequest[] newArray(int size) {
- return new FontRequest[size];
- }
- };
-
- @Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("FontRequest {"
diff --git a/core/java/android/provider/FontsContract.java b/core/java/android/provider/FontsContract.java
index 068628a..f909114 100644
--- a/core/java/android/provider/FontsContract.java
+++ b/core/java/android/provider/FontsContract.java
@@ -15,7 +15,6 @@
*/
package android.provider;
-import static android.graphics.fonts.FontVariationAxis.InvalidFormatException;
import static java.lang.annotation.RetentionPolicy.SOURCE;
import android.annotation.IntDef;
@@ -32,8 +31,6 @@
import android.content.pm.Signature;
import android.database.Cursor;
import android.graphics.Typeface;
-import android.graphics.fonts.FontRequest;
-import android.graphics.fonts.FontResult;
import android.graphics.fonts.FontVariationAxis;
import android.net.Uri;
import android.os.Bundle;
@@ -43,6 +40,7 @@
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.ResultReceiver;
+import android.util.ArraySet;
import android.util.Log;
import android.util.LruCache;
@@ -64,6 +62,13 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
/**
* Utility class to deal with Font ContentProviders.
@@ -104,14 +109,6 @@
*/
public static final String VARIATION_SETTINGS = "font_variation_settings";
/**
- * DO NOT USE THIS COLUMN.
- * This column is kept for preventing demo apps.
- * TODO: Remove once nobody uses this column.
- * @hide
- * @removed
- */
- public static final String STYLE = "font_style";
- /**
* Constant used to request data from a font provider. The cursor returned from the query
* should have this column populated with the int weight for the resulting font. This value
* should be between 100 and 900. The most common values are 400 for regular weight and 700
@@ -158,36 +155,24 @@
public static final int RESULT_CODE_MALFORMED_QUERY = 3;
}
- /**
- * Constant used to identify the List of {@link ParcelFileDescriptor} item in the Bundle
- * returned to the ResultReceiver in getFont.
- * @hide
- */
- public static final String PARCEL_FONT_RESULTS = "font_results";
- // Error codes internal to the system, which can not come from a provider. To keep the number
- // space open for new provider codes, these should all be negative numbers.
- /** @hide */
- public static final int RESULT_CODE_PROVIDER_NOT_FOUND = -1;
- /** @hide */
- public static final int RESULT_CODE_WRONG_CERTIFICATES = -2;
- // Note -3 is used by Typeface to indicate the font failed to load.
+ private static final Object sLock = new Object();
+ @GuardedBy("sLock")
+ private static Handler sHandler;
+ @GuardedBy("sLock")
+ private static HandlerThread sThread;
+ @GuardedBy("sLock")
+ private static Set<String> sInQueueSet;
- private static final int THREAD_RENEWAL_THRESHOLD_MS = 10000;
-
- private final Context mContext;
- private final PackageManager mPackageManager;
- private final Object mLock = new Object();
- @GuardedBy("mLock")
- private Handler mHandler;
- @GuardedBy("mLock")
- private HandlerThread mThread;
+ private volatile static Context sContext; // set once in setApplicationContextForResources
private static final LruCache<String, Typeface> sTypefaceCache = new LruCache<>(16);
+ private FontsContract() {
+ }
+
/** @hide */
- public FontsContract(Context context) {
- mContext = context.getApplicationContext();
- mPackageManager = mContext.getPackageManager();
+ public static void setApplicationContextForResources(Context context) {
+ sContext = context.getApplicationContext();
}
/**
@@ -320,90 +305,100 @@
}
}
+ private static final int THREAD_RENEWAL_THRESHOLD_MS = 10000;
+
+ private static final long SYNC_FONT_FETCH_TIMEOUT_MS = 500;
+
// We use a background thread to post the content resolving work for all requests on. This
// thread should be quit/stopped after all requests are done.
- private final Runnable mReplaceDispatcherThreadRunnable = new Runnable() {
+ // TODO: Factor out to other class. Consider to switch MessageQueue.IdleHandler.
+ private static final Runnable sReplaceDispatcherThreadRunnable = new Runnable() {
@Override
public void run() {
- synchronized (mLock) {
- if (mThread != null) {
- mThread.quitSafely();
- mThread = null;
- mHandler = null;
+ synchronized (sLock) {
+ if (sThread != null) {
+ sThread.quitSafely();
+ sThread = null;
+ sHandler = null;
}
}
}
};
/** @hide */
- public void getFont(FontRequest request, ResultReceiver receiver) {
- synchronized (mLock) {
- if (mHandler == null) {
- mThread = new HandlerThread("fonts", Process.THREAD_PRIORITY_BACKGROUND);
- mThread.start();
- mHandler = new Handler(mThread.getLooper());
- }
- mHandler.post(() -> {
- ProviderInfo providerInfo;
- try {
- providerInfo = getProvider(mPackageManager, request);
- if (providerInfo == null) {
- receiver.send(RESULT_CODE_PROVIDER_NOT_FOUND, null);
- return;
- }
- } catch (PackageManager.NameNotFoundException e) {
- receiver.send(RESULT_CODE_PROVIDER_NOT_FOUND, null);
- return;
- }
- FontInfo[] fonts;
- try {
- fonts = getFontFromProvider(mContext, request, providerInfo.authority,
- null /* cancellation signal */);
- } catch (InvalidFormatException e) {
- receiver.send(RESULT_CODE_PROVIDER_NOT_FOUND, null);
- return;
- }
+ public static Typeface getFontSync(FontRequest request) {
+ final String id = request.getIdentifier();
+ Typeface cachedTypeface = sTypefaceCache.get(id);
+ if (cachedTypeface != null) {
+ return cachedTypeface;
+ }
- ArrayList<FontResult> result = new ArrayList<>();
- int resultCode = -1;
- for (FontInfo font : fonts) {
- try {
- resultCode = font.getResultCode();
- if (resultCode != Columns.RESULT_CODE_OK) {
- if (resultCode < 0) {
- // Negative values are reserved for the internal errors.
- resultCode = Columns.RESULT_CODE_FONT_NOT_FOUND;
- }
- for (int i = 0; i < result.size(); ++i) {
- try {
- result.get(i).getFileDescriptor().close();
- } catch (IOException e) {
- // Ignore, as we are closing fds for cleanup.
- }
- }
- receiver.send(resultCode, null);
- return;
+ // Unfortunately the typeface is not available at this time, but requesting from the font
+ // provider takes too much time. For now, request the font data to ensure it is in the cache
+ // next time and return.
+ synchronized (sLock) {
+ if (sHandler == null) {
+ sThread = new HandlerThread("fonts", Process.THREAD_PRIORITY_BACKGROUND);
+ sThread.start();
+ sHandler = new Handler(sThread.getLooper());
+ }
+ final Lock lock = new ReentrantLock();
+ final Condition cond = lock.newCondition();
+ final AtomicReference<Typeface> holder = new AtomicReference<>();
+ final AtomicBoolean waiting = new AtomicBoolean(true);
+ final AtomicBoolean timeout = new AtomicBoolean(false);
+
+ sHandler.post(() -> {
+ try {
+ FontFamilyResult result = fetchFonts(sContext, null, request);
+ if (result.getStatusCode() == FontFamilyResult.STATUS_OK) {
+ Typeface typeface = buildTypeface(sContext, null, result.getFonts());
+ if (typeface != null) {
+ sTypefaceCache.put(id, typeface);
}
- ParcelFileDescriptor pfd = mContext.getContentResolver().openFileDescriptor(
- font.getUri(), "r");
- result.add(new FontResult(pfd, font.getTtcIndex(),
- FontVariationAxis.toFontVariationSettings(font.getAxes()),
- font.getWeight(), font.isItalic()));
- } catch (FileNotFoundException e) {
- Log.e(TAG, "FileNotFoundException raised when interacting with content "
- + "provider " + providerInfo.authority, e);
+ holder.set(typeface);
+ }
+ } catch (NameNotFoundException e) {
+ // Ignore.
+ }
+ lock.lock();
+ try {
+ if (!timeout.get()) {
+ waiting.set(false);
+ cond.signal();
+ }
+ } finally {
+ lock.unlock();
+ }
+ });
+ sHandler.removeCallbacks(sReplaceDispatcherThreadRunnable);
+ sHandler.postDelayed(sReplaceDispatcherThreadRunnable, THREAD_RENEWAL_THRESHOLD_MS);
+
+ long remaining = TimeUnit.MILLISECONDS.toNanos(SYNC_FONT_FETCH_TIMEOUT_MS);
+ lock.lock();
+ try {
+ if (!waiting.get()) {
+ return holder.get();
+ }
+ for (;;) {
+ try {
+ remaining = cond.awaitNanos(remaining);
+ } catch (InterruptedException e) {
+ // do nothing.
+ }
+ if (!waiting.get()) {
+ return holder.get();
+ }
+ if (remaining <= 0) {
+ timeout.set(true);
+ Log.w(TAG, "Remote font fetch timed out: " +
+ request.getProviderAuthority() + "/" + request.getQuery());
+ return null;
}
}
- if (!result.isEmpty()) {
- Bundle bundle = new Bundle();
- bundle.putParcelableArrayList(PARCEL_FONT_RESULTS, result);
- receiver.send(Columns.RESULT_CODE_OK, bundle);
- return;
- }
- receiver.send(Columns.RESULT_CODE_FONT_NOT_FOUND, null);
- });
- mHandler.removeCallbacks(mReplaceDispatcherThreadRunnable);
- mHandler.postDelayed(mReplaceDispatcherThreadRunnable, THREAD_RENEWAL_THRESHOLD_MS);
+ } finally {
+ lock.unlock();
+ }
}
}
@@ -415,12 +410,12 @@
* Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the given
* provider was not found on the device.
*/
- public static final int FAIL_REASON_PROVIDER_NOT_FOUND = RESULT_CODE_PROVIDER_NOT_FOUND;
+ public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1;
/**
* Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the given
* provider must be authenticated and the given certificates do not match its signature.
*/
- public static final int FAIL_REASON_WRONG_CERTIFICATES = RESULT_CODE_WRONG_CERTIFICATES;
+ public static final int FAIL_REASON_WRONG_CERTIFICATES = -2;
/**
* Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the font
* returned by the provider was not loaded properly.
@@ -452,16 +447,14 @@
public FontRequestCallback() {}
/**
- * Called then a Typeface request done via {@link Typeface#create(FontRequest,
- * FontRequestCallback)} is complete. Note that this method will not be called if
- * {@link #onTypefaceRequestFailed(int)} is called instead.
+ * Called then a Typeface request done via {@link #requestFont} is complete. Note that this
+ * method will not be called if {@link #onTypefaceRequestFailed(int)} is called instead.
* @param typeface The Typeface object retrieved.
*/
public void onTypefaceRetrieved(Typeface typeface) {}
/**
- * Called when a Typeface request done via {@link Typeface#create(FontRequest,
- * FontRequestCallback)} fails.
+ * Called when a Typeface request done via {@link #requestFont}} fails.
* @param reason One of {@link #FAIL_REASON_PROVIDER_NOT_FOUND},
* {@link #FAIL_REASON_FONT_NOT_FOUND},
* {@link #FAIL_REASON_FONT_LOAD_ERROR},
@@ -487,11 +480,15 @@
* @param context A context to be used for fetching from font provider.
* @param request A {@link FontRequest} object that identifies the provider and query for the
* request. May not be null.
- * @param callback A callback that will be triggered when results are obtained. May not be null.
* @param handler A handler to be processed the font fetching.
+ * @param cancellationSignal A signal to cancel the operation in progress, or null if none. If
+ * the operation is canceled, then {@link
+ * android.os.OperationCanceledException} will be thrown.
+ * @param callback A callback that will be triggered when results are obtained. May not be null.
*/
- public static void requestFont(@NonNull Context context, @NonNull FontRequest request,
- @NonNull FontRequestCallback callback, @NonNull Handler handler) {
+ public static void requestFonts(@NonNull Context context, @NonNull FontRequest request,
+ @NonNull Handler handler, @Nullable CancellationSignal cancellationSignal,
+ @NonNull FontRequestCallback callback) {
final Handler callerThreadHandler = new Handler();
final Typeface cachedTypeface = sTypefaceCache.get(request.getIdentifier());
@@ -503,7 +500,7 @@
handler.post(() -> {
FontFamilyResult result;
try {
- result = fetchFonts(context, null /* cancellation signal */, request);
+ result = fetchFonts(context, cancellationSignal, request);
} catch (NameNotFoundException e) {
callerThreadHandler.post(() -> callback.onTypefaceRequestFailed(
FontRequestCallback.FAIL_REASON_PROVIDER_NOT_FOUND));
@@ -558,7 +555,7 @@
}
}
- final Typeface typeface = buildTypeface(context, null /* cancellation signal */, fonts);
+ final Typeface typeface = buildTypeface(context, cancellationSignal, fonts);
if (typeface == null) {
// Something went wrong during reading font files. This happens if the given font
// file is an unsupported font type.
@@ -603,46 +600,12 @@
FontInfo[] fonts = getFontFromProvider(
context, request, providerInfo.authority, cancellationSignal);
return new FontFamilyResult(FontFamilyResult.STATUS_OK, fonts);
- } catch (InvalidFormatException e) {
+ } catch (IllegalArgumentException e) {
return new FontFamilyResult(FontFamilyResult.STATUS_UNEXPECTED_DATA_PROVIDED, null);
}
}
/**
- * Build a Typeface from an array of {@link FontInfo}. Results that are marked as not ready
- * will be skipped.
- *
- * @param context A {@link Context} that will be used to fetch the font contents.
- * @param cancellationSignal A signal to cancel the operation in progress, or null if none. If
- * the operation is canceled, then {@link
- * android.os.OperationCanceledException} will be thrown.
- * @param fonts An array of {@link FontInfo} to be used to create a Typeface.
- * @param weight A weight value to be used for selecting a font from a font family.
- * @param italic {@code true} if this font is of italic style. This will be used for font
- * selection from a font family.
- * @param fallbackFontName A fallback font name used if this method fails to create the
- * Typeface. By passing {@code null}, this method returns {@code null}
- * if typeface creation fails.
- * @return A Typeface object. May return {@code null} if that is the value passed to {@code
- * fallBackFontName}.
- */
- public static Typeface buildTypeface(@NonNull Context context,
- @Nullable CancellationSignal cancellationSignal, @NonNull FontInfo[] fonts,
- int weight, boolean italic, @Nullable String fallbackFontName) {
- if (context.isRestricted()) {
- // TODO: Should we allow if the peer process is system or myself?
- return null;
- }
- final Map<Uri, ByteBuffer> uriBuffer =
- prepareFontData(context, fonts, cancellationSignal);
- return new Typeface.Builder(fonts, uriBuffer)
- .setFallback(fallbackFontName)
- .setWeight(weight)
- .setItalic(italic)
- .build();
- }
-
- /**
* Build a Typeface from an array of {@link FontInfo}
*
* Results that are marked as not ready will be skipped.
@@ -662,6 +625,9 @@
}
final Map<Uri, ByteBuffer> uriBuffer =
prepareFontData(context, fonts, cancellationSignal);
+ if (uriBuffer.isEmpty()) {
+ return null;
+ }
return new Typeface.Builder(fonts, uriBuffer).build();
}
@@ -692,11 +658,17 @@
ByteBuffer buffer = null;
try (final ParcelFileDescriptor pfd =
- resolver.openFileDescriptor(uri, "r", cancellationSignal);
- final FileInputStream fis = new FileInputStream(pfd.getFileDescriptor())) {
- final FileChannel fileChannel = fis.getChannel();
- final long size = fileChannel.size();
- buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, size);
+ resolver.openFileDescriptor(uri, "r", cancellationSignal)) {
+ if (pfd != null) {
+ try (final FileInputStream fis =
+ new FileInputStream(pfd.getFileDescriptor())) {
+ final FileChannel fileChannel = fis.getChannel();
+ final long size = fileChannel.size();
+ buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, size);
+ } catch (IOException e) {
+ // ignore
+ }
+ }
} catch (IOException e) {
// ignore
}
@@ -782,7 +754,7 @@
@VisibleForTesting
public static @NonNull FontInfo[] getFontFromProvider(
Context context, FontRequest request, String authority,
- CancellationSignal cancellationSignal) throws InvalidFormatException {
+ CancellationSignal cancellationSignal) {
ArrayList<FontInfo> result = new ArrayList<>();
final Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
.authority(authority)
@@ -793,7 +765,7 @@
.build();
try (Cursor cursor = context.getContentResolver().query(uri, new String[] { Columns._ID,
Columns.FILE_ID, Columns.TTC_INDEX, Columns.VARIATION_SETTINGS,
- Columns.STYLE, Columns.WEIGHT, Columns.ITALIC, Columns.RESULT_CODE },
+ Columns.WEIGHT, Columns.ITALIC, Columns.RESULT_CODE },
"query = ?", new String[] { request.getQuery() }, null, cancellationSignal);) {
// TODO: Should we restrict the amount of fonts that can be returned?
// TODO: Write documentation explaining that all results should be from the same family.
@@ -806,7 +778,6 @@
final int vsColumnIndex = cursor.getColumnIndex(Columns.VARIATION_SETTINGS);
final int weightColumnIndex = cursor.getColumnIndex(Columns.WEIGHT);
final int italicColumnIndex = cursor.getColumnIndex(Columns.ITALIC);
- final int styleColumnIndex = cursor.getColumnIndex(Columns.STYLE);
while (cursor.moveToNext()) {
int resultCode = resultCodeColumnIndex != -1
? cursor.getInt(resultCodeColumnIndex) : Columns.RESULT_CODE_OK;
@@ -823,17 +794,11 @@
long id = cursor.getLong(fileIdColumnIndex);
fileUri = ContentUris.withAppendedId(fileBaseUri, id);
}
- // TODO: Stop using STYLE column and enforce WEIGHT/ITALIC column.
int weight;
boolean italic;
if (weightColumnIndex != -1 && italicColumnIndex != -1) {
weight = cursor.getInt(weightColumnIndex);
italic = cursor.getInt(italicColumnIndex) == 1;
- } else if (styleColumnIndex != -1) {
- final int style = cursor.getInt(styleColumnIndex);
- weight = (style & Typeface.BOLD) != 0 ?
- Typeface.Builder.BOLD_WEIGHT : Typeface.Builder.NORMAL_WEIGHT;
- italic = (style & Typeface.ITALIC) != 0;
} else {
weight = Typeface.Builder.NORMAL_WEIGHT;
italic = false;
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index 93adf83..13e1e26 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -1498,6 +1498,7 @@
* May also contain the extra EXTRA_MAX_BYTES.
* @see #EXTRA_MAX_BYTES
*/
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String RECORD_SOUND_ACTION =
"android.provider.MediaStore.RECORD_SOUND";
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 0884480..f215ae7 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -724,6 +724,19 @@
"android.settings.APPLICATION_DETAILS_SETTINGS";
/**
+ * Activity Action: Show list of applications that have been running
+ * foreground services (to the user "running in the background").
+ * <p>
+ * Input: Extras "packages" is a string array of package names.
+ * <p>
+ * Output: Nothing.
+ * @hide
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_FOREGROUND_SERVICES_SETTINGS =
+ "android.settings.FOREGROUND_SERVICES_SETTINGS";
+
+ /**
* Activity Action: Show screen for controlling which apps can ignore battery optimizations.
* <p>
* Input: Nothing.
@@ -1398,6 +1411,26 @@
public static final String ACTION_ENTERPRISE_PRIVACY_SETTINGS
= "android.settings.ENTERPRISE_PRIVACY_SETTINGS";
+ /**
+ * Activity Action: Show screen that let user select its Autofill Service.
+ * <p>
+ * Input: Intent's data URI set with an application name, using the
+ * "package" schema (like "package:com.my.app").
+ *
+ * <p>
+ * Output: {@link android.app.Activity#RESULT_OK} if user selected an Autofill Service belonging
+ * to the caller package.
+ *
+ * <p>
+ * <b>NOTE: </b> applications should call
+ * {@link android.view.autofill.AutofillManager#hasEnabledAutofillServices()} and
+ * {@link android.view.autofill.AutofillManager#isAutofillSupported()} first, and only
+ * broadcast this intent if they return {@code false} and {@code true} respectively.
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_REQUEST_SET_AUTOFILL_SERVICE =
+ "android.settings.REQUEST_SET_AUTOFILL_SERVICE";
+
// End of Intent actions for Settings
/**
@@ -5555,76 +5588,6 @@
"high_text_contrast_enabled";
/**
- * If injection of accessibility enhancing JavaScript screen-reader
- * is enabled.
- * <p>
- * Note: The JavaScript based screen-reader is served by the
- * Google infrastructure and enable users with disabilities to
- * efficiently navigate in and explore web content.
- * </p>
- * <p>
- * This property represents a boolean value.
- * </p>
- * @hide
- */
- public static final String ACCESSIBILITY_SCRIPT_INJECTION =
- "accessibility_script_injection";
-
- /**
- * The URL for the injected JavaScript based screen-reader used
- * for providing accessibility of content in WebView.
- * <p>
- * Note: The JavaScript based screen-reader is served by the
- * Google infrastructure and enable users with disabilities to
- * efficiently navigate in and explore web content.
- * </p>
- * <p>
- * This property represents a string value.
- * </p>
- * @hide
- */
- public static final String ACCESSIBILITY_SCREEN_READER_URL =
- "accessibility_script_injection_url";
-
- /**
- * Key bindings for navigation in built-in accessibility support for web content.
- * <p>
- * Note: These key bindings are for the built-in accessibility navigation for
- * web content which is used as a fall back solution if JavaScript in a WebView
- * is not enabled or the user has not opted-in script injection from Google.
- * </p>
- * <p>
- * The bindings are separated by semi-colon. A binding is a mapping from
- * a key to a sequence of actions (for more details look at
- * android.webkit.AccessibilityInjector). A key is represented as the hexademical
- * string representation of an integer obtained from a meta state (optional) shifted
- * sixteen times left and bitwise ored with a key code. An action is represented
- * as a hexademical string representation of an integer where the first two digits
- * are navigation action index, the second, the third, and the fourth digit pairs
- * represent the action arguments. The separate actions in a binding are colon
- * separated. The key and the action sequence it maps to are separated by equals.
- * </p>
- * <p>
- * For example, the binding below maps the DPAD right button to traverse the
- * current navigation axis once without firing an accessibility event and to
- * perform the same traversal again but to fire an event:
- * <code>
- * 0x16=0x01000100:0x01000101;
- * </code>
- * </p>
- * <p>
- * The goal of this binding is to enable dynamic rebinding of keys to
- * navigation actions for web content without requiring a framework change.
- * </p>
- * <p>
- * This property represents a string value.
- * </p>
- * @hide
- */
- public static final String ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS =
- "accessibility_web_content_key_bindings";
-
- /**
* Setting that specifies whether the display magnification is enabled via a system-wide
* triple tap gesture. Display magnifications allows the user to zoom in the display content
* and is targeted to low vision users. The current magnification scale is controlled by
@@ -6672,6 +6635,13 @@
public static final String PAYMENT_SERVICE_SEARCH_URI = "payment_service_search_uri";
/**
+ * This is the query URI for finding a auto fill service to install.
+ *
+ * @hide
+ */
+ public static final String AUTOFILL_SERVICE_SEARCH_URI = "autofill_service_search_uri";
+
+ /**
* If enabled, apps should try to skip any introductory hints on first launch. This might
* apply to users that are already familiar with the environment or temporary users.
* <p>
@@ -6993,9 +6963,8 @@
ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED,
+ AUTOFILL_SERVICE,
ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE,
- ACCESSIBILITY_SCRIPT_INJECTION,
- ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS,
ENABLED_ACCESSIBILITY_SERVICES,
ENABLED_NOTIFICATION_LISTENERS,
ENABLED_VR_LISTENERS,
@@ -7116,6 +7085,12 @@
INSTANT_APP_SETTINGS.add(ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR);
INSTANT_APP_SETTINGS.add(ACCESSIBILITY_CAPTIONING_TYPEFACE);
INSTANT_APP_SETTINGS.add(ACCESSIBILITY_CAPTIONING_FONT_SCALE);
+ INSTANT_APP_SETTINGS.add(ACCESSIBILITY_CAPTIONING_WINDOW_COLOR);
+ INSTANT_APP_SETTINGS.add(ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED);
+ INSTANT_APP_SETTINGS.add(ACCESSIBILITY_DISPLAY_DALTONIZER);
+ INSTANT_APP_SETTINGS.add(ACCESSIBILITY_AUTOCLICK_DELAY);
+ INSTANT_APP_SETTINGS.add(ACCESSIBILITY_AUTOCLICK_ENABLED);
+ INSTANT_APP_SETTINGS.add(ACCESSIBILITY_LARGE_POINTER_ICON);
INSTANT_APP_SETTINGS.add(DEFAULT_INPUT_METHOD);
INSTANT_APP_SETTINGS.add(ENABLED_INPUT_METHODS);
@@ -7762,13 +7737,36 @@
"location_background_throttle_interval_ms";
/**
+ * Most frequent location update interval in milliseconds that proximity alert is allowed
+ * to request.
+ * @hide
+ */
+ public static final String LOCATION_BACKGROUND_THROTTLE_PROXIMITY_ALERT_INTERVAL_MS =
+ "location_background_throttle_proximity_alert_interval_ms";
+
+ /**
* Packages that are whitelisted for background throttling (throttling will not be applied).
* @hide
*/
public static final String LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST =
"location_background_throttle_package_whitelist";
- /**
+ /**
+ * The interval in milliseconds at which wifi scan requests will be throttled when they are
+ * coming from the background.
+ * @hide
+ */
+ public static final String WIFI_SCAN_BACKGROUND_THROTTLE_INTERVAL_MS =
+ "wifi_scan_background_throttle_interval_ms";
+
+ /**
+ * Packages that are whitelisted to be exempt for wifi background throttling.
+ * @hide
+ */
+ public static final String WIFI_SCAN_BACKGROUND_THROTTLE_PACKAGE_WHITELIST =
+ "wifi_scan_background_throttle_package_whitelist";
+
+ /**
* Whether TV will switch to MHL port when a mobile device is plugged in.
* (0 = false, 1 = true)
* @hide
@@ -8352,16 +8350,6 @@
"network_recommendations_package";
/**
- * Value to specify if the Wi-Fi Framework should defer to
- * {@link com.android.server.NetworkScoreService} for evaluating saved open networks.
- *
- * Type: int (0 for false, 1 for true)
- * @hide
- */
- @SystemApi
- public static final String CURATE_SAVED_OPEN_NETWORKS = "curate_saved_open_networks";
-
- /**
* The package name of the application that connect and secures high quality open wifi
* networks automatically.
*
@@ -8376,6 +8364,7 @@
*
* Type: long
* @hide
+ * @deprecated to be removed
*/
public static final String NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS =
"network_recommendation_request_timeout_ms";
@@ -9004,13 +8993,30 @@
* Activity manager specific settings.
* This is encoded as a key=value list, separated by commas. Ex:
*
- * "enforce_bg_check=true,max_cached_processes=24"
+ * "gc_timeout=5000,max_cached_processes=24"
*
* The following keys are supported:
*
* <pre>
- * enforce_bg_check (boolean)
* max_cached_processes (int)
+ * background_settle_time (long)
+ * foreground_service_ui_min_time (long)
+ * content_provider_retain_time (long)
+ * gc_timeout (long)
+ * gc_min_interval (long)
+ * full_pss_min_interval (long)
+ * full_pss_lowered_interval (long)
+ * power_check_delay (long)
+ * wake_lock_min_check_duration (long)
+ * cpu_min_check_duration (long)
+ * service_usage_interaction_time (long)
+ * usage_stats_interaction_interval (long)
+ * service_restart_duration (long)
+ * service_reset_run_duration (long)
+ * service_restart_duration_factor (int)
+ * service_min_restart_time_between (long)
+ * service_max_inactivity (long)
+ * service_bg_start_timeout (long)
* </pre>
*
* <p>
@@ -9877,7 +9883,6 @@
CHARGING_SOUNDS_ENABLED,
USB_MASS_STORAGE_ENABLED,
NETWORK_RECOMMENDATIONS_ENABLED,
- CURATE_SAVED_OPEN_NETWORKS,
WIFI_WAKEUP_ENABLED,
WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
USE_OPEN_WIFI_PACKAGE,
diff --git a/core/java/android/security/IKeystoreService.aidl b/core/java/android/security/IKeystoreService.aidl
index 641e1ad..bfc8636c 100644
--- a/core/java/android/security/IKeystoreService.aidl
+++ b/core/java/android/security/IKeystoreService.aidl
@@ -76,5 +76,6 @@
int onUserAdded(int userId, int parentId);
int onUserRemoved(int userId);
int attestKey(String alias, in KeymasterArguments params, out KeymasterCertificateChain chain);
+ int attestDeviceIds(in KeymasterArguments params, out KeymasterCertificateChain chain);
int onDeviceOffBody();
}
diff --git a/core/java/android/service/autofill/AutofillService.java b/core/java/android/service/autofill/AutofillService.java
index 813c54f..416455d 100644
--- a/core/java/android/service/autofill/AutofillService.java
+++ b/core/java/android/service/autofill/AutofillService.java
@@ -34,11 +34,9 @@
import com.android.internal.os.SomeArgs;
+import java.util.ArrayList;
import java.util.List;
-//TODO(b/33197203): improve javadoc (of both class and methods); in particular, make sure the
-//life-cycle (and how state could be maintained on server-side) is well documented.
-
/**
* Top-level service of the current autofill service for a given user.
*
@@ -50,20 +48,7 @@
/**
* The {@link Intent} that must be declared as handled by the service.
* To be supported, the service must also require the
- * {@link android.Manifest.permission#BIND_AUTO_FILL} permission so
- * that other applications can not abuse it.
- *
- * @hide
- * @deprecated TODO(b/35956626): remove once clients use AutofillService
- */
- @Deprecated
- @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION)
- public static final String OLD_SERVICE_INTERFACE = "android.service.autofill.AutoFillService";
-
- /**
- * The {@link Intent} that must be declared as handled by the service.
- * To be supported, the service must also require the
- * {@link android.Manifest.permission#BIND_AUTOFILL} permission so
+ * {@link android.Manifest.permission#BIND_AUTOFILL_SERVICE} permission so
* that other applications can not abuse it.
*/
@SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION)
@@ -82,18 +67,12 @@
*/
public static final String SERVICE_META_DATA = "android.autofill";
- // Internal extras
- /** @hide */
- public static final String EXTRA_SESSION_ID = "android.service.autofill.extra.SESSION_ID";
-
// Handler messages.
private static final int MSG_CONNECT = 1;
private static final int MSG_DISCONNECT = 2;
private static final int MSG_ON_FILL_REQUEST = 3;
private static final int MSG_ON_SAVE_REQUEST = 4;
- private static final int UNUSED_ARG = -1;
-
private final IAutoFillService mInterface = new IAutoFillService.Stub() {
@Override
public void onConnectedStateChanged(boolean connected) {
@@ -136,7 +115,15 @@
final IFillCallback callback = (IFillCallback) args.arg3;
final FillCallback fillCallback = new FillCallback(callback, request.getId());
args.recycle();
- onFillRequest(request, cancellation, fillCallback);
+ // TODO(b/37563972): temporary try-catch hack to support old method
+ try {
+ onFillRequest(request, cancellation, fillCallback);
+ } catch (AbstractMethodError e) {
+ final ArrayList<FillContext> contexts = request.getFillContexts();
+ onFillRequest(contexts.get(contexts.size() - 1).getStructure(),
+ request.getClientState(), request.getFlags(), cancellation,
+ fillCallback);
+ }
break;
} case MSG_ON_SAVE_REQUEST: {
final SomeArgs args = (SomeArgs) msg.obj;
@@ -144,7 +131,14 @@
final ISaveCallback callback = (ISaveCallback) args.arg2;
final SaveCallback saveCallback = new SaveCallback(callback);
args.recycle();
- onSaveRequest(request, saveCallback);
+ // TODO(b/37563972): temporary try-catch hack to support old method
+ try {
+ onSaveRequest(request, saveCallback);
+ } catch (AbstractMethodError e) {
+ final List<FillContext> contexts = request.getFillContexts();
+ onSaveRequest(contexts.get(contexts.size() - 1).getStructure(),
+ request.getClientState(), saveCallback);
+ }
break;
} case MSG_DISCONNECT: {
onDisconnected();
@@ -170,8 +164,7 @@
@Override
public final IBinder onBind(Intent intent) {
- if (SERVICE_INTERFACE.equals(intent.getAction())
- || OLD_SERVICE_INTERFACE.equals(intent.getAction())) {
+ if (SERVICE_INTERFACE.equals(intent.getAction())) {
return mInterface.asBinder();
}
Log.w(TAG, "Tried to bind to wrong intent: " + intent);
@@ -202,11 +195,8 @@
* handling this fill request in order to save resources.
* @param callback object used to notify the result of the request.
*/
- public void onFillRequest(@NonNull FillRequest request,
- @NonNull CancellationSignal cancellationSignal, @NonNull FillCallback callback) {
- onFillRequest(request.getStructure(), request.getClientState(), request.getFlags(),
- cancellationSignal, callback);
- }
+ public abstract void onFillRequest(@NonNull FillRequest request,
+ @NonNull CancellationSignal cancellationSignal, @NonNull FillCallback callback);
/**
* Called by the Android system do decide if an {@link Activity} can be autofilled by the
@@ -229,11 +219,15 @@
* this to notify you that the fill result is no longer needed and you should stop
* handling this fill request in order to save resources.
* @param callback object used to notify the result of the request.
+ *
+ * @hide
*/
@Deprecated
- public abstract void onFillRequest(@NonNull AssistStructure structure, @Nullable Bundle data,
+ public void onFillRequest(@NonNull AssistStructure structure, @Nullable Bundle data,
int flags, @NonNull CancellationSignal cancellationSignal,
- @NonNull FillCallback callback);
+ @NonNull FillCallback callback) {
+
+ }
/**
* Called when user requests service to save the fields of an {@link Activity}.
@@ -246,11 +240,8 @@
* See {@link FillResponse} for examples of multiple-sections requests.
* @param callback object used to notify the result of the request.
*/
- public void onSaveRequest(@NonNull SaveRequest request, @NonNull SaveCallback callback) {
- final List<FillContext> contexts = request.getFillContexts();
- onSaveRequest(contexts.get(contexts.size() - 1).getStructure(),
- request.getClientState(), callback);
- }
+ public abstract void onSaveRequest(@NonNull SaveRequest request,
+ @NonNull SaveCallback callback);
/**
* Called when user requests service to save the fields of an {@link Activity}.
@@ -267,10 +258,14 @@
* conserve resources.
* See {@link FillResponse} for examples of multiple-sections requests.
* @param callback object used to notify the result of the request.
+ *
+ * @hide
*/
@Deprecated
- public abstract void onSaveRequest(@NonNull AssistStructure structure, @Nullable Bundle data,
- @NonNull SaveCallback callback);
+ public void onSaveRequest(@NonNull AssistStructure structure, @Nullable Bundle data,
+ @NonNull SaveCallback callback) {
+
+ }
/**
* Called when the Android system disconnects from the service.
@@ -280,9 +275,9 @@
public void onDisconnected() {
}
+ /** @hide */
@Deprecated
public final void disableSelf() {
- // TODO(b/33197203): Remove when GCore has migrated off this API
getSystemService(AutofillManager.class).disableOwnedAutofillServices();
}
diff --git a/core/java/android/service/autofill/AutofillServiceInfo.java b/core/java/android/service/autofill/AutofillServiceInfo.java
index 0f4824e..e64eb0d 100644
--- a/core/java/android/service/autofill/AutofillServiceInfo.java
+++ b/core/java/android/service/autofill/AutofillServiceInfo.java
@@ -83,14 +83,19 @@
}
/**
- * Gets the meta-data as a TypedArray, or null if not provided, or throws if invalid.
+ * Gets the meta-data as a {@link TypedArray}, or {@code null} if not provided,
+ * or throws if invalid.
*/
@Nullable
private static TypedArray getMetaDataArray(PackageManager pm, ServiceInfo si) {
// Check for permissions.
- if (!Manifest.permission.BIND_AUTOFILL.equals(si.permission)) {
- Log.e(TAG, "Service does not require permission " + Manifest.permission.BIND_AUTOFILL);
- return null;
+ // TODO(b/37563972): remove support to BIND_AUTOFILL once clients use BIND_AUTOFILL_SERVICE
+ if (!Manifest.permission.BIND_AUTOFILL_SERVICE.equals(si.permission)
+ && !Manifest.permission.BIND_AUTOFILL.equals(si.permission)) {
+ Log.w(TAG, "AutofillService from '" + si.packageName + "' does not require permission "
+ + Manifest.permission.BIND_AUTOFILL_SERVICE);
+ throw new SecurityException("Service does not require permission "
+ + Manifest.permission.BIND_AUTOFILL_SERVICE);
}
// Get the AutoFill metadata, if declared.
diff --git a/core/java/android/service/autofill/Dataset.java b/core/java/android/service/autofill/Dataset.java
index e04fae7..69f3f67 100644
--- a/core/java/android/service/autofill/Dataset.java
+++ b/core/java/android/service/autofill/Dataset.java
@@ -16,7 +16,7 @@
package android.service.autofill;
-import static android.view.autofill.Helper.DEBUG;
+import static android.view.autofill.Helper.sDebug;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -24,7 +24,6 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.view.autofill.AutofillId;
-import android.view.autofill.AutofillManager;
import android.view.autofill.AutofillValue;
import android.widget.RemoteViews;
import com.android.internal.util.Preconditions;
@@ -90,7 +89,7 @@
@Override
public String toString() {
- if (!DEBUG) return super.toString();
+ if (!sDebug) return super.toString();
return new StringBuilder("Dataset " + mId + " [")
.append("fieldIds=").append(mFieldIds)
diff --git a/core/java/android/service/autofill/FillCallback.java b/core/java/android/service/autofill/FillCallback.java
index 7774bdd..105cd38 100644
--- a/core/java/android/service/autofill/FillCallback.java
+++ b/core/java/android/service/autofill/FillCallback.java
@@ -47,8 +47,13 @@
public void onSuccess(@Nullable FillResponse response) {
assertNotCalled();
mCalled = true;
+
+ if (response != null) {
+ response.setRequestId(mRequestId);
+ }
+
try {
- mCallback.onSuccess(response, mRequestId);
+ mCallback.onSuccess(response);
} catch (RemoteException e) {
e.rethrowAsRuntimeException();
}
diff --git a/core/java/android/service/autofill/FillContext.java b/core/java/android/service/autofill/FillContext.java
index 2efa08c..d6616bf 100644
--- a/core/java/android/service/autofill/FillContext.java
+++ b/core/java/android/service/autofill/FillContext.java
@@ -16,6 +16,8 @@
package android.service.autofill;
+import static android.view.autofill.Helper.sDebug;
+
import android.annotation.NonNull;
import android.app.assist.AssistStructure;
import android.os.Bundle;
@@ -71,6 +73,13 @@
}
@Override
+ public String toString() {
+ if (!sDebug) return super.toString();
+
+ return "FillContext [reqId=" + mRequestId + "]";
+ }
+
+ @Override
public int describeContents() {
return 0;
}
diff --git a/core/java/android/service/autofill/FillRequest.java b/core/java/android/service/autofill/FillRequest.java
index aa6db4d..8ac399c 100644
--- a/core/java/android/service/autofill/FillRequest.java
+++ b/core/java/android/service/autofill/FillRequest.java
@@ -19,16 +19,16 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.app.assist.AssistStructure;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.Parcel;
import android.os.Parcelable;
+
import com.android.internal.util.Preconditions;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.ArrayList;
/**
* This class represents a request to an {@link AutofillService autofill provider}
@@ -39,14 +39,15 @@
* @see AutofillService#onFillRequest(FillRequest, CancellationSignal, FillCallback)
*/
public final class FillRequest implements Parcelable {
- private static AtomicInteger sIdCounter = new AtomicInteger();
-
/**
* Indicates autofill was explicitly requested by the user.
*/
public static final int FLAG_MANUAL_REQUEST = 0x1;
/** @hide */
+ public static final int INVALID_REQUEST_ID = Integer.MIN_VALUE;
+
+ /** @hide */
@IntDef(
flag = true,
value = {FLAG_MANUAL_REQUEST})
@@ -55,27 +56,24 @@
private final int mId;
private final @RequestFlags int mFlags;
- private final @NonNull AssistStructure mStructure;
+ private final @NonNull ArrayList<FillContext> mContexts;
private final @Nullable Bundle mClientState;
- /** @hide */
- public FillRequest(@NonNull AssistStructure structure,
- @Nullable Bundle clientState, @RequestFlags int flags) {
- this(sIdCounter.incrementAndGet(), structure, clientState, flags);
- }
-
private FillRequest(@NonNull Parcel parcel) {
mId = parcel.readInt();
- mStructure = parcel.readParcelable(null);
+ mContexts = new ArrayList<>();
+ parcel.readParcelableList(mContexts, null);
+
mClientState = parcel.readBundle();
mFlags = parcel.readInt();
}
- private FillRequest(int id, @NonNull AssistStructure structure,
+ /** @hide */
+ public FillRequest(int id, @NonNull ArrayList<FillContext> contexts,
@Nullable Bundle clientState, @RequestFlags int flags) {
mId = id;
mFlags = Preconditions.checkFlagsArgument(flags, FLAG_MANUAL_REQUEST);
- mStructure = Preconditions.checkNotNull(structure, "structure");
+ mContexts = Preconditions.checkCollectionElementsNotNull(contexts, "contexts");
mClientState = clientState;
}
@@ -96,10 +94,10 @@
}
/**
- * @return The structure capturing the UI state.
+ * @return The contexts associated with each previous fill request.
*/
- public @NonNull AssistStructure getStructure() {
- return mStructure;
+ public @NonNull ArrayList<FillContext> getFillContexts() {
+ return mContexts;
}
/**
@@ -124,7 +122,7 @@
@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeInt(mId);
- parcel.writeParcelable(mStructure, flags);
+ parcel.writeParcelableList(mContexts, flags);
parcel.writeBundle(mClientState);
parcel.writeInt(mFlags);
}
diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java
index 68ce0b5..42c0151 100644
--- a/core/java/android/service/autofill/FillResponse.java
+++ b/core/java/android/service/autofill/FillResponse.java
@@ -16,7 +16,8 @@
package android.service.autofill;
-import static android.view.autofill.Helper.DEBUG;
+import static android.service.autofill.FillRequest.INVALID_REQUEST_ID;
+import static android.view.autofill.Helper.sDebug;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -138,6 +139,7 @@
private final @Nullable IntentSender mAuthentication;
private final @Nullable AutofillId[] mAuthenticationIds;
private final @Nullable AutofillId[] mIgnoredIds;
+ private int mRequestId;
private FillResponse(@NonNull Builder builder) {
mDatasets = builder.mDatasets;
@@ -147,6 +149,7 @@
mAuthentication = builder.mAuthentication;
mAuthenticationIds = builder.mAuthenticationIds;
mIgnoredIds = builder.mIgnoredIds;
+ mRequestId = INVALID_REQUEST_ID;
}
/** @hide */
@@ -185,6 +188,24 @@
}
/**
+ * Associates a {@link FillResponse} to a request.
+ *
+ * <p>Set inside of the {@link FillCallback} code, not the {@link AutofillService}.
+ *
+ * @param requestId The id of the request to associate the response to.
+ *
+ * @hide
+ */
+ public void setRequestId(int requestId) {
+ mRequestId = requestId;
+ }
+
+ /** @hide */
+ public int getRequestId() {
+ return mRequestId;
+ }
+
+ /**
* Builder for {@link FillResponse} objects. You must to provide at least
* one dataset or set an authentication intent with a presentation view.
*/
@@ -242,7 +263,7 @@
public @NonNull Builder setAuthentication(@NonNull AutofillId[] ids,
@Nullable IntentSender authentication, @Nullable RemoteViews presentation) {
throwIfDestroyed();
- // TODO(b/33197203): assert ids is not null nor empty once old version is removed
+ // TODO(b/37424539): assert ids is not null nor empty once old version is removed
if (authentication == null ^ presentation == null) {
throw new IllegalArgumentException("authentication and presentation"
+ " must be both non-null or null");
@@ -254,7 +275,7 @@
}
/**
- * TODO(b/33197203): will be removed once clients use the version that takes ids
+ * TODO(b/37424539): will be removed once clients use the version that takes ids
* @hide
* @deprecated
*/
@@ -311,6 +332,7 @@
/**
* @deprecated Use {@link #setClientState(Bundle)} instead.
+ * @hide
*/
@Deprecated
public Builder setExtras(@Nullable Bundle extras) {
@@ -372,10 +394,11 @@
/////////////////////////////////////
@Override
public String toString() {
- if (!DEBUG) return super.toString();
+ if (!sDebug) return super.toString();
return new StringBuilder(
- "FillResponse: [datasets=").append(mDatasets)
+ "FillResponse : [mRequestId=" + mRequestId)
+ .append(", datasets=").append(mDatasets)
.append(", saveInfo=").append(mSaveInfo)
.append(", clientState=").append(mClientState != null)
.append(", hasPresentation=").append(mPresentation != null)
@@ -384,6 +407,7 @@
? mAuthenticationIds.length : "N/A")
.append(", ignoredIdsSize=").append(mIgnoredIds != null
? mIgnoredIds.length : "N/A")
+ .append("]")
.toString();
}
@@ -405,6 +429,7 @@
parcel.writeParcelable(mAuthentication, flags);
parcel.writeParcelable(mPresentation, flags);
parcel.writeParcelableArray(mIgnoredIds, flags);
+ parcel.writeInt(mRequestId);
}
public static final Parcelable.Creator<FillResponse> CREATOR =
@@ -425,7 +450,11 @@
builder.setAuthentication(parcel.readParcelableArray(null, AutofillId.class),
parcel.readParcelable(null), parcel.readParcelable(null));
builder.setIgnoredIds(parcel.readParcelableArray(null, AutofillId.class));
- return builder.build();
+ final FillResponse response = builder.build();
+
+ response.setRequestId(parcel.readInt());
+
+ return response;
}
@Override
diff --git a/core/java/android/service/autofill/IFillCallback.aidl b/core/java/android/service/autofill/IFillCallback.aidl
index 688ac84..2bb3e9a 100644
--- a/core/java/android/service/autofill/IFillCallback.aidl
+++ b/core/java/android/service/autofill/IFillCallback.aidl
@@ -27,6 +27,6 @@
*/
interface IFillCallback {
void onCancellable(in ICancellationSignal cancellation);
- void onSuccess(in FillResponse response, int requestId);
+ void onSuccess(in FillResponse response);
void onFailure(CharSequence message);
}
diff --git a/core/java/android/service/autofill/SaveInfo.java b/core/java/android/service/autofill/SaveInfo.java
index 3a1529f..277c622 100644
--- a/core/java/android/service/autofill/SaveInfo.java
+++ b/core/java/android/service/autofill/SaveInfo.java
@@ -16,7 +16,7 @@
package android.service.autofill;
-import static android.view.autofill.Helper.DEBUG;
+import static android.view.autofill.Helper.sDebug;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -139,6 +139,33 @@
*/
public static final int SAVE_DATA_TYPE_EMAIL_ADDRESS = 0x10;
+ /**
+ * Style for the negative button of the save UI to cancel the
+ * save operation. In this case, the user tapping the negative
+ * button signals that they would prefer to not save the filled
+ * content.
+ */
+ public static final int NEGATIVE_BUTTON_STYLE_CANCEL = 0;
+
+ /**
+ * Style for the negative button of the save UI to reject the
+ * save operation. This could be useful if the user needs to
+ * opt-in your service and the save prompt is an advertisement
+ * of the potential value you can add to the user. In this
+ * case, the user tapping the negative button sends a strong
+ * signal that the feature may not be useful and you may
+ * consider some backoff strategy.
+ */
+ public static final int NEGATIVE_BUTTON_STYLE_REJECT = 1;
+
+ /** @hide */
+ @IntDef(
+ value = {
+ NEGATIVE_BUTTON_STYLE_CANCEL,
+ NEGATIVE_BUTTON_STYLE_REJECT})
+ @Retention(RetentionPolicy.SOURCE)
+ @interface NegativeButtonStyle{}
+
/** @hide */
@IntDef(
flag = true,
@@ -166,7 +193,7 @@
@interface SaveInfoFlags{}
private final @SaveDataType int mType;
- private final CharSequence mNegativeActionTitle;
+ private final @NegativeButtonStyle int mNegativeButtonStyle;
private final IntentSender mNegativeActionListener;
private final AutofillId[] mRequiredIds;
private final AutofillId[] mOptionalIds;
@@ -175,7 +202,7 @@
private SaveInfo(Builder builder) {
mType = builder.mType;
- mNegativeActionTitle = builder.mNegativeActionTitle;
+ mNegativeButtonStyle = builder.mNegativeButtonStyle;
mNegativeActionListener = builder.mNegativeActionListener;
mRequiredIds = builder.mRequiredIds;
mOptionalIds = builder.mOptionalIds;
@@ -184,8 +211,8 @@
}
/** @hide */
- public @Nullable CharSequence getNegativeActionTitle() {
- return mNegativeActionTitle;
+ public @NegativeButtonStyle int getNegativeActionStyle() {
+ return mNegativeButtonStyle;
}
/** @hide */
@@ -224,7 +251,7 @@
public static final class Builder {
private final @SaveDataType int mType;
- private CharSequence mNegativeActionTitle;
+ private @NegativeButtonStyle int mNegativeButtonStyle = NEGATIVE_BUTTON_STYLE_CANCEL;
private IntentSender mNegativeActionListener;
private final AutofillId[] mRequiredIds;
private AutofillId[] mOptionalIds;
@@ -298,38 +325,42 @@
return this;
}
- /**
- * Sets the title and listener for the negative save action.
- *
- * <p>This allows a fill-provider to customize the text and be
- * notified when the user selects the negative action in the save
- * UI. Note that selecting the negative action regardless of its text
- * and listener being customized would dismiss the save UI and if a
- * custom listener intent is provided then this intent will be
- * started.</p>
- *
- * <p>This customization could be useful for providing additional
- * semantics to the negative action. For example, a fill-provider
- * can use this mechanism to add a "Disable" function or a "More info"
- * function, etc. Note that the save action is exclusively controlled
- * by the platform to ensure user consent is collected to release
- * data from the filled app to the fill-provider.</p>
- *
- * @param title The action title.
- * @param listener The action listener.
- * @return This builder.
- *
- * @throws IllegalArgumentException If the title and the listener
- * are not both either null or non-null.
- */
+ /** @hide */
+ // TODO (b/37563972): Remove when callers migrate
public @NonNull Builder setNegativeAction(@Nullable CharSequence title,
@Nullable IntentSender listener) {
throwIfDestroyed();
- if (title == null ^ listener == null) {
- throw new IllegalArgumentException("title and listener"
- + " must be both non-null or null");
+ setNegativeAction(NEGATIVE_BUTTON_STYLE_CANCEL, listener);
+ return this;
+ }
+
+ /**
+ * Sets the style and listener for the negative save action.
+ *
+ * <p>This allows a fill-provider to customize the style and be
+ * notified when the user selects the negative action in the save
+ * UI. Note that selecting the negative action regardless of its style
+ * and listener being customized would dismiss the save UI and if a
+ * custom listener intent is provided then this intent will be
+ * started. The default style is {@link #NEGATIVE_BUTTON_STYLE_CANCEL}</p>
+ *
+ * @param style The action style.
+ * @param listener The action listener.
+ * @return This builder.
+ *
+ * @see #NEGATIVE_BUTTON_STYLE_CANCEL
+ * @see #NEGATIVE_BUTTON_STYLE_REJECT
+ *
+ * @throws IllegalArgumentException If the style is invalid
+ */
+ public @NonNull Builder setNegativeAction(@NegativeButtonStyle int style,
+ @Nullable IntentSender listener) {
+ throwIfDestroyed();
+ if (style != NEGATIVE_BUTTON_STYLE_CANCEL
+ && style != NEGATIVE_BUTTON_STYLE_REJECT) {
+ throw new IllegalArgumentException("Invalid style: " + style);
}
- mNegativeActionTitle = title;
+ mNegativeButtonStyle = style;
mNegativeActionListener = listener;
return this;
}
@@ -356,13 +387,15 @@
/////////////////////////////////////
@Override
public String toString() {
- if (!DEBUG) return super.toString();
+ if (!sDebug) return super.toString();
return new StringBuilder("SaveInfo: [type=")
.append(DebugUtils.flagsToString(SaveInfo.class, "SAVE_DATA_TYPE_", mType))
.append(", requiredIds=").append(Arrays.toString(mRequiredIds))
.append(", optionalIds=").append(Arrays.toString(mOptionalIds))
.append(", description=").append(mDescription)
+ .append(DebugUtils.flagsToString(SaveInfo.class, "NEGATIVE_BUTTON_STYLE_",
+ mNegativeButtonStyle))
.append(", mFlags=").append(mFlags)
.append("]").toString();
}
@@ -380,7 +413,7 @@
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeInt(mType);
parcel.writeParcelableArray(mRequiredIds, flags);
- parcel.writeCharSequence(mNegativeActionTitle);
+ parcel.writeInt(mNegativeButtonStyle);
parcel.writeParcelable(mNegativeActionListener, flags);
parcel.writeParcelableArray(mOptionalIds, flags);
parcel.writeCharSequence(mDescription);
@@ -395,7 +428,7 @@
// using specially crafted parcels.
final Builder builder = new Builder(parcel.readInt(),
parcel.readParcelableArray(null, AutofillId.class));
- builder.setNegativeAction(parcel.readCharSequence(), parcel.readParcelable(null));
+ builder.setNegativeAction(parcel.readInt(), parcel.readParcelable(null));
builder.setOptionalIds(parcel.readParcelableArray(null, AutofillId.class));
builder.setDescription(parcel.readCharSequence());
builder.setFlags(parcel.readInt());
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index 00bd304..76c96bd 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -1094,9 +1094,9 @@
/**
* Request that the service be unbound.
*
- * <p>This will no longer receive updates until
- * {@link #requestRebind(ComponentName)} is called.
- * The service will likely be kiled by the system after this call.
+ * <p>Once this is called, you will no longer receive updates and no method calls are
+ * guaranteed to be successful, until you next receive the {@link #onListenerConnected()} event.
+ * The service will likely be killed by the system after this call.
*
* <p>The service should wait for the {@link #onListenerConnected()} event
* before performing this operation. I know it's tempting, but you must wait.
diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java
index 6a24aa4..31b2dcc 100644
--- a/core/java/android/service/notification/StatusBarNotification.java
+++ b/core/java/android/service/notification/StatusBarNotification.java
@@ -133,7 +133,7 @@
}
return user.getIdentifier() + "|" + pkg + "|" +
(group == null
- ? "c:" + notification.getChannel()
+ ? "c:" + notification.getChannelId()
: "g:" + group);
}
diff --git a/core/java/android/service/quicksettings/TileService.java b/core/java/android/service/quicksettings/TileService.java
index 56b267f..c35423f 100644
--- a/core/java/android/service/quicksettings/TileService.java
+++ b/core/java/android/service/quicksettings/TileService.java
@@ -80,8 +80,13 @@
public class TileService extends Service {
/**
- * An activity that provides a user interface for adjusting TileService preferences.
- * Optional but recommended for apps that implement a TileService.
+ * An activity that provides a user interface for adjusting TileService
+ * preferences. Optional but recommended for apps that implement a
+ * TileService.
+ * <p>
+ * This intent may also define a {@link Intent#EXTRA_COMPONENT_NAME} value
+ * to indicate the {@link ComponentName} that caused the preferences to be
+ * opened.
*/
@SdkConstant(SdkConstantType.INTENT_CATEGORY)
public static final String ACTION_QS_TILE_PREFERENCES
@@ -130,13 +135,6 @@
public static final String EXTRA_TOKEN = "token";
/**
- * May be included when {@link #ACTION_QS_TILE_PREFERENCES} is launched from a tile.
- * This extra may contain the {@link ComponentName} of the tile that triggered
- * the preferences to be opened.
- */
- public static final String EXTRA_COMPONENT = "android.service.quicksettings.extra.COMPONENT";
-
- /**
* @hide
*/
public static final String EXTRA_STATE = "state";
@@ -445,7 +443,7 @@
*/
public static final void requestListeningState(Context context, ComponentName component) {
Intent intent = new Intent(ACTION_REQUEST_LISTENING);
- intent.putExtra(EXTRA_COMPONENT, component);
+ intent.putExtra(Intent.EXTRA_COMPONENT_NAME, component);
intent.setPackage("com.android.systemui");
context.sendBroadcast(intent, Manifest.permission.BIND_QUICK_SETTINGS_TILE);
}
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 98780a7..6bbb0ff 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -16,8 +16,6 @@
package android.service.wallpaper;
-import android.annotation.Nullable;
-import android.app.WallpaperColors;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.util.MergedConfiguration;
@@ -544,24 +542,6 @@
*/
public void onSurfaceDestroyed(SurfaceHolder holder) {
}
-
- /**
- * Notifies the engine that wallpaper colors changed significantly.
- * This will trigger a {@link #onComputeWallpaperColors()} call.
- */
- public void invalidateColors() {
- }
-
- /**
- * Notifies the system about what colors the wallpaper is using.
- * You might return null if no color information is available at the moment. In that case
- * you might want to call {@link #invalidateColors()} in a near future.
- *
- * @return List of wallpaper colors and their weights.
- */
- public @Nullable WallpaperColors onComputeWallpaperColors() {
- return null;
- }
protected void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) {
out.print(prefix); out.print("mInitializing="); out.print(mInitializing);
diff --git a/core/java/android/util/ArrayMap.java b/core/java/android/util/ArrayMap.java
index 92a5803..d51a13f 100644
--- a/core/java/android/util/ArrayMap.java
+++ b/core/java/android/util/ArrayMap.java
@@ -19,6 +19,7 @@
import libcore.util.EmptyArray;
import java.util.Collection;
+import java.util.ConcurrentModificationException;
import java.util.Map;
import java.util.Set;
@@ -49,6 +50,18 @@
private static final String TAG = "ArrayMap";
/**
+ * Attempt to spot concurrent modifications to this data structure.
+ *
+ * It's best-effort, but any time we can throw something more diagnostic than an
+ * ArrayIndexOutOfBoundsException deep in the ArrayMap internals it's going to
+ * save a lot of development time.
+ *
+ * Good times to look for CME include after any allocArrays() call and at the end of
+ * functions that change mSize (put/remove/clear).
+ */
+ private static final boolean CONCURRENT_MODIFICATION_EXCEPTIONS = true;
+
+ /**
* The minimum amount by which the capacity of a ArrayMap will increase.
* This is tuned to be relatively space-efficient.
*/
@@ -86,6 +99,18 @@
int mSize;
MapCollections<K, V> mCollections;
+ private static int binarySearchHashes(int[] hashes, int N, int hash) {
+ try {
+ return ContainerHelpers.binarySearch(hashes, N, hash);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ if (CONCURRENT_MODIFICATION_EXCEPTIONS) {
+ throw new ConcurrentModificationException();
+ } else {
+ throw e; // the cache is poisoned at this point, there's not much we can do
+ }
+ }
+ }
+
int indexOf(Object key, int hash) {
final int N = mSize;
@@ -94,7 +119,7 @@
return ~0;
}
- int index = ContainerHelpers.binarySearch(mHashes, N, hash);
+ int index = binarySearchHashes(mHashes, N, hash);
// If the hash code wasn't found, then we have no entry for this key.
if (index < 0) {
@@ -132,7 +157,7 @@
return ~0;
}
- int index = ContainerHelpers.binarySearch(mHashes, N, 0);
+ int index = binarySearchHashes(mHashes, N, 0);
// If the hash code wasn't found, then we have no entry for this key.
if (index < 0) {
@@ -282,10 +307,16 @@
@Override
public void clear() {
if (mSize > 0) {
- freeArrays(mHashes, mArray, mSize);
+ final int[] ohashes = mHashes;
+ final Object[] oarray = mArray;
+ final int osize = mSize;
mHashes = EmptyArray.INT;
mArray = EmptyArray.OBJECT;
mSize = 0;
+ freeArrays(ohashes, oarray, osize);
+ }
+ if (CONCURRENT_MODIFICATION_EXCEPTIONS && mSize > 0) {
+ throw new ConcurrentModificationException();
}
}
@@ -309,15 +340,19 @@
* items.
*/
public void ensureCapacity(int minimumCapacity) {
+ final int osize = mSize;
if (mHashes.length < minimumCapacity) {
final int[] ohashes = mHashes;
final Object[] oarray = mArray;
allocArrays(minimumCapacity);
if (mSize > 0) {
- System.arraycopy(ohashes, 0, mHashes, 0, mSize);
- System.arraycopy(oarray, 0, mArray, 0, mSize<<1);
+ System.arraycopy(ohashes, 0, mHashes, 0, osize);
+ System.arraycopy(oarray, 0, mArray, 0, osize<<1);
}
- freeArrays(ohashes, oarray, mSize);
+ freeArrays(ohashes, oarray, osize);
+ }
+ if (CONCURRENT_MODIFICATION_EXCEPTIONS && mSize != osize) {
+ throw new ConcurrentModificationException();
}
}
@@ -435,6 +470,7 @@
*/
@Override
public V put(K key, V value) {
+ final int osize = mSize;
final int hash;
int index;
if (key == null) {
@@ -452,9 +488,9 @@
}
index = ~index;
- if (mSize >= mHashes.length) {
- final int n = mSize >= (BASE_SIZE*2) ? (mSize+(mSize>>1))
- : (mSize >= BASE_SIZE ? (BASE_SIZE*2) : BASE_SIZE);
+ if (osize >= mHashes.length) {
+ final int n = osize >= (BASE_SIZE*2) ? (osize+(osize>>1))
+ : (osize >= BASE_SIZE ? (BASE_SIZE*2) : BASE_SIZE);
if (DEBUG) Log.d(TAG, "put: grow from " + mHashes.length + " to " + n);
@@ -462,22 +498,31 @@
final Object[] oarray = mArray;
allocArrays(n);
+ if (CONCURRENT_MODIFICATION_EXCEPTIONS && osize != mSize) {
+ throw new ConcurrentModificationException();
+ }
+
if (mHashes.length > 0) {
- if (DEBUG) Log.d(TAG, "put: copy 0-" + mSize + " to 0");
+ if (DEBUG) Log.d(TAG, "put: copy 0-" + osize + " to 0");
System.arraycopy(ohashes, 0, mHashes, 0, ohashes.length);
System.arraycopy(oarray, 0, mArray, 0, oarray.length);
}
- freeArrays(ohashes, oarray, mSize);
+ freeArrays(ohashes, oarray, osize);
}
- if (index < mSize) {
- if (DEBUG) Log.d(TAG, "put: move " + index + "-" + (mSize-index)
+ if (index < osize) {
+ if (DEBUG) Log.d(TAG, "put: move " + index + "-" + (osize-index)
+ " to " + (index+1));
- System.arraycopy(mHashes, index, mHashes, index + 1, mSize - index);
+ System.arraycopy(mHashes, index, mHashes, index + 1, osize - index);
System.arraycopy(mArray, index << 1, mArray, (index + 1) << 1, (mSize - index) << 1);
}
+ if (CONCURRENT_MODIFICATION_EXCEPTIONS) {
+ if (osize != mSize || index >= mHashes.length) {
+ throw new ConcurrentModificationException();
+ }
+ }
mHashes[index] = hash;
mArray[index<<1] = key;
mArray[(index<<1)+1] = value;
@@ -594,19 +639,22 @@
*/
public V removeAt(int index) {
final Object old = mArray[(index << 1) + 1];
- if (mSize <= 1) {
+ final int osize = mSize;
+ final int nsize;
+ if (osize <= 1) {
// Now empty.
if (DEBUG) Log.d(TAG, "remove: shrink from " + mHashes.length + " to 0");
- freeArrays(mHashes, mArray, mSize);
+ freeArrays(mHashes, mArray, osize);
mHashes = EmptyArray.INT;
mArray = EmptyArray.OBJECT;
- mSize = 0;
+ nsize = 0;
} else {
+ nsize = osize - 1;
if (mHashes.length > (BASE_SIZE*2) && mSize < mHashes.length/3) {
// Shrunk enough to reduce size of arrays. We don't allow it to
// shrink smaller than (BASE_SIZE*2) to avoid flapping between
// that and BASE_SIZE.
- final int n = mSize > (BASE_SIZE*2) ? (mSize + (mSize>>1)) : (BASE_SIZE*2);
+ final int n = osize > (BASE_SIZE*2) ? (osize + (osize>>1)) : (BASE_SIZE*2);
if (DEBUG) Log.d(TAG, "remove: shrink from " + mHashes.length + " to " + n);
@@ -614,32 +662,38 @@
final Object[] oarray = mArray;
allocArrays(n);
- mSize--;
+ if (CONCURRENT_MODIFICATION_EXCEPTIONS && osize != mSize) {
+ throw new ConcurrentModificationException();
+ }
+
if (index > 0) {
if (DEBUG) Log.d(TAG, "remove: copy from 0-" + index + " to 0");
System.arraycopy(ohashes, 0, mHashes, 0, index);
System.arraycopy(oarray, 0, mArray, 0, index << 1);
}
- if (index < mSize) {
- if (DEBUG) Log.d(TAG, "remove: copy from " + (index+1) + "-" + mSize
+ if (index < nsize) {
+ if (DEBUG) Log.d(TAG, "remove: copy from " + (index+1) + "-" + nsize
+ " to " + index);
- System.arraycopy(ohashes, index + 1, mHashes, index, mSize - index);
+ System.arraycopy(ohashes, index + 1, mHashes, index, nsize - index);
System.arraycopy(oarray, (index + 1) << 1, mArray, index << 1,
- (mSize - index) << 1);
+ (nsize - index) << 1);
}
} else {
- mSize--;
- if (index < mSize) {
- if (DEBUG) Log.d(TAG, "remove: move " + (index+1) + "-" + mSize
+ if (index < nsize) {
+ if (DEBUG) Log.d(TAG, "remove: move " + (index+1) + "-" + nsize
+ " to " + index);
- System.arraycopy(mHashes, index + 1, mHashes, index, mSize - index);
+ System.arraycopy(mHashes, index + 1, mHashes, index, nsize - index);
System.arraycopy(mArray, (index + 1) << 1, mArray, index << 1,
- (mSize - index) << 1);
+ (nsize - index) << 1);
}
- mArray[mSize << 1] = null;
- mArray[(mSize << 1) + 1] = null;
+ mArray[nsize << 1] = null;
+ mArray[(nsize << 1) + 1] = null;
}
}
+ if (CONCURRENT_MODIFICATION_EXCEPTIONS && osize != mSize) {
+ throw new ConcurrentModificationException();
+ }
+ mSize = nsize;
return (V)old;
}
diff --git a/core/java/android/util/EventLog.java b/core/java/android/util/EventLog.java
index 6d4281b..92f218b 100644
--- a/core/java/android/util/EventLog.java
+++ b/core/java/android/util/EventLog.java
@@ -68,6 +68,7 @@
private static final int THREAD_OFFSET = 8;
private static final int SECONDS_OFFSET = 12;
private static final int NANOSECONDS_OFFSET = 16;
+ private static final int UID_OFFSET = 24;
// Layout for event log v1 format, v2 and v3 use HEADER_SIZE_OFFSET
private static final int V1_PAYLOAD_START = 20;
@@ -91,6 +92,20 @@
return mBuffer.getInt(PROCESS_OFFSET);
}
+ /**
+ * @return the UID which wrote the log entry
+ * @hide
+ */
+ @SystemApi
+ public int getUid() {
+ try {
+ return mBuffer.getInt(UID_OFFSET);
+ } catch (IndexOutOfBoundsException e) {
+ // buffer won't contain the UID if the caller doesn't have permission.
+ return -1;
+ }
+ }
+
/** @return the thread ID which wrote the log entry */
public int getThreadId() {
return mBuffer.getInt(THREAD_OFFSET);
diff --git a/core/java/android/util/MergedConfiguration.java b/core/java/android/util/MergedConfiguration.java
index d94af8a..68d0309 100644
--- a/core/java/android/util/MergedConfiguration.java
+++ b/core/java/android/util/MergedConfiguration.java
@@ -21,6 +21,8 @@
import android.os.Parcel;
import android.os.Parcelable;
+import java.io.PrintWriter;
+
/**
* Container that holds global and override config and their merge product.
* Merged configuration updates automatically whenever global or override configs are updated via
@@ -41,6 +43,10 @@
setConfiguration(globalConfig, overrideConfig);
}
+ public MergedConfiguration(Configuration globalConfig) {
+ setGlobalConfiguration(globalConfig);
+ }
+
public MergedConfiguration(MergedConfiguration mergedConfiguration) {
setConfiguration(mergedConfiguration.getGlobalConfiguration(),
mergedConfiguration.getOverrideConfiguration());
@@ -93,6 +99,36 @@
}
/**
+ * Update global configurations.
+ * Merged configuration will automatically be updated.
+ * @param globalConfig New global configuration.
+ */
+ public void setGlobalConfiguration(Configuration globalConfig) {
+ mGlobalConfig.setTo(globalConfig);
+ updateMergedConfig();
+ }
+
+ /**
+ * Update override configurations.
+ * Merged configuration will automatically be updated.
+ * @param overrideConfig New override configuration.
+ */
+ public void setOverrideConfiguration(Configuration overrideConfig) {
+ mOverrideConfig.setTo(overrideConfig);
+ updateMergedConfig();
+ }
+
+ public void setTo(MergedConfiguration config) {
+ setConfiguration(config.mGlobalConfig, config.mOverrideConfig);
+ }
+
+ public void unset() {
+ mGlobalConfig.unset();
+ mOverrideConfig.unset();
+ updateMergedConfig();
+ }
+
+ /**
* @return Stored global configuration value.
*/
@NonNull
@@ -119,4 +155,14 @@
mMergedConfig.setTo(mGlobalConfig);
mMergedConfig.updateFrom(mOverrideConfig);
}
+
+ @Override
+ public String toString() {
+ return "{mGlobalConfig=" + mGlobalConfig + " mOverrideConfig=" + mOverrideConfig + "}";
+ }
+
+ public void dump(PrintWriter pw, String prefix) {
+ pw.println(prefix + "mGlobalConfig=" + mGlobalConfig);
+ pw.println(prefix + "mOverrideConfig=" + mOverrideConfig);
+ }
}
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 9d40895..f539752 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -711,6 +711,10 @@
mTranslator.translateRectInAppWindowToScreen(mScreenRect);
}
+ if (mSurfaceControl == null) {
+ return;
+ }
+
if (!isHardwareAccelerated() || !mRtHandlingPositionUpdates) {
try {
if (DEBUG) Log.d(TAG, String.format("%d updateSurfacePosition UI, " +
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index bcf0b90..39f1170 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -100,6 +100,7 @@
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Transformation;
+import android.view.autofill.AutofillId;
import android.view.autofill.AutofillManager;
import android.view.autofill.AutofillValue;
import android.view.inputmethod.EditorInfo;
@@ -804,6 +805,14 @@
public static final int LAST_APP_ACCESSIBILITY_ID = Integer.MAX_VALUE / 2;
/**
+ * Attribute to find the autofilled highlight
+ *
+ * @see #getAutofilledDrawable()
+ */
+ private static final int[] AUTOFILL_HIGHLIGHT_ATTR =
+ new int[]{android.R.attr.autofilledHighlight};
+
+ /**
* Signals that compatibility booleans have been initialized according to
* target SDK versions.
*/
@@ -1068,10 +1077,15 @@
public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY = "creditCardExpirationDay";
/**
- * Hintd for the autofill services that describes the content of the view.
+ * Hints for the autofill services that describes the content of the view.
*/
private @Nullable String[] mAutofillHints;
+ /**
+ * Autofill id, lazily created on calls to {@link #getAutofillId()}.
+ */
+ private AutofillId mAutofillId;
+
/** @hide */
@IntDef({
AUTOFILL_TYPE_NONE,
@@ -1153,7 +1167,7 @@
public static final int IMPORTANT_FOR_AUTOFILL_YES = 0x1;
/**
- * The view is not important for autofill, and its children (if any) will be traversed.
+ * The view is not important for autofill, but its children (if any) will be traversed.
*/
public static final int IMPORTANT_FOR_AUTOFILL_NO = 0x2;
@@ -1167,6 +1181,18 @@
*/
public static final int IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS = 0x8;
+ /** @hide */
+ @IntDef(
+ flag = true,
+ value = {AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface AutofillFlags {}
+
+ /**
+ * Flag requesting you to add views not-important for autofill to the assist data.
+ */
+ public static final int AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x1;
+
/**
* This view is enabled. Interpretation varies by subclass.
* Use with ENABLED_MASK when calling setFlags.
@@ -2739,8 +2765,7 @@
* 1 PFLAG3_IS_AUTOFILLED
* 1 PFLAG3_FINGER_DOWN
* 1 PFLAG3_FOCUSED_BY_DEFAULT
- * __ unused
- * 11 PFLAG3_IMPORTANT_FOR_AUTOFILL
+ * 1111 PFLAG3_IMPORTANT_FOR_AUTOFILL
* 1 PFLAG3_OVERLAPPING_RENDERING_FORCED_VALUE
* 1 PFLAG3_HAS_OVERLAPPING_RENDERING_FORCED
* 1 PFLAG3_TEMPORARY_DETACH
@@ -2972,14 +2997,16 @@
* Shift for the bits in {@link #mPrivateFlags3} related to the
* "importantForAutofill" attribute.
*/
- static final int PFLAG3_IMPORTANT_FOR_AUTOFILL_SHIFT = 21;
+ static final int PFLAG3_IMPORTANT_FOR_AUTOFILL_SHIFT = 19;
/**
* Mask for obtaining the bits which specify how to determine
* whether a view is important for autofill.
*/
static final int PFLAG3_IMPORTANT_FOR_AUTOFILL_MASK = (IMPORTANT_FOR_AUTOFILL_AUTO
- | IMPORTANT_FOR_AUTOFILL_YES | IMPORTANT_FOR_AUTOFILL_NO)
+ | IMPORTANT_FOR_AUTOFILL_YES | IMPORTANT_FOR_AUTOFILL_NO
+ | IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS
+ | IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS)
<< PFLAG3_IMPORTANT_FOR_AUTOFILL_SHIFT;
/**
@@ -7276,28 +7303,24 @@
*
* <p>This method already provides most of what's needed for autofill, but should be overridden
* when:
- * <ol>
- * <li>The view contents does not include PII (Personally Identifiable Information), so it
+ * <ul>
+ * <li>The view contents does not include PII (Personally Identifiable Information), so it
* can call {@link ViewStructure#setDataIsSensitive(boolean)} passing {@code false}.
- * <li>It must set fields such {@link ViewStructure#setText(CharSequence)},
+ * <li>It must set fields such {@link ViewStructure#setText(CharSequence)},
* {@link ViewStructure#setAutofillOptions(CharSequence[])},
- * or {@link ViewStructure#setUrl(String)}.
- * </ol>
+ * or {@link ViewStructure#setWebDomain(String)}.
+ * </ul>
*
* @param structure Fill in with structured view data. The default implementation
* fills in all data that can be inferred from the view itself.
- * @param flags optional flags (currently {@code 0}).
+ * @param flags optional flags.
+ *
+ * @see #AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
*/
public void onProvideAutofillStructure(ViewStructure structure, int flags) {
onProvideStructureForAssistOrAutofill(structure, true);
}
- private void setAutofillId(ViewStructure structure) {
- // The autofill id needs to be unique, but its value doesn't matter,
- // so it's better to reuse the accessibility id to save space.
- structure.setAutofillId(getAccessibilityViewId());
- }
-
private void onProvideStructureForAssistOrAutofill(ViewStructure structure,
boolean forAutofill) {
final int id = mID;
@@ -7317,7 +7340,6 @@
}
if (forAutofill) {
- setAutofillId(structure);
final @AutofillType int autofillType = getAutofillType();
// Don't need to fill autofill info if view does not support it.
// For example, only TextViews that are editable support autofill
@@ -7381,17 +7403,20 @@
* optimal implementation providing this data.
*/
public void onProvideVirtualStructure(ViewStructure structure) {
- onProvideVirtualStructureForAssistOrAutofill(structure, false);
+ AccessibilityNodeProvider provider = getAccessibilityNodeProvider();
+ if (provider != null) {
+ AccessibilityNodeInfo info = createAccessibilityNodeInfo();
+ structure.setChildCount(1);
+ ViewStructure root = structure.newChild(0);
+ populateVirtualStructure(root, provider, info);
+ info.recycle();
+ }
}
/**
* Called when assist structure is being retrieved from a view as part of an autofill request
* to generate additional virtual structure under this view.
*
- * <p>The default implementation uses {@link #getAccessibilityNodeProvider()} to try to
- * generate this from the view's virtual accessibility nodes, if any. You can override this
- * for a more optimal implementation providing this data.
- *
* <p>When implementing this method, subclasses must follow the rules below:
*
* <ol>
@@ -7415,27 +7440,6 @@
* @param flags optional flags (currently {@code 0}).
*/
public void onProvideAutofillVirtualStructure(ViewStructure structure, int flags) {
- onProvideVirtualStructureForAssistOrAutofill(structure, true);
- }
-
- private void onProvideVirtualStructureForAssistOrAutofill(ViewStructure structure,
- boolean forAutofill) {
- if (forAutofill) {
- setAutofillId(structure);
- }
- // NOTE: currently flags are only used for AutoFill; if they're used for Assist as well,
- // this method should take a boolean with the type of request.
- AccessibilityNodeProvider provider = getAccessibilityNodeProvider();
- if (provider != null) {
- AccessibilityNodeInfo info = createAccessibilityNodeInfo();
- structure.setChildCount(1);
- ViewStructure root = structure.newChild(0);
- if (forAutofill) {
- setAutofillId(root);
- }
- populateVirtualStructure(root, provider, info, forAutofill);
- info.recycle();
- }
}
/**
@@ -7475,15 +7479,31 @@
* <p>See {@link #autofill(AutofillValue)} and
* {@link #onProvideAutofillVirtualStructure(ViewStructure, int)} for more info.
* <p>To indicate that a virtual view was autofilled
- * <code>@android:drawable/autofilled_highlight</code> should be drawn over it until the data
+ * <code>?android:attr/autofilledHighlight</code> should be drawn over it until the data
* changes.
*
* @param values map of values to be autofilled, keyed by virtual child id.
+ *
+ * @attr ref android.R.styleable#Theme_autofilledHighlight
*/
public void autofill(@NonNull @SuppressWarnings("unused") SparseArray<AutofillValue> values) {
}
/**
+ * Gets the unique identifier of this view on the screen for Autofill purposes.
+ *
+ * @return The View's Autofill id.
+ */
+ public final AutofillId getAutofillId() {
+ if (mAutofillId == null) {
+ // The autofill id needs to be unique, but its value doesn't matter,
+ // so it's better to reuse the accessibility id to save space.
+ mAutofillId = new AutofillId(getAccessibilityViewId());
+ }
+ return mAutofillId;
+ }
+
+ /**
* Describes the autofill type that should be used on calls to
* {@link #autofill(AutofillValue)} and {@link #autofill(SparseArray)}.
*
@@ -7551,6 +7571,17 @@
/**
* Sets the mode for determining whether this View is important for autofill.
*
+ * <p>This property controls how this view is presented to the autofill components
+ * which help users to fill credentials, addresses, etc. For example, views
+ * that contain labels and input fields are useful for autofill components to
+ * determine the user context and provide values for the inputs. Note that the
+ * user can always override this by manually triggering autotill which would
+ * expose the view to the autofill provider.
+ *
+ * <p>The platform determines the importance for autofill automatically but you
+ * can use this method to customize the behavior. See the autofill modes below
+ * for more details.
+ *
* <p>See {@link #setImportantForAutofill(int)} for more info about this mode.
*
* @param mode {@link #IMPORTANT_FOR_AUTOFILL_AUTO}, {@link #IMPORTANT_FOR_AUTOFILL_YES},
@@ -7604,24 +7635,40 @@
*
* @return whether the view is considered important for autofill.
*
+ * @see #setImportantForAutofill(int)
* @see #IMPORTANT_FOR_AUTOFILL_AUTO
* @see #IMPORTANT_FOR_AUTOFILL_YES
* @see #IMPORTANT_FOR_AUTOFILL_NO
+ * @see #IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS
+ * @see #IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS
*/
public final boolean isImportantForAutofill() {
- final int flag = getImportantForAutofill();
+ // Check parent mode to ensure we're not hidden.
+ ViewParent parent = mParent;
+ while (parent instanceof View) {
+ final int parentImportance = ((View) parent).getImportantForAutofill();
+ if (parentImportance == IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS
+ || parentImportance == IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS) {
+ return false;
+ }
+ parent = parent.getParent();
+ }
- // First, check if view explicity set it to YES or NO
- if ((flag & IMPORTANT_FOR_AUTOFILL_YES) != 0) {
+ final int importance = getImportantForAutofill();
+
+ // First, check the explicit states.
+ if (importance == IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS
+ || importance == IMPORTANT_FOR_AUTOFILL_YES) {
return true;
}
- if ((flag & IMPORTANT_FOR_AUTOFILL_NO) != 0) {
+ if (importance == IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS
+ || importance == IMPORTANT_FOR_AUTOFILL_NO) {
return false;
}
// Then use some heuristics to handle AUTO.
- // Always include views that have a explicity resource id.
+ // Always include views that have an explicit resource id.
final int id = mID;
if (id != NO_ID && !isViewIdGenerated(id)) {
final Resources res = getResources();
@@ -7648,11 +7695,11 @@
}
private boolean isAutofillable() {
- return getAutofillType() != AUTOFILL_TYPE_NONE && !isAutofillBlocked();
+ return getAutofillType() != AUTOFILL_TYPE_NONE && isImportantForAutofill();
}
private void populateVirtualStructure(ViewStructure structure,
- AccessibilityNodeProvider provider, AccessibilityNodeInfo info, boolean forAutofill) {
+ AccessibilityNodeProvider provider, AccessibilityNodeInfo info) {
structure.setId(AccessibilityNodeInfo.getVirtualDescendantId(info.getSourceNodeId()),
null, null, null);
Rect rect = structure.getTempRect();
@@ -7690,10 +7737,7 @@
CharSequence cname = info.getClassName();
structure.setClassName(cname != null ? cname.toString() : null);
structure.setContentDescription(info.getContentDescription());
- if (!forAutofill && (info.getText() != null || info.getError() != null)) {
- // TODO(b/33197203) (b/33269702): when sanitized, try to use the Accessibility API to
- // just set sanitized values (like text coming from resource files), rather than not
- // setting it at all.
+ if ((info.getText() != null || info.getError() != null)) {
structure.setText(info.getText(), info.getTextSelectionStart(),
info.getTextSelectionEnd());
}
@@ -7704,12 +7748,7 @@
AccessibilityNodeInfo cinfo = provider.createAccessibilityNodeInfo(
AccessibilityNodeInfo.getVirtualDescendantId(info.getChildId(i)));
ViewStructure child = structure.newChild(i);
- if (forAutofill) {
- // TODO(b/33197203): add CTS test to autofill virtual children based on
- // Accessibility API.
- child.setAutofillId(structure, i);
- }
- populateVirtualStructure(child, provider, cinfo, forAutofill);
+ populateVirtualStructure(child, provider, cinfo);
cinfo.recycle();
}
}
@@ -7727,32 +7766,46 @@
/**
* Dispatch creation of {@link ViewStructure} down the hierarchy.
*
- * <p>The structure must be filled according to the request type, which is set in the
- * {@code flags} parameter - see the documentation on each flag for more details.
+ * <p>The default implementation does the following:
*
- * <p>The default implementation calls {@link #onProvideAutofillStructure(ViewStructure, int)}
- * and {@link #onProvideAutofillVirtualStructure(ViewStructure, int)}.
+ * <ul>
+ * <li>Sets the {@link AutofillId} in the structure.
+ * <li>Calls {@link #onProvideAutofillStructure(ViewStructure, int)}.
+ * <li>Calls {@link #onProvideAutofillVirtualStructure(ViewStructure, int)}.
+ * </ul>
+ *
+ * <p>When overridden, it must either call
+ * {@code super.dispatchProvideAutofillStructure(structure, flags)} or explicitly
+ * set the {@link AutofillId} in the structure (for example, by calling
+ * {@code structure.setAutofillId(getAutofillId())}).
+ *
+ * <p>When providing your implementation you need to decide how to handle
+ * the {@link #AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS} flag which instructs you
+ * to report all views to the structure regardless if {@link #isImportantForAutofill()}
+ * returns true. We encourage you respect the importance property for a better
+ * user experience in your app. If the flag is not set then you should filter out
+ * not important views to optimize autofill performance in your app.
*
* @param structure Fill in with structured view data.
- * @param flags optional flags (currently {@code 0}).
+ * @param flags optional flags.
+ *
+ * @see #AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
*/
- public void dispatchProvideAutofillStructure(ViewStructure structure, int flags) {
+ public void dispatchProvideAutofillStructure(@NonNull ViewStructure structure,
+ @AutofillFlags int flags) {
dispatchProvideStructureForAssistOrAutofill(structure, true);
}
private void dispatchProvideStructureForAssistOrAutofill(ViewStructure structure,
boolean forAutofill) {
- boolean blocked = forAutofill ? isAutofillBlocked() : isAssistBlocked();
- if (!blocked) {
- if (forAutofill) {
- setAutofillId(structure);
- // NOTE: flags are not currently supported, hence 0
- onProvideAutofillStructure(structure, 0);
- onProvideAutofillVirtualStructure(structure, 0);
- } else {
- onProvideStructure(structure);
- onProvideVirtualStructure(structure);
- }
+ if (forAutofill) {
+ structure.setAutofillId(getAutofillId());
+ // NOTE: flags are not currently supported, hence 0
+ onProvideAutofillStructure(structure, 0);
+ onProvideAutofillVirtualStructure(structure, 0);
+ } else if (!isAssistBlocked()) {
+ onProvideStructure(structure);
+ onProvideVirtualStructure(structure);
} else {
structure.setClassName(getAccessibilityClassName().toString());
structure.setAssistBlocked(true);
@@ -9590,25 +9643,6 @@
/**
* @hide
- * Indicates whether this view will participate in data collection through
- * {@link ViewStructure} for autofill purposes.
- *
- * <p>If {@code true}, it will not provide any data for itself or its children.
- * <p>If {@code false}, the normal data collection will be allowed.
- *
- * @return Returns {@code false} if assist data collection for autofill is not blocked,
- * else {@code true}.
- *
- * TODO(b/33197203): update / remove javadoc tags below
- * @see #setAssistBlocked(boolean)
- * @attr ref android.R.styleable#View_assistBlocked
- */
- public boolean isAutofillBlocked() {
- return false; // TODO(b/33197203): properly implement it
- }
-
- /**
- * @hide
* Controls whether assist data collection from this view and its children is enabled
* (that is, whether {@link #onProvideStructure} and
* {@link #onProvideVirtualStructure} will be called). The default value is false,
@@ -16585,6 +16619,7 @@
* @param config Configuration of the resources on new display after move.
*
* @see #onConfigurationChanged(Configuration)
+ * @hide
*/
public void onMovedToDisplay(int displayId, Configuration config) {
}
@@ -20381,15 +20416,13 @@
*
* @throws IllegalStateException if the drawable could not be found.
*/
- @NonNull private Drawable getAutofilledDrawable() {
+ @Nullable private Drawable getAutofilledDrawable() {
// Lazily load the isAutofilled drawable.
if (mAttachInfo.mAutofilledDrawable == null) {
- mAttachInfo.mAutofilledDrawable = mContext.getDrawable(R.drawable.autofilled_highlight);
-
- if (mAttachInfo.mAutofilledDrawable == null) {
- throw new IllegalStateException(
- "Could not find android:drawable/autofilled_highlight");
- }
+ TypedArray a = mContext.getTheme().obtainStyledAttributes(AUTOFILL_HIGHLIGHT_ATTR);
+ int attributeResourceId = a.getResourceId(0, 0);
+ mAttachInfo.mAutofilledDrawable = mContext.getDrawable(attributeResourceId);
+ a.recycle();
}
return mAttachInfo.mAutofilledDrawable;
@@ -20404,8 +20437,10 @@
if (isAutofilled()) {
Drawable autofilledHighlight = getAutofilledDrawable();
- autofilledHighlight.setBounds(0, 0, getWidth(), getHeight());
- autofilledHighlight.draw(canvas);
+ if (autofilledHighlight != null) {
+ autofilledHighlight.setBounds(0, 0, getWidth(), getHeight());
+ autofilledHighlight.draw(canvas);
+ }
}
}
@@ -21092,7 +21127,7 @@
*/
@Nullable
public final <T extends View> T findViewById(@IdRes int id) {
- if (id < 0) {
+ if (id == NO_ID) {
return null;
}
return findViewTraversal(id);
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 1977ef5..18c1b8c 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -57,7 +57,6 @@
import android.view.animation.AnimationUtils;
import android.view.animation.LayoutAnimationController;
import android.view.animation.Transformation;
-
import com.android.internal.R;
import java.util.ArrayList;
@@ -3442,12 +3441,13 @@
* default {@link View} implementation.
*/
@Override
- public void dispatchProvideAutofillStructure(ViewStructure structure, int flags) {
+ public void dispatchProvideAutofillStructure(ViewStructure structure,
+ @AutofillFlags int flags) {
super.dispatchProvideAutofillStructure(structure, flags);
- if (isAutofillBlocked() || structure.getChildCount() != 0) {
+ if (structure.getChildCount() != 0) {
return;
}
- final ChildListForAutoFill children = getChildrenForAutofill();
+ final ChildListForAutoFill children = getChildrenForAutofill(flags);
final int childrenCount = children.size();
structure.setChildCount(childrenCount);
for (int i = 0; i < childrenCount; i++) {
@@ -3463,14 +3463,14 @@
* level descendants that are important for autofill. The returned
* child list object is pooled and the caller must recycle it once done.
* @hide */
- private @NonNull ChildListForAutoFill getChildrenForAutofill() {
+ private @NonNull ChildListForAutoFill getChildrenForAutofill(@AutofillFlags int flags) {
final ChildListForAutoFill children = ChildListForAutoFill.obtain();
- populateChildrenForAutofill(children);
+ populateChildrenForAutofill(children, flags);
return children;
}
/** @hide */
- private void populateChildrenForAutofill(ArrayList<View> list) {
+ private void populateChildrenForAutofill(ArrayList<View> list, @AutofillFlags int flags) {
final int childrenCount = mChildrenCount;
if (childrenCount <= 0) {
return;
@@ -3482,10 +3482,11 @@
final int childIndex = getAndVerifyPreorderedIndex(childrenCount, i, customOrder);
final View child = (preorderedList == null)
? mChildren[childIndex] : preorderedList.get(childIndex);
- if (child.isImportantForAutofill()) {
+ if ((flags & AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS) != 0
+ || child.isImportantForAutofill()) {
list.add(child);
} else if (child instanceof ViewGroup) {
- ((ViewGroup) child).populateChildrenForAutofill(list);
+ ((ViewGroup) child).populateChildrenForAutofill(list, flags);
}
}
}
@@ -5413,6 +5414,9 @@
if (mDefaultFocus != null) {
clearDefaultFocus(mDefaultFocus);
}
+ if (mFocusedInCluster != null) {
+ clearFocusedInCluster(mFocusedInCluster);
+ }
if (clearChildFocus) {
clearChildFocus(focused);
if (!rootViewRequestFocus()) {
@@ -5823,34 +5827,6 @@
}
/**
- * Quick invalidation method that simply transforms the dirty rect into the parent's
- * coordinate system, pruning the invalidation if the parent has already been invalidated.
- *
- * @hide
- */
- protected ViewParent damageChildInParent(int left, int top, final Rect dirty) {
- if ((mPrivateFlags & PFLAG_DRAWN) != 0
- || (mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) != 0) {
- dirty.offset(left - mScrollX, top - mScrollY);
- if ((mGroupFlags & FLAG_CLIP_CHILDREN) == 0) {
- dirty.union(0, 0, mRight - mLeft, mBottom - mTop);
- }
-
- if ((mGroupFlags & FLAG_CLIP_CHILDREN) == 0 ||
- dirty.intersect(0, 0, mRight - mLeft, mBottom - mTop)) {
-
- if (!getMatrix().isIdentity()) {
- transformRect(dirty);
- }
-
- return mParent;
- }
- }
-
- return null;
- }
-
- /**
* Offset a rectangle that is in a descendant's coordinate
* space into our coordinate space.
* @param descendant A descendant of this view
diff --git a/core/java/android/view/ViewOverlay.java b/core/java/android/view/ViewOverlay.java
index f061370..21123c1 100644
--- a/core/java/android/view/ViewOverlay.java
+++ b/core/java/android/view/ViewOverlay.java
@@ -330,20 +330,20 @@
@Override
public void onDescendantInvalidated(@NonNull View child, @NonNull View target) {
- if (mHostView != null && mHostView.getParent() != null) {
- mHostView.getParent().onDescendantInvalidated(mHostView, target);
- }
- }
+ if (mHostView != null) {
+ if (mHostView instanceof ViewGroup) {
+ // Propagate invalidate through the host...
+ ((ViewGroup) mHostView).onDescendantInvalidated(mHostView, target);
- /**
- * @hide
- */
- @Override
- protected ViewParent damageChildInParent(int left, int top, Rect dirty) {
- if (mHostView instanceof ViewGroup) {
- return ((ViewGroup) mHostView).damageChildInParent(left, top, dirty);
+ // ...and also this view, since it will hold the descendant, and must later
+ // propagate the calls to update display lists if dirty
+ super.onDescendantInvalidated(child, target);
+ } else {
+ // Can't use onDescendantInvalidated because host isn't a ViewGroup - fall back
+ // to invalidating.
+ invalidate();
+ }
}
- return null;
}
@Override
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 9ecced6..1f13220 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -435,8 +435,9 @@
AccessibilityInteractionController mAccessibilityInteractionController;
- AccessibilityInteractionConnectionManager mAccessibilityInteractionConnectionManager;
- HighContrastTextManager mHighContrastTextManager;
+ final AccessibilityInteractionConnectionManager mAccessibilityInteractionConnectionManager =
+ new AccessibilityInteractionConnectionManager();
+ final HighContrastTextManager mHighContrastTextManager;
SendWindowContentChangedAccessibilityEvent mSendWindowContentChangedAccessibilityEvent;
@@ -496,13 +497,11 @@
mAttachInfo = new View.AttachInfo(mWindowSession, mWindow, display, this, mHandler, this,
context);
mAccessibilityManager = AccessibilityManager.getInstance(context);
- mAccessibilityInteractionConnectionManager =
- new AccessibilityInteractionConnectionManager();
mAccessibilityManager.addAccessibilityStateChangeListener(
- mAccessibilityInteractionConnectionManager);
+ mAccessibilityInteractionConnectionManager, mHandler);
mHighContrastTextManager = new HighContrastTextManager();
mAccessibilityManager.addHighTextContrastStateChangeListener(
- mHighContrastTextManager);
+ mHighContrastTextManager, mHandler);
mViewConfiguration = ViewConfiguration.get(context);
mDensity = context.getResources().getDisplayMetrics().densityDpi;
mNoncompatDensity = context.getResources().getDisplayMetrics().noncompatDensityDpi;
diff --git a/core/java/android/view/ViewStructure.java b/core/java/android/view/ViewStructure.java
index 387a9ce..f71589c 100644
--- a/core/java/android/view/ViewStructure.java
+++ b/core/java/android/view/ViewStructure.java
@@ -26,7 +26,7 @@
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillValue;
-import java.util.ArrayList;
+import java.util.List;
/**
* Container for storing additional per-view data generated by {@link View#onProvideStructure
@@ -284,12 +284,30 @@
public abstract ViewStructure asyncNewChild(int index);
/**
+ * Gets the {@link AutofillId} associated with this node.
+ */
+ @Nullable
+ public abstract AutofillId getAutofillId();
+
+ /**
+ * Sets the {@link AutofillId} associated with this node.
+ */
+ public abstract void setAutofillId(@NonNull AutofillId id);
+
+ /**
* Sets the {@link AutofillId} for this virtual node.
*
- * @param parent parent node.
+ * @param parentId id of the parent node.
* @param virtualId an opaque ID to the Android System; it's the same id used on
* {@link View#autofill(android.util.SparseArray)}.
*/
+ public abstract void setAutofillId(@NonNull AutofillId parentId, int virtualId);
+
+ /**
+ * @deprecated - use {@link #setAutofillId(AutofillId, int)} instead
+ * @hide
+ */
+ @Deprecated
public abstract void setAutofillId(@NonNull ViewStructure parent, int virtualId);
/**
@@ -355,14 +373,9 @@
/** @hide */
public abstract Rect getTempRect();
- /** @hide */
- public abstract void setAutofillId(int viewId);
-
- /** @hide */
- public abstract AutofillId getAutofillId();
-
/**
* @deprecated - use {@link #setWebDomain(String)} instead.
+ * @hide
*/
@Deprecated
public abstract void setUrl(String url);
@@ -416,7 +429,7 @@
* @return list of key/value pairs; could contain pairs with the same keys.
*/
@Nullable
- public abstract ArrayList<Pair<String, String>> getAttributes();
+ public abstract List<Pair<String, String>> getAttributes();
/**
* Builder for {@link HtmlInfo} objects.
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index 6c884c4..dfb0095 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -37,6 +37,7 @@
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.UserHandle;
+import android.util.ArrayMap;
import android.util.Log;
import android.view.IWindow;
import android.view.View;
@@ -47,7 +48,6 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
/**
* System level service that serves as an event dispatch for {@link AccessibilityEvent}s,
@@ -137,17 +137,18 @@
boolean mIsHighTextContrastEnabled;
- private final CopyOnWriteArrayList<AccessibilityStateChangeListener>
- mAccessibilityStateChangeListeners = new CopyOnWriteArrayList<>();
+ private final ArrayMap<AccessibilityStateChangeListener, Handler>
+ mAccessibilityStateChangeListeners = new ArrayMap<>();
- private final CopyOnWriteArrayList<TouchExplorationStateChangeListener>
- mTouchExplorationStateChangeListeners = new CopyOnWriteArrayList<>();
+ private final ArrayMap<TouchExplorationStateChangeListener, Handler>
+ mTouchExplorationStateChangeListeners = new ArrayMap<>();
- private final CopyOnWriteArrayList<HighTextContrastChangeListener>
- mHighTextContrastStateChangeListeners = new CopyOnWriteArrayList<>();
+ private final ArrayMap<HighTextContrastChangeListener, Handler>
+ mHighTextContrastStateChangeListeners = new ArrayMap<>();
- private final CopyOnWriteArrayList<AccessibilityServicesStateChangeListener>
- mServicesStateChangeListeners = new CopyOnWriteArrayList<>();
+ private final ArrayMap<AccessibilityServicesStateChangeListener, Handler>
+ mServicesStateChangeListeners = new ArrayMap<>();
+
/**
* Listener for the system accessibility state. To listen for changes to the
* accessibility state on the device, implement this interface and register
@@ -229,7 +230,21 @@
@Override
public void notifyServicesStateChanged() {
- mHandler.obtainMessage(MyCallback.MSG_NOTIFY_SERVICES_STATE_CHANGED).sendToTarget();
+ final ArrayMap<AccessibilityServicesStateChangeListener, Handler> listeners;
+ synchronized (mLock) {
+ if (mServicesStateChangeListeners.isEmpty()) {
+ return;
+ }
+ listeners = new ArrayMap<>(mServicesStateChangeListeners);
+ }
+
+ int numListeners = listeners.size();
+ for (int i = 0; i < numListeners; i++) {
+ final AccessibilityServicesStateChangeListener listener =
+ mServicesStateChangeListeners.keyAt(i);
+ mServicesStateChangeListeners.valueAt(i).post(() -> listener
+ .onAccessibilityServicesStateChanged(AccessibilityManager.this));
+ }
}
@Override
@@ -565,73 +580,118 @@
/**
* Registers an {@link AccessibilityStateChangeListener} for changes in
- * the global accessibility state of the system.
+ * the global accessibility state of the system. Equivalent to calling
+ * {@link #addAccessibilityStateChangeListener(AccessibilityStateChangeListener, Handler)}
+ * with a null handler.
*
* @param listener The listener.
- * @return True if successfully registered.
+ * @return Always returns {@code true}.
*/
public boolean addAccessibilityStateChangeListener(
@NonNull AccessibilityStateChangeListener listener) {
- // Final CopyOnWriteArrayList - no lock needed.
- return mAccessibilityStateChangeListeners.add(listener);
+ addAccessibilityStateChangeListener(listener, null);
+ return true;
+ }
+
+ /**
+ * Registers an {@link AccessibilityStateChangeListener} for changes in
+ * the global accessibility state of the system. If the listener has already been registered,
+ * the handler used to call it back is updated.
+ *
+ * @param listener The listener.
+ * @param handler The handler on which the listener should be called back, or {@code null}
+ * for a callback on the process's main handler.
+ */
+ public void addAccessibilityStateChangeListener(
+ @NonNull AccessibilityStateChangeListener listener, @Nullable Handler handler) {
+ synchronized (mLock) {
+ mAccessibilityStateChangeListeners
+ .put(listener, (handler == null) ? mHandler : handler);
+ }
}
/**
* Unregisters an {@link AccessibilityStateChangeListener}.
*
* @param listener The listener.
- * @return True if successfully unregistered.
+ * @return True if the listener was previously registered.
*/
public boolean removeAccessibilityStateChangeListener(
@NonNull AccessibilityStateChangeListener listener) {
- // Final CopyOnWriteArrayList - no lock needed.
- return mAccessibilityStateChangeListeners.remove(listener);
+ synchronized (mLock) {
+ int index = mAccessibilityStateChangeListeners.indexOfKey(listener);
+ mAccessibilityStateChangeListeners.remove(listener);
+ return (index >= 0);
+ }
}
/**
* Registers a {@link TouchExplorationStateChangeListener} for changes in
- * the global touch exploration state of the system.
+ * the global touch exploration state of the system. Equivalent to calling
+ * {@link #addTouchExplorationStateChangeListener(TouchExplorationStateChangeListener, Handler)}
+ * with a null handler.
*
* @param listener The listener.
- * @return True if successfully registered.
+ * @return Always returns {@code true}.
*/
public boolean addTouchExplorationStateChangeListener(
@NonNull TouchExplorationStateChangeListener listener) {
- // Final CopyOnWriteArrayList - no lock needed.
- return mTouchExplorationStateChangeListeners.add(listener);
+ addTouchExplorationStateChangeListener(listener, null);
+ return true;
+ }
+
+ /**
+ * Registers an {@link TouchExplorationStateChangeListener} for changes in
+ * the global touch exploration state of the system. If the listener has already been
+ * registered, the handler used to call it back is updated.
+ *
+ * @param listener The listener.
+ * @param handler The handler on which the listener should be called back, or {@code null}
+ * for a callback on the process's main handler.
+ */
+ public void addTouchExplorationStateChangeListener(
+ @NonNull TouchExplorationStateChangeListener listener, @Nullable Handler handler) {
+ synchronized (mLock) {
+ mTouchExplorationStateChangeListeners
+ .put(listener, (handler == null) ? mHandler : handler);
+ }
}
/**
* Unregisters a {@link TouchExplorationStateChangeListener}.
*
* @param listener The listener.
- * @return True if successfully unregistered.
+ * @return True if listener was previously registered.
*/
public boolean removeTouchExplorationStateChangeListener(
@NonNull TouchExplorationStateChangeListener listener) {
- // Final CopyOnWriteArrayList - no lock needed.
- return mTouchExplorationStateChangeListeners.remove(listener);
+ synchronized (mLock) {
+ int index = mTouchExplorationStateChangeListeners.indexOfKey(listener);
+ mTouchExplorationStateChangeListeners.remove(listener);
+ return (index >= 0);
+ }
}
/**
* Registers a {@link AccessibilityServicesStateChangeListener}.
*
* @param listener The listener.
- * @return True if successfully registered.
- *
+ * @param handler The handler on which the listener should be called back, or {@code null}
+ * for a callback on the process's main handler.
* @hide
*/
public void addAccessibilityServicesStateChangeListener(
- @NonNull AccessibilityServicesStateChangeListener listener) {
- // Final CopyOnWriteArrayList - no lock needed.
- mServicesStateChangeListeners.add(listener);
+ @NonNull AccessibilityServicesStateChangeListener listener, @Nullable Handler handler) {
+ synchronized (mLock) {
+ mServicesStateChangeListeners
+ .put(listener, (handler == null) ? mHandler : handler);
+ }
}
/**
* Unregisters a {@link AccessibilityServicesStateChangeListener}.
*
* @param listener The listener.
- * @return True if successfully unregistered.
*
* @hide
*/
@@ -646,28 +706,29 @@
* the global high text contrast state of the system.
*
* @param listener The listener.
- * @return True if successfully registered.
*
* @hide
*/
- public boolean addHighTextContrastStateChangeListener(
- @NonNull HighTextContrastChangeListener listener) {
- // Final CopyOnWriteArrayList - no lock needed.
- return mHighTextContrastStateChangeListeners.add(listener);
+ public void addHighTextContrastStateChangeListener(
+ @NonNull HighTextContrastChangeListener listener, @Nullable Handler handler) {
+ synchronized (mLock) {
+ mHighTextContrastStateChangeListeners
+ .put(listener, (handler == null) ? mHandler : handler);
+ }
}
/**
* Unregisters a {@link HighTextContrastChangeListener}.
*
* @param listener The listener.
- * @return True if successfully unregistered.
*
* @hide
*/
- public boolean removeHighTextContrastStateChangeListener(
+ public void removeHighTextContrastStateChangeListener(
@NonNull HighTextContrastChangeListener listener) {
- // Final CopyOnWriteArrayList - no lock needed.
- return mHighTextContrastStateChangeListeners.remove(listener);
+ synchronized (mLock) {
+ mHighTextContrastStateChangeListeners.remove(listener);
+ }
}
/**
@@ -732,15 +793,15 @@
mIsHighTextContrastEnabled = highTextContrastEnabled;
if (wasEnabled != enabled) {
- mHandler.sendEmptyMessage(MyCallback.MSG_NOTIFY_ACCESSIBILITY_STATE_CHANGED);
+ notifyAccessibilityStateChanged();
}
if (wasTouchExplorationEnabled != touchExplorationEnabled) {
- mHandler.sendEmptyMessage(MyCallback.MSG_NOTIFY_EXPLORATION_STATE_CHANGED);
+ notifyTouchExplorationStateChanged();
}
if (wasHighTextContrastEnabled != highTextContrastEnabled) {
- mHandler.sendEmptyMessage(MyCallback.MSG_NOTIFY_HIGH_TEXT_CONTRAST_STATE_CHANGED);
+ notifyHighTextContrastStateChanged();
}
}
@@ -932,81 +993,78 @@
/**
* Notifies the registered {@link AccessibilityStateChangeListener}s.
*/
- private void handleNotifyAccessibilityStateChanged() {
+ private void notifyAccessibilityStateChanged() {
final boolean isEnabled;
+ final ArrayMap<AccessibilityStateChangeListener, Handler> listeners;
synchronized (mLock) {
+ if (mAccessibilityStateChangeListeners.isEmpty()) {
+ return;
+ }
isEnabled = mIsEnabled;
+ listeners = new ArrayMap<>(mAccessibilityStateChangeListeners);
}
- // Listeners are a final CopyOnWriteArrayList, hence no lock needed.
- for (AccessibilityStateChangeListener listener : mAccessibilityStateChangeListeners) {
- listener.onAccessibilityStateChanged(isEnabled);
+
+ int numListeners = listeners.size();
+ for (int i = 0; i < numListeners; i++) {
+ final AccessibilityStateChangeListener listener =
+ mAccessibilityStateChangeListeners.keyAt(i);
+ mAccessibilityStateChangeListeners.valueAt(i)
+ .post(() -> listener.onAccessibilityStateChanged(isEnabled));
}
}
/**
* Notifies the registered {@link TouchExplorationStateChangeListener}s.
*/
- private void handleNotifyTouchExplorationStateChanged() {
+ private void notifyTouchExplorationStateChanged() {
final boolean isTouchExplorationEnabled;
+ final ArrayMap<TouchExplorationStateChangeListener, Handler> listeners;
synchronized (mLock) {
+ if (mTouchExplorationStateChangeListeners.isEmpty()) {
+ return;
+ }
isTouchExplorationEnabled = mIsTouchExplorationEnabled;
+ listeners = new ArrayMap<>(mTouchExplorationStateChangeListeners);
}
- // Listeners are a final CopyOnWriteArrayList, hence no lock needed.
- for (TouchExplorationStateChangeListener listener :mTouchExplorationStateChangeListeners) {
- listener.onTouchExplorationStateChanged(isTouchExplorationEnabled);
+
+ int numListeners = listeners.size();
+ for (int i = 0; i < numListeners; i++) {
+ final TouchExplorationStateChangeListener listener =
+ mTouchExplorationStateChangeListeners.keyAt(i);
+ mTouchExplorationStateChangeListeners.valueAt(i)
+ .post(() -> listener.onTouchExplorationStateChanged(isTouchExplorationEnabled));
}
}
/**
* Notifies the registered {@link HighTextContrastChangeListener}s.
*/
- private void handleNotifyHighTextContrastStateChanged() {
+ private void notifyHighTextContrastStateChanged() {
final boolean isHighTextContrastEnabled;
+ final ArrayMap<HighTextContrastChangeListener, Handler> listeners;
synchronized (mLock) {
+ if (mHighTextContrastStateChangeListeners.isEmpty()) {
+ return;
+ }
isHighTextContrastEnabled = mIsHighTextContrastEnabled;
+ listeners = new ArrayMap<>(mHighTextContrastStateChangeListeners);
}
- // Listeners are a final CopyOnWriteArrayList, hence no lock needed.
- for (HighTextContrastChangeListener listener : mHighTextContrastStateChangeListeners) {
- listener.onHighTextContrastStateChanged(isHighTextContrastEnabled);
- }
- }
- /**
- * Notifies the registered {@link AccessibilityServicesStateChangeListener}s.
- */
- private void handleNotifyServicesStateChanged() {
- // Listeners are a final CopyOnWriteArrayList, hence no lock needed.
- for (AccessibilityServicesStateChangeListener listener : mServicesStateChangeListeners) {
- listener.onAccessibilityServicesStateChanged(this);
+ int numListeners = listeners.size();
+ for (int i = 0; i < numListeners; i++) {
+ final HighTextContrastChangeListener listener =
+ mHighTextContrastStateChangeListeners.keyAt(i);
+ mHighTextContrastStateChangeListeners.valueAt(i)
+ .post(() -> listener.onHighTextContrastStateChanged(isHighTextContrastEnabled));
}
}
private final class MyCallback implements Handler.Callback {
- public static final int MSG_NOTIFY_ACCESSIBILITY_STATE_CHANGED = 1;
- public static final int MSG_NOTIFY_EXPLORATION_STATE_CHANGED = 2;
- public static final int MSG_NOTIFY_HIGH_TEXT_CONTRAST_STATE_CHANGED = 3;
- public static final int MSG_SET_STATE = 4;
- public static final int MSG_NOTIFY_SERVICES_STATE_CHANGED = 5;
+ public static final int MSG_SET_STATE = 1;
@Override
public boolean handleMessage(Message message) {
switch (message.what) {
- case MSG_NOTIFY_ACCESSIBILITY_STATE_CHANGED: {
- handleNotifyAccessibilityStateChanged();
- } break;
-
- case MSG_NOTIFY_EXPLORATION_STATE_CHANGED: {
- handleNotifyTouchExplorationStateChanged();
- } break;
-
- case MSG_NOTIFY_HIGH_TEXT_CONTRAST_STATE_CHANGED: {
- handleNotifyHighTextContrastStateChanged();
- } break;
-
- case MSG_NOTIFY_SERVICES_STATE_CHANGED: {
- handleNotifyServicesStateChanged();
- } break;
-
case MSG_SET_STATE: {
// See comment at mClient
final int state = message.arg1;
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 94a4547..5148d92 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -487,7 +487,7 @@
* @see AccessibilityAction#ACTION_MOVE_WINDOW
*/
public static final String ACTION_ARGUMENT_MOVE_WINDOW_X =
- "android.view.accessibility.action.ARGUMENT_MOVE_WINDOW_X";
+ "ACTION_ARGUMENT_MOVE_WINDOW_X";
/**
* Argument for specifying the y coordinate to which to move a window.
@@ -501,7 +501,7 @@
* @see AccessibilityAction#ACTION_MOVE_WINDOW
*/
public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y =
- "android.view.accessibility.action.ARGUMENT_MOVE_WINDOW_Y";
+ "ACTION_ARGUMENT_MOVE_WINDOW_Y";
/**
* Argument to pass the {@link AccessibilityClickableSpan}.
diff --git a/core/java/android/view/accessibility/AccessibilityWindowInfo.java b/core/java/android/view/accessibility/AccessibilityWindowInfo.java
index 2a7537b..f11767d 100644
--- a/core/java/android/view/accessibility/AccessibilityWindowInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityWindowInfo.java
@@ -231,8 +231,18 @@
* Check if the window is in picture-in-picture mode.
*
* @return {@code true} if the window is in picture-in-picture mode, {@code false} otherwise.
+ * @removed
*/
public boolean inPictureInPicture() {
+ return isInPictureInPictureMode();
+ }
+
+ /**
+ * Check if the window is in picture-in-picture mode.
+ *
+ * @return {@code true} if the window is in picture-in-picture mode, {@code false} otherwise.
+ */
+ public boolean isInPictureInPictureMode() {
return mInPictureInPicture;
}
diff --git a/core/java/android/view/autofill/AutofillId.java b/core/java/android/view/autofill/AutofillId.java
index d678015..1cee529 100644
--- a/core/java/android/view/autofill/AutofillId.java
+++ b/core/java/android/view/autofill/AutofillId.java
@@ -15,8 +15,6 @@
*/
package android.view.autofill;
-import static android.view.autofill.Helper.DEBUG;
-
import android.os.Parcel;
import android.os.Parcelable;
import android.view.View;
@@ -30,7 +28,6 @@
private final boolean mVirtual;
private final int mVirtualId;
- // TODO(b/33197203): use factory and cache values, since they're immutable
/** @hide */
public AutofillId(int id) {
mVirtual = false;
@@ -93,11 +90,9 @@
@Override
public String toString() {
- if (!DEBUG) return super.toString();
-
final StringBuilder builder = new StringBuilder().append(mViewId);
if (mVirtual) {
- builder.append(":").append(mVirtualId);
+ builder.append(':').append(mVirtualId);
}
return builder.toString();
}
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index 981be21..0a24bfb0 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -16,8 +16,8 @@
package android.view.autofill;
-import static android.view.autofill.Helper.DEBUG;
-import static android.view.autofill.Helper.VERBOSE;
+import static android.view.autofill.Helper.sDebug;
+import static android.view.autofill.Helper.sVerbose;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -51,12 +51,10 @@
import java.util.Objects;
/**
- * App entry point to the AutoFill Framework.
+ * App entry point to the Autofill Framework.
*
* <p>It is safe to call into this from any thread.
*/
-// TODO(b/33197203): improve this javadoc
-//TODO(b/33197203): restrict manager calls to activity
public final class AutofillManager {
private static final String TAG = "AutofillManager";
@@ -96,26 +94,29 @@
* <p>
* Type: {@link android.os.Bundle}
*/
- public static final String EXTRA_DATA_EXTRAS = "android.view.autofill.extra.DATA_EXTRAS";
+ public static final String EXTRA_CLIENT_STATE =
+ "android.view.autofill.extra.EXTRA_CLIENT_STATE";
static final String SESSION_ID_TAG = "android:sessionId";
static final String LAST_AUTOFILLED_DATA_TAG = "android:lastAutoFilledData";
- // Public flags start from the lowest bit
/**
- * Indicates autofill was explicitly requested by the user.
- *
* @deprecated Use {@link android.service.autofill.FillRequest#FLAG_MANUAL_REQUEST}
+ * @hide
*/
- // TODO(b/33197203): remove (and change value of private flags)
+ // TODO(b/37563972): remove (and change value of private flags)
@Deprecated
public static final int FLAG_MANUAL_REQUEST = 0x1;
- // Private flags start from the highest bit
- /** @hide */ public static final int FLAG_START_SESSION = 0x80000000;
- /** @hide */ public static final int FLAG_VIEW_ENTERED = 0x40000000;
- /** @hide */ public static final int FLAG_VIEW_EXITED = 0x20000000;
- /** @hide */ public static final int FLAG_VALUE_CHANGED = 0x10000000;
+ /** @hide */ public static final int ACTION_START_SESSION = 1;
+ /** @hide */ public static final int ACTION_VIEW_ENTERED = 2;
+ /** @hide */ public static final int ACTION_VIEW_EXITED = 3;
+ /** @hide */ public static final int ACTION_VALUE_CHANGED = 4;
+
+
+ /** @hide */ public static final int FLAG_ADD_CLIENT_ENABLED = 0x1;
+ /** @hide */ public static final int FLAG_ADD_CLIENT_DEBUG = 0x2;
+ /** @hide */ public static final int FLAG_ADD_CLIENT_VERBOSE = 0x4;
private final MetricsLogger mMetricsLogger = new MetricsLogger();
@@ -243,7 +244,7 @@
Log.w(TAG, "Session " + mSessionId + " could not be restored");
mSessionId = NO_SESSION;
} else {
- if (DEBUG) {
+ if (sDebug) {
Log.d(TAG, "session " + mSessionId + " was restored");
}
@@ -360,21 +361,7 @@
* @param view view requesting the new autofill context.
*/
public void requestAutofill(@NonNull View view) {
- if (!hasAutofillFeature()) {
- return;
- }
- synchronized (mLock) {
- ensureServiceClientAddedIfNeededLocked();
-
- if (!mEnabled) {
- return;
- }
-
- final AutofillId id = getAutofillId(view);
- final AutofillValue value = view.getAutofillValue();
-
- startSessionLocked(id, view.getWindowToken(), null, value, FLAG_MANUAL_REQUEST);
- }
+ notifyViewEntered(view, FLAG_MANUAL_REQUEST);
}
/**
@@ -389,28 +376,19 @@
* @param bounds child boundaries, relative to the top window.
*/
public void requestAutofill(@NonNull View view, int childId, @NonNull Rect bounds) {
- if (!hasAutofillFeature()) {
- return;
- }
- synchronized (mLock) {
- ensureServiceClientAddedIfNeededLocked();
-
- if (!mEnabled) {
- return;
- }
-
- final AutofillId id = getAutofillId(view, childId);
- startSessionLocked(id, view.getWindowToken(), bounds, null, FLAG_MANUAL_REQUEST);
- }
+ notifyViewEntered(view, childId, bounds, FLAG_MANUAL_REQUEST);
}
-
/**
* Called when a {@link View} that supports autofill is entered.
*
* @param view {@link View} that was entered.
*/
public void notifyViewEntered(@NonNull View view) {
+ notifyViewEntered(view, 0);
+ }
+
+ private void notifyViewEntered(@NonNull View view, int flags) {
if (!hasAutofillFeature()) {
return;
}
@@ -428,10 +406,10 @@
if (mSessionId == NO_SESSION) {
// Starts new session.
- startSessionLocked(id, view.getWindowToken(), null, value, 0);
+ startSessionLocked(id, view.getWindowToken(), null, value, flags);
} else {
// Update focus on existing session.
- updateSessionLocked(id, null, value, FLAG_VIEW_ENTERED);
+ updateSessionLocked(id, null, value, ACTION_VIEW_ENTERED, flags);
}
}
}
@@ -457,7 +435,7 @@
final AutofillId id = getAutofillId(view);
// Update focus on existing session.
- updateSessionLocked(id, null, null, FLAG_VIEW_EXITED);
+ updateSessionLocked(id, null, null, ACTION_VIEW_EXITED, 0);
}
}
}
@@ -486,6 +464,10 @@
* @param bounds child boundaries, relative to the top window.
*/
public void notifyViewEntered(@NonNull View view, int childId, @NonNull Rect bounds) {
+ notifyViewEntered(view, childId, bounds, 0);
+ }
+
+ private void notifyViewEntered(View view, int childId, Rect bounds, int flags) {
if (!hasAutofillFeature()) {
return;
}
@@ -502,10 +484,10 @@
if (mSessionId == NO_SESSION) {
// Starts new session.
- startSessionLocked(id, view.getWindowToken(), bounds, null, 0);
+ startSessionLocked(id, view.getWindowToken(), bounds, null, flags);
} else {
// Update focus on existing session.
- updateSessionLocked(id, bounds, null, FLAG_VIEW_ENTERED);
+ updateSessionLocked(id, bounds, null, ACTION_VIEW_ENTERED, flags);
}
}
}
@@ -533,7 +515,7 @@
final AutofillId id = getAutofillId(view, childId);
// Update focus on existing session.
- updateSessionLocked(id, null, null, FLAG_VIEW_EXITED);
+ updateSessionLocked(id, null, null, ACTION_VIEW_EXITED, 0);
}
}
}
@@ -585,7 +567,7 @@
value = view.getAutofillValue();
}
- updateSessionLocked(id, null, value, FLAG_VALUE_CHANGED);
+ updateSessionLocked(id, null, value, ACTION_VALUE_CHANGED, 0);
}
}
@@ -606,7 +588,7 @@
}
final AutofillId id = getAutofillId(view, childId);
- updateSessionLocked(id, null, value, FLAG_VALUE_CHANGED);
+ updateSessionLocked(id, null, value, ACTION_VALUE_CHANGED, 0);
}
}
@@ -648,11 +630,16 @@
}
}
+ /** @hide */
+ public void disableOwnedAutofillServices() {
+ disableAutofillServices();
+ }
+
/**
* If the app calling this API has enabled autofill services they
* will be disabled.
*/
- public void disableOwnedAutofillServices() {
+ public void disableAutofillServices() {
if (!hasAutofillFeature()) {
return;
}
@@ -663,6 +650,39 @@
}
}
+ /**
+ * Returns {@code true} if the calling application provides a {@link AutofillService} that is
+ * enabled for the current user, or {@code false} otherwise.
+ */
+ public boolean hasEnabledAutofillServices() {
+ if (mService == null) return false;
+
+ try {
+ return mService.isServiceEnabled(mContext.getUserId(), mContext.getPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Returns {@code true} if Autofill is supported for this user.
+ *
+ * <p>Autofill is typically supported, but it could be unsupported in cases like:
+ * <ol>
+ * <li>Low-end devices.
+ * <li>Device policy rules that forbid its usage.
+ * </ol>
+ */
+ public boolean isAutofillSupported() {
+ if (mService == null) return false;
+
+ try {
+ return mService.isServiceSupported(mContext.getUserId());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
private AutofillClient getClientLocked() {
if (mContext instanceof AutofillClient) {
return (AutofillClient) mContext;
@@ -675,12 +695,12 @@
if (!hasAutofillFeature()) {
return;
}
- // TODO(b/33197203): the result code is being ignored, so this method is not reliably
+ // TODO: the result code is being ignored, so this method is not reliably
// handling the cases where it's not RESULT_OK: it works fine if the service does not
// set the EXTRA_AUTHENTICATION_RESULT extra, but it could cause weird results if the
// service set the extra and returned RESULT_CANCELED...
- if (DEBUG) Log.d(TAG, "onAuthenticationResult(): d=" + data);
+ if (sDebug) Log.d(TAG, "onAuthenticationResult(): d=" + data);
synchronized (mLock) {
if (mSessionId == NO_SESSION || data == null) {
@@ -707,8 +727,8 @@
private void startSessionLocked(@NonNull AutofillId id, @NonNull IBinder windowToken,
@NonNull Rect bounds, @NonNull AutofillValue value, int flags) {
- if (DEBUG) {
- Log.d(TAG, "startSessionLocked(): id=" + id + ", bounds=" + bounds + ", value=" + value
+ if (sVerbose) {
+ Log.v(TAG, "startSessionLocked(): id=" + id + ", bounds=" + bounds + ", value=" + value
+ ", flags=" + flags);
}
@@ -716,7 +736,7 @@
mSessionId = mService.startSession(mContext.getActivityToken(), windowToken,
mServiceClient.asBinder(), id, bounds, value, mContext.getUserId(),
mCallback != null, flags, mContext.getOpPackageName());
- AutofillClient client = getClientLocked();
+ final AutofillClient client = getClientLocked();
if (client != null) {
client.autofillCallbackResetableStateAvailable();
}
@@ -726,9 +746,7 @@
}
private void finishSessionLocked() {
- if (DEBUG) {
- Log.d(TAG, "finishSessionLocked()");
- }
+ if (sVerbose) Log.v(TAG, "finishSessionLocked()");
try {
mService.finishSession(mSessionId, mContext.getUserId());
@@ -741,9 +759,7 @@
}
private void cancelSessionLocked() {
- if (DEBUG) {
- Log.d(TAG, "cancelSessionLocked()");
- }
+ if (sVerbose) Log.v(TAG, "cancelSessionLocked()");
try {
mService.cancelSession(mSessionId, mContext.getUserId());
@@ -751,20 +767,24 @@
throw e.rethrowFromSystemServer();
}
- mTrackedViews = null;
- mSessionId = NO_SESSION;
+ resetSessionLocked();
}
- private void updateSessionLocked(AutofillId id, Rect bounds, AutofillValue value, int flags) {
- if (DEBUG) {
- if (VERBOSE || (flags & FLAG_VIEW_EXITED) != 0) {
- Log.d(TAG, "updateSessionLocked(): id=" + id + ", bounds=" + bounds
- + ", value=" + value + ", flags=" + flags);
- }
+ private void resetSessionLocked() {
+ mSessionId = NO_SESSION;
+ mTrackedViews = null;
+ }
+
+ private void updateSessionLocked(AutofillId id, Rect bounds, AutofillValue value, int action,
+ int flags) {
+ if (sVerbose && action != ACTION_VIEW_EXITED) {
+ Log.v(TAG, "updateSessionLocked(): id=" + id + ", bounds=" + bounds
+ + ", value=" + value + ", action=" + action + ", flags=" + flags);
}
try {
- mService.updateSession(mSessionId, id, bounds, value, flags, mContext.getUserId());
+ mService.updateSession(mSessionId, id, bounds, value, action, flags,
+ mContext.getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -778,7 +798,10 @@
if (mServiceClient == null) {
mServiceClient = new AutofillManagerClient(this);
try {
- mEnabled = mService.addClient(mServiceClient, mContext.getUserId());
+ final int flags = mService.addClient(mServiceClient, mContext.getUserId());
+ mEnabled = (flags & FLAG_ADD_CLIENT_ENABLED) != 0;
+ sDebug = (flags & FLAG_ADD_CLIENT_DEBUG) != 0;
+ sVerbose = (flags & FLAG_ADD_CLIENT_VERBOSE) != 0;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -874,9 +897,17 @@
}
}
- private void setState(boolean enabled) {
+ private void setState(boolean enabled, boolean resetSession, boolean resetClient) {
synchronized (mLock) {
mEnabled = enabled;
+ if (!mEnabled || resetSession) {
+ // Reset the session state
+ resetSessionLocked();
+ }
+ if (resetClient) {
+ // Reset connection to system
+ mServiceClient = null;
+ }
}
}
@@ -996,13 +1027,14 @@
AutofillCallback callback = null;
synchronized (mLock) {
- if (mSessionId == sessionId) {
- AutofillClient client = getClientLocked();
-
- if (client != null) {
- if (client.autofillCallbackRequestHideFillUi() && mCallback != null) {
- callback = mCallback;
- }
+ // We do not check the session id for two reasons:
+ // 1. If local and remote session id are off sync the UI would be stuck shown
+ // 2. There is a race between the user state being destroyed due the fill
+ // service being uninstalled and the UI being dismissed.
+ AutofillClient client = getClientLocked();
+ if (client != null) {
+ if (client.autofillCallbackRequestHideFillUi() && mCallback != null) {
+ callback = mCallback;
}
}
}
@@ -1052,7 +1084,8 @@
return view;
}
- private boolean hasAutofillFeature() {
+ /** @hide */
+ public boolean hasAutofillFeature() {
return mService != null;
}
@@ -1150,8 +1183,8 @@
}
}
- if (DEBUG) {
- Log.d(TAG, "TrackedViews(trackedIds=" + trackedIds + "): "
+ if (sVerbose) {
+ Log.v(TAG, "TrackedViews(trackedIds=" + trackedIds + "): "
+ " mVisibleTrackedIds=" + mVisibleTrackedIds
+ " mInvisibleTrackedIds=" + mInvisibleTrackedIds);
}
@@ -1171,7 +1204,7 @@
AutofillId id = getAutofillId(view);
AutofillClient client = getClientLocked();
- if (DEBUG) {
+ if (sDebug) {
Log.d(TAG, "notifyViewVisibilityChange(): id=" + id + " isVisible="
+ isVisible);
}
@@ -1212,8 +1245,8 @@
if (client.getViewVisibility(id.getViewId())) {
updatedVisibleTrackedIds = addToSet(updatedVisibleTrackedIds, id);
- if (DEBUG) {
- Log.i(TAG, "onVisibleForAutofill() " + id + " became visible");
+ if (sDebug) {
+ Log.d(TAG, "onVisibleForAutofill() " + id + " became visible");
}
} else {
updatedInvisibleTrackedIds = addToSet(updatedInvisibleTrackedIds, id);
@@ -1228,8 +1261,8 @@
} else {
updatedInvisibleTrackedIds = addToSet(updatedInvisibleTrackedIds, id);
- if (DEBUG) {
- Log.i(TAG, "onVisibleForAutofill() " + id + " became invisible");
+ if (sDebug) {
+ Log.d(TAG, "onVisibleForAutofill() " + id + " became invisible");
}
}
}
@@ -1313,18 +1346,17 @@
}
@Override
- public void setState(boolean enabled) {
+ public void setState(boolean enabled, boolean resetSession, boolean resetClient) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(() -> afm.setState(enabled));
+ afm.mContext.getMainThreadHandler().post(
+ () -> afm.setState(enabled, resetSession, resetClient));
}
}
@Override
public void autofill(int sessionId, IBinder windowToken, List<AutofillId> ids,
List<AutofillValue> values) {
- // TODO(b/33197203): must keep the dataset so subsequent calls pass the same
- // dataset.extras to service
final AutofillManager afm = mAfm.get();
if (afm != null) {
afm.mContext.getMainThreadHandler().post(
diff --git a/core/java/android/view/autofill/AutofillValue.java b/core/java/android/view/autofill/AutofillValue.java
index e2dd7fe..b57dab5 100644
--- a/core/java/android/view/autofill/AutofillValue.java
+++ b/core/java/android/view/autofill/AutofillValue.java
@@ -20,8 +20,7 @@
import static android.view.View.AUTOFILL_TYPE_LIST;
import static android.view.View.AUTOFILL_TYPE_TEXT;
import static android.view.View.AUTOFILL_TYPE_TOGGLE;
-import static android.view.autofill.Helper.DEBUG;
-import static android.view.autofill.Helper.VERBOSE;
+import static android.view.autofill.Helper.sDebug;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -171,12 +170,17 @@
@Override
public String toString() {
- if (!DEBUG) return super.toString();
+ if (!sDebug) return super.toString();
- final String sanitizedValue = isText() && !VERBOSE
- ? ((CharSequence) mValue).length() + "_chars" : mValue.toString();
-
- return "[type=" + mType + ", value=" + sanitizedValue + "]";
+ final StringBuilder string = new StringBuilder()
+ .append("[type=").append(mType)
+ .append(", value=");
+ if (isText()) {
+ string.append(((CharSequence) mValue).length()).append("_chars");
+ } else {
+ string.append(mValue);
+ }
+ return string.append(']').toString();
}
/////////////////////////////////////
@@ -252,7 +256,6 @@
*
* <p>See {@link View#AUTOFILL_TYPE_TEXT} for more info.
*/
- // TODO(b/33197203): use cache
public static AutofillValue forText(@Nullable CharSequence value) {
return value == null ? null : new AutofillValue(AUTOFILL_TYPE_TEXT, value);
}
diff --git a/core/java/android/view/autofill/Helper.java b/core/java/android/view/autofill/Helper.java
index aa94de0..829e7f3 100644
--- a/core/java/android/view/autofill/Helper.java
+++ b/core/java/android/view/autofill/Helper.java
@@ -25,14 +25,16 @@
/** @hide */
public final class Helper {
- public static final boolean DEBUG = true; // TODO(b/33197203): set to false when stable
- public static final boolean VERBOSE = false;
+ // Debug-level flags are defined when service is bound.
+ public static boolean sDebug = false;
+ public static boolean sVerbose = false;
+
public static final String REDACTED = "[REDACTED]";
static StringBuilder append(StringBuilder builder, Bundle bundle) {
- if (bundle == null) {
+ if (bundle == null || !sDebug) {
builder.append("N/A");
- } else if (!VERBOSE) {
+ } else if (!sVerbose) {
builder.append(REDACTED);
} else {
final Set<String> keySet = bundle.keySet();
diff --git a/core/java/android/view/autofill/IAutoFillManager.aidl b/core/java/android/view/autofill/IAutoFillManager.aidl
index df777c4..f28d8ba 100644
--- a/core/java/android/view/autofill/IAutoFillManager.aidl
+++ b/core/java/android/view/autofill/IAutoFillManager.aidl
@@ -30,7 +30,8 @@
* {@hide}
*/
interface IAutoFillManager {
- boolean addClient(in IAutoFillManagerClient client, int userId);
+ // Returns flags: FLAG_ADD_CLIENT_ENABLED | FLAG_ADD_CLIENT_DEBUG | FLAG_ADD_CLIENT_VERBOSE
+ int addClient(in IAutoFillManagerClient client, int userId);
int startSession(IBinder activityToken, IBinder windowToken, in IBinder appCallback,
in AutofillId autoFillId, in Rect bounds, in AutofillValue value, int userId,
boolean hasCallback, int flags, String packageName);
@@ -38,10 +39,12 @@
boolean restoreSession(int sessionId, in IBinder activityToken, in IBinder appCallback);
void setWindow(int sessionId, in IBinder windowToken);
void updateSession(int sessionId, in AutofillId id, in Rect bounds,
- in AutofillValue value, int flags, int userId);
+ in AutofillValue value, int action, int flags, int userId);
void finishSession(int sessionId, int userId);
void cancelSession(int sessionId, int userId);
void setAuthenticationResult(in Bundle data, int sessionId, int userId);
void setHasCallback(int sessionId, int userId, boolean hasIt);
void disableOwnedAutofillServices(int userId);
+ boolean isServiceSupported(int userId);
+ boolean isServiceEnabled(int userId, String packageName);
}
diff --git a/core/java/android/view/autofill/IAutoFillManagerClient.aidl b/core/java/android/view/autofill/IAutoFillManagerClient.aidl
index 1a6bad2..aef98b7 100644
--- a/core/java/android/view/autofill/IAutoFillManagerClient.aidl
+++ b/core/java/android/view/autofill/IAutoFillManagerClient.aidl
@@ -35,7 +35,7 @@
/**
* Notifies the client when the autofill enabled state changed.
*/
- void setState(boolean enabled);
+ void setState(boolean enabled, boolean resetSession, boolean resetClient);
/**
* Autofills the activity with the contents of a dataset.
diff --git a/core/java/android/view/textclassifier/SmartSelection.java b/core/java/android/view/textclassifier/SmartSelection.java
index f0f39b6..f0e83d1 100644
--- a/core/java/android/view/textclassifier/SmartSelection.java
+++ b/core/java/android/view/textclassifier/SmartSelection.java
@@ -75,6 +75,20 @@
nativeClose(mCtx);
}
+ /**
+ * Returns the language of the model.
+ */
+ public static String getLanguage(int fd) {
+ return nativeGetLanguage(fd);
+ }
+
+ /**
+ * Returns the version of the model.
+ */
+ public static int getVersion(int fd) {
+ return nativeGetVersion(fd);
+ }
+
private static native long nativeNew(int fd);
private static native int[] nativeSuggest(
@@ -85,6 +99,10 @@
private static native void nativeClose(long context);
+ private static native String nativeGetLanguage(int fd);
+
+ private static native int nativeGetVersion(int fd);
+
/** Classification result for classifyText method. */
static final class ClassificationResult {
final String mCollection;
diff --git a/core/java/android/view/textclassifier/TextClassificationResult.java b/core/java/android/view/textclassifier/TextClassification.java
similarity index 93%
rename from core/java/android/view/textclassifier/TextClassificationResult.java
rename to core/java/android/view/textclassifier/TextClassification.java
index e188d11a..b6dd0b9 100644
--- a/core/java/android/view/textclassifier/TextClassificationResult.java
+++ b/core/java/android/view/textclassifier/TextClassification.java
@@ -33,12 +33,12 @@
/**
* Information for generating a widget to handle classified text.
*/
-public final class TextClassificationResult {
+public final class TextClassification {
/**
* @hide
*/
- static final TextClassificationResult EMPTY = new TextClassificationResult.Builder().build();
+ static final TextClassification EMPTY = new TextClassification.Builder().build();
@NonNull private final String mText;
@Nullable private final Drawable mIcon;
@@ -49,7 +49,7 @@
@NonNull private final List<String> mEntities;
private int mLogType;
- private TextClassificationResult(
+ private TextClassification(
@NonNull String text,
Drawable icon,
String label,
@@ -147,7 +147,7 @@
@Override
public String toString() {
- return String.format("TextClassificationResult {"
+ return String.format("TextClassification {"
+ "text=%s, entities=%s, label=%s, intent=%s}",
mText, mEntityConfidence, mLabel, mIntent);
}
@@ -167,7 +167,7 @@
}
/**
- * Builder for building {@link TextClassificationResult}s.
+ * Builder for building {@link TextClassification} objects.
*/
public static final class Builder {
@@ -244,10 +244,10 @@
}
/**
- * Builds an returns a {@link TextClassificationResult}.
+ * Builds and returns a {@link TextClassification} object.
*/
- public TextClassificationResult build() {
- return new TextClassificationResult(
+ public TextClassification build() {
+ return new TextClassification(
mText, mIcon, mLabel, mIntent, mOnClickListener, mEntityConfidence, mLogType);
}
}
diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java
index 46fed43..1f3be84 100644
--- a/core/java/android/view/textclassifier/TextClassifier.java
+++ b/core/java/android/view/textclassifier/TextClassifier.java
@@ -20,6 +20,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.StringDef;
+import android.annotation.WorkerThread;
import android.os.LocaleList;
import java.lang.annotation.Retention;
@@ -62,9 +63,9 @@
}
@Override
- public TextClassificationResult getTextClassificationResult(
+ public TextClassification classifyText(
CharSequence text, int startIndex, int endIndex, LocaleList defaultLocales) {
- return TextClassificationResult.EMPTY;
+ return TextClassification.EMPTY;
}
@Override
@@ -89,6 +90,7 @@
* @throws IllegalArgumentException if text is null; selectionStartIndex is negative;
* selectionEndIndex is greater than text.length() or not greater than selectionStartIndex
*/
+ @WorkerThread
@NonNull
TextSelection suggestSelection(
@NonNull CharSequence text,
@@ -97,8 +99,8 @@
@Nullable LocaleList defaultLocales);
/**
- * Returns a {@link TextClassificationResult} object that can be used to generate a widget for
- * handling the classified text.
+ * Classifies the specified text and returns a {@link TextClassification} object that can be
+ * used to generate a widget for handling the classified text.
*
* @param text text providing context for the text to classify (which is specified
* by the sub sequence starting at startIndex and ending at endIndex)
@@ -112,8 +114,9 @@
* @throws IllegalArgumentException if text is null; startIndex is negative;
* endIndex is greater than text.length() or not greater than startIndex
*/
+ @WorkerThread
@NonNull
- TextClassificationResult getTextClassificationResult(
+ TextClassification classifyText(
@NonNull CharSequence text,
@IntRange(from = 0) int startIndex,
@IntRange(from = 0) int endIndex,
@@ -134,6 +137,7 @@
* @throws IllegalArgumentException if text is null
* @hide
*/
+ @WorkerThread
LinksInfo getLinks(
@NonNull CharSequence text, int linkMask, @Nullable LocaleList defaultLocales);
}
diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java
index 246fab3..108107e 100644
--- a/core/java/android/view/textclassifier/TextClassifierImpl.java
+++ b/core/java/android/view/textclassifier/TextClassifierImpl.java
@@ -44,6 +44,7 @@
import java.io.File;
import java.io.FileNotFoundException;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -71,6 +72,8 @@
private static final String LOG_TAG = "TextClassifierImpl";
private static final String MODEL_DIR = "/etc/textclassifier/";
private static final String MODEL_FILE_REGEX = "textclassifier\\.smartselection\\.(.*)\\.model";
+ private static final String UPDATED_MODEL_FILE_PATH =
+ "/data/misc/textclassifier/textclassifier.smartselection.model";
private final Context mContext;
@@ -127,7 +130,7 @@
}
@Override
- public TextClassificationResult getTextClassificationResult(
+ public TextClassification classifyText(
@NonNull CharSequence text, int startIndex, int endIndex,
@Nullable LocaleList defaultLocales) {
validateInput(text, startIndex, endIndex);
@@ -138,7 +141,7 @@
.classifyText(string, startIndex, endIndex,
getHintFlags(string, startIndex, endIndex));
if (results.length > 0) {
- final TextClassificationResult classificationResult =
+ final TextClassification classificationResult =
createClassificationResult(
results, string.subSequence(startIndex, endIndex));
// TODO: Added this log for debug only. Remove before release.
@@ -152,7 +155,7 @@
Log.e(LOG_TAG, "Error getting assist info.", t);
}
// Getting here means something went wrong, return a NO_OP result.
- return TextClassifier.NO_OP.getTextClassificationResult(
+ return TextClassifier.NO_OP.classifyText(
text, startIndex, endIndex, defaultLocales);
}
@@ -175,15 +178,12 @@
synchronized (mSmartSelectionLock) {
localeList = localeList == null ? LocaleList.getEmptyLocaleList() : localeList;
final Locale locale = findBestSupportedLocaleLocked(localeList);
+ if (locale == null) {
+ throw new FileNotFoundException("No file for null locale");
+ }
if (mSmartSelection == null || !Objects.equals(mLocale, locale)) {
destroySmartSelectionIfExistsLocked();
- mSmartSelection = new SmartSelection(
- ParcelFileDescriptor.open(
- // findBestSupportedLocaleLocked should have initialized
- // mModelFilePaths
- new File(mModelFilePaths.get(locale)),
- ParcelFileDescriptor.MODE_READ_ONLY)
- .getFd());
+ mSmartSelection = new SmartSelection(getFdLocked(locale));
mLocale = locale;
}
return mSmartSelection;
@@ -191,6 +191,68 @@
}
@GuardedBy("mSmartSelectionLock") // Do not call outside this lock.
+ private int getFdLocked(Locale locale) throws FileNotFoundException {
+ ParcelFileDescriptor updateFd;
+ try {
+ updateFd = ParcelFileDescriptor.open(
+ new File(UPDATED_MODEL_FILE_PATH), ParcelFileDescriptor.MODE_READ_ONLY);
+ } catch (FileNotFoundException e) {
+ updateFd = null;
+ }
+ ParcelFileDescriptor factoryFd;
+ try {
+ final String factoryModelFilePath = getFactoryModelFilePathsLocked().get(locale);
+ if (factoryModelFilePath != null) {
+ factoryFd = ParcelFileDescriptor.open(
+ new File(factoryModelFilePath), ParcelFileDescriptor.MODE_READ_ONLY);
+ } else {
+ factoryFd = null;
+ }
+ } catch (FileNotFoundException e) {
+ factoryFd = null;
+ }
+
+ if (updateFd == null) {
+ if (factoryFd != null) {
+ return factoryFd.getFd();
+ } else {
+ throw new FileNotFoundException(
+ String.format("No model file found for %s", locale));
+ }
+ }
+
+ final int updateFdInt = updateFd.getFd();
+ final boolean localeMatches = Objects.equals(
+ locale.getLanguage().trim().toLowerCase(),
+ SmartSelection.getLanguage(updateFdInt).trim().toLowerCase());
+ if (factoryFd == null) {
+ if (localeMatches) {
+ return updateFdInt;
+ } else {
+ closeAndLogError(updateFd);
+ throw new FileNotFoundException(
+ String.format("No model file found for %s", locale));
+ }
+ }
+
+ if (!localeMatches) {
+ closeAndLogError(updateFd);
+ return factoryFd.getFd();
+ }
+
+ final int updateVersion = SmartSelection.getVersion(updateFdInt);
+ final int factoryFdInt = factoryFd.getFd();
+ final int factoryVersion = SmartSelection.getVersion(factoryFdInt);
+ if (updateVersion > factoryVersion) {
+ closeAndLogError(factoryFd);
+ return updateFdInt;
+ } else {
+ closeAndLogError(updateFd);
+ return factoryFdInt;
+ }
+ }
+
+ @GuardedBy("mSmartSelectionLock") // Do not call outside this lock.
private void destroySmartSelectionIfExistsLocked() {
if (mSmartSelection != null) {
mSmartSelection.close();
@@ -206,11 +268,18 @@
? LocaleList.getDefault().toLanguageTags()
: localeList.toLanguageTags() + "," + LocaleList.getDefault().toLanguageTags();
final List<Locale.LanguageRange> languageRangeList = Locale.LanguageRange.parse(languages);
- return Locale.lookup(languageRangeList, loadModelFilePathsLocked().keySet());
+
+ final List<Locale> supportedLocales =
+ new ArrayList<>(getFactoryModelFilePathsLocked().keySet());
+ final Locale updatedModelLocale = getUpdatedModelLocale();
+ if (updatedModelLocale != null) {
+ supportedLocales.add(updatedModelLocale);
+ }
+ return Locale.lookup(languageRangeList, supportedLocales);
}
@GuardedBy("mSmartSelectionLock") // Do not call outside this lock.
- private Map<Locale, String> loadModelFilePathsLocked() {
+ private Map<Locale, String> getFactoryModelFilePathsLocked() {
if (mModelFilePaths == null) {
final Map<Locale, String> modelFilePaths = new HashMap<>();
final File modelsDir = new File(MODEL_DIR);
@@ -233,9 +302,23 @@
return mModelFilePaths;
}
- private TextClassificationResult createClassificationResult(
+ @Nullable
+ private Locale getUpdatedModelLocale() {
+ try {
+ final ParcelFileDescriptor updateFd = ParcelFileDescriptor.open(
+ new File(UPDATED_MODEL_FILE_PATH), ParcelFileDescriptor.MODE_READ_ONLY);
+ final Locale locale = Locale.forLanguageTag(
+ SmartSelection.getLanguage(updateFd.getFd()));
+ closeAndLogError(updateFd);
+ return locale;
+ } catch (FileNotFoundException e) {
+ return null;
+ }
+ }
+
+ private TextClassification createClassificationResult(
SmartSelection.ClassificationResult[] classifications, CharSequence text) {
- final TextClassificationResult.Builder builder = new TextClassificationResult.Builder()
+ final TextClassification.Builder builder = new TextClassification.Builder()
.setText(text.toString());
final int size = classifications.length;
@@ -258,7 +341,7 @@
}
if (resolveInfo != null && resolveInfo.activityInfo != null) {
builder.setIntent(intent)
- .setOnClickListener(TextClassificationResult.createStartActivityOnClickListener(
+ .setOnClickListener(TextClassification.createStartActivityOnClickListener(
mContext, intent));
final String packageName = resolveInfo.activityInfo.packageName;
@@ -319,6 +402,17 @@
}
/**
+ * Closes the ParcelFileDescriptor and logs any errors that occur.
+ */
+ private static void closeAndLogError(ParcelFileDescriptor fd) {
+ try {
+ fd.close();
+ } catch (IOException e) {
+ Log.e(LOG_TAG, "Error closing file.", e);
+ }
+ }
+
+ /**
* @throws IllegalArgumentException if text is null; startIndex is negative;
* endIndex is greater than text.length() or is not greater than startIndex
*/
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 6213a63..52c82a7 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -2255,6 +2255,7 @@
/**
* Sets the {@link TextClassifier} for this WebView.
+ * @hide
*/
public void setTextClassifier(@Nullable TextClassifier textClassifier) {
mProvider.setTextClassifier(textClassifier);
@@ -2263,6 +2264,7 @@
/**
* Returns the {@link TextClassifier} used by this WebView.
* If no TextClassifier has been set, this WebView uses the default set by the system.
+ * @hide
*/
@NonNull
public TextClassifier getTextClassifier() {
@@ -2506,6 +2508,7 @@
super.onDetachedFromWindowInternal();
}
+ /** @hide */
@Override
public void onMovedToDisplay(int displayId, Configuration config) {
mProvider.getViewDelegate().onMovedToDisplay(displayId, config);
diff --git a/core/java/android/webkit/WebViewZygote.java b/core/java/android/webkit/WebViewZygote.java
index 2123deb..b519ec9 100644
--- a/core/java/android/webkit/WebViewZygote.java
+++ b/core/java/android/webkit/WebViewZygote.java
@@ -40,6 +40,7 @@
private static final String WEBVIEW_ZYGOTE_SERVICE_32 = "webview_zygote32";
private static final String WEBVIEW_ZYGOTE_SERVICE_64 = "webview_zygote64";
+ private static final String WEBVIEW_ZYGOTE_SOCKET = "webview_zygote";
/**
* Lock object that protects all other static members.
@@ -202,7 +203,7 @@
}
try {
- sZygote = new ZygoteProcess("webview_zygote", null);
+ sZygote = new ZygoteProcess(WEBVIEW_ZYGOTE_SOCKET, null);
// All the work below is usually done by LoadedApk, but the zygote can't talk to
// PackageManager or construct a LoadedApk since it's single-threaded pre-fork, so
@@ -217,6 +218,8 @@
final String zip = (zipPaths.size() == 1) ? zipPaths.get(0) :
TextUtils.join(File.pathSeparator, zipPaths);
+ waitForZygote();
+
Log.d(LOGTAG, "Preloading package " + zip + " " + librarySearchPath);
sZygote.preloadPackageForAbi(zip, librarySearchPath, sPackageCacheKey,
Build.SUPPORTED_ABIS[0]);
@@ -225,4 +228,25 @@
sZygote = null;
}
}
+
+ /**
+ * Wait until a connection to the Zygote can be established.
+ */
+ private static void waitForZygote() {
+ while (true) {
+ try {
+ final ZygoteProcess.ZygoteState zs =
+ ZygoteProcess.ZygoteState.connect(WEBVIEW_ZYGOTE_SOCKET);
+ zs.close();
+ break;
+ } catch (IOException ioe) {
+ Log.w(LOGTAG, "Got error connecting to zygote, retrying. msg= " + ioe.getMessage());
+ }
+
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException ie) {
+ }
+ }
+ }
}
diff --git a/core/java/android/widget/AbsSpinner.java b/core/java/android/widget/AbsSpinner.java
index f80c9e6..816c949 100644
--- a/core/java/android/widget/AbsSpinner.java
+++ b/core/java/android/widget/AbsSpinner.java
@@ -491,8 +491,6 @@
return AbsSpinner.class.getName();
}
- // TODO(b/33197203): add unit/CTS tests for auto-fill methods (and make sure they handle enable)
-
@Override
public void autofill(AutofillValue value) {
if (!isEnabled()) return;
diff --git a/core/java/android/widget/ArrayAdapter.java b/core/java/android/widget/ArrayAdapter.java
index 869ef71..74f22b3 100644
--- a/core/java/android/widget/ArrayAdapter.java
+++ b/core/java/android/widget/ArrayAdapter.java
@@ -37,19 +37,38 @@
import java.util.List;
/**
- * A concrete BaseAdapter that is backed by an array of arbitrary
- * objects. By default this class expects that the provided resource id references
- * a single TextView. If you want to use a more complex layout, use the constructors that
- * also takes a field id. That field id should reference a TextView in the larger layout
- * resource.
- *
- * <p>However the TextView is referenced, it will be filled with the toString() of each object in
- * the array. You can add lists or arrays of custom objects. Override the toString() method
- * of your objects to determine what text will be displayed for the item in the list.
- *
- * <p>To use something other than TextViews for the array display, for instance, ImageViews,
- * or to have some of data besides toString() results fill the views,
- * override {@link #getView(int, View, ViewGroup)} to return the type of view you want.
+ * You can use this adapter to provide views for an {@link AdapterView},
+ * Returns a view for each object in a collection of data objects you
+ * provide, and can be used with list-based user interface widgets such as
+ * {@link ListView} or {@link Spinner}.
+ * <p>
+ * By default, the array adapter creates a view by calling {@link Object#toString()} on each
+ * data object in the collection you provide, and places the result in a TextView.
+ * You may also customize what type of view is used for the data object in the collection.
+ * To customize what type of view is used for the data object,
+ * override {@link #getView(int, View, ViewGroup)}
+ * and inflate a view resource.
+ * For a code example, see
+ * the <a href="https://developer.android.com/samples/CustomChoiceList/index.html">
+ * CustomChoiceList</a> sample.
+ * </p>
+ * <p>
+ * For an example of using an array adapter with a ListView, see the
+ * <a href="{@docRoot}guide/topics/ui/declaring-layout.html#AdapterViews">
+ * Adapter Views</a> guide.
+ * </p>
+ * <p>
+ * For an example of using an array adapter with a Spinner, see the
+ * <a href="{@docRoot}guide/topics/ui/controls/spinner.html">Spinners</a> guide.
+ * </p>
+ * <p class="note"><strong>Note:</strong>
+ * If you are considering using array adapter with a ListView, consider using
+ * {@link android.support.v7.widget.RecyclerView} instead.
+ * RecyclerView offers similar features with better performance and more flexibility than
+ * ListView provides.
+ * See the
+ * <a href="https://developer.android.com/guide/topics/ui/layout/recyclerview.html">
+ * Recycler View</a> guide.</p>
*/
public class ArrayAdapter<T> extends BaseAdapter implements Filterable, ThemedSpinnerAdapter {
/**
diff --git a/core/java/android/widget/Button.java b/core/java/android/widget/Button.java
index 09ba553..452ff17 100644
--- a/core/java/android/widget/Button.java
+++ b/core/java/android/widget/Button.java
@@ -24,89 +24,150 @@
/**
- * Represents a push-button widget. Push-buttons can be
- * pressed, or clicked, by the user to perform an action.
-
- * <p>A typical use of a push-button in an activity would be the following:
- * </p>
+ * A user interface element the user can tap or click to perform an action.
+ *
+ * <p>To display a button in an activity, add a button to the activity's layout XML file:</p>
+ *
+ * <pre>
+ * <Button
+ * android:id="@+id/button_id"
+ * android:layout_height="wrap_content"
+ * android:layout_width="wrap_content"
+ * android:text="@string/self_destruct" /></pre>
+ *
+ * <p>To specify an action when the button is pressed, set a click
+ * listener on the button object in the corresponding activity code:</p>
*
* <pre>
* public class MyActivity extends Activity {
- * protected void onCreate(Bundle icicle) {
- * super.onCreate(icicle);
+ * protected void onCreate(Bundle savedInstanceState) {
+ * super.onCreate(savedInstanceState);
*
* setContentView(R.layout.content_layout_id);
*
* final Button button = findViewById(R.id.button_id);
* button.setOnClickListener(new View.OnClickListener() {
* public void onClick(View v) {
- * // Perform action on click
+ * // Code here executes on main thread after user presses button
* }
* });
* }
* }</pre>
*
- * <p>However, instead of applying an {@link android.view.View.OnClickListener OnClickListener} to
- * the button in your activity, you can assign a method to your button in the XML layout,
- * using the {@link android.R.attr#onClick android:onClick} attribute. For example:</p>
+ * <p>The above snippet creates an instance of {@link View.OnClickListener} and wires
+ * the listener to the button using
+ * {@link #setOnClickListener setOnClickListener(View.OnClickListener)}.
+ * As a result, the system executes the code you write in {@code onClick(View)} after the
+ * user presses the button.</p>
*
- * <pre>
- * <Button
- * android:layout_height="wrap_content"
- * android:layout_width="wrap_content"
- * android:text="@string/self_destruct"
- * android:onClick="selfDestruct" /></pre>
+ * <p class="note">The system executes the code in {@code onClick} on the
+ * <a href="{@docRoot}guide/components/processes-and-threads.html#Threads">main thread</a>.
+ * This means your onClick code must execute quickly to avoid delaying your app's response
+ * to further user actions. See
+ * <a href="{@docRoot}training/articles/perf-anr.html">Keeping Your App Responsive</a>
+ * for more details.</p>
*
- * <p>Now, when a user clicks the button, the Android system calls the activity's {@code
- * selfDestruct(View)} method. In order for this to work, the method must be public and accept
- * a {@link android.view.View} as its only parameter. For example:</p>
- *
- * <pre>
- * public void selfDestruct(View view) {
- * // Kabloey
- * }</pre>
- *
- * <p>The {@link android.view.View} passed into the method is a reference to the widget
- * that was clicked.</p>
- *
- * <h3>Button style</h3>
- *
- * <p>Every Button is styled using the system's default button background, which is often different
- * from one device to another and from one version of the platform to another. If you're not
- * satisfied with the default button style and want to customize it to match the design of your
- * application, then you can replace the button's background image with a <a
- * href="{@docRoot}guide/topics/resources/drawable-resource.html#StateList">state list drawable</a>.
- * A state list drawable is a drawable resource defined in XML that changes its image based on
- * the current state of the button. Once you've defined a state list drawable in XML, you can apply
- * it to your Button with the {@link android.R.attr#background android:background}
- * attribute. For more information and an example, see <a
- * href="{@docRoot}guide/topics/resources/drawable-resource.html#StateList">State List
- * Drawable</a>.</p>
- *
- * <p>See the <a href="{@docRoot}guide/topics/ui/controls/button.html">Buttons</a>
+ * <p>Every button is styled using the system's default button background, which is often
+ * different from one version of the platform to another. If you are not satisfied with the
+ * default button style, you can customize it. For more details and code samples, see the
+ * <a href="{@docRoot}guide/topics/ui/controls/button.html#Style">Styling Your Button</a>
* guide.</p>
*
- * <p><strong>XML attributes</strong></p>
- * <p>
- * See {@link android.R.styleable#Button Button Attributes},
+ * <p>For all XML style attributes available on Button see
+ * {@link android.R.styleable#Button Button Attributes},
* {@link android.R.styleable#TextView TextView Attributes},
- * {@link android.R.styleable#View View Attributes}
- * </p>
+ * {@link android.R.styleable#View View Attributes}. See the
+ * {@link <a href="{@docRoot}guide/topics/ui/themes.html#ApplyingStyles">Styles and Themes</a>
+ * guide to learn how to implement and organize overrides to style-related attributes.</p>
+ *
+ * @see
+ * <a href="{@docRoot}guide/topics/ui/controls/button.html">Buttons Guide</a>
+ * {@link android.R.styleable#Button Styleable Button Attributes},
+ * {@link android.R.styleable#TextView Styleable TextView Attributes},
+ * {@link android.R.styleable#View Styleable View Attributes},
+ *
*/
@RemoteView
public class Button extends TextView {
+
+ /**
+ * Simple constructor to use when creating a button from code.
+ *
+ * @param context The Context the Button is running in, through which it can
+ * access the current theme, resources, etc.
+ *
+ * @see #Button(Context, AttributeSet)
+ */
public Button(Context context) {
this(context, null);
}
+ /**
+ * {@link LayoutInflater} calls this constructor when inflating a Button from XML.
+ * The attributes defined by the current theme's
+ * {@link android.R.attr#buttonStyle android:buttonStyle}
+ * override base view attributes.
+ *
+ * You typically do not call this constructor to create your own button instance in code.
+ * However, you must override this constructor when
+ * <a href="{@docRoot}training/custom-views/index.html">creating custom views</a>.
+ *
+ * @param context The Context the view is running in, through which it can
+ * access the current theme, resources, etc.
+ * @param attrs The attributes of the XML Button tag being used to inflate the view.
+ *
+ * @see #Button(Context, AttributeSet, int)
+ * @see android.view.View#View(Context, AttributeSet)
+ */
public Button(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.buttonStyle);
}
+ /**
+ * This constructor allows a Button subclass to use its own class-specific base style from a
+ * theme attribute when inflating. The attributes defined by the current theme's
+ * {@code defStyleAttr} override base view attributes.
+ *
+ * <p>For Button's base view attributes see
+ * {@link android.R.styleable#Button Button Attributes},
+ * {@link android.R.styleable#TextView TextView Attributes},
+ * {@link android.R.styleable#View View Attributes}.
+ *
+ * @param context The Context the Button is running in, through which it can
+ * access the current theme, resources, etc.
+ * @param attrs The attributes of the XML Button tag that is inflating the view.
+ * @param defStyleAttr The resource identifier of an attribute in the current theme
+ * whose value is the the resource id of a style. The specified style’s
+ * attribute values serve as default values for the button. Set this parameter
+ * to 0 to avoid use of default values.
+ * @see #Button(Context, AttributeSet, int, int)
+ * @see android.view.View#View(Context, AttributeSet, int)
+ */
public Button(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
+ /**
+ * This constructor allows a Button subclass to use its own class-specific base style from
+ * either a theme attribute or style resource when inflating. To see how the final value of a
+ * particular attribute is resolved based on your inputs to this constructor, see
+ * {@link android.view.View#View(Context, AttributeSet, int, int)}.
+ *
+ * @param context The Context the Button is running in, through which it can
+ * access the current theme, resources, etc.
+ * @param attrs The attributes of the XML Button tag that is inflating the view.
+ * @param defStyleAttr The resource identifier of an attribute in the current theme
+ * whose value is the the resource id of a style. The specified style’s
+ * attribute values serve as default values for the button. Set this parameter
+ * to 0 to avoid use of default values.
+ * @param defStyleRes The identifier of a style resource that
+ * supplies default values for the button, used only if
+ * defStyleAttr is 0 or cannot be found in the theme.
+ * Set this parameter to 0 to avoid use of default values.
+ *
+ * @see #Button(Context, AttributeSet, int)
+ * @see android.view.View#View(Context, AttributeSet, int, int)
+ */
public Button(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
diff --git a/core/java/android/widget/CompoundButton.java b/core/java/android/widget/CompoundButton.java
index c7ba7b5..0762b15 100644
--- a/core/java/android/widget/CompoundButton.java
+++ b/core/java/android/widget/CompoundButton.java
@@ -574,8 +574,6 @@
stream.addProperty("checked", isChecked());
}
- // TODO(b/33197203): add unit/CTS tests for autofill methods (and make sure they handle enable)
-
@Override
public void onProvideAutofillStructure(ViewStructure structure, int flags) {
super.onProvideAutofillStructure(structure, flags);
diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java
index 463ff58..8094bfc 100644
--- a/core/java/android/widget/DatePicker.java
+++ b/core/java/android/widget/DatePicker.java
@@ -764,13 +764,12 @@
void onValidationChanged(boolean valid);
}
- // TODO(b/33197203): add unit/CTS tests for autofill methods (and make sure they handle enable)
-
@Override
public void dispatchProvideAutofillStructure(ViewStructure structure, int flags) {
// This view is self-sufficient for autofill, so it needs to call
// onProvideAutoFillStructure() to fill itself, but it does not need to call
// dispatchProvideAutoFillStructure() to fill its children.
+ structure.setAutofillId(getAutofillId());
onProvideAutofillStructure(structure, flags);
}
diff --git a/core/java/android/widget/EditText.java b/core/java/android/widget/EditText.java
index 07ad872..56c3e4a 100644
--- a/core/java/android/widget/EditText.java
+++ b/core/java/android/widget/EditText.java
@@ -33,11 +33,35 @@
*/
/**
- * EditText is a thin veneer over TextView that configures itself
- * to be editable.
+ * A user interface element for entering and modifying text.
+ * When you define an edit text widget, you must specify the
+ * {@link android.R.styleable#TextView_inputType}
+ * attribute. For example, for plain text input set inputType to "text":
+ * <p>
+ * <pre>
+ * <EditText
+ * android:id="@+id/plain_text_input"
+ * android:layout_height="wrap_content"
+ * android:layout_width="match_parent"
+ * android:inputType="text"/></pre>
*
- * <p>See the <a href="{@docRoot}guide/topics/ui/controls/text.html">Text Fields</a>
- * guide.</p>
+ * Choosing the input type configures the keyboard type that is shown, acceptable characters,
+ * and appearance of the edit text.
+ * For example, if you want to accept a secret number, like a unique pin or serial number,
+ * you can set inputType to "numericPassword".
+ * An inputType of "numericPassword" results in an edit text that accepts numbers only,
+ * shows a numeric keyboard when focused, and masks the text that is entered for privacy.
+ * <p>
+ * See the <a href="{@docRoot}guide/topics/ui/controls/text.html">Text Fields</a>
+ * guide for examples of other
+ * {@link android.R.styleable#TextView_inputType} settings.
+ * </p>
+ * <p>You also can receive callbacks as a user changes text by
+ * adding a {@link android.text.TextWatcher} to the edit text.
+ * This is useful when you want to add auto-save functionality as changes are made,
+ * or validate the format of user input, for example.
+ * You add a text watcher using the {@link TextView#addTextChangedListener} method.
+ * </p>
* <p>
* This widget does not support auto-sizing text.
* <p>
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 4ae3510..481c160 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -106,7 +106,7 @@
import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
-import android.view.textclassifier.TextClassificationResult;
+import android.view.textclassifier.TextClassification;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.TextView.Drawables;
import android.widget.TextView.OnEditorActionListener;
@@ -3836,9 +3836,11 @@
}
if (mTextView.canRequestAutofill()) {
+ final int mode = mTextView.getText().length() <= 0
+ ? MenuItem.SHOW_AS_ACTION_IF_ROOM : MenuItem.SHOW_AS_ACTION_NEVER;
menu.add(Menu.NONE, TextView.ID_AUTOFILL, MENU_ITEM_ORDER_AUTOFILL,
com.android.internal.R.string.autofill)
- .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+ .setShowAsAction(mode);
}
updateSelectAllItem(menu);
@@ -3884,14 +3886,14 @@
private void updateAssistMenuItem(Menu menu) {
menu.removeItem(TextView.ID_ASSIST);
- final TextClassificationResult textClassificationResult =
- getSelectionActionModeHelper().getTextClassificationResult();
- if (textClassificationResult != null) {
- final Drawable icon = textClassificationResult.getIcon();
- final CharSequence label = textClassificationResult.getLabel();
+ final TextClassification textClassification =
+ getSelectionActionModeHelper().getTextClassification();
+ if (textClassification != null) {
+ final Drawable icon = textClassification.getIcon();
+ final CharSequence label = textClassification.getLabel();
final OnClickListener onClickListener =
- textClassificationResult.getOnClickListener();
- final Intent intent = textClassificationResult.getIntent();
+ textClassification.getOnClickListener();
+ final Intent intent = textClassification.getIntent();
if ((icon != null || !TextUtils.isEmpty(label))
&& (onClickListener != null || intent != null)) {
menu.add(TextView.ID_ASSIST, TextView.ID_ASSIST, MENU_ITEM_ORDER_ASSIST, label)
@@ -3900,7 +3902,7 @@
mMetricsLogger.write(
new LogMaker(MetricsEvent.TEXT_SELECTION_MENU_ITEM_ASSIST)
.setType(MetricsEvent.TYPE_OPEN)
- .setSubtype(textClassificationResult.getLogType()));
+ .setSubtype(textClassification.getLogType()));
}
}
}
@@ -3914,24 +3916,24 @@
if (customCallback != null && customCallback.onActionItemClicked(mode, item)) {
return true;
}
- final TextClassificationResult textClassificationResult =
- getSelectionActionModeHelper().getTextClassificationResult();
- if (TextView.ID_ASSIST == item.getItemId() && textClassificationResult != null) {
+ final TextClassification textClassification =
+ getSelectionActionModeHelper().getTextClassification();
+ if (TextView.ID_ASSIST == item.getItemId() && textClassification != null) {
final OnClickListener onClickListener =
- textClassificationResult.getOnClickListener();
+ textClassification.getOnClickListener();
if (onClickListener != null) {
onClickListener.onClick(mTextView);
} else {
- final Intent intent = textClassificationResult.getIntent();
+ final Intent intent = textClassification.getIntent();
if (intent != null) {
- TextClassificationResult.createStartActivityOnClickListener(
+ TextClassification.createStartActivityOnClickListener(
mTextView.getContext(), intent)
.onClick(mTextView);
}
}
mMetricsLogger.action(
MetricsEvent.ACTION_TEXT_SELECTION_MENU_ITEM_ASSIST,
- textClassificationResult.getLogType());
+ textClassification.getLogType());
stopTextActionMode();
return true;
}
diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java
index 544e591..88c3c5b 100644
--- a/core/java/android/widget/LinearLayout.java
+++ b/core/java/android/widget/LinearLayout.java
@@ -39,20 +39,43 @@
/**
- * A Layout that arranges its children in a single column or a single row. The direction of
- * the row can be set by calling {@link #setOrientation(int) setOrientation()}.
- * You can also specify gravity, which specifies the alignment of all the child elements by
- * calling {@link #setGravity(int) setGravity()} or specify that specific children
- * grow to fill up any remaining space in the layout by setting the <em>weight</em> member of
- * {@link android.widget.LinearLayout.LayoutParams LinearLayout.LayoutParams}.
- * The default orientation is horizontal.
+ * A layout that arranges other views either horizontally in a single column
+ * or vertically in a single row.
*
- * <p>See the <a href="{@docRoot}guide/topics/ui/layout/linear.html">Linear Layout</a>
- * guide.</p>
+ * <p>The following snippet shows how to include a linear layout in your layout XML file:</p>
*
- * <p>
- * Also see {@link LinearLayout.LayoutParams android.widget.LinearLayout.LayoutParams}
- * for layout attributes </p>
+ * <pre><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ * android:layout_width="match_parent"
+ * android:layout_height="match_parent"
+ * android:paddingLeft="16dp"
+ * android:paddingRight="16dp"
+ * android:orientation="horizontal"
+ * android:gravity="center">
+ *
+ * <!-- Include other widget or layout tags here. These are considered
+ * "child views" or "children" of the linear layout -->
+ *
+ * </LinearLayout></pre>
+ *
+ * <p>Set {@link android.R.styleable#LinearLayout_orientation android:orientation} to specify
+ * whether child views are displayed in a row or column.</p>
+ *
+ * <p>To control how linear layout aligns all the views it contains, set a value for
+ * {@link android.R.styleable#LinearLayout_gravity android:gravity}. For example, the
+ * snippet above sets android:gravity to "center". The value you set affects
+ * both horizontal and vertical alignment of all child views within the single row or column.</p>
+ *
+ * <p>You can set
+ * {@link LinearLayout.LayoutParams.html#attr_android:layout_weight android:layout_weight}
+ * on individual child views to specify how linear layout divides remaining space amongst
+ * the views it contains. See the
+ * <a href="https://developer.android.com/guide/topics/ui/layout/linear.html">Linear Layout</a>
+ * guide for an example.</p>
+ *
+ * <p>See
+ * {@link android.widget.LinearLayout.LayoutParams LinearLayout.LayoutParams}
+ * to learn about other attributes you can set on a child view to affect its
+ * position and size in the containing linear layout.</p>
*
* @attr ref android.R.styleable#LinearLayout_baselineAligned
* @attr ref android.R.styleable#LinearLayout_baselineAlignedChildIndex
@@ -235,9 +258,9 @@
mUseLargestChild = a.getBoolean(R.styleable.LinearLayout_measureWithLargestChild, false);
- setDividerDrawable(a.getDrawable(R.styleable.LinearLayout_divider));
mShowDividers = a.getInt(R.styleable.LinearLayout_showDividers, SHOW_DIVIDER_NONE);
mDividerPadding = a.getDimensionPixelSize(R.styleable.LinearLayout_dividerPadding, 0);
+ setDividerDrawable(a.getDrawable(R.styleable.LinearLayout_divider));
final int version = context.getApplicationInfo().targetSdkVersion;
mAllowInconsistentMeasurement = version <= Build.VERSION_CODES.M;
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index 12e35a1..569fe01 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -67,11 +67,77 @@
/**
- * A view that shows items in a vertically scrolling list. The items
- * come from the {@link ListAdapter} associated with this view.
+ * <p>Displays a vertically-scrollable collection of views, where each view is positioned
+ * immediatelybelow the previous view in the list. For a more modern, flexible, and performant
+ * approach to displaying lists, use {@link android.support.v7.widget.RecyclerView}.</p>
*
- * <p>See the <a href="{@docRoot}guide/topics/ui/layout/listview.html">List View</a>
- * guide.</p>
+ * <p>To display a list, you can include a list view in your layout XML file:</p>
+ *
+ * <pre><ListView
+ * android:id="@+id/list_view"
+ * android:layout_width="match_parent"
+ * android:layout_height="match_parent" /></pre>
+ *
+ * <p>A list view is an <a href="{@docRoot}guide/topics/ui/declaring-layout.html#AdapterViews">
+ * adapter view</a> that does not know the details, such as type and contents, of the views it
+ * contains. Instead list view requests views on demand from a {@link ListAdapter} as needed,
+ * such as to display new views as the user scrolls up or down.</p>
+ *
+ * <p>In order to display items in the list, call {@link #setAdapter(ListAdapter adapter)}
+ * to associate an adapter with the list. For a simple example, see the discussion of filling an
+ * adapter view with text in the
+ * <a href="{@docRoot}guide/topics/ui/declaring-layout.html#FillingTheLayout">
+ * Layouts</a> guide.</p>
+ *
+ * <p>To display a more custom view for each item in your dataset, implement a ListAdapter.
+ * For example, extend {@link BaseAdapter} and create and configure the view for each data item in
+ * {@code getView(...)}:</p>
+ *
+ * <pre>private class MyAdapter extends BaseAdapter {
+ *
+ * // override other abstract methods here
+ *
+ * @Override
+ * public View getView(int position, View convertView, ViewGroup container) {
+ * if (convertView == null) {
+ * convertView = getLayoutInflater().inflate(R.layout.list_item, container, false);
+ * }
+ *
+ * ((TextView) convertView.findViewById(android.R.id.text1))
+ * .setText(getItem(position));
+ * return convertView;
+ * }
+ * }</pre>
+ *
+ * <p class="note">ListView attempts to reuse view objects in order to improve performance and
+ * avoid a lag in response to user scrolls. To take advantage of this feature, check if the
+ * {@code convertView} provided to {@code getView(...)} is null before creating or inflating a new
+ * view object. See
+ * <a href="{@docRoot}training/improving-layouts/smooth-scrolling.html">
+ * Making ListView Scrolling Smooth</a> for more ways to ensure a smooth user experience.</p>
+ *
+ * <p>For a more complete example of creating a custom adapter, see the
+ * <a href="{@docRoot}samples/CustomChoiceList/index.html">
+ * Custom Choice List</a> sample app.</p>
+ *
+ * <p>To specify an action when a user clicks or taps on a single list item, see
+ * <a href="{@docRoot}guide/topics/ui/declaring-layout.html#HandlingUserSelections">
+ * Handling click events</a>.</p>
+ *
+ * <p>To learn how to populate a list view with a CursorAdapter, see the discussion of filling an
+ * adapter view with text in the
+ * <a href="{@docRoot}guide/topics/ui/declaring-layout.html#FillingTheLayout">
+ * Layouts</a> guide.
+ * See <a href="{@docRoot}guide/topics/ui/layout/listview.html">
+ * Using a Loader</a>
+ * to learn how to avoid blocking the main thread when using a cursor.</p>
+ *
+ * <p class="note">Note, many examples use {@link android.app.ListActivity ListActivity}
+ * or {@link android.app.ListFragment ListFragment}
+ * to display a list view. Instead, favor the more flexible approach when writing your own app:
+ * use a more generic Activity subclass or Fragment subclass and add a list view to the layout
+ * or view hierarchy directly. This approach gives you more direct control of the
+ * list view and adapter.</p>
*
* @attr ref android.R.styleable#ListView_entries
* @attr ref android.R.styleable#ListView_divider
diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java
index cabf8ea..ced66cd 100644
--- a/core/java/android/widget/ProgressBar.java
+++ b/core/java/android/widget/ProgressBar.java
@@ -65,99 +65,57 @@
/**
* <p>
- * Visual indicator of progress in some operation. Displays a bar to the user
- * representing how far the operation has progressed; the application can
- * change the amount of progress (modifying the length of the bar) as it moves
- * forward. There is also a secondary progress displayable on a progress bar
- * which is useful for displaying intermediate progress, such as the buffer
- * level during a streaming playback progress bar.
+ * A user interface element that indicates the progress of an operation.
+ * Progress bar supports two modes to represent progress: determinate, and indeterminate. For
+ * a visual overview of the difference between determinate and indeterminate progress modes, see
+ * <a href="https://material.io/guidelines/components/progress-activity.html#progress-activity-types-of-indicators">
+ * Progress & activity</a>.
+ * Display progress bars to a user in a non-interruptive way.
+ * Show the progress bar in your app's user interface or in a notification
+ * instead of within a dialog.
* </p>
- *
+ * <h3>Indeterminate Progress</h3>
* <p>
- * A progress bar can also be made indeterminate. In indeterminate mode, the
- * progress bar shows a cyclic animation without an indication of progress. This mode is used by
- * applications when the length of the task is unknown. The indeterminate progress bar can be either
- * a spinning wheel or a horizontal bar.
- * </p>
- *
- * <p>The following code example shows how a progress bar can be used from
- * a worker thread to update the user interface to notify the user of progress:
- * </p>
- *
- * <pre>
- * public class MyActivity extends Activity {
- * private static final int PROGRESS = 0x1;
- *
- * private ProgressBar mProgress;
- * private int mProgressStatus = 0;
- *
- * private Handler mHandler = new Handler();
- *
- * protected void onCreate(Bundle icicle) {
- * super.onCreate(icicle);
- *
- * setContentView(R.layout.progressbar_activity);
- *
- * mProgress = (ProgressBar) findViewById(R.id.progress_bar);
- *
- * // Start lengthy operation in a background thread
- * new Thread(new Runnable() {
- * public void run() {
- * while (mProgressStatus < 100) {
- * mProgressStatus = doWork();
- *
- * // Update the progress bar
- * mHandler.post(new Runnable() {
- * public void run() {
- * mProgress.setProgress(mProgressStatus);
- * }
- * });
- * }
- * }
- * }).start();
- * }
- * }</pre>
- *
- * <p>To add a progress bar to a layout file, you can use the {@code <ProgressBar>} element.
- * By default, the progress bar is a spinning wheel (an indeterminate indicator). To change to a
- * horizontal progress bar, apply the {@link android.R.style#Widget_ProgressBar_Horizontal
- * Widget.ProgressBar.Horizontal} style, like so:</p>
- *
+ * Use indeterminate mode for the progress bar when you do not know how long an
+ * operation will take.
+ * Indeterminate mode is the default for progress bar and shows a cyclic animation without a
+ * specific amount of progress indicated.
+ * The following example shows an indeterminate progress bar:
* <pre>
* <ProgressBar
- * style="@android:style/Widget.ProgressBar.Horizontal"
- * ... /></pre>
- *
- * <p>If you will use the progress bar to show real progress, you must use the horizontal bar. You
- * can then increment the progress with {@link #incrementProgressBy incrementProgressBy()} or
- * {@link #setProgress setProgress()}. By default, the progress bar is full when it reaches 100. If
- * necessary, you can adjust the maximum value (the value for a full bar) using the {@link
- * android.R.styleable#ProgressBar_max android:max} attribute. Other attributes available are listed
- * below.</p>
- *
- * <p>Another common style to apply to the progress bar is {@link
- * android.R.style#Widget_ProgressBar_Small Widget.ProgressBar.Small}, which shows a smaller
- * version of the spinning wheel—useful when waiting for content to load.
- * For example, you can insert this kind of progress bar into your default layout for
- * a view that will be populated by some content fetched from the Internet—the spinning wheel
- * appears immediately and when your application receives the content, it replaces the progress bar
- * with the loaded content. For example:</p>
- *
+ * android:id="@+id/indeterminateBar"
+ * android:layout_width="wrap_content"
+ * android:layout_height="wrap_content"
+ * />
+ * </pre>
+ * </p>
+ * <h3>Determinate Progress</h3>
+ * <p>
+ * Use determinate mode for the progress bar when you want to show that a specific quantity of
+ * progress has occurred.
+ * For example, the percent remaining of a file being retrieved, the amount records in
+ * a batch written to database, or the percent remaining of an audio file that is playing.
+ * <p>
+ * <p>
+ * To indicate determinate progress, you set the style of the progress bar to
+ * {@link android.R.style#Widget_ProgressBar_Horizontal} and set the amount of progress.
+ * The following example shows a determinate progress bar that is 25% complete:
* <pre>
- * <LinearLayout
- * android:orientation="horizontal"
- * ... >
- * <ProgressBar
- * android:layout_width="wrap_content"
- * android:layout_height="wrap_content"
- * style="@android:style/Widget.ProgressBar.Small"
- * android:layout_marginRight="5dp" />
- * <TextView
- * android:layout_width="wrap_content"
- * android:layout_height="wrap_content"
- * android:text="@string/loading" />
- * </LinearLayout></pre>
- *
+ * <ProgressBar
+ * android:id="@+id/determinateBar"
+ * style="@android:style/Widget.ProgressBar.Horizontal"
+ * android:layout_width="wrap_content"
+ * android:layout_height="wrap_content"
+ * android:progress="25"/>
+ * </pre>
+ * You can update the percentage of progress displayed by using the
+ * {@link #setProgress(int)} method, or by calling
+ * {@link #incrementProgressBy(int)} to increase the current progress completed
+ * by a specified amount.
+ * By default, the progress bar is full when the progress value reaches 100.
+ * You can adjust this default by setting the
+ * {@link android.R.styleable#ProgressBar_max android:max} attribute.
+ * </p>
* <p>Other progress bar styles provided by the system include:</p>
* <ul>
* <li>{@link android.R.style#Widget_ProgressBar_Horizontal Widget.ProgressBar.Horizontal}</li>
diff --git a/core/java/android/widget/RadioGroup.java b/core/java/android/widget/RadioGroup.java
index 08e6575..5c4d4d2 100644
--- a/core/java/android/widget/RadioGroup.java
+++ b/core/java/android/widget/RadioGroup.java
@@ -417,8 +417,6 @@
}
}
- // TODO(b/33197203): add unit/CTS tests for autofill methods (and make sure they handle enable)
-
@Override
public void onProvideAutofillStructure(ViewStructure structure, int flags) {
super.onProvideAutofillStructure(structure, flags);
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index 67bfe5e..181ad31 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -1174,7 +1174,19 @@
}
/**
- * Per-child layout information associated with RelativeLayout.
+ * Specifies how a view is positioned within a {@link RelativeLayout}.
+ * The relative layout containing the view uses the value of these layout parameters to
+ * determine where to position the view on the screen. If the view is not contained
+ * within a relative layout, these attributes are ignored.
+ *
+ * See the <a href=“https://developer.android.com/guide/topics/ui/layout/relative.html”>
+ * Relative Layout</a> guide for example code demonstrating how to use relative layout’s
+ * layout parameters in a layout XML.
+ *
+ * To learn more about layout parameters and how they differ from typical view attributes,
+ * see the <a href=“https://developer.android.com/guide/topics/ui/declaring-layout.html#attributes”>
+ * Layouts guide</a>.
+ *
*
* @attr ref android.R.styleable#RelativeLayout_Layout_layout_alignWithParentIfMissing
* @attr ref android.R.styleable#RelativeLayout_Layout_layout_toLeftOf
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 036b391..e534233 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -413,6 +413,30 @@
recalculateMemoryUsage();
}
+ private static class RemoteViewsContextWrapper extends ContextWrapper {
+ private final Context mContextForResources;
+
+ RemoteViewsContextWrapper(Context context, Context contextForResources) {
+ super(context);
+ mContextForResources = contextForResources;
+ }
+
+ @Override
+ public Resources getResources() {
+ return mContextForResources.getResources();
+ }
+
+ @Override
+ public Resources.Theme getTheme() {
+ return mContextForResources.getTheme();
+ }
+
+ @Override
+ public String getPackageName() {
+ return mContextForResources.getPackageName();
+ }
+ }
+
private class SetEmptyView extends Action {
int viewId;
int emptyViewId;
@@ -3240,20 +3264,7 @@
// still returns the current users userId so settings like data / time formats
// are loaded without requiring cross user persmissions.
final Context contextForResources = getContextForResources(context);
- Context inflationContext = new ContextWrapper(context) {
- @Override
- public Resources getResources() {
- return contextForResources.getResources();
- }
- @Override
- public Resources.Theme getTheme() {
- return contextForResources.getTheme();
- }
- @Override
- public String getPackageName() {
- return contextForResources.getPackageName();
- }
- };
+ Context inflationContext = new RemoteViewsContextWrapper(context, contextForResources);
LayoutInflater inflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index 8fc4f50..97d32f1 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -50,25 +50,27 @@
import java.util.List;
/**
- * Layout container for a view hierarchy that can be scrolled by the user,
- * allowing it to be larger than the physical display. A ScrollView
- * is a {@link FrameLayout}, meaning you should place one child in it
- * containing the entire contents to scroll; this child may itself be a layout
- * manager with a complex hierarchy of objects. A child that is often used
- * is a {@link LinearLayout} in a vertical orientation, presenting a vertical
- * array of top-level items that the user can scroll through.
- * <p>You should never use a ScrollView with a {@link ListView}, because
- * ListView takes care of its own vertical scrolling. Most importantly, doing this
- * defeats all of the important optimizations in ListView for dealing with
- * large lists, since it effectively forces the ListView to display its entire
- * list of items to fill up the infinite container supplied by ScrollView.
- * <p>The {@link TextView} class also
- * takes care of its own scrolling, so does not require a ScrollView, but
- * using the two together is possible to achieve the effect of a text view
- * within a larger container.
+ * A view group that allows the view hierarchy placed within it to be scrolled.
+ * Scroll view may have only one direct child placed within it.
+ * To add multiple views within the scroll view, make
+ * the direct child you add a view group, for example {@link LinearLayout}, and
+ * place additional views within that LinearLayout.
*
- * <p>ScrollView only supports vertical scrolling. For horizontal scrolling,
- * use {@link HorizontalScrollView}.
+ * <p>Scroll view supports vertical scrolling only. For horizontal scrolling,
+ * use {@link HorizontalScrollView} instead.</p>
+ *
+ * <p>Never add a {@link android.support.v7.widget.RecyclerView} or {@link ListView} to
+ * a scroll view. Doing so results in poor user interface performance and a poor user
+ * experience.</p>
+ *
+ * <p class="note">
+ * For vertical scrolling, consider {@link android.support.v4.widget.NestedScrollView}
+ * instead of scroll view which offers greater user interface flexibility and
+ * support for the material design scrolling patterns.</p>
+ *
+ * <p>To learn more about material design patterns for handling scrolling, see
+ * <a href="https://material.io/guidelines/patterns/scrolling-techniques.html#">
+ * Scrolling techniques</a>.</p>
*
* @attr ref android.R.styleable#ScrollView_fillViewport
*/
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index 003db06..beff1b0 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -26,7 +26,7 @@
import android.text.Spannable;
import android.text.TextUtils;
import android.view.ActionMode;
-import android.view.textclassifier.TextClassificationResult;
+import android.view.textclassifier.TextClassification;
import android.view.textclassifier.TextClassifier;
import android.view.textclassifier.TextSelection;
import android.widget.Editor.SelectionModifierCursorController;
@@ -52,7 +52,7 @@
private final Editor mEditor;
private final TextClassificationHelper mTextClassificationHelper;
- private TextClassificationResult mTextClassificationResult;
+ private TextClassification mTextClassification;
private AsyncTask mTextClassificationAsyncTask;
private final SelectionInfo mSelectionInfo = new SelectionInfo();
@@ -107,8 +107,8 @@
}
@Nullable
- public TextClassificationResult getTextClassificationResult() {
- return mTextClassificationResult;
+ public TextClassification getTextClassification() {
+ return mTextClassification;
}
public void onDestroyActionMode() {
@@ -121,7 +121,7 @@
mTextClassificationAsyncTask.cancel(true);
mTextClassificationAsyncTask = null;
}
- mTextClassificationResult = null;
+ mTextClassification = null;
}
private boolean isNoOpTextClassifier() {
@@ -140,9 +140,9 @@
textView.getSelectionStart(), textView.getSelectionEnd());
if (result != null && text instanceof Spannable) {
Selection.setSelection((Spannable) text, result.mStart, result.mEnd);
- mTextClassificationResult = result.mResult;
+ mTextClassification = result.mClassification;
} else {
- mTextClassificationResult = null;
+ mTextClassification = null;
}
if (mEditor.startSelectionActionModeInternal()) {
final SelectionModifierCursorController controller = mEditor.getSelectionController();
@@ -158,7 +158,7 @@
}
private void invalidateActionMode(@Nullable SelectionResult result) {
- mTextClassificationResult = result != null ? result.mResult : null;
+ mTextClassification = result != null ? result.mClassification : null;
final ActionMode actionMode = mEditor.getTextActionMode();
if (actionMode != null) {
actionMode.invalidate();
@@ -332,7 +332,7 @@
return new SelectionResult(
mSelectionStart,
mSelectionEnd,
- mTextClassifier.getTextClassificationResult(
+ mTextClassifier.classifyText(
mTrimmedText, mRelativeStart, mRelativeEnd, mLocales));
}
@@ -361,12 +361,12 @@
private static final class SelectionResult {
private final int mStart;
private final int mEnd;
- private final TextClassificationResult mResult;
+ private final TextClassification mClassification;
- SelectionResult(int start, int end, TextClassificationResult result) {
+ SelectionResult(int start, int end, TextClassification classification) {
mStart = start;
mEnd = end;
- mResult = Preconditions.checkNotNull(result);
+ mClassification = Preconditions.checkNotNull(classification);
}
}
}
diff --git a/core/java/android/widget/SimpleAdapter.java b/core/java/android/widget/SimpleAdapter.java
index 57e2ece..9190117 100644
--- a/core/java/android/widget/SimpleAdapter.java
+++ b/core/java/android/widget/SimpleAdapter.java
@@ -320,9 +320,6 @@
return mFilter;
}
- // TODO(b/33197203): implement getAutofillOptions
-
-
/**
* This class can be used by external clients of SimpleAdapter to bind
* values to views.
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index f42d6c8..629216e 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -125,6 +125,7 @@
import android.view.DragEvent;
import android.view.Gravity;
import android.view.HapticFeedbackConstants;
+import android.view.InputDevice;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.MotionEvent;
@@ -394,6 +395,14 @@
private TextClassifier mTextClassifier;
+ // A flag to prevent repeated movements from escaping the enclosing text view. The idea here is
+ // that if a user is holding down a movement key to traverse text, we shouldn't also traverse
+ // the view hierarchy. On the other hand, if the user is using the movement key to traverse
+ // views (i.e. the first movement was to traverse out of this view, or this view was traversed
+ // into by the user holding the movement key down) then we shouldn't prevent the focus from
+ // changing.
+ private boolean mPreventDefaultMovement;
+
private TextUtils.TruncateAt mEllipsize;
static class Drawables {
@@ -903,10 +912,13 @@
break;
case com.android.internal.R.styleable.TextAppearance_fontFamily:
- try {
- fontTypeface = appearance.getFont(attr);
- } catch (UnsupportedOperationException | Resources.NotFoundException e) {
- // Expected if it is not a font resource.
+ if (!context.isRestricted()) {
+ try {
+ fontTypeface = appearance.getFont(attr);
+ } catch (UnsupportedOperationException
+ | Resources.NotFoundException e) {
+ // Expected if it is not a font resource.
+ }
}
if (fontTypeface == null) {
fontFamily = appearance.getString(attr);
@@ -1220,11 +1232,13 @@
break;
case com.android.internal.R.styleable.TextView_fontFamily:
- try {
- fontTypeface = a.getFont(attr);
- } catch (UnsupportedOperationException | Resources.NotFoundException e) {
- // Expected if it is not a resource reference or if it is a reference to
- // another resource type.
+ if (!context.isRestricted()) {
+ try {
+ fontTypeface = a.getFont(attr);
+ } catch (UnsupportedOperationException | Resources.NotFoundException e) {
+ // Expected if it is not a resource reference or if it is a reference to
+ // another resource type.
+ }
}
if (fontTypeface == null) {
fontFamily = a.getString(attr);
@@ -3371,10 +3385,12 @@
Typeface fontTypeface = null;
String fontFamily = null;
- try {
- fontTypeface = ta.getFont(R.styleable.TextAppearance_fontFamily);
- } catch (UnsupportedOperationException | Resources.NotFoundException e) {
- // Expected if it is not a font resource.
+ if (!context.isRestricted()) {
+ try {
+ fontTypeface = ta.getFont(R.styleable.TextAppearance_fontFamily);
+ } catch (UnsupportedOperationException | Resources.NotFoundException e) {
+ // Expected if it is not a font resource.
+ }
}
if (fontTypeface == null) {
fontFamily = ta.getString(R.styleable.TextAppearance_fontFamily);
@@ -3886,26 +3902,42 @@
* are invalid. If a specified axis name is not defined in the font, the settings will be
* ignored.
*
+ * <p>
+ * Examples,
+ * <ul>
+ * <li>Set font width to 150.
* <pre>
- * textView.setFontVariationSettings("'wdth' 1.0");
- * textView.setFontVariationSettings("'AX ' 1.8, 'FB ' 2.0");
+ * <code>
+ * TextView textView = (TextView) findViewById(R.id.textView);
+ * textView.setFontVariationSettings("'wdth' 150");
+ * </code>
* </pre>
+ * </li>
+ *
+ * <li>Set the font slant to 20 degrees and ask for italic style.
+ * <pre>
+ * <code>
+ * TextView textView = (TextView) findViewById(R.id.textView);
+ * textView.setFontVariationSettings("'slnt' 20, 'ital' 1");
+ * </code>
+ * </pre>
+ * </p>
+ * </li>
+ * </ul>
*
* @param fontVariationSettings font variation settings. You can pass null or empty string as
* no variation settings.
- *
* @return true if the given settings is effective to at least one font file underlying this
* TextView. This function also returns true for empty settings string. Otherwise
* returns false.
*
- * @throws FontVariationAxis.InvalidFormatException
- * If given string is not a valid font variation settings format.
+ * @throws IllegalArgumentException If given string is not a valid font variation settings
+ * format.
*
* @see #getFontVariationSettings()
- * @see Paint#getFontVariationSettings() Paint.getFontVariationSettings()
+ * @see FontVariationAxis
*/
- public boolean setFontVariationSettings(@Nullable String fontVariationSettings)
- throws FontVariationAxis.InvalidFormatException {
+ public boolean setFontVariationSettings(@Nullable String fontVariationSettings) {
final String existingSettings = mTextPaint.getFontVariationSettings();
if (fontVariationSettings == existingSettings
|| (fontVariationSettings != null
@@ -5337,7 +5369,7 @@
sendAfterTextChanged((Editable) text);
} else {
// Always notify AutoFillManager - it will return right away if autofill is disabled.
- notifyAutoFillManagerAfterTextChanged();
+ notifyAutoFillManagerAfterTextChangedIfNeeded();
}
// SelectionModifierCursorController depends on textCanBeSelected, which depends on text
@@ -7137,6 +7169,15 @@
return KEY_EVENT_NOT_HANDLED;
}
+ // If this is the initial keydown, we don't want to prevent a movement away from this view.
+ // While this shouldn't be necessary because any time we're preventing default movement we
+ // should be restricting the focus to remain within this view, thus we'll also receive
+ // the key up event, occasionally key up events will get dropped and we don't want to
+ // prevent the user from traversing out of this on the next key down.
+ if (event.getRepeatCount() == 0 && !KeyEvent.isModifierKey(keyCode)) {
+ mPreventDefaultMovement = false;
+ }
+
switch (keyCode) {
case KeyEvent.KEYCODE_ENTER:
if (event.hasNoModifiers()) {
@@ -7268,16 +7309,23 @@
}
if (doDown) {
if (mMovement.onKeyDown(this, (Spannable) mText, keyCode, event)) {
+ if (event.getRepeatCount() == 0 && !KeyEvent.isModifierKey(keyCode)) {
+ mPreventDefaultMovement = true;
+ }
return KEY_DOWN_HANDLED_BY_MOVEMENT_METHOD;
}
}
- // Consume arrows to prevent focus leaving the editor.
- if (isDirectionalNavigationKey(keyCode)) {
+ // Consume arrows from keyboard devices to prevent focus leaving the editor.
+ // DPAD/JOY devices (Gamepads, TV remotes) often lack a TAB key so allow those
+ // to move focus with arrows.
+ if (event.getSource() == InputDevice.SOURCE_KEYBOARD
+ && isDirectionalNavigationKey(keyCode)) {
return KEY_EVENT_HANDLED;
}
}
- return KEY_EVENT_NOT_HANDLED;
+ return mPreventDefaultMovement && !KeyEvent.isModifierKey(keyCode)
+ ? KEY_EVENT_HANDLED : KEY_EVENT_NOT_HANDLED;
}
/**
@@ -7310,6 +7358,10 @@
return super.onKeyUp(keyCode, event);
}
+ if (!KeyEvent.isModifierKey(keyCode)) {
+ mPreventDefaultMovement = false;
+ }
+
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
if (event.hasNoModifiers()) {
@@ -9280,12 +9332,17 @@
}
// Always notify AutoFillManager - it will return right away if autofill is disabled.
- notifyAutoFillManagerAfterTextChanged();
+ notifyAutoFillManagerAfterTextChangedIfNeeded();
hideErrorIfUnchanged();
}
- private void notifyAutoFillManagerAfterTextChanged() {
+ private void notifyAutoFillManagerAfterTextChangedIfNeeded() {
+ // It is important to not check whether the view is important for autofill
+ // since the user can trigger autofill manually on not important views.
+ if (!isAutofillable()) {
+ return;
+ }
final AutofillManager afm = mContext.getSystemService(AutofillManager.class);
if (afm != null) {
if (DEBUG_AUTOFILL) {
@@ -9295,6 +9352,12 @@
}
}
+ private boolean isAutofillable() {
+ // It is important to not check whether the view is important for autofill
+ // since the user can trigger autofill manually on not important views.
+ return getAutofillType() != AUTOFILL_TYPE_NONE;
+ }
+
void updateAfterEdit() {
invalidate();
int curs = getSelectionStart();
@@ -10170,9 +10233,10 @@
structure.setInputType(getInputType());
}
- // TODO(b/33197203): add unit/CTS tests for autofill methods
-
boolean canRequestAutofill() {
+ if (!isAutofillable()) {
+ return false;
+ }
final AutofillManager afm = mContext.getSystemService(AutofillManager.class);
if (afm != null) {
return afm.isEnabled();
diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java
index fb00c4392..de289bb 100644
--- a/core/java/android/widget/TimePicker.java
+++ b/core/java/android/widget/TimePicker.java
@@ -519,13 +519,12 @@
}
}
- // TODO(b/33197203): add unit/CTS tests for autofill methods (and make sure they handle enable)
-
@Override
public void dispatchProvideAutofillStructure(ViewStructure structure, int flags) {
// This view is self-sufficient for autofill, so it needs to call
// onProvideAutoFillStructure() to fill itself, but it does not need to call
// dispatchProvideAutoFillStructure() to fill its children.
+ structure.setAutofillId(getAutofillId());
onProvideAutofillStructure(structure, flags);
}
diff --git a/core/java/com/android/internal/app/procstats/ProcessState.java b/core/java/com/android/internal/app/procstats/ProcessState.java
index 8c2c236..9470668 100644
--- a/core/java/com/android/internal/app/procstats/ProcessState.java
+++ b/core/java/com/android/internal/app/procstats/ProcessState.java
@@ -86,6 +86,7 @@
STATE_TOP, // ActivityManager.PROCESS_STATE_TOP_SLEEPING
STATE_IMPORTANT_FOREGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
STATE_IMPORTANT_BACKGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
+ STATE_IMPORTANT_BACKGROUND, // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND
STATE_BACKUP, // ActivityManager.PROCESS_STATE_BACKUP
STATE_HEAVY_WEIGHT, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
STATE_SERVICE, // ActivityManager.PROCESS_STATE_SERVICE
diff --git a/core/java/com/android/internal/content/PackageMonitor.java b/core/java/com/android/internal/content/PackageMonitor.java
index c6b6a7fb..d2e9789 100644
--- a/core/java/com/android/internal/content/PackageMonitor.java
+++ b/core/java/com/android/internal/content/PackageMonitor.java
@@ -65,6 +65,7 @@
int mChangeType;
int mChangeUserId = UserHandle.USER_NULL;
boolean mSomePackagesChanged;
+ String[] mModifiedComponents;
String[] mTempArray = new String[1];
@@ -269,6 +270,18 @@
}
return false;
}
+
+ public boolean isComponentModified(String className) {
+ if (className == null || mModifiedComponents == null) {
+ return false;
+ }
+ for (int i = mModifiedComponents.length - 1; i >= 0; i--) {
+ if (className.equals(mModifiedComponents[i])) {
+ return true;
+ }
+ }
+ return false;
+ }
public void onSomePackagesChanged() {
}
@@ -301,6 +314,7 @@
mDisappearingPackages = mAppearingPackages = null;
mSomePackagesChanged = false;
+ mModifiedComponents = null;
String action = intent.getAction();
if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {
@@ -358,13 +372,13 @@
} else if (Intent.ACTION_PACKAGE_CHANGED.equals(action)) {
String pkg = getPackageName(intent);
int uid = intent.getIntExtra(Intent.EXTRA_UID, 0);
- String[] components = intent.getStringArrayExtra(
+ mModifiedComponents = intent.getStringArrayExtra(
Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST);
if (pkg != null) {
mModifiedPackages = mTempArray;
mTempArray[0] = pkg;
mChangeType = PACKAGE_PERMANENT_CHANGE;
- if (onPackageChanged(pkg, uid, components)) {
+ if (onPackageChanged(pkg, uid, mModifiedComponents)) {
mSomePackagesChanged = true;
}
onPackageModified(pkg);
diff --git a/core/java/com/android/internal/notification/SystemNotificationChannels.java b/core/java/com/android/internal/notification/SystemNotificationChannels.java
index ef20750..fef85da 100644
--- a/core/java/com/android/internal/notification/SystemNotificationChannels.java
+++ b/core/java/com/android/internal/notification/SystemNotificationChannels.java
@@ -45,6 +45,7 @@
public static String ALERTS = "ALERTS";
public static String RETAIL_MODE = "RETAIL_MODE";
public static String USB = "USB";
+ public static String FOREGROUND_SERVICE = "FOREGROUND_SERVICE";
public static void createAll(Context context) {
final NotificationManager nm = context.getSystemService(NotificationManager.class);
@@ -125,6 +126,11 @@
context.getString(R.string.notification_channel_usb),
NotificationManager.IMPORTANCE_MIN));
+ channelsList.add(new NotificationChannel(
+ FOREGROUND_SERVICE,
+ context.getString(R.string.notification_channel_foreground_service),
+ NotificationManager.IMPORTANCE_MIN));
+
nm.createNotificationChannels(channelsList);
}
diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java
index 2c8e4e0..73886a7 100644
--- a/core/java/com/android/internal/util/ArrayUtils.java
+++ b/core/java/com/android/internal/util/ArrayUtils.java
@@ -169,6 +169,13 @@
}
/**
+ * Length of the given array or 0 if it's null.
+ */
+ public static int size(@Nullable Object[] array) {
+ return array == null ? 0 : array.length;
+ }
+
+ /**
* Checks that value is present as at least one of the elements of the array.
* @param array the array to check in
* @param value the value to check for
diff --git a/core/java/com/android/internal/util/NotificationColorUtil.java b/core/java/com/android/internal/util/NotificationColorUtil.java
index 5cb66e5..2c97f8b 100644
--- a/core/java/com/android/internal/util/NotificationColorUtil.java
+++ b/core/java/com/android/internal/util/NotificationColorUtil.java
@@ -257,7 +257,7 @@
* @return a color with the same hue as {@param color}, potentially darkened to meet the
* contrast ratio.
*/
- private static int findContrastColor(int color, int other, boolean findFg, double minRatio) {
+ public static int findContrastColor(int color, int other, boolean findFg, double minRatio) {
int fg = findFg ? color : other;
int bg = findFg ? other : color;
if (ColorUtilsFromCompat.calculateContrast(fg, bg) >= minRatio) {
@@ -402,16 +402,17 @@
}
/**
- * Lighten a color by a specified value
+ * Change a color by a specified value
* @param baseColor the base color to lighten
* @param amount the amount to lighten the color from 0 to 100. This corresponds to the L
- * increase in the LAB color space.
- * @return the lightened color
+ * increase in the LAB color space. A negative value will darken the color and
+ * a positive will lighten it.
+ * @return the changed color
*/
- public static int lightenColor(int baseColor, int amount) {
+ public static int changeColorLightness(int baseColor, int amount) {
final double[] result = ColorUtilsFromCompat.getTempDouble3Array();
ColorUtilsFromCompat.colorToLAB(baseColor, result);
- result[0] = Math.min(100, result[0] + amount);
+ result[0] = Math.max(Math.min(100, result[0] + amount), 0);
return ColorUtilsFromCompat.LABToColor(result[0], result[1], result[2]);
}
@@ -491,6 +492,15 @@
return useDark;
}
+ public static double calculateLuminance(int backgroundColor) {
+ return ColorUtilsFromCompat.calculateLuminance(backgroundColor);
+ }
+
+
+ public static double calculateContrast(int foregroundColor, int backgroundColor) {
+ return ColorUtilsFromCompat.calculateContrast(foregroundColor, backgroundColor);
+ }
+
/**
* Framework copy of functions needed from android.support.v4.graphics.ColorUtils.
*/
diff --git a/core/java/com/android/internal/widget/MediaNotificationView.java b/core/java/com/android/internal/widget/MediaNotificationView.java
index afb2a5e..bbebcc2 100644
--- a/core/java/com/android/internal/widget/MediaNotificationView.java
+++ b/core/java/com/android/internal/widget/MediaNotificationView.java
@@ -23,7 +23,6 @@
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
-import android.widget.RelativeLayout;
import android.widget.RemoteViews;
/**
@@ -34,8 +33,7 @@
@RemoteViews.RemoteView
public class MediaNotificationView extends FrameLayout {
- private final int mMaxImageSize;
- private final int mImageMinTopMargin;
+ private final int mSmallImageSize;
private final int mNotificationContentMarginEnd;
private final int mNotificationContentImageMarginEnd;
private ImageView mRightIcon;
@@ -57,72 +55,68 @@
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int mode = MeasureSpec.getMode(widthMeasureSpec);
boolean hasIcon = mRightIcon.getVisibility() != GONE;
+ if (!hasIcon) {
+ resetHeaderIndention();
+ }
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ int mode = MeasureSpec.getMode(widthMeasureSpec);
+ boolean reMeasure = false;
if (hasIcon && mode != MeasureSpec.UNSPECIFIED) {
- measureChild(mActions, widthMeasureSpec, heightMeasureSpec);
int size = MeasureSpec.getSize(widthMeasureSpec);
size = size - mActions.getMeasuredWidth();
ViewGroup.MarginLayoutParams layoutParams =
(MarginLayoutParams) mRightIcon.getLayoutParams();
int imageEndMargin = layoutParams.getMarginEnd();
size -= imageEndMargin;
- size = Math.min(size, mMaxImageSize);
- size = Math.max(size, mRightIcon.getMinimumWidth());
- layoutParams.width = size;
- layoutParams.height = size;
- mRightIcon.setLayoutParams(layoutParams);
-
- // lets ensure that the main column doesn't run into the image
- ViewGroup.MarginLayoutParams mainParams
- = (MarginLayoutParams) mMainColumn.getLayoutParams();
- int marginEnd = size + imageEndMargin + mNotificationContentMarginEnd;
- if (marginEnd != mainParams.getMarginEnd()) {
- mainParams.setMarginEnd(marginEnd);
- mMainColumn.setLayoutParams(mainParams);
+ int fullHeight = getMeasuredHeight();
+ if (size < fullHeight) {
+ size = mSmallImageSize;
+ } else {
+ size = fullHeight;
}
-
- }
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- ViewGroup.MarginLayoutParams iconParams =
- (MarginLayoutParams) mRightIcon.getLayoutParams();
- int topMargin = getMeasuredHeight() - mRightIcon.getMeasuredHeight()
- - iconParams.bottomMargin;
- // If the topMargin is high enough we can also remove the header constraint!
- boolean reMeasure = false;
- if (!hasIcon || topMargin >= mImageMinTopMargin) {
- reMeasure = resetHeaderIndention();
- } else {
- int paddingEnd = mNotificationContentImageMarginEnd;
- ViewGroup.MarginLayoutParams headerParams =
- (MarginLayoutParams) mHeader.getLayoutParams();
- int newMarginEnd = mRightIcon.getMeasuredWidth() + iconParams.getMarginEnd();
- if (headerParams.getMarginEnd() != newMarginEnd) {
- headerParams.setMarginEnd(newMarginEnd);
- mHeader.setLayoutParams(headerParams);
+ if (layoutParams.width != size || layoutParams.height != size) {
+ layoutParams.width = size;
+ layoutParams.height = size;
+ mRightIcon.setLayoutParams(layoutParams);
reMeasure = true;
}
- if (mHeader.getPaddingEnd() != paddingEnd) {
+
+ // lets ensure that the main column doesn't run into the image
+ ViewGroup.MarginLayoutParams params
+ = (MarginLayoutParams) mMainColumn.getLayoutParams();
+ int marginEnd = size + imageEndMargin + mNotificationContentMarginEnd;
+ if (marginEnd != params.getMarginEnd()) {
+ params.setMarginEnd(marginEnd);
+ mMainColumn.setLayoutParams(params);
+ reMeasure = true;
+ }
+ int headerMarginEnd = size + imageEndMargin;
+ params = (MarginLayoutParams) mHeader.getLayoutParams();
+ if (params.getMarginEnd() != headerMarginEnd) {
+ params.setMarginEnd(headerMarginEnd);
+ mHeader.setLayoutParams(params);
+ reMeasure = true;
+ }
+ if (mHeader.getPaddingEnd() != mNotificationContentImageMarginEnd) {
mHeader.setPaddingRelative(mHeader.getPaddingStart(),
mHeader.getPaddingTop(),
- paddingEnd,
+ mNotificationContentImageMarginEnd,
mHeader.getPaddingBottom());
reMeasure = true;
}
}
if (reMeasure) {
- measureChildWithMargins(mHeader, widthMeasureSpec, 0, heightMeasureSpec, 0);
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
- private boolean resetHeaderIndention() {
- boolean remeasure = false;
+ private void resetHeaderIndention() {
if (mHeader.getPaddingEnd() != mNotificationContentMarginEnd) {
mHeader.setPaddingRelative(mHeader.getPaddingStart(),
mHeader.getPaddingTop(),
mNotificationContentMarginEnd,
mHeader.getPaddingBottom());
- remeasure = true;
}
ViewGroup.MarginLayoutParams headerParams =
(MarginLayoutParams) mHeader.getLayoutParams();
@@ -130,19 +124,14 @@
if (headerParams.getMarginEnd() != 0) {
headerParams.setMarginEnd(0);
mHeader.setLayoutParams(headerParams);
- remeasure = true;
}
- return remeasure;
}
public MediaNotificationView(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
- mMaxImageSize = context.getResources().getDimensionPixelSize(
- com.android.internal.R.dimen.media_notification_expanded_image_max_size);
- mImageMinTopMargin = (int) (context.getResources().getDimensionPixelSize(
- com.android.internal.R.dimen.notification_content_margin_top)
- + getResources().getDisplayMetrics().density * 2);
+ mSmallImageSize = context.getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.media_notification_expanded_image_small_size);
mNotificationContentMarginEnd = context.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.notification_content_margin_end);
mNotificationContentImageMarginEnd = context.getResources().getDimensionPixelSize(
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index 96285cd..ceb3cc8 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -234,6 +234,7 @@
libseccomp_policy \
libselinux \
libcrypto \
+ libgrallocusage \
LOCAL_SHARED_LIBRARIES := \
libmemtrack \
diff --git a/core/jni/android/graphics/Path.cpp b/core/jni/android/graphics/Path.cpp
index 292454b..d3d6882 100644
--- a/core/jni/android/graphics/Path.cpp
+++ b/core/jni/android/graphics/Path.cpp
@@ -26,6 +26,7 @@
#include "SkPath.h"
#include "SkPathOps.h"
+#include "SkGeometry.h" // WARNING: Internal Skia Header
#include <Caches.h>
#include <vector>
@@ -355,8 +356,9 @@
}
}
- static void createVerbSegments(SkPath::Verb verb, const SkPoint* points,
- std::vector<SkPoint>& segmentPoints, std::vector<float>& lengths, float errorSquared) {
+ static void createVerbSegments(const SkPath::Iter& pathIter, SkPath::Verb verb,
+ const SkPoint* points, std::vector<SkPoint>& segmentPoints,
+ std::vector<float>& lengths, float errorSquared, float errorConic) {
switch (verb) {
case SkPath::kMove_Verb:
addMove(segmentPoints, lengths, points[0]);
@@ -375,8 +377,27 @@
addBezier(points, cubicBezierCalculation, segmentPoints, lengths,
errorSquared, true);
break;
+ case SkPath::kConic_Verb: {
+ SkAutoConicToQuads converter;
+ const SkPoint* quads = converter.computeQuads(
+ points, pathIter.conicWeight(), errorConic);
+ for (int i = 0; i < converter.countQuads(); i++) {
+ // Note: offset each subsequent quad by 2, since end points are shared
+ const SkPoint* quad = quads + i * 2;
+ addBezier(quad, quadraticBezierCalculation, segmentPoints, lengths,
+ errorConic, false);
+ }
+ break;
+ }
default:
- // Leave element as NULL, Conic sections are not supported.
+ static_assert(SkPath::kMove_Verb == 0
+ && SkPath::kLine_Verb == 1
+ && SkPath::kQuad_Verb == 2
+ && SkPath::kConic_Verb == 3
+ && SkPath::kCubic_Verb == 4
+ && SkPath::kClose_Verb == 5
+ && SkPath::kDone_Verb == 6,
+ "Path enum changed, new types may have been added.");
break;
}
}
@@ -398,9 +419,11 @@
std::vector<SkPoint> segmentPoints;
std::vector<float> lengths;
float errorSquared = acceptableError * acceptableError;
+ float errorConic = acceptableError / 2; // somewhat arbitrary
while ((verb = pathIter.next(points, false)) != SkPath::kDone_Verb) {
- createVerbSegments(verb, points, segmentPoints, lengths, errorSquared);
+ createVerbSegments(pathIter, verb, points, segmentPoints, lengths,
+ errorSquared, errorConic);
}
if (segmentPoints.empty()) {
diff --git a/core/jni/android_hardware_HardwareBuffer.cpp b/core/jni/android_hardware_HardwareBuffer.cpp
index ed0ab60..ba23450 100644
--- a/core/jni/android_hardware_HardwareBuffer.cpp
+++ b/core/jni/android_hardware_HardwareBuffer.cpp
@@ -34,6 +34,7 @@
#include <private/gui/ComposerService.h>
#include <hardware/gralloc1.h>
+#include <grallocusage/GrallocUsageConversion.h>
#include "core_jni_helpers.h"
@@ -79,14 +80,10 @@
}
return NULL;
}
- uint64_t producerUsage = 0;
- uint64_t consumerUsage = 0;
- android_hardware_HardwareBuffer_convertToGrallocUsageBits(
- &producerUsage, &consumerUsage, usage, 0);
+ uint64_t grallocUsage = AHardwareBuffer_convertToGrallocUsageBits(usage);
sp<GraphicBuffer> buffer = new GraphicBuffer(width, height, pixelFormat, layers,
- producerUsage, consumerUsage,
- std::string("HardwareBuffer pid [") + std::to_string(getpid()) +"]");
+ grallocUsage, std::string("HardwareBuffer pid [") + std::to_string(getpid()) +"]");
status_t error = buffer->initCheck();
if (error < 0) {
if (kDebugGraphicBuffer) {
@@ -144,11 +141,7 @@
static jlong android_hardware_HardwareBuffer_getUsage(JNIEnv* env,
jobject clazz, jlong nativeObject) {
GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject);
- uint64_t usage0 = 0;
- uint64_t usage1 = 0;
- android_hardware_HardwareBuffer_convertFromGrallocUsageBits(&usage0, &usage1,
- buffer->getUsage(), buffer->getUsage());
- return usage0;
+ return AHardwareBuffer_convertFromGrallocUsageBits(buffer->getUsage());
}
// ----------------------------------------------------------------------------
@@ -220,14 +213,8 @@
return AHardwareBuffer_convertToPixelFormat(format);
}
-void android_hardware_HardwareBuffer_convertToGrallocUsageBits(uint64_t* outProducerUsage,
- uint64_t* outConsumerUsage, uint64_t usage0, uint64_t usage1) {
- AHardwareBuffer_convertToGrallocUsageBits(outProducerUsage, outConsumerUsage, usage0, usage1);
-}
-
-void android_hardware_HardwareBuffer_convertFromGrallocUsageBits(uint64_t* outUsage0,
- uint64_t* outUsage1, uint64_t producerUsage, uint64_t consumerUsage) {
- AHardwareBuffer_convertFromGrallocUsageBits(outUsage0, outUsage1, producerUsage, consumerUsage);
+uint64_t android_hardware_HardwareBuffer_convertToGrallocUsageBits(uint64_t usage) {
+ return AHardwareBuffer_convertToGrallocUsageBits(usage);
}
} // namespace android
diff --git a/core/jni/android_hardware_SensorManager.cpp b/core/jni/android_hardware_SensorManager.cpp
index d046996..f1b19e17 100644
--- a/core/jni/android_hardware_SensorManager.cpp
+++ b/core/jni/android_hardware_SensorManager.cpp
@@ -427,6 +427,11 @@
String8 clientName(packageUtf.c_str());
sp<SensorEventQueue> queue(mgr->createEventQueue(clientName, mode));
+ if (queue == NULL) {
+ jniThrowRuntimeException(env, "Cannot construct native SensorEventQueue.");
+ return 0;
+ }
+
sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, msgQ);
if (messageQueue == NULL) {
jniThrowRuntimeException(env, "MessageQueue is not initialized.");
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index b95258b..6000fb5 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -685,11 +685,14 @@
// Grant CAP_WAKE_ALARM to the Bluetooth process.
// Additionally, allow bluetooth to open packet sockets so it can start the DHCP client.
+ // Grant CAP_SYS_NICE to allow Bluetooth to set RT priority for
+ // audio-related threads.
// TODO: consider making such functionality an RPC to netd.
if (multiuser_get_app_id(uid) == AID_BLUETOOTH) {
capabilities |= (1LL << CAP_WAKE_ALARM);
capabilities |= (1LL << CAP_NET_RAW);
capabilities |= (1LL << CAP_NET_BIND_SERVICE);
+ capabilities |= (1LL << CAP_SYS_NICE);
}
// Grant CAP_BLOCK_SUSPEND to processes that belong to GID "wakelock"
diff --git a/core/jni/include/android_runtime/android_hardware_HardwareBuffer.h b/core/jni/include/android_runtime/android_hardware_HardwareBuffer.h
index 3545c56..c452b74 100644
--- a/core/jni/include/android_runtime/android_hardware_HardwareBuffer.h
+++ b/core/jni/include/android_runtime/android_hardware_HardwareBuffer.h
@@ -32,22 +32,19 @@
JNIEnv* env, AHardwareBuffer* hardwareBuffer);
/* Convert from HAL_PIXEL_FORMAT values to AHARDWAREBUFFER_FORMAT values. */
-extern uint32_t android_hardware_HardwareBuffer_convertFromPixelFormat(
- uint32_t format);
+extern uint32_t android_hardware_HardwareBuffer_convertFromPixelFormat(uint32_t format);
/* Convert from AHARDWAREBUFFER_FORMAT values to HAL_PIXEL_FORMAT values. */
-extern uint32_t android_hardware_HardwareBuffer_convertToPixelFormat(
- uint32_t format);
+extern uint32_t android_hardware_HardwareBuffer_convertToPixelFormat(uint32_t format);
/* Convert from AHARDWAREBUFFER_USAGE* flags to to gralloc usage flags. */
-extern void android_hardware_HardwareBuffer_convertToGrallocUsageBits(
- uint64_t* outProducerUsage, uint64_t* outConsumerUsage, uint64_t usage0,
- uint64_t usage1);
+extern uint64_t android_hardware_HardwareBuffer_convertToGrallocUsageBits(uint64_t usage);
-/* Convert from gralloc usage flags to to AHARDWAREBUFFER_USAGE0* flags. */
-extern void android_hardware_HardwareBuffer_convertFromGrallocUsageBits(
- uint64_t* outUsage0, uint64_t* outUsage1, uint64_t producerUsage,
- uint64_t consumerUsage);
+inline void android_hardware_HardwareBuffer_convertToGrallocUsageBits(
+ uint64_t* outProducerUsage, uint64_t* outConsumerUsage, uint64_t usage, uint64_t) {
+ outProducerUsage[0] = outConsumerUsage[0] =
+ android_hardware_HardwareBuffer_convertToGrallocUsageBits(usage);
+}
} // namespace android
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 3131302..ea9bd22 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -376,8 +376,6 @@
<protected-broadcast android:name="android.nfc.handover.intent.action.TRANSFER_PROGRESS" />
<protected-broadcast android:name="android.nfc.handover.intent.action.TRANSFER_DONE" />
- <protected-broadcast android:name="android.intent.action.ACTION_DEFAULT_SUBSCRIPTION_CHANGED" />
- <protected-broadcast android:name="android.intent.action.ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED" />
<protected-broadcast android:name="android.intent.action.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED" />
<protected-broadcast android:name="android.intent.action.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED" />
<protected-broadcast android:name="android.intent.action.ACTION_SUBINFO_CONTENT_CHANGE" />
@@ -445,6 +443,8 @@
<protected-broadcast android:name="android.telecom.action.PHONE_ACCOUNT_UNREGISTERED" />
<protected-broadcast android:name="android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION" />
<protected-broadcast android:name="android.telephony.action.CARRIER_CONFIG_CHANGED" />
+ <protected-broadcast android:name="android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED" />
+ <protected-broadcast android:name="android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED" />
<protected-broadcast android:name="android.telephony.action.SHOW_VOICEMAIL_NOTIFICATION" />
<protected-broadcast android:name="com.android.bluetooth.btservice.action.ALARM_WAKEUP" />
@@ -826,16 +826,6 @@
android:description="@string/permdesc_callPhone"
android:protectionLevel="dangerous" />
- <!-- Allows an application to manage its own calls, but rely on the system to route focus to the
- currently active call.
- <p>Protection level: dangerous
- -->
- <permission android:name="android.permission.MANAGE_OWN_CALLS"
- android:permissionGroup="android.permission-group.PHONE"
- android:label="@string/permlab_manageOwnCalls"
- android:description="@string/permdesc_manageOwnCalls"
- android:protectionLevel="dangerous" />
-
<!-- Allows an application to access the IMS call service: making and
modifying a call
<p>Protection level: signature|privileged
@@ -923,6 +913,16 @@
android:description="@string/permdesc_answerPhoneCalls"
android:protectionLevel="dangerous|runtime" />
+ <!-- Allows a calling application which manages it own calls through the self-managed
+ {@link android.telecom.ConnectionService} APIs. See
+ {@link android.telecom.PhoneAccount#CAPABILITY_SELF_MANAGED for more information on the
+ self-managed ConnectionService APIs.
+ <p>Protection level: normal
+ -->
+ <permission android:name="android.permission.MANAGE_OWN_CALLS"
+ android:label="@string/permlab_manageOwnCalls"
+ android:description="@string/permdesc_manageOwnCalls"
+ android:protectionLevel="normal" />
<!-- ====================================================================== -->
<!-- Permissions for accessing the device microphone -->
@@ -1697,7 +1697,8 @@
<permission android:name="android.permission.CACHE_CONTENT"
android:protectionLevel="signature" />
- <!-- Allows an application to aggressively allocate disk space.
+ <!-- @SystemApi @hide
+ Allows an application to aggressively allocate disk space.
<p>Not for use by third-party applications.
-->
<permission android:name="android.permission.ALLOCATE_AGGRESSIVE"
@@ -1860,22 +1861,40 @@
android:description="@string/permdesc_systemAlertWindow"
android:protectionLevel="signature|preinstalled|appop|pre23|development" />
- <!-- Allows an app to run in the background.
- <p>Protection level: signature
+ <!-- @deprecated Use {@link android.Manifest.permission#REQUEST_COMPANION_RUN_IN_BACKGROUND}
+ @hide
-->
<permission android:name="android.permission.RUN_IN_BACKGROUND"
android:label="@string/permlab_runInBackground"
android:description="@string/permdesc_runInBackground"
android:protectionLevel="signature" />
- <!-- Allows an app to use data in the background.
- <p>Protection level: signature
+ <!-- @deprecated Use
+ {@link android.Manifest.permission#REQUEST_COMPANION_USE_DATA_IN_BACKGROUND}
+ @hide
-->
<permission android:name="android.permission.USE_DATA_IN_BACKGROUND"
android:label="@string/permlab_useDataInBackground"
android:description="@string/permdesc_useDataInBackground"
android:protectionLevel="signature" />
+ <!-- Allows a companion app to run in the background.
+ <p>Protection level: signature
+ -->
+ <permission android:name="android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND"
+ android:label="@string/permlab_runInBackground"
+ android:description="@string/permdesc_runInBackground"
+ android:protectionLevel="signature" />
+
+ <!-- Allows a companion app to use data in the background.
+ <p>Protection level: signature
+ -->
+ <permission android:name="android.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND"
+ android:label="@string/permlab_useDataInBackground"
+ android:description="@string/permdesc_useDataInBackground"
+ android:protectionLevel="signature" />
+
+
<!-- ================================== -->
<!-- Permissions affecting the system wallpaper -->
<!-- ================================== -->
@@ -2485,13 +2504,11 @@
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
- <permission android:name="android.permission.BIND_AUTOFILL"
+ <permission android:name="android.permission.BIND_AUTOFILL_SERVICE"
android:protectionLevel="signature" />
- <!-- TODO(b/35956626): temporary until clients change to BIND_AUTOFILL
- <p>Protection level: signature
- -->
- <permission android:name="android.permission.BIND_AUTO_FILL"
+ <!-- @hide TODO(b/37563972): remove once clients use BIND_AUTOFILL_SERVICE -->
+ <permission android:name="android.permission.BIND_AUTOFILL"
android:protectionLevel="signature" />
<!-- Must be required by hotword enrollment application,
@@ -3336,6 +3353,8 @@
android:protectionLevel="signature" />
<!-- Must be required by system apps when accessing restricted VR APIs.
+ @hide
+ @SystemApi
<p>Protection level: signature -->
<permission android:name="android.permission.RESTRICTED_VR_ACCESS"
android:protectionLevel="signature|preinstalled" />
diff --git a/core/res/res/drawable/ic_picture_in_picture.xml b/core/res/res/drawable/ic_picture_in_picture.xml
deleted file mode 100644
index e2dda33..0000000
--- a/core/res/res/drawable/ic_picture_in_picture.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M19 11h-8v6h8v-6zm4 8V4.98C23 3.88 22.1 3 21 3H3c-1.1 0-2 .88-2 1.98V19c0 1.1 .9
-2 2 2h18c1.1 0 2-.9 2-2zm-2 .02H3V4.97h18v14.05z" />
- <path
- android:pathData="M0 0h24v24H0V0z" />
-</vector>
\ No newline at end of file
diff --git a/core/res/res/layout/autofill_save.xml b/core/res/res/layout/autofill_save.xml
index 2f7ad3a..60df492 100644
--- a/core/res/res/layout/autofill_save.xml
+++ b/core/res/res/layout/autofill_save.xml
@@ -25,7 +25,7 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
- android:padding="16dp"
+ android:paddingTop="16dp"
android:elevation="32dp"
android:background="?android:attr/colorBackground"
android:orientation="vertical">
@@ -33,43 +33,53 @@
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal">
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <TextView
+ android:id="@+id/autofill_save_title"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:text="@string/autofill_save_title"
+ android:textSize="16sp"
+ android:textColor="?android:attr/textColorPrimary"
+ android:layout_weight="1">
+ </TextView>
+
+ <ImageView
+ android:id="@+id/autofill_save_close"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="16dp"
+ android:src="@android:drawable/ic_close"
+ android:alpha="0.54"
+ android:background="?android:attr/selectableItemBackgroundBorderless">
+ </ImageView>
+
+ </LinearLayout>
<TextView
- android:id="@+id/autofill_save_title"
- android:layout_width="0dp"
+ android:id="@+id/autofill_save_subtitle"
+ android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:text="@string/autofill_save_title"
- android:textSize="16sp"
- android:textColor="?android:attr/textColorPrimary"
- android:layout_weight="1">
+ android:layout_marginTop="4dp"
+ android:visibility="gone">
</TextView>
- <ImageView
- android:id="@+id/autofill_save_close"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dp"
- android:src="@android:drawable/ic_close"
- android:alpha="0.54"
- android:background="?android:attr/selectableItemBackgroundBorderless">
- </ImageView>
-
</LinearLayout>
- <TextView
- android:id="@+id/autofill_save_subtitle"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="4dp"
- android:visibility="gone">
- </TextView>
-
<com.android.internal.widget.ButtonBarLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
- android:layout_marginTop="16dp"
+ android:padding="16dp"
+ android:clipToPadding="false"
android:layout_weight="1"
android:orientation="horizontal">
@@ -94,6 +104,7 @@
android:layout_height="wrap_content"
style="@style/Widget.Material.Button.Colored"
android:text="@string/autofill_save_yes">
+ <requestFocus />
</Button>
</com.android.internal.widget.ButtonBarLayout>
diff --git a/core/res/res/layout/notification_template_material_ambient.xml b/core/res/res/layout/notification_template_material_ambient.xml
index 74f0e57..76b3528 100644
--- a/core/res/res/layout/notification_template_material_ambient.xml
+++ b/core/res/res/layout/notification_template_material_ambient.xml
@@ -33,7 +33,8 @@
android:layout_gravity="top"
android:layout_marginTop="@dimen/notification_content_margin_top"
android:layout_marginBottom="@dimen/notification_action_list_height"
- android:paddingTop="10dp"
+ android:paddingTop="4dp"
+ android:paddingBottom="6dp"
android:clipToPadding="false"
android:orientation="vertical">
diff --git a/core/res/res/layout/notification_template_material_big_media.xml b/core/res/res/layout/notification_template_material_big_media.xml
index 04ea12d..532f28e 100644
--- a/core/res/res/layout/notification_template_material_big_media.xml
+++ b/core/res/res/layout/notification_template_material_big_media.xml
@@ -23,6 +23,13 @@
android:background="#00000000"
android:tag="bigMediaNarrow"
>
+ <!-- The size will actually be determined at runtime -->
+ <ImageView android:id="@+id/right_icon"
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_gravity="top|end"
+ android:scaleType="centerCrop"
+ />
<include layout="@layout/notification_template_header"
android:layout_width="match_parent"
android:layout_height="53dp"
@@ -60,14 +67,4 @@
<!-- media buttons will be added here -->
</LinearLayout>
</LinearLayout>
-
- <ImageView android:id="@+id/right_icon"
- android:layout_width="@dimen/media_notification_expanded_image_max_size"
- android:layout_height="@dimen/media_notification_expanded_image_max_size"
- android:minWidth="40dp"
- android:layout_marginEnd="16dp"
- android:layout_marginBottom="20dp"
- android:layout_gravity="bottom|end"
- android:scaleType="centerCrop"
- />
</com.android.internal.widget.MediaNotificationView>
diff --git a/core/res/res/layout/notification_template_material_media.xml b/core/res/res/layout/notification_template_material_media.xml
index 4c64207..4be53e0 100644
--- a/core/res/res/layout/notification_template_material_media.xml
+++ b/core/res/res/layout/notification_template_material_media.xml
@@ -23,6 +23,13 @@
android:background="#00000000"
android:tag="media"
>
+ <ImageView android:id="@+id/right_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:adjustViewBounds="true"
+ android:layout_gravity="top|end"
+ android:scaleType="centerCrop"
+ />
<include layout="@layout/notification_template_header"
android:layout_width="fill_parent"
android:layout_height="53dp" />
@@ -61,5 +68,4 @@
<!-- media buttons will be added here -->
</LinearLayout>
</LinearLayout>
- <include layout="@layout/notification_template_right_icon" />
</FrameLayout>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 2155c8f..b6cc035 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Jou diensverskaffer het tydelik stem- en noodoproepe by hierdie ligging opgeskort"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Kan netwerk nie bereik nie"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Om die opvangs te verbeter, probeer die tipe verander wat gekies is by Stelsel > Netwerk en internet > Mobiele netwerke > Voorkeurnetwerktipe."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Opletberigte"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Oproepaanstuur"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Noodterugbel-modus"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Opletberigte oor mobiele data"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS-boodskappe"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Stemboodskappe"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-oproepe"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Ander party het TTY-modus VOL versoek"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Ander party het TTY-modus GOD versoek"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Ander party het TTY-modus SOD versoek"</string>
@@ -280,15 +287,13 @@
<string name="permgroupdesc_phone" msgid="6234224354060641055">"foonoproepe te maak en te bestuur"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Liggaamsensors"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"toegang te verkry tot sensordata oor jou lewenstekens"</string>
- <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Haal venster-inhoud op"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Venster-inhoud ophaal"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Ondersoek die inhoud van \'n venster waarmee jy interaksie het."</string>
- <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Skakel Verken deur raak aan"</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Verken deur raak aanskakel"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Items waarop getik word, sal hardop gesê word en die skerm kan met behulp van gebare verken word."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Skakel verbeterde webtoeganklikheid aan"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skripte kan geïnstalleer word om program-inhoud meer toeganklik te maak."</string>
- <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Neem teks wat jy tik waar"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Teks wat jy tik waarneem"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Sluit persoonlike data soos kredietkaartnommers en wagwoorde in."</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Beheer vertoonskermvergroting"</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Vertoonskermvergroting beheer"</string>
<string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Beheer die vertoonskerm se zoemvlak en posisionering."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Voer gebare uit"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Kan tik, swiep, knyp en ander gebare uitvoer."</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Skakel oor na teksmodus vir die tydinvoer."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Skakel oor na horlosiemodus vir die tydinvoer."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Outovulopsies"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Stoor vir outovul"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Inhoud kan nie outomaties ingevul word nie"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Stoor na <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Stoor <xliff:g id="TYPE">%1$s</xliff:g> na <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Stoor <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> in <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Stoor <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> in <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Stoor in <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Stoor <xliff:g id="TYPE">%1$s</xliff:g> in <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Stoor <xliff:g id="TYPE_0">%1$s</xliff:g> en <xliff:g id="TYPE_1">%2$s</xliff:g> in <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Stoor <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> en <xliff:g id="TYPE_2">%3$s</xliff:g> in <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Stoor"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Nee, dankie"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"wagwoord"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 41a0153..03432cb 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"የእርስዎ አገልግሎት አቅራቢ ከዚህ መገኛ አካባቢ ላይ ለጊዜው የድምፅ እና የድንገተኛ አደጋ ጥሪዎችን አግዷል"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"አውታረ መረብ ላይ መድረስ አይቻልም"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ቅበላን ለማሻሻል የተመረጠውን ዓይነት በሥርዓት > አውታረ መረቦች እና በይነመረብ > የተንቀሳቃሽ ስልክ አውታረ መረቦች > ተመራጭ የአውታረ መረብ ዓይነት ላይ ለመለወጥ ይሞክሩ።"</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"ማንቂያዎች"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"ጥሪ ማስተላለፍ"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"የአደጋ ጊዜ ጥሪ ሁነታ"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"የተንቀሳቃሽ ስልክ ውሂብ ማንቂያዎች"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"የኤስኤምኤስ መልዕክቶች"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"የድምጽ መልዕክቶች"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"የWi-Fi ጥሪ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ FULL ጠይቋል"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ HCO ጠይቋል"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ VCO ጠይቋል"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"መስተጋበር የሚፈጥሩት የመስኮት ይዘት ይመርምሩ።"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"በመንካት ያስሱን ያብሩ"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"መታ የተደረጉ ንጥሎች ጮክ ተብለው ይነገሩና የጣት ምልክቶችን በመጠቀም ማያ ገጹ ሊታሰስ ይችላል።"</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"የተሻሻለ የድር ተደራሽነት ያብሩ"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"የመተግበሪያ ይዘት ይበልጥ የሚገኙ ለማድረግ ስክሪፕቶች ሊጫኑ ይችላሉ።"</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"የሚተይቡት ጽሑፍ ይመልከቱ"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"እንደ የክሬዲት ካርድ ቁጥሮች እና የይለፍ ቃላት ያሉ የግል ውሂብ ያካትታል።"</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"የመቆጣጠሪያ ማሳያ እንዲጎላ አደራረግ"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"ለጊዜ ግቤቱ ወደ የጽሑፍ ግቤት ሁነታ ቀይር።"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"ለጊዜ ግቤቱ ወደ የሰዓት ሁነታ ቀይር።"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"የራስ-ሙላ አማራጮች"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"ለራስ-ሙላ አስቀምጥ"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"ይዘቶች በራስ-ሰር ሊሞሉ አይችሉም"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"ወደ <xliff:g id="LABEL">%1$s</xliff:g> ይቀመጥ?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> ወደ <xliff:g id="LABEL">%2$s</xliff:g> ይቀመጥ?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>፣ <xliff:g id="TYPE_1">%2$s</xliff:g> ወደ <xliff:g id="LABEL">%3$s</xliff:g> ይቀመጡ?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>፣ <xliff:g id="TYPE_1">%2$s</xliff:g>፣ <xliff:g id="TYPE_2">%3$s</xliff:g> ወደ <xliff:g id="LABEL">%4$s</xliff:g> ይቀመጡ?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"ወደ <b><xliff:g id="LABEL">%1$s</xliff:g></b> ይቀመጥ?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> ወደ <b><xliff:g id="LABEL">%2$s</xliff:g></b> ይቀመጥ?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> እና <xliff:g id="TYPE_1">%2$s</xliff:g> ወደ <b><xliff:g id="LABEL">%3$s</xliff:g></b> ይቀመጡ?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>፣ <xliff:g id="TYPE_1">%2$s</xliff:g> እና <xliff:g id="TYPE_2">%3$s</xliff:g> ወደ <b><xliff:g id="LABEL">%4$s</xliff:g></b> ይቀመጡ?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"አስቀምጥ"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"አይ፣ አመሰግናለሁ"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"የይለፍ ቃል"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 570e3c4..49aeb0a 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -103,6 +103,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"علّق مشغّل شبكة الجوّال الصوت ومكالمات الطوارئ مؤقتًا في هذا الموقع الجغرافي"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"يتعذر الوصول إلى الشبكة"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"لتحسين الاستقبال، يمكنك تجربة تغيير النوع المحدّد في النظام > الشبكة والإنترنت > شبكات الجوّال > نوع الشبكة المفضّل."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"التنبيهات"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"اعادة توجيه المكالمة"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"وضع معاودة الاتصال بالطوارئ"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"تنبيهات بيانات الجوّال"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"الرسائل القصيرة SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"رسائل البريد الصوتي"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"الاتصال عبر Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"طلب النظير وضع TTY الكامل"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"طلب النظير وضع TTY على HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"طلب النظير وضع TTY على VCO"</string>
@@ -296,8 +303,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"فحص محتوى نافذة يتم التفاعل معها."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"تشغيل الاستكشاف باللمس"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"سيتم نطق العناصر التي تم النقر عليها بصوت عال ويمكن استكشاف الشاشة باستخدام الإيماءات."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"تشغيل إمكانية الدخول المحسّن عبر الويب"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"قد يتم تثبيت النصوص البرمجية لتسهيل الدخول إلى المحتوى."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"ملاحظة النص الذي تكتبه"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"يتضمن بيانات شخصية مثل أرقام بطاقات الائتمان وكلمات المرور."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"التحكم في تكبير الشاشة"</string>
@@ -591,7 +596,7 @@
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"المنزل"</item>
<item msgid="869923650527136615">"الجوال"</item>
- <item msgid="7897544654242874543">"عمل"</item>
+ <item msgid="7897544654242874543">"العمل"</item>
<item msgid="1103601433382158155">"فاكس العمل"</item>
<item msgid="1735177144948329370">"فاكس المنزل"</item>
<item msgid="603878674477207394">"جهاز نداء"</item>
@@ -634,7 +639,7 @@
<string name="phoneTypeCustom" msgid="1644738059053355820">"مخصص"</string>
<string name="phoneTypeHome" msgid="2570923463033985887">"المنزل"</string>
<string name="phoneTypeMobile" msgid="6501463557754751037">"الجوال"</string>
- <string name="phoneTypeWork" msgid="8863939667059911633">"عمل"</string>
+ <string name="phoneTypeWork" msgid="8863939667059911633">"العمل"</string>
<string name="phoneTypeFaxWork" msgid="3517792160008890912">"فاكس العمل"</string>
<string name="phoneTypeFaxHome" msgid="2067265972322971467">"فاكس المنزل"</string>
<string name="phoneTypePager" msgid="7582359955394921732">"جهاز نداء"</string>
@@ -1856,11 +1861,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"يُرجى التبديل إلى وضع إدخال النص لإدخال الوقت."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"يُرجى التبديل إلى وضع الساعة لإدخال الوقت."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"خيارات الملء التلقائي"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"حفظ المعلومات للملء التلقائي لاحقًا"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"يتعذر إجراء ملء تلقائي للمحتويات"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"هل تريد الحفظ في <xliff:g id="LABEL">%1$s</xliff:g>؟"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"هل تريد حفظ <xliff:g id="TYPE">%1$s</xliff:g> في <xliff:g id="LABEL">%2$s</xliff:g>؟"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"هل تريد حفظ <xliff:g id="TYPE_0">%1$s</xliff:g> و<xliff:g id="TYPE_1">%2$s</xliff:g> في <xliff:g id="LABEL">%3$s</xliff:g>؟"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"هل تريد حفظ <xliff:g id="TYPE_0">%1$s</xliff:g> و<xliff:g id="TYPE_1">%2$s</xliff:g> و<xliff:g id="TYPE_2">%3$s</xliff:g> في <xliff:g id="LABEL">%4$s</xliff:g>؟"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"هل تريد الحفظ في <b><xliff:g id="LABEL">%1$s</xliff:g></b>؟"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"هل تريد حفظ <xliff:g id="TYPE">%1$s</xliff:g> في <b><xliff:g id="LABEL">%2$s</xliff:g></b>؟"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"هل تريد حفظ <xliff:g id="TYPE_0">%1$s</xliff:g> و<xliff:g id="TYPE_1">%2$s</xliff:g> في <b><xliff:g id="LABEL">%3$s</xliff:g></b>؟"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"هل تريد حفظ <xliff:g id="TYPE_0">%1$s</xliff:g> و<xliff:g id="TYPE_1">%2$s</xliff:g> و<xliff:g id="TYPE_2">%3$s</xliff:g> في <b><xliff:g id="LABEL">%4$s</xliff:g></b>؟"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"حفظ"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"لا، شكرًا"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"كلمة مرور"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 6da988a..4d4d157 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Operator müvəqqəti olaraq bu məkanda səsli və təcili zəngləri dayandırıb"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Şəbəkəyə daxil olmaq mümkün deyil"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Qəbulu inkişaf etdirmək üçün seçilmiş növü Sistem > Şəbəkə və İnternet > Mobil şəbəkə > Tərcih edilən şəbəkə növü bölməsində dəyişə bilərsiniz."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Siqnallar"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Zəng yönləndirmə"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Təcili geriyə zəng rejimi"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Mobil data siqnalları"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS mesajları"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Səsli e-poçt mesajları"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi zəngi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Eskpert TTY Rejimi FULL-u sorğuladı"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Ekspert TTY Rejimi HCO-nu sorğuladı"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Ekspert TTY Rejimi VCO-nu sorğuladı"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Əlaqədə olduğunuz pəncərənin məzmununu nəzərdən keçirin."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Toxunaraq Kəşf et funksiyasını yandırın"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Tıklanan hissələr səsləndiriləcək və ekran jestlərlə idarə oluna biləcək."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"İnkişaf etmiş veb əlçatımlılığı yandırın"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skriptlər tətbiq məzmununun daha əlçatımlı olması üçün quraşdırıla bilər."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Yazdığınız mətni izləyin"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Kredit kartı nömrələri və parollar kimi şəxsi məlumatlar daxildir."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Ekran böyütməsinə nəzarət edin"</string>
@@ -1021,7 +1026,7 @@
<string name="aerr_application_repeated" msgid="3146328699537439573">"<xliff:g id="APPLICATION">%1$s</xliff:g> dayandırılması davam edir"</string>
<string name="aerr_process_repeated" msgid="6235302956890402259">"<xliff:g id="PROCESS">%1$s</xliff:g> dayandırılması davam edir"</string>
<string name="aerr_restart" msgid="7581308074153624475">"Tətbiqi yenidən açın"</string>
- <string name="aerr_report" msgid="5371800241488400617">"Geri əlaqə göndərin"</string>
+ <string name="aerr_report" msgid="5371800241488400617">"Rəyinizi bildirin"</string>
<string name="aerr_close" msgid="2991640326563991340">"Bağla"</string>
<string name="aerr_mute" msgid="1974781923723235953">"Cihaz yeniden başladılana kimi səssiz edin"</string>
<string name="aerr_wait" msgid="3199956902437040261">"Gözləyin"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Zamanı daxil etmək üçün mətnlə daxiletmə rejiminə keçin"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Zamanı daxil etmək üçün saat rejiminə keçin"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Avtodoldurma seçimləri"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Avtodoldurma üçün yadda saxlayın"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Kontentlər avtomatik olaraq doldurula bilməz"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> etiketində yadda saxlanılsın?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> <xliff:g id="LABEL">%2$s</xliff:g> etiketində yadda saxlanılsın?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> <xliff:g id="LABEL">%3$s</xliff:g> etiketində yadda saxlanılsın?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> <xliff:g id="LABEL">%4$s</xliff:g> etiketində yadda saxlanılsın?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> etiketində yadda saxlansın?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> <b><xliff:g id="LABEL">%2$s</xliff:g><b> etiketində yadda saxlansın?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> və <xliff:g id="TYPE_1">%2$s</xliff:g> <b><xliff:g id="LABEL">%3$s</xliff:g></b> etiketində yadda saxlansın?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> və <xliff:g id="TYPE_2">%3$s</xliff:g> <b><xliff:g id="LABEL">%4$s</xliff:g></b> etiketində yadda saxlansın?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Yadda saxlayın"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Xeyr, çox sağ olun"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"parol"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index b66167e..81ef908 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -100,6 +100,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Mobilni operater je privremeno suspendovao glasovne i hitne pozive na ovoj lokaciji"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Povezivanje sa mrežom nije uspelo"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Da biste poboljšali prijem, probajte da promenite izabrani tip u odeljku Sistem > Mreža i internet > Mobilne mreže > Željeni tip mreže."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Obaveštenja"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmeravanje poziva"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Režim za hitan povratni poziv"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Obaveštenja za mobilne podatke"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS-ovi"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Poruke govorne pošte"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Pozivanje preko Wi-Fi mreže"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Korisnik zahteva POTPUN režim TTY"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Korisnik zahteva PRENOS ZVUKA za režim TTY"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Korisnik zahteva PRENOS GLASA za režim TTY"</string>
@@ -287,8 +294,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Proverava sadržaj prozora sa kojim ostvarujete interakciju."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Uključi Istraživanja dodirom"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Stavke koje dodirnete će biti izgovorene naglas, a možete da se krećete po ekranu pokretima."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Uključi poboljšanu pristupačnost veba"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Mogu da se instaliraju skripte da bi sadržaj aplikacija bio pristupačniji."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Prati tekst koji unosite"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Obuhvata lične podatke kao što su brojevi kreditnih kartica i lozinke."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Upravljaj uvećanjem prikaza"</string>
@@ -1763,11 +1768,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Pređite u režim unosa teksta radi unosa vremena."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Pređite u režim sata radi unosa vremena."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Opcije automatskog popunjavanja"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Sačuvajte za automatsko popunjavanje"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Sadržaj ne može automatski da se popuni"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Želite li da sačuvate u: <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Želite li da sačuvate stavku <xliff:g id="TYPE">%1$s</xliff:g> u: <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Želite li da sačuvate stavke <xliff:g id="TYPE_0">%1$s</xliff:g> i <xliff:g id="TYPE_1">%2$s</xliff:g> u <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Želite li da sačuvate stavke <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> i <xliff:g id="TYPE_2">%3$s</xliff:g> u <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Želite li da sačuvate u: <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Želite li da sačuvate stavku <xliff:g id="TYPE">%1$s</xliff:g> u: <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Želite li da sačuvate stavke <xliff:g id="TYPE_0">%1$s</xliff:g> i <xliff:g id="TYPE_1">%2$s</xliff:g> u: <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Želite li da sačuvate stavke <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> i <xliff:g id="TYPE_2">%3$s</xliff:g> u: <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Sačuvaj"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Ne, hvala"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"lozinka"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 2702b13..3836385 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -20,7 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="byteShort" msgid="8340973892742019101">"B"</string>
+ <string name="byteShort" msgid="8340973892742019101">"б"</string>
<string name="kilobyteShort" msgid="7542884022844556968">"КБ"</string>
<string name="megabyteShort" msgid="6355851576770428922">"Мб"</string>
<string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string>
@@ -101,6 +101,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Ваш аператар часова прыпыніў працу сэрвісу галасавых і экстранных выклікаў у гэтым месцы"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Немагчыма падключыцца да сеткі"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Каб палепшыць якасць прыёму, паспрабуйце змяніць тып, выбраны ў меню \"Сістэма > Сетка і інтэрнэт > Мабільныя сеткі > Прыярытэтны тып сеткі\"."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Абвесткі"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Пераадрасацыя выкліку"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Рэжым экстраннага зваротнага выкліку"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Абвесткі пра мабільныя даныя"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS-паведамленні"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Паведамленні галасавой пошты"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-тэлефанія"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Аднарангавая прылада запытала рэжым TTY FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Аднарангавая прылада запытала рэжым TTY НСО"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Аднарангавая прылада запытала рэжым TTY VCO"</string>
@@ -240,7 +247,7 @@
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Бязгучны рэжым"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Гук выкл."</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Гук уключаны"</string>
- <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Рэжым \"У самалёце\""</string>
+ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Рэжым палёту"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Уключаны рэжым \"У самалёце\""</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Рэжым \"У самалёце\" адключаны"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Налады"</string>
@@ -290,8 +297,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Вывучыце змесцiва акна, з якiм вы працуеце."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Уключыце Explore by Touch"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Элементы, да якіх дакрануліся, будуць агучаны, а экранам можна даследаваць пры дапамозе жэстаў."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Уключыце паляпшэнне вэб-даступнасці"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Сцэнарыi могуць быць усталяваны, каб зрабіць змесцiва прыкладання больш даступным."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Глядзiце, што набiраеце"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Уключае ў сябе асабістыя дадзеныя, такія як нумары крэдытных карт і паролі."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Кіраваць павелічэннем дысплэя"</string>
@@ -1786,7 +1791,7 @@
<string name="app_category_productivity" msgid="3742083261781538852">"Прадукцыйнасць"</string>
<string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"Сховішча на прыладзе"</string>
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"Адладка USB"</string>
- <string name="time_picker_hour_label" msgid="2979075098868106450">"гадзіна"</string>
+ <string name="time_picker_hour_label" msgid="2979075098868106450">"гадз"</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"хвіліна"</string>
<string name="time_picker_header_text" msgid="143536825321922567">"Задаць час"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"Увядзіце дапушчальны час"</string>
@@ -1794,11 +1799,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Пераключыцца на рэжым тэксту пры ўводзе часу."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Пераключыцца на рэжым гадзінніка пры ўводзе часу."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Параметры аўтазапаўнення"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Захаваць для аўтазапаўнення"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Для гэтага змесціва аўтазапаўненне немагчымае"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Захаваць у <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Захаваць наступнае: <xliff:g id="TYPE">%1$s</xliff:g> у <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Захаваць <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> у <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Захаваць <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> у <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Захаваць у <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Захаваць <xliff:g id="TYPE">%1$s</xliff:g> у <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Захаваць <xliff:g id="TYPE_0">%1$s</xliff:g> і <xliff:g id="TYPE_1">%2$s</xliff:g> у <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Захаваць <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> і <xliff:g id="TYPE_2">%3$s</xliff:g> у <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Захаваць"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Не, дзякуй"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"пароль"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index cfb8177..c799ca9 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Операторът ви временно е спрял гласовите и спешните обаждания в това местоположение"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Не може да се установи връзка с мрежата"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"За да подобрите сигнала, променете избрания тип мрежа от „Система“ > „Мрежа и интернет“ > „Мобилни мрежи“ > „Предпочитан тип мрежа“."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Сигнали"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Пренасочване на обаждания"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим на обратно обаждане при спешност"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Сигнали за мобилните данни"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS съобщения"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Съобщения в гласовата поща"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Обаждания през Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Отсрещният потребител заяви пълен TTY режим (FULL)"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Отсрещният потребител заяви TTY режим с пренос на слух (HCO)"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Отсрещният потребител заяви TTY режим с пренос на глас (VCО)"</string>
@@ -259,7 +266,7 @@
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Демонстрационен режим за магазини"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB връзка"</string>
<string name="safeMode" msgid="2788228061547930246">"Безопасен режим"</string>
- <string name="android_system_label" msgid="6577375335728551336">"Системно от Android"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"Система Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Превключване към личния потребителски профил"</string>
<string name="managed_profile_label" msgid="5289992269827577857">"Превключване към служебния пoтребителски профил"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакти"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Инспектиране на съдържанието на прозорец, с който взаимодействате."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Включване на изследването чрез докосване"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Докосваните елементи ще бъдат изговаряни на глас и екранът може да бъде изследван посредством жестове."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Включване на подобрената достъпност в мрежата"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Скриптовете може да бъдат инсталирани, за да направят съдържанието от приложенията по-достъпно."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Наблюдение на въвеждания от вас текст"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Включва лични данни, като например номера на кредитни карти и пароли."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Управление на увеличението на дисплея"</string>
@@ -1471,7 +1476,7 @@
<string name="user_switched" msgid="3768006783166984410">"Текущ потребител <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="2871009331809089783">"Превключва се към <xliff:g id="NAME">%1$s</xliff:g>…"</string>
<string name="user_logging_out_message" msgid="8939524935808875155">"<xliff:g id="NAME">%1$s</xliff:g> излиза…"</string>
- <string name="owner_name" msgid="2716755460376028154">"Собственик"</string>
+ <string name="owner_name" msgid="2716755460376028154">"собственик"</string>
<string name="error_message_title" msgid="4510373083082500195">"Грешка"</string>
<string name="error_message_change_not_allowed" msgid="1238035947357923497">"Тази промяна не е разрешена от администратора ви"</string>
<string name="app_not_found" msgid="3429141853498927379">"Няма намерено приложение за извършване на това действие"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Превключете към режима за въвеждане на текст, за да въведете часа."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Превключете към режима за часовник, за да въведете часа."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Опции за автоматично попълване"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Запазване за автоматично попълване"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Съдържанието не може да бъде попълнено автоматично"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Да се запази ли в/ъв „<xliff:g id="LABEL">%1$s</xliff:g>“?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> да се запази ли в/ъв „<xliff:g id="LABEL">%2$s</xliff:g>“?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Искате ли да запазите <xliff:g id="TYPE_0">%1$s</xliff:g> и <xliff:g id="TYPE_1">%2$s</xliff:g> в/ъв „<xliff:g id="LABEL">%3$s</xliff:g>“?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Искате ли да запазите <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> и <xliff:g id="TYPE_2">%3$s</xliff:g> в/ъв „<xliff:g id="LABEL">%4$s</xliff:g>“?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Да се запази ли в/ъв <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> да се запази ли в/ъв <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> и <xliff:g id="TYPE_1">%2$s</xliff:g> да се запазят ли в/ъв <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> и <xliff:g id="TYPE_2">%3$s</xliff:g> да се запазят ли в/ъв <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Запазване"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Не, благодаря"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"Паролата"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 754e04f..c8bc6d7 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"আপনার পরিষেবা প্রদানকারী এই অবস্থানে ভয়েস এবং জরুরি কল সাময়িকভাবে সাসপেন্ড করেছে"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"নেটওয়ার্কের সিগন্যাল নেই"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"রিসেপশন উন্নত করতে সিস্টেম > নেটওয়ার্ক এবং ইন্টারনেট > মোবাইল নেটওয়ার্ক > পছন্দের নেটওয়ার্কের ধরণ এ গিয়ে নির্বাচিত নেটওয়ার্কের ধরণ পরিবর্তন করে দেখুন।"</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"সতর্কবার্তা"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"কল ফরওয়ার্ড করা"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"জরুরি কলব্যাক মোড"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"মোবাইল ডেটার সতর্কবার্তা"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"এসএমএস বার্তা"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ভয়েসমেল বার্তা"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"ওয়াই-ফাই কলিং"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"পির TTY মোড FULL অনুরোধ করেছে"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"পির TTY মোড HCO অনুরোধ করেছে"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"পির TTY মোড VCO অনুরোধ করেছে"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"আপনি ইন্টারঅ্যাক্ট করছেন এমন একটি উইন্ডোর সামগ্রীকে সযত্নে নিরীক্ষণ করে৷"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"স্পর্শের মাধ্যমে অন্বেষণ করা চালু করুন"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"যে আইটেমগুলিতে আলতো চেপেছেন সেগুলি সশব্দে বলবে এবং ইঙ্গিতগুলি ব্যবহার করে স্ক্রীন অন্বেষণ করা যাবে৷"</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"উন্নত ওয়েব অ্যাক্সেসযোগ্যতা চালু করুন"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"অ্যাপ্লিকেশানের সামগ্রীকে আরো অ্যাক্সেসযোগ্য করতে স্ক্রিপ্টগুলি ইনস্টল করা হতে পারে৷"</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"আপনার লেখা পাঠ্যকে নিরীক্ষণ করে"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"ক্রেডিট কার্ডের নম্বর ও পাসওয়ার্ডগুলির মতো ব্যক্তিগত তথ্য অন্তর্ভুক্ত করে৷"</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"প্রদর্শনের বৃহত্তরীকরণ ব্যবস্থা নিয়ন্ত্রণ করুন"</string>
@@ -1101,7 +1106,7 @@
<string-array name="network_switch_type_name">
<item msgid="3979506840912951943">"মোবাইল ডেটা"</item>
<item msgid="75483255295529161">"Wi-Fi"</item>
- <item msgid="6862614801537202646">"Bluetooth"</item>
+ <item msgid="6862614801537202646">"ব্লুটুথ"</item>
<item msgid="5447331121797802871">"ইথারনেট"</item>
<item msgid="8257233890381651999">"VPN"</item>
</string-array>
@@ -1604,7 +1609,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"আপনার প্রশাসক ইনস্টল করেছেন"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"আপনার প্রশাসক আপডেট করেছেন"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"আপনার প্রশাসক মুছে দিয়েছেন"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"ব্যাটরির লাইফ উন্নত করতে সহায়তা করতে, ব্যাটারি সাশ্রয়কারী আপনার ডিভাইসের কার্যসম্পাদনা হ্রাস করে এবং কম্পন, অবস্থান পরিষেবাসমূহ এবং অধিকাংশ ব্যাকগ্রাউন্ড ডেটা সীমিত করে৷ ইমেল, বার্তাপ্রেরণ এবং অন্যান্য অ্যাপ্লিকেশানগুলিকে যেগুলি সিঙ্কের উপর নির্ভর করে সেগুলিকে আপনি না খোলা পর্যন্ত নাও আপডেট হতে পারে৷\n\nআপনার ডিভাইসটিকে যখন চার্জ করা হয় তখন ব্যাটারি সাশ্রয়কারী স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়৷"</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"ব্যাটরির লাইফ উন্নত করতে সহায়তা করতে, ব্যাটারি সাশ্রয়কারী আপনার ডিভাইসের কার্যসম্পাদনা হ্রাস করে এবং কম্পন, অবস্থান পরিষেবাগুলি এবং অধিকাংশ ব্যাকগ্রাউন্ড ডেটা সীমিত করে৷ ইমেল, বার্তাপ্রেরণ এবং অন্যান্য অ্যাপ্লিকেশানগুলিকে যেগুলি সিঙ্কের উপর নির্ভর করে সেগুলিকে আপনি না খোলা পর্যন্ত নাও আপডেট হতে পারে৷\n\nআপনার ডিভাইসটিকে যখন চার্জ করা হয় তখন ব্যাটারি সাশ্রয়কারী স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়৷"</string>
<string name="data_saver_description" msgid="6015391409098303235">"ডেটার ব্যবহার কমাতে সহায়তা করার জন্য, ডেটা সেভার পটভূমিতে কিছু অ্যাপ্লিকেশানকে ডেটা পাঠাতে বা গ্রহণ করতে বাধা দেয়৷ আপনি বর্তমানে এমন একটি অ্যাপ্লিকেশান ব্যবহার করছেন যেটি ডেটা অ্যাক্সেস করতে পারে, তবে সেটি কমই করে৷ এর ফলে যা হতে পারে, উদাহরণস্বরূপ, আপনি ছবিগুলিতে আলতো চাপ না দেওয়া পর্যন্ত সেগুলি প্রদর্শিত হবে না৷"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ডেটা সেভার চালু করবেন?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"চালু করুন"</string>
@@ -1733,11 +1738,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"সময় ইনপুট দেওয়ার জন্য পাঠ্য ইনপুট মোডে যান।"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"সময় ইনপুট দেওয়ার জন্য ঘড়ি মোডে যান।"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"আপনাআপনি পূরণ করার বিকল্পগুলি"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"স্বতঃপূর্ণর জন্য সংরক্ষণ করুন"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"বিষয়বস্তুগুলি অটো-ফিল করা যাবে না"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> এ সংরক্ষণ করবেন?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="LABEL">%2$s</xliff:g> এ <xliff:g id="TYPE">%1$s</xliff:g> সংরক্ষণ করবেন?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> <xliff:g id="LABEL">%3$s</xliff:g> এ সংরক্ষণ করবেন?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> <xliff:g id="LABEL">%4$s</xliff:g> এ সংরক্ষণ করবেন?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> এ সংরক্ষণ করবেন?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> কে <b><xliff:g id="LABEL">%2$s</xliff:g></b>এ সংরক্ষণ করবেন?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> এবং <xliff:g id="TYPE_1">%2$s</xliff:g> কে <b><xliff:g id="LABEL">%3$s</xliff:g></b> এ সংরক্ষণ করবেন?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, এবং <xliff:g id="TYPE_2">%3$s</xliff:g> কে <b><xliff:g id="LABEL">%4$s</xliff:g></b> এ সংরক্ষণ করবেন?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"সংরক্ষণ করুন"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"না থাক"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"পাসওয়ার্ড"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 6b8fa78..f93c655 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -100,6 +100,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Vaš operater je na ovoj lokaciji privremeno obustavio govorne i hitne pozive."</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nije moguće dosegnuti mrežu"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Za poboljšanje prijema, pokušajte promijeniti tip odabran u meniju Sistem > Mreža i internet > Mobilne mreže > Preferirani tip mreže."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozorenja"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmjeravanje poziva"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Način rada za hitni povratni poziv"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Upozorenja za mobilne podatke"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS poruke"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Poruke govorne pošte"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi pozivanje"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Ravnopravni uređaj zatražio TTY PUNI način rada"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Ravnopravni uređaj zatražio TTY HCO način rada"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Ravnopravni uređaj zatražio TTY VCO način rada"</string>
@@ -283,15 +290,13 @@
<string name="permgroupdesc_phone" msgid="6234224354060641055">"poziva i upravlja pozivima"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Tjelesni senzori"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pristupa podacima senzora o vašim vitalnim funkcijama"</string>
- <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Ponovo prikaži sadržaj prozora"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Istražite sadržaj prozora koji trenutno koristite."</string>
- <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Uključite Istraživanje dodirom"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Preuzima sadržaj prozora"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Pregleda sadržaj prozora koji trenutno koristite."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Uključi opciju Istraživanje dodirom"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Stavke koje dodirnete bit će izgovorene naglas, a ekran možete istraživati koristeći pokrete."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Uključite poboljšanu web pristupačnost"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Možda će biti instalirana skripta kako bi sadržaj aplikacije bio dostupniji."</string>
- <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Obratite pažnju na tekst koji tipkate"</string>
- <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Uključuje lične podatke kao što su brojevi kreditnih kartica i lozinke."</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Kontroliranje uvećanja prikaza na ekranu"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Prati tekst koji unosite"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Obuhvata lične podatke kao što su brojevi kreditnih kartica i lozinke."</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Kontrolira uvećanje prikaza na ekranu"</string>
<string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Kontrolira stepen uvećanja prikaza na ekranu i podešavanje položaja."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Praviti pokrete"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Može dodirivati, prevlačiti, hvatati prstima i praviti druge pokrete."</string>
@@ -641,14 +646,14 @@
<string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
<string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Poslovni mobilni"</string>
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Poslovni pejdžer"</string>
- <string name="phoneTypeAssistant" msgid="5596772636128562884">"Pomoćnik"</string>
+ <string name="phoneTypeAssistant" msgid="5596772636128562884">"Asistent"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
<string name="eventTypeCustom" msgid="7837586198458073404">"Prilagođeno"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Rođendan"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Godišnjica"</string>
<string name="eventTypeOther" msgid="7388178939010143077">"Ostalo"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Prilagođeno"</string>
- <string name="emailTypeHome" msgid="449227236140433919">"Kućni"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"Privatna"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Posao"</string>
<string name="emailTypeOther" msgid="2923008695272639549">"Ostalo"</string>
<string name="emailTypeMobile" msgid="119919005321166205">"Mobilni"</string>
@@ -674,7 +679,7 @@
<string name="orgTypeOther" msgid="3951781131570124082">"Ostalo"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Prilagođeno"</string>
<string name="relationTypeCustom" msgid="3542403679827297300">"Prilagođeno"</string>
- <string name="relationTypeAssistant" msgid="6274334825195379076">"Pomoćnik"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Asistent"</string>
<string name="relationTypeBrother" msgid="8757913506784067713">"Brat"</string>
<string name="relationTypeChild" msgid="1890746277276881626">"Dijete"</string>
<string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Nevjenčani partner"</string>
@@ -849,9 +854,9 @@
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"razmak"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"potvrdi"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"izbriši"</string>
- <string name="search_go" msgid="8298016669822141719">"Traži"</string>
+ <string name="search_go" msgid="8298016669822141719">"Pretraži"</string>
<string name="search_hint" msgid="1733947260773056054">"Pretraži..."</string>
- <string name="searchview_description_search" msgid="6749826639098512120">"Traži"</string>
+ <string name="searchview_description_search" msgid="6749826639098512120">"Pretraživanje"</string>
<string name="searchview_description_query" msgid="5911778593125355124">"Upit za pretragu"</string>
<string name="searchview_description_clear" msgid="1330281990951833033">"Obriši upit"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Potvrditi upit"</string>
@@ -878,7 +883,7 @@
<string name="minute" msgid="9148878657703769868">"minuta"</string>
<string name="minutes" msgid="5646001005827034509">"minute"</string>
<string name="second" msgid="3184235808021478">"sekunda"</string>
- <string name="seconds" msgid="3161515347216589235">"sekunde"</string>
+ <string name="seconds" msgid="3161515347216589235">"s"</string>
<string name="week" msgid="5617961537173061583">"sedmica"</string>
<string name="weeks" msgid="6509623834583944518">"sedmice"</string>
<string name="year" msgid="4001118221013892076">"godina"</string>
@@ -1091,7 +1096,7 @@
<string name="dump_heap_text" msgid="4809417337240334941">"Proces <xliff:g id="PROC">%1$s</xliff:g> je premašio ograničenje procesne memorije od <xliff:g id="SIZE">%2$s</xliff:g>. Snimak dinamičkog dijela memorije vam je dostupan i možete ga dijeliti sa njegovim programerom. Budite oprezni: ovaj snimak dinamičkog dijela memorije može sadržavati vaše lične podatke kojima aplikacija ima pristup."</string>
<string name="sendText" msgid="5209874571959469142">"Biranje akcije za tekst"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Jačina zvuka zvona"</string>
- <string name="volume_music" msgid="5421651157138628171">"Jačina zvuka za medijske sadržaje"</string>
+ <string name="volume_music" msgid="5421651157138628171">"Jačina zvuka medija"</string>
<string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Medijski sadržaj se reproducira preko Bluetooth veze"</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Postavljena nečujna melodija zvona"</string>
<string name="volume_call" msgid="3941680041282788711">"Jačina zvuka tokom poziva"</string>
@@ -1102,7 +1107,7 @@
<string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Jačina zvuka za Bluetooth vezu"</string>
<string name="volume_icon_description_ringer" msgid="3326003847006162496">"Jačina zvuka melodije"</string>
<string name="volume_icon_description_incall" msgid="8890073218154543397">"Jačina zvuka tokom poziva"</string>
- <string name="volume_icon_description_media" msgid="4217311719665194215">"Jačina zvuka za medijske sadržaje"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"Jačina zvuka medija"</string>
<string name="volume_icon_description_notification" msgid="7044986546477282274">"Jačina zvuka za obavještenja"</string>
<string name="ringtone_default" msgid="3789758980357696936">"Zadana melodija zvona"</string>
<string name="ringtone_default_with_actual" msgid="1767304850491060581">"Zadano (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
@@ -1112,7 +1117,7 @@
<string name="ringtone_picker_title_notification" msgid="4837740874822788802">"Zvuci obavještenja"</string>
<string name="ringtone_unknown" msgid="3914515995813061520">"Nepoznato"</string>
<string name="wifi_available_sign_in" msgid="9157196203958866662">"Prijavljivanje na Wi-Fi mrežu"</string>
- <string name="network_available_sign_in" msgid="1848877297365446605">"Prijavite se na mrežu"</string>
+ <string name="network_available_sign_in" msgid="1848877297365446605">"Prijava na mrežu"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
<string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi nema pristup Internetu"</string>
@@ -1143,7 +1148,7 @@
<string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"Pozivnica poslana"</string>
<string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"Poziv za povezivanje"</string>
<string name="wifi_p2p_from_message" msgid="570389174731951769">"Pošiljalac:"</string>
- <string name="wifi_p2p_to_message" msgid="248968974522044099">"Primalac:"</string>
+ <string name="wifi_p2p_to_message" msgid="248968974522044099">"Prima:"</string>
<string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"Unesite potrebni PIN:"</string>
<string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
<string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"Tablet će privremeno prekinuti Wi-Fi vezu dok bude povezan s uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
@@ -1204,7 +1209,7 @@
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ODBACI"</string>
<string name="select_input_method" msgid="8547250819326693584">"Promijeni tastaturu"</string>
<string name="show_ime" msgid="2506087537466597099">"Prikaži na ekranu dok je fizička tastatura aktivna"</string>
- <string name="hardware" msgid="194658061510127999">"Prikaži virtualnu tastaturu"</string>
+ <string name="hardware" msgid="194658061510127999">"Prikaži virtuelnu tastaturu"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Konfiguriraj fizičku tastaturu"</string>
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dodirnite za odabir jezika i rasporeda"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1265,7 +1270,7 @@
<string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Dodirnite dvaput za kontrolu uvećanja"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Dodavanje vidžeta nije uspjelo."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Počni"</string>
- <string name="ime_action_search" msgid="658110271822807811">"Traži"</string>
+ <string name="ime_action_search" msgid="658110271822807811">"Pretraži"</string>
<string name="ime_action_send" msgid="2316166556349314424">"Poslati"</string>
<string name="ime_action_next" msgid="3138843904009813834">"Naprijed"</string>
<string name="ime_action_done" msgid="8971516117910934605">"Gotovo"</string>
@@ -1302,7 +1307,7 @@
<string name="vpn_lockdown_config" msgid="5099330695245008680">"Dodirnite za postavke"</string>
<string name="upload_file" msgid="2897957172366730416">"Odabir fajla"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nije izabran nijedan fajl"</string>
- <string name="reset" msgid="2448168080964209908">"Ponovno pokretanje"</string>
+ <string name="reset" msgid="2448168080964209908">"Vrati na zadano"</string>
<string name="submit" msgid="1602335572089911941">"Potvrdi"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Način rada u autu omogućen"</string>
<string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Dodirnite za izlaz iz načina rada u automobilu"</string>
@@ -1337,7 +1342,7 @@
<string name="sync_undo_deletes" msgid="2941317360600338602">"Poništiti brisanje"</string>
<string name="sync_do_nothing" msgid="3743764740430821845">"Ne radi ništa za sada"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Odaberite račun"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Dodajte račun"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"Dodaj račun"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Dodajte račun"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Povećaj"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Smanji"</string>
@@ -1609,7 +1614,7 @@
<string name="restr_pin_try_later" msgid="973144472490532377">"Pokušajte ponovo kasnije."</string>
<string name="immersive_cling_title" msgid="8394201622932303336">"Prikazuje se cijeli ekran"</string>
<string name="immersive_cling_description" msgid="3482371193207536040">"Da izađete, prevucite nadolje odozgo."</string>
- <string name="immersive_cling_positive" msgid="5016839404568297683">"Jasno mi je"</string>
+ <string name="immersive_cling_positive" msgid="5016839404568297683">"Razumijem"</string>
<string name="done_label" msgid="2093726099505892398">"Završeno"</string>
<string name="hour_picker_description" msgid="6698199186859736512">"Kružni klizač za odabir sata"</string>
<string name="minute_picker_description" msgid="8606010966873791190">"Kružni klizač za minute"</string>
@@ -1631,7 +1636,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalirao je vaš administrator"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ažurirao je vaš administrator"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Izbrisao je vaš administrator"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"Da bi se trajanje baterije produžilo, opcija za štednju baterije minimizira rad uređaja i ograničava vibriranje, usluge lokacije i većinu prijenosa podataka u pozadini. E-pošta, poruke i druge aplikacije koje se oslanjaju na sinhronizaciju ne mogu biti ažurirane dok ih ne otvorite.\n\nŠtednja baterije se automatski isključi prilikom punjenja uređaja."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Da bi se produžilo trajanje baterije, opcija za štednju baterije minimizira rad uređaja i ograničava vibriranje, usluge lokacije i većinu prijenosa podataka u pozadini. E-pošta, poruke i druge aplikacije koje se oslanjaju na sinhronizaciju ne mogu biti ažurirane dok ih ne otvorite.\n\nŠtednja baterije se automatski isključuje prilikom punjenja uređaja."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Da bi se smanjio prijenos podataka, usluga Ušteda podataka sprečava da neke aplikacije šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može pristupiti podacima, ali se to može desiti rjeđe. To može značiti, naprimjer, da se slike ne prikazuju sve dok ih ne dodirnete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Uključiti Uštedu podataka?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Uključi"</string>
@@ -1763,17 +1768,18 @@
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"Otklanjanje grešaka putem uređaja spojenog na USB"</string>
<string name="time_picker_hour_label" msgid="2979075098868106450">"sat"</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"minuta"</string>
- <string name="time_picker_header_text" msgid="143536825321922567">"Postavite vrijeme"</string>
+ <string name="time_picker_header_text" msgid="143536825321922567">"Postavljanje vremena"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"Unesite ispravno vrijeme"</string>
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Upišite vrijeme"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Prebacite u način unosa teksta za unos vremena."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Prebacite u način rada kao sat za unos vremena."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Opcije za automatsko popunjavanje"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Sačuvaj za automatsko popunjavanje"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Sadržaje nije moguće automatski popuniti"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Želite li sačuvati u: <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Želite li sačuvati stavku <xliff:g id="TYPE">%1$s</xliff:g> u: <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Želite li <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> sačuvati u <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Želite li <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> sačuvati u <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Želite li sačuvati u <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Želite li da se <xliff:g id="TYPE">%1$s</xliff:g> sačuva u <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Želite li da se <xliff:g id="TYPE_0">%1$s</xliff:g> i <xliff:g id="TYPE_1">%2$s</xliff:g> sačuvaju u <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Želite li da se <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, i <xliff:g id="TYPE_2">%3$s</xliff:g> sačuvaju <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Sačuvaj"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Ne, hvala"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"lozinka"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index b0ea791..512f167 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"El teu operador de telefonia mòbil ha suspès temporalment les trucades de veu i d\'emergència en aquesta ubicació"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"No es pot accedir a la xarxa"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Per millorar la recepció, prova de canviar-ne el tipus a Sistema > Xarxa i Internet > Xarxes de telefonia mòbil > Tipus de xarxa preferit."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertes"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Desviació de trucades"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode de devolució de trucada d\'emergència"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Alertes de dades mòbils"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Missatges SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Missatges de veu"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Trucades per Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"L\'altre dispositiu ha sol·licitat el mode TTY COMPLET."</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"L\'altre dispositiu ha sol·licitat el mode TTY HCO."</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"L\'altre dispositiu ha sol·licitat el mode TTY VCO."</string>
@@ -136,7 +143,7 @@
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Trucada de Wi-Fi de: %s"</item>
</string-array>
- <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desactivades"</string>
+ <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desactivat"</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="1988279625335345908">"Preferència per a dades mòbils"</string>
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Només Wi-Fi"</string>
@@ -284,14 +291,12 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contingut d\'una finestra amb què estàs interaccionant."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar Exploració tàctil"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Els elements que toquis es diran en veu alta, i podràs explorar la pantalla amb gestos."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Activar l\'accessibilitat web millorada"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"És possible que s\'instal·lin scripts perquè el contingut de les aplicacions sigui més accessible."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observar el text que escrius"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Inclou dades personals com ara números de targetes de crèdit i contrasenyes."</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Controla l\'ampliació de la pantalla"</string>
- <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Controla el nivell i el posicionament del zoom de la pantalla."</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Controlar l\'ampliació de la pantalla"</string>
+ <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Controla el nivell i la posició del zoom de la pantalla."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Utilitza gestos"</string>
- <string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Pot tocar, lliscar, pessigar i utilitzar altres gestos."</string>
+ <string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Permet tocar, lliscar, pinçar i fer altres gestos."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gestos al sensor d\'empremtes digitals"</string>
<string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Captura gestos realitzats en el sensor d\'empremtes digitals del dispositiu."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"desactivar o modificar la barra d\'estat"</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instal·lat per l\'administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Actualitzat per l\'administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Suprimit per l\'administrador"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"Per tal d\'augmentar la durada de la bateria, la funció d\'estalvi de bateria redueix el rendiment del dispositiu i en limita la vibració i la majoria de dades en segon pla. És possible que el correu electrònic, la missatgeria i la resta d\'aplicacions que se sincronitzen amb freqüència no s\'actualitzin llevat que les obris.\n\nL\'estalvi de bateria es desactiva automàticament mentre el dispositiu s\'està carregant."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Per tal d\'augmentar la durada de la bateria, la funció d\'estalvi de bateria redueix el rendiment del dispositiu i en limita la vibració, els serveis d\'ubicació i la majoria de dades en segon pla. És possible que el correu electrònic, la missatgeria i la resta d\'aplicacions que se sincronitzen amb freqüència no s\'actualitzin llevat que les obris.\n\nL\'estalvi de bateria es desactiva automàticament mentre el dispositiu s\'està carregant."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Per reduir l\'ús de dades, la funció Economitzador de dades evita que determinades aplicacions enviïn o rebin dades en segon pla. L\'aplicació que estiguis fent servir podrà accedir a dades, però potser ho farà menys sovint. Això vol dir, per exemple, que les imatges no es mostraran fins que no les toquis."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Activar Economitzador de dades?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activa"</string>
@@ -1691,7 +1696,7 @@
<string name="work_mode_off_message" msgid="2961559609199223594">"S\'activarà el teu perfil professional, incloses les aplicacions, la sincronització en segon pla i les funcions relacionades"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Activa"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Tens missatges nous"</string>
- <string name="new_sms_notification_content" msgid="7002938807812083463">"Obre l\'aplicació de SMS per veure\'ls"</string>
+ <string name="new_sms_notification_content" msgid="7002938807812083463">"Obre l\'aplicació d\'SMS per veure\'ls"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Algunes funcions es limitaran"</string>
<string name="user_encrypted_message" msgid="4923292604515744267">"Toca per desbloquejar"</string>
<string name="user_encrypted_detail" msgid="5708447464349420392">"Dades d\'usuari bloquejades"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Canvia al mode d\'introducció de text per introduir l\'hora."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Canvia al mode de rellotge per introduir l\'hora."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Opcions d\'emplenament automàtic"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Desa per a emplenament automàtic"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"El contingut no es pot emplenar automàticament"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Vols desar-ho a <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Vols desar la informació del camp <xliff:g id="TYPE">%1$s</xliff:g> a <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Vols desar <xliff:g id="TYPE_0">%1$s</xliff:g> i <xliff:g id="TYPE_1">%2$s</xliff:g> a <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Vols desar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> i <xliff:g id="TYPE_2">%3$s</xliff:g> a <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Vols desar-ho a <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Vols desar <xliff:g id="TYPE">%1$s</xliff:g> a <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Vols desar <xliff:g id="TYPE_0">%1$s</xliff:g> i <xliff:g id="TYPE_1">%2$s</xliff:g> a <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Vols desar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> i <xliff:g id="TYPE_2">%3$s</xliff:g> a <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Desa"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"No, gràcies"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"contrasenya"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 0b9b95d..0dabc80 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -101,6 +101,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Váš operátor v této oblasti dočasně blokuje hlasová i tísňová volání"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"K síti se nelze připojit"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Chcete-li zlepšit příjem, zkuste změnit vybraný typ sítě v nastavení Systém > Síť a internet > Mobilní sítě > Preferovaný typ sítě."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozornění"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Přesměrování hovorů"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Režim tísňového zpětného volání"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Upozornění na mobilní data"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Zprávy SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Hlasové zprávy"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Volání přes Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Partner požádal o přechod na režim TTY FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Partner požádal o přechod na režim TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Partner požádal o přechod na režim TTY VCO"</string>
@@ -290,8 +297,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Může prozkoumávat obsah oken, se kterými pracujete."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Zapnout funkci Prozkoumání dotykem"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Položky, na které klepnete, budou přečteny nahlas a obrazovku bude možné procházet pomocí gest."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Zapnout vylepšené usnadnění přístupu k webu"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Za účelem usnadnění přístupu k obsahu aplikací mohou být nainstalovány skripty."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Sledovat zadávaný text"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Sledování zahrnuje osobní údaje, jako jsou například čísla kreditních karet a hesla."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Nastavení zvětšení obsahu obrazovky"</string>
@@ -1647,7 +1652,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Nainstalováno administrátorem"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Aktualizováno administrátorem"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"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>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Spořič baterie prodlužuje výdrž baterie tím, že 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>
<string name="data_saver_description" msgid="6015391409098303235">"Spořič dat z důvodu snížení využití dat některým aplikacím brání v odesílání nebo příjmu dat na pozadí. Aplikace, kterou právě používáte, data přenášet může, ale může tak činit méně často. V důsledku toho se například obrázky nemusejí zobrazit, dokud na ně neklepnete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Chcete zapnout Spořič dat?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Zapnout"</string>
@@ -1794,11 +1799,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Chcete-li zadat čas, přepněte na režim textu."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Chcete-li zadat čas, přepněte na režim hodin."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Možnosti automatického vyplňování"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Uložit do Automatického vyplňování"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Obsah nelze automaticky vyplnit"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Uložit do služby <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Uložit položku <xliff:g id="TYPE">%1$s</xliff:g> do služby <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Má se <xliff:g id="TYPE_0">%1$s</xliff:g> a <xliff:g id="TYPE_1">%2$s</xliff:g> uložit do služby <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Má se <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> a <xliff:g id="TYPE_2">%3$s</xliff:g> uložit do služby <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Uložit do služby <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Uložit položku <xliff:g id="TYPE">%1$s</xliff:g> do služby <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Uložit položky <xliff:g id="TYPE_0">%1$s</xliff:g> a <xliff:g id="TYPE_1">%2$s</xliff:g> do služby <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Uložit položky <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> a <xliff:g id="TYPE_2">%3$s</xliff:g> do služby <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Uložit"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Ne, děkuji"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"heslo"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 1708834..d5b40fb 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Dit mobilselskab har midlertidigt suspenderet tale- og nødopkald på dette sted"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Der er ingen forbindelse til netværket"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Hvis du vil forbedre signalet, kan du prøve at ændre den valgte netværkstype i System > Netværk og internet > Mobilnetværk > Foretrukken netværkstype."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Underretninger"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Viderestilling af opkald"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Nødtilbagekaldstilstand"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Underretninger om mobildata"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Sms-beskeder"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Talebeskeder"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-opkald"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Den anden enhed har skiftet til FULD TTY-tilstand"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Den anden enhed har skiftet til TTY-tilstanden HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Den anden enhed har skiftet til TTY-tilstanden VCO"</string>
@@ -284,11 +291,9 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"undersøge indholdet i et vindue, du interagerer med."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"aktivere Udforsk ved berøring"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"De elementer, der trykkes på, læses højt, og skærmen kan udforskes ved hjælp af bevægelser."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Aktivér udvidede webhjælpefunktioner"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Der installeres muligvis scripts for at gøre appindhold mere tilgængeligt."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"observere tekst, du skriver"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Dette omfatter personlige data såsom kreditkortnumre og adgangskoder."</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Kontrollér skærmforstørrelsen"</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"administrere skærmforstørrelsen"</string>
<string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Kontrollér skærmens zoomniveau og position."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Udfør bevægelser"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Kan trykke, stryge, knibe sammen og udføre andre bevægelser."</string>
@@ -1562,7 +1567,7 @@
<string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Annulleret"</string>
<string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Fejl ved skrivning af indhold"</string>
<string name="reason_unknown" msgid="6048913880184628119">"ukendt"</string>
- <string name="reason_service_unavailable" msgid="7824008732243903268">"Udskriftstjenesten er ikke aktiveret"</string>
+ <string name="reason_service_unavailable" msgid="7824008732243903268">"Udskrivningstjenesten er ikke aktiveret"</string>
<string name="print_service_installed_title" msgid="2246317169444081628">"Tjenesten <xliff:g id="NAME">%s</xliff:g> er installeret"</string>
<string name="print_service_installed_message" msgid="5897362931070459152">"Tryk for at aktivere"</string>
<string name="restr_pin_enter_admin_pin" msgid="8641662909467236832">"Indtast administratorpinkoden"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Skift til teksttilstand for at angive klokkeslæt."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Skift til urtilstand for at angive klokkeslæt."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Valgmuligheder for AutoFyld"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Gem til AutoFyld"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Indhold kan ikke udfyldes automatisk"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Skal indholdet gemmes i <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Skal <xliff:g id="TYPE">%1$s</xliff:g> gemmes i <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Vil du gemme <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> til <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Vil du gemme <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> til <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Vil du gemme i <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Vil du gemme <xliff:g id="TYPE">%1$s</xliff:g> i <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Vil du gemme <xliff:g id="TYPE_0">%1$s</xliff:g> og <xliff:g id="TYPE_1">%2$s</xliff:g> i <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Vil du gemme <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> og <xliff:g id="TYPE_2">%3$s</xliff:g> i <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Gem"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Nej tak"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"adgangskode"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index e283c3d..347ebca 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -82,7 +82,7 @@
<string name="ThreeWCMmi" msgid="9051047170321190368">"Dreierkonferenz"</string>
<string name="RuacMmi" msgid="7827887459138308886">"Ablehnung unerwünschter Anrufe"</string>
<string name="CndMmi" msgid="3116446237081575808">"Rufnummernübermittlung"</string>
- <string name="DndMmi" msgid="1265478932418334331">"Bitte nicht stören"</string>
+ <string name="DndMmi" msgid="1265478932418334331">"Nicht stören"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Anrufer-ID ist standardmäßig beschränkt. Nächster Anruf: Beschränkt"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Anrufer-ID ist standardmäßig beschränkt. Nächster Anruf: Nicht beschränkt"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Anrufer-ID ist standardmäßig nicht beschränkt. Nächster Anruf: Beschränkt"</string>
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Dein Anbieter hat Anrufe und Notrufe an diesem Standort vorübergehend ausgesetzt"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Netzwerk nicht erreichbar"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Der Empfang lässt sich möglicherweise verbessern, indem du unter \"System\" > \"Netzwerk\" & \"Internet\" > \"Mobilfunknetze\" > \"Bevorzugter Netzwerktyp\" einen anderen Typ auswählst."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Warnmeldungen"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Anrufweiterleitung"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Notfallrückrufmodus"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Warnmeldungen für mobile Daten"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mailboxnachrichten"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Anrufe über WLAN"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer hat TTY-Modus \"Vollständig\" angefordert."</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer hat TTY-Modus \"HCO\" angefordert."</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer hat TTY-Modus \"VC\" angefordert."</string>
@@ -265,7 +272,7 @@
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakte"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"auf deine Kontakte zugreifen"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Standort"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"auf den Standort deines Geräts zuzugreifen"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"auf den Standort deines Geräts zugreifen"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"auf deinen Kalender zugreifen"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Die Inhalte eines Fensters, mit dem du interagierst, werden abgerufen."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\"Tippen & Entdecken\" aktivieren"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Berührte Elemente werden laut vorgelesen und der Bildschirm kann über Gesten erkundet werden."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Verbesserte Web-Bedienung aktivieren"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skripts können installiert werden, um den Zugriff auf App-Inhalte zu erleichtern."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Text bei der Eingabe beobachten"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Einschließlich personenbezogener Daten wie Kreditkartennummern und Passwörter."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Displayvergrößerung festlegen"</string>
@@ -441,7 +446,7 @@
<string name="permlab_accessWifiState" msgid="5202012949247040011">"WLAN-Verbindungen abrufen"</string>
<string name="permdesc_accessWifiState" msgid="5002798077387803726">"Ermöglicht der App, Informationen zu WLANs abzurufen, etwa ob ein WLAN aktiviert ist, und den Namen verbundener WLAN-Geräte."</string>
<string name="permlab_changeWifiState" msgid="6550641188749128035">"WLAN-Verbindungen herstellen und trennen"</string>
- <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Ermöglicht der App, eine Verbindung zu WLAN-Zugriffspunkten herzustellen und solche zu trennen und Änderungen an der Gerätekonfiguration für WLAN-Netzwerke vorzunehmen."</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Ermöglicht der App, eine Verbindung zu WLAN-Zugangspunkten herzustellen und solche zu trennen und Änderungen an der Gerätekonfiguration für WLAN-Netzwerke vorzunehmen."</string>
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"WLAN-Multicast-Empfang zulassen"</string>
<string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Ermöglicht der App, Pakete zu empfangen, die mithilfe von Multicast-Adressen an sämtliche Geräte in einem WLAN versendet wurden, nicht nur an dein Tablet. Dies nicht mehr Leistung in Anspruch als der Nicht-Multicast-Modus."</string>
<string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"Ermöglicht der App, Pakete zu empfangen, die mithilfe von Multicast-Adressen an sämtliche Geräte in einem WLAN gesendet wurden, nicht nur an deinen Fernseher. Dies nimmt mehr Leistung in Anspruch als der Nicht-Multicast-Modus."</string>
@@ -1402,7 +1407,7 @@
<string name="default_audio_route_category_name" msgid="3722811174003886946">"System"</string>
<string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Bluetooth-Audio"</string>
<string name="wireless_display_route_description" msgid="9070346425023979651">"Kabellose Übertragung (WiDi)"</string>
- <string name="media_route_button_content_description" msgid="591703006349356016">"Übertragen"</string>
+ <string name="media_route_button_content_description" msgid="591703006349356016">"Streamen"</string>
<string name="media_route_chooser_title" msgid="1751618554539087622">"Mit Gerät verbinden"</string>
<string name="media_route_chooser_title_for_remote_display" msgid="3395541745872017583">"Bildschirm auf Gerät übertragen"</string>
<string name="media_route_chooser_searching" msgid="4776236202610828706">"Geräte werden gesucht…"</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Von deinem Administrator installiert"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Von deinem Administrator aktualisiert"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Von deinem 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 deinem Gerät synchronisiert werden, werden möglicherweise erst nach dem Öffnen aktualisiert.\n\nDer Energiesparmodus wird automatisch deaktiviert, wenn dein Gerät aufgeladen wird."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Der Energiesparmodus schont den Akku, indem er die Leistung des Geräts reduziert und die Vibrationsfunktion, Standortdienste sowie die meisten Hintergrunddatenaktivitäten einschränkt. E-Mail, SMS/MMS und andere Apps, die auf deinem Gerät synchronisiert werden, werden möglicherweise erst nach dem Öffnen aktualisiert.\n\nDer Energiesparmodus wird automatisch deaktiviert, wenn dein Gerät aufgeladen wird."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Mit dem Datensparmodus wird die Datennutzung verringert, indem verhindert wird, dass im Hintergrund Daten von Apps gesendet oder empfangen werden. Datenzugriffe sind mit einer aktiven App zwar möglich, erfolgen aber seltener. Als Folge davon könnten Bilder beispielsweise erst dann sichtbar werden, wenn sie angetippt werden."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Datensparmodus aktivieren?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktivieren"</string>
@@ -1641,7 +1646,7 @@
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"Bis <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"Bis <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (nächste Weckzeit)"</string>
- <string name="zen_mode_forever" msgid="1916263162129197274">"Bis zur Deaktivierung von \"Bitte nicht stören\""</string>
+ <string name="zen_mode_forever" msgid="1916263162129197274">"Bis zur Deaktivierung von \"Nicht stören\""</string>
<string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Bis zur Deaktivierung von \"Nicht stören\""</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Minimieren"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"In den Texteingabemodus wechseln, um die Uhrzeit einzugeben."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"In den Uhrzeitmodus wechseln, um die Uhrzeit einzugeben."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"AutoFill-Optionen"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Für AutoFill speichern"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Inhalte können nicht automatisch ausgefüllt werden"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"In <xliff:g id="LABEL">%1$s</xliff:g> speichern?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> in <xliff:g id="LABEL">%2$s</xliff:g> speichern?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"\"<xliff:g id="TYPE_0">%1$s</xliff:g>\" und \"<xliff:g id="TYPE_1">%2$s</xliff:g>\" in \"<xliff:g id="LABEL">%3$s</xliff:g>\" speichern?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"\"<xliff:g id="TYPE_0">%1$s</xliff:g>\", \"<xliff:g id="TYPE_1">%2$s</xliff:g>\" und \"<xliff:g id="TYPE_2">%3$s</xliff:g>\" in \"<xliff:g id="LABEL">%4$s</xliff:g>\" speichern?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"In <b><xliff:g id="LABEL">%1$s</xliff:g></b> speichern?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> in <b><xliff:g id="LABEL">%2$s</xliff:g></b> speichern?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> und <xliff:g id="TYPE_1">%2$s</xliff:g> in <b><xliff:g id="LABEL">%3$s</xliff:g></b> speichern?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> und <xliff:g id="TYPE_2">%3$s</xliff:g> in <b><xliff:g id="LABEL">%4$s</xliff:g></b> speichern?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Speichern"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Nein danke"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"Passwort"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 99fa2e5..4d93e5f 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Οι φωνητικές κλήσεις και οι κλήσεις έκτακτης ανάγκης έχουν τεθεί προσωρινά σε αναστολή από την εταιρεία κινητής τηλεφωνίας σας σε αυτήν την περιοχή"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Δεν είναι δυνατή η σύνδεση στο δίκτυο"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Για να βελτιώσετε τη λήψη, δοκιμάστε να αλλάξετε τον επιλεγμένο τύπο από το Σύστημα > Δίκτυο και διαδίκτυο > Δίκτυα κινητής τηλεφωνίας > Προτιμώμενος τύπος δικτύου."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Ειδοποιήσεις"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Προώθηση κλήσης"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Λειτουργία επιστροφής κλήσης έκτακτης ανάγκης"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Ειδοποιήσεις δεδομένων κινητής τηλεφωνίας"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Μηνύματα SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Μηνύματα αυτόματου τηλεφωνητή"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Κλήση Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Αίτημα peer για TTY ΠΛΗΡΗΣ Λειτουργία"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Αίτημα peer για TTY Λειτουργία HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Αίτημα peer για TTY Λειτουργία VCO"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Έλεγχος του περιεχομένου ενός παραθύρου με το οποίο αλληλεπιδράτε."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ενεργοποίηση της \"Εξερεύνησης με άγγιγμα\""</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Τα στοιχεία που πατάτε θα εκφωνούνται και η εξερεύνηση της οθόνης μπορεί να γίνει με κινήσεις."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Ενεργοποίηση της βελτιωμένης προσβασιμότητας ιστού"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Ενδέχεται να εγκατασταθούν σενάρια για τη βελτίωση της πρόσβασης στο περιεχόμενο της εφαρμογής."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Παρακολούθηση του κειμένου που πληκτρολογείτε"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Περιλαμβάνει προσωπικά δεδομένα, όπως είναι οι αριθμοί πιστωτικών καρτών και οι κωδικοί πρόσβασης."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Ελέγξτε τη μεγέθυνση της οθόνης"</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Εγκαταστάθηκε από τον διαχειριστή σας"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ενημερώθηκε από τον διαχειριστή σας"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Διαγράφηκε από τον διαχειριστή σας"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"Προκειμένου να βελτιώσει τη διάρκεια ζωής της μπαταρίας σας, η Εξοικονόμηση μπαταρίας μειώνει την απόδοση της συσκευής σας και περιορίζει λειτουργίες όπως η δόνηση, οι υπηρεσίες τοποθεσίας και τα περισσότερα δεδομένα παρασκηνίου. Το ηλεκτρονικό ταχυδρομείο, η ανταλλαγή μηνυμάτων και άλλες εφαρμογές που βασίζονται στο συγχρονισμό ενδέχεται να μην ενημερώνονται έως ότου τις ανοίξετε.\n\nΗ Εξοικονόμηση μπαταρίας απενεργοποιείται αυτόματα όταν η συσκευή σας φορτίζει."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Προκειμένου να βελτιώσει τη διάρκεια ζωής της μπαταρίας σας, η Εξοικονόμηση μπαταρίας μειώνει την απόδοση της συσκευής σας και περιορίζει λειτουργίες όπως η δόνηση, οι υπηρεσίες τοποθεσίας και τα περισσότερα δεδομένα παρασκηνίου. Το ηλεκτρονικό ταχυδρομείο, η ανταλλαγή μηνυμάτων και άλλες εφαρμογές που βασίζονται στο συγχρονισμό ενδέχεται να μην ενημερώνονται μέχρι να τις ανοίξετε.\n\nΗ Εξοικονόμηση μπαταρίας απενεργοποιείται αυτόματα όταν η συσκευή σας φορτίζει."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Προκειμένου να μειωθεί η χρήση δεδομένων, η Εξοικονόμηση δεδομένων αποτρέπει την αποστολή ή λήψη δεδομένων από ορισμένες εφαρμογές στο παρασκήνιο. Μια εφαρμογή που χρησιμοποιείτε αυτήν τη στιγμή μπορεί να χρησιμοποιήσει δεδομένα αλλά με μικρότερη συχνότητα. Για παράδειγμα, οι εικόνες μπορεί να μην εμφανίζονται μέχρι να τις πατήσετε."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ενεργ.Εξοικονόμησης δεδομένων;"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ενεργοποίηση"</string>
@@ -1641,8 +1646,8 @@
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"Έως τις <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"Μέχρι τις <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (επόμενο ξυπνητήρι)"</string>
- <string name="zen_mode_forever" msgid="1916263162129197274">"Μέχρι να απενεργοποιήσετε τη ρύθμιση \"Μην ενοχλείτε\""</string>
- <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Μέχρι να απενεργοποιήσετε τη ρύθμιση \"Μην ενοχλείτε\""</string>
+ <string name="zen_mode_forever" msgid="1916263162129197274">"Μέχρι να απενεργοποιήσετε \"Μην ενοχλείτε\""</string>
+ <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Μέχρι να απενεργοποιήσετε \"Μην ενοχλείτε\""</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Σύμπτυξη"</string>
<string name="zen_mode_feature_name" msgid="5254089399895895004">"Μην ενοχλείτε"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Κάντε εναλλαγή στη λειτουργία εισαγωγής κειμένου, για την εισαγωγή της ώρας."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Κάντε εναλλαγή στη λειτουργία ρολογιού, για την εισαγωγή της ώρας."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Επιλογές αυτόματης συμπλήρωσης"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Αποθήκευση για Αυτόματη Συμπλήρωση"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Δεν είναι δυνατή η αυτόματη συμπλήρωση των περιεχομένων"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Αποθήκευση σε <xliff:g id="LABEL">%1$s</xliff:g>;"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Αποθήκευση <xliff:g id="TYPE">%1$s</xliff:g> σε <xliff:g id="LABEL">%2$s</xliff:g>;"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Αποθήκευση <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> σε <xliff:g id="LABEL">%3$s</xliff:g>;"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Αποθήκευση <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> σε <xliff:g id="LABEL">%4$s</xliff:g>;"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Αποθήκευση σε <b><xliff:g id="LABEL">%1$s</xliff:g></b>;"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Αποθήκευση <xliff:g id="TYPE">%1$s</xliff:g> σε <b><xliff:g id="LABEL">%2$s</xliff:g></b>;"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Αποθήκευση <xliff:g id="TYPE_0">%1$s</xliff:g> και <xliff:g id="TYPE_1">%2$s</xliff:g> σε <b><xliff:g id="LABEL">%3$s</xliff:g></b>;"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Αποθήκευση <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> και <xliff:g id="TYPE_2">%3$s</xliff:g> σε <b><xliff:g id="LABEL">%4$s</xliff:g></b>;"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Αποθήκευση"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Όχι, ευχαριστώ"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"κωδικός πρόσβασης"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 0a6a7d5..aa08377 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Your operator has temporarily suspended voice and emergency calls at this location"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t find network"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"To improve reception, try changing the type selected at System > Network & Internet > Mobile networks > Preferred network type."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerts"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Call forwarding"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Mobile data alerts"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS messages"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi Calling"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string>
@@ -259,7 +266,7 @@
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Retail demo"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB connection"</string>
<string name="safeMode" msgid="2788228061547930246">"Safe mode"</string>
- <string name="android_system_label" msgid="6577375335728551336">"Android System"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"Android system"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Switch to Personal"</string>
<string name="managed_profile_label" msgid="5289992269827577857">"Switch to Work"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
@@ -278,14 +285,12 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"take pictures and record video"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telephone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"make and manage phone calls"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Body Sensors"</string>
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"Body sensors"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"access sensor data about your vital signs"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Tapped items will be spoken aloud and the screen can be explored using gestures."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Turn on enhanced web accessibility"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Scripts may be installed to make app content more accessible."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observe text that you type"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Includes personal data such as credit card numbers and passwords."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Control display magnification"</string>
@@ -580,8 +585,8 @@
<item msgid="8901098336658710359">"Home"</item>
<item msgid="869923650527136615">"Mobile"</item>
<item msgid="7897544654242874543">"Work"</item>
- <item msgid="1103601433382158155">"Work Fax"</item>
- <item msgid="1735177144948329370">"Home Fax"</item>
+ <item msgid="1103601433382158155">"Work fax"</item>
+ <item msgid="1735177144948329370">"Home fax"</item>
<item msgid="603878674477207394">"Pager"</item>
<item msgid="1650824275177931637">"Other"</item>
<item msgid="9192514806975898961">"Custom"</item>
@@ -624,7 +629,7 @@
<string name="phoneTypeMobile" msgid="6501463557754751037">"Mobile"</string>
<string name="phoneTypeWork" msgid="8863939667059911633">"Work"</string>
<string name="phoneTypeFaxWork" msgid="3517792160008890912">"Work Fax"</string>
- <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Home Fax"</string>
+ <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Home fax"</string>
<string name="phoneTypePager" msgid="7582359955394921732">"Pager"</string>
<string name="phoneTypeOther" msgid="1544425847868765990">"Other"</string>
<string name="phoneTypeCallback" msgid="2712175203065678206">"Callback"</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installed by your admin"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Deleted by your admin"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"To help improve battery life, battery saver reduces your device’s performance and limits vibration, location services and most background data. Email, messaging, and other apps that rely on syncing may not update unless you open them.\n\nBattery saver turns off automatically when your device is charging."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"To help improve battery life, battery saver reduces your device’s performance and limits vibration, location services and most background data. Email, messaging and other apps that rely on syncing may not update unless you open them.\n\nBattery saver turns off automatically when your device is charging."</string>
<string name="data_saver_description" msgid="6015391409098303235">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Turn on"</string>
@@ -1641,8 +1646,8 @@
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (next alarm)"</string>
- <string name="zen_mode_forever" msgid="1916263162129197274">"Until you turn off Do Not Disturb"</string>
- <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Until you turn off Do Not Disturb"</string>
+ <string name="zen_mode_forever" msgid="1916263162129197274">"Until you turn off Do not disturb"</string>
+ <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Until you turn off Do not disturb"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Collapse"</string>
<string name="zen_mode_feature_name" msgid="5254089399895895004">"Do not disturb"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Switch to text input mode for the time input."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Switch to clock mode for the time input."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Auto-fill options"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Save for AutoFill"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Contents can’t be auto-filled"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Save to <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Save <xliff:g id="TYPE">%1$s</xliff:g> to <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Save <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> to <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Save <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> to <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Save to <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Save <xliff:g id="TYPE">%1$s</xliff:g> to <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Save <xliff:g id="TYPE_0">%1$s</xliff:g> and <xliff:g id="TYPE_1">%2$s</xliff:g> to <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Save <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, and <xliff:g id="TYPE_2">%3$s</xliff:g> to <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Save"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"No thanks"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"password"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 0a6a7d5..aa08377 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Your operator has temporarily suspended voice and emergency calls at this location"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t find network"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"To improve reception, try changing the type selected at System > Network & Internet > Mobile networks > Preferred network type."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerts"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Call forwarding"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Mobile data alerts"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS messages"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi Calling"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string>
@@ -259,7 +266,7 @@
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Retail demo"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB connection"</string>
<string name="safeMode" msgid="2788228061547930246">"Safe mode"</string>
- <string name="android_system_label" msgid="6577375335728551336">"Android System"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"Android system"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Switch to Personal"</string>
<string name="managed_profile_label" msgid="5289992269827577857">"Switch to Work"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
@@ -278,14 +285,12 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"take pictures and record video"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telephone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"make and manage phone calls"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Body Sensors"</string>
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"Body sensors"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"access sensor data about your vital signs"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Tapped items will be spoken aloud and the screen can be explored using gestures."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Turn on enhanced web accessibility"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Scripts may be installed to make app content more accessible."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observe text that you type"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Includes personal data such as credit card numbers and passwords."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Control display magnification"</string>
@@ -580,8 +585,8 @@
<item msgid="8901098336658710359">"Home"</item>
<item msgid="869923650527136615">"Mobile"</item>
<item msgid="7897544654242874543">"Work"</item>
- <item msgid="1103601433382158155">"Work Fax"</item>
- <item msgid="1735177144948329370">"Home Fax"</item>
+ <item msgid="1103601433382158155">"Work fax"</item>
+ <item msgid="1735177144948329370">"Home fax"</item>
<item msgid="603878674477207394">"Pager"</item>
<item msgid="1650824275177931637">"Other"</item>
<item msgid="9192514806975898961">"Custom"</item>
@@ -624,7 +629,7 @@
<string name="phoneTypeMobile" msgid="6501463557754751037">"Mobile"</string>
<string name="phoneTypeWork" msgid="8863939667059911633">"Work"</string>
<string name="phoneTypeFaxWork" msgid="3517792160008890912">"Work Fax"</string>
- <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Home Fax"</string>
+ <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Home fax"</string>
<string name="phoneTypePager" msgid="7582359955394921732">"Pager"</string>
<string name="phoneTypeOther" msgid="1544425847868765990">"Other"</string>
<string name="phoneTypeCallback" msgid="2712175203065678206">"Callback"</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installed by your admin"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Deleted by your admin"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"To help improve battery life, battery saver reduces your device’s performance and limits vibration, location services and most background data. Email, messaging, and other apps that rely on syncing may not update unless you open them.\n\nBattery saver turns off automatically when your device is charging."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"To help improve battery life, battery saver reduces your device’s performance and limits vibration, location services and most background data. Email, messaging and other apps that rely on syncing may not update unless you open them.\n\nBattery saver turns off automatically when your device is charging."</string>
<string name="data_saver_description" msgid="6015391409098303235">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Turn on"</string>
@@ -1641,8 +1646,8 @@
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (next alarm)"</string>
- <string name="zen_mode_forever" msgid="1916263162129197274">"Until you turn off Do Not Disturb"</string>
- <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Until you turn off Do Not Disturb"</string>
+ <string name="zen_mode_forever" msgid="1916263162129197274">"Until you turn off Do not disturb"</string>
+ <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Until you turn off Do not disturb"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Collapse"</string>
<string name="zen_mode_feature_name" msgid="5254089399895895004">"Do not disturb"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Switch to text input mode for the time input."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Switch to clock mode for the time input."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Auto-fill options"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Save for AutoFill"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Contents can’t be auto-filled"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Save to <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Save <xliff:g id="TYPE">%1$s</xliff:g> to <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Save <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> to <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Save <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> to <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Save to <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Save <xliff:g id="TYPE">%1$s</xliff:g> to <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Save <xliff:g id="TYPE_0">%1$s</xliff:g> and <xliff:g id="TYPE_1">%2$s</xliff:g> to <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Save <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, and <xliff:g id="TYPE_2">%3$s</xliff:g> to <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Save"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"No thanks"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"password"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 0a6a7d5..aa08377 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Your operator has temporarily suspended voice and emergency calls at this location"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t find network"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"To improve reception, try changing the type selected at System > Network & Internet > Mobile networks > Preferred network type."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerts"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Call forwarding"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Mobile data alerts"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS messages"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi Calling"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string>
@@ -259,7 +266,7 @@
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Retail demo"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB connection"</string>
<string name="safeMode" msgid="2788228061547930246">"Safe mode"</string>
- <string name="android_system_label" msgid="6577375335728551336">"Android System"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"Android system"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Switch to Personal"</string>
<string name="managed_profile_label" msgid="5289992269827577857">"Switch to Work"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
@@ -278,14 +285,12 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"take pictures and record video"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telephone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"make and manage phone calls"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Body Sensors"</string>
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"Body sensors"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"access sensor data about your vital signs"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Tapped items will be spoken aloud and the screen can be explored using gestures."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Turn on enhanced web accessibility"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Scripts may be installed to make app content more accessible."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observe text that you type"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Includes personal data such as credit card numbers and passwords."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Control display magnification"</string>
@@ -580,8 +585,8 @@
<item msgid="8901098336658710359">"Home"</item>
<item msgid="869923650527136615">"Mobile"</item>
<item msgid="7897544654242874543">"Work"</item>
- <item msgid="1103601433382158155">"Work Fax"</item>
- <item msgid="1735177144948329370">"Home Fax"</item>
+ <item msgid="1103601433382158155">"Work fax"</item>
+ <item msgid="1735177144948329370">"Home fax"</item>
<item msgid="603878674477207394">"Pager"</item>
<item msgid="1650824275177931637">"Other"</item>
<item msgid="9192514806975898961">"Custom"</item>
@@ -624,7 +629,7 @@
<string name="phoneTypeMobile" msgid="6501463557754751037">"Mobile"</string>
<string name="phoneTypeWork" msgid="8863939667059911633">"Work"</string>
<string name="phoneTypeFaxWork" msgid="3517792160008890912">"Work Fax"</string>
- <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Home Fax"</string>
+ <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Home fax"</string>
<string name="phoneTypePager" msgid="7582359955394921732">"Pager"</string>
<string name="phoneTypeOther" msgid="1544425847868765990">"Other"</string>
<string name="phoneTypeCallback" msgid="2712175203065678206">"Callback"</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installed by your admin"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Deleted by your admin"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"To help improve battery life, battery saver reduces your device’s performance and limits vibration, location services and most background data. Email, messaging, and other apps that rely on syncing may not update unless you open them.\n\nBattery saver turns off automatically when your device is charging."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"To help improve battery life, battery saver reduces your device’s performance and limits vibration, location services and most background data. Email, messaging and other apps that rely on syncing may not update unless you open them.\n\nBattery saver turns off automatically when your device is charging."</string>
<string name="data_saver_description" msgid="6015391409098303235">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Turn on"</string>
@@ -1641,8 +1646,8 @@
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (next alarm)"</string>
- <string name="zen_mode_forever" msgid="1916263162129197274">"Until you turn off Do Not Disturb"</string>
- <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Until you turn off Do Not Disturb"</string>
+ <string name="zen_mode_forever" msgid="1916263162129197274">"Until you turn off Do not disturb"</string>
+ <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Until you turn off Do not disturb"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Collapse"</string>
<string name="zen_mode_feature_name" msgid="5254089399895895004">"Do not disturb"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Switch to text input mode for the time input."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Switch to clock mode for the time input."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Auto-fill options"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Save for AutoFill"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Contents can’t be auto-filled"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Save to <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Save <xliff:g id="TYPE">%1$s</xliff:g> to <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Save <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> to <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Save <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> to <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Save to <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Save <xliff:g id="TYPE">%1$s</xliff:g> to <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Save <xliff:g id="TYPE_0">%1$s</xliff:g> and <xliff:g id="TYPE_1">%2$s</xliff:g> to <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Save <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, and <xliff:g id="TYPE_2">%3$s</xliff:g> to <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Save"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"No thanks"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"password"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index df55b6c..29a0adc 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Tu proveedor suspendió temporalmente las llamadas de emergencia y de voz en esta ubicación"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"No se puede establecer conexión con la red"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para mejorar la recepción, cambia el tipo de red. Selecciona Sistema > Internet y red > Redes móviles > Tipo de red preferido."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de llamada"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de devolución de llamada de emergencia"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Alertas de datos móviles"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Mensajes SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensajes del buzón de voz"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Llamada con Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"El dispositivo del mismo nivel solicitó el modo TTY FULL."</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"El dispositivo del mismo nivel solicitó el modo TTY HCO."</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"El dispositivo del mismo nivel solicitó el modo TTY VCO."</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contenido de la ventana con la que estés interactuando."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar la Exploración táctil"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Los elementos que presiones se dirán en voz alta y podrás explorar la pantalla mediante gestos."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Activar la accesibilidad web mejorada"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Es posible que se instalen secuencias de comandos para que el contenido de las aplicaciones sea más accesible."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observar el texto que escribes"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Incluye datos personales, como números de tarjeta de crédito y contraseñas."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Controlar la ampliación de pantalla"</string>
@@ -1099,7 +1104,7 @@
<string name="network_switch_metered_detail" msgid="5325661434777870353">"El dispositivo usa <xliff:g id="NEW_NETWORK">%1$s</xliff:g> cuando <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> no tiene acceso a Internet. Es posible que se apliquen cargos."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Se cambió de <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> a <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
<string-array name="network_switch_type_name">
- <item msgid="3979506840912951943">"datos móviles"</item>
+ <item msgid="3979506840912951943">"Datos móviles"</item>
<item msgid="75483255295529161">"Wi-Fi"</item>
<item msgid="6862614801537202646">"Bluetooth"</item>
<item msgid="5447331121797802871">"Ethernet"</item>
@@ -1426,7 +1431,7 @@
<string name="kg_pattern_instructions" msgid="398978611683075868">"Dibuja tu patrón."</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Ingresa el PIN de la tarjeta SIM."</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"Ingresa el PIN."</string>
- <string name="kg_password_instructions" msgid="5753646556186936819">"Ingresa tu contraseña."</string>
+ <string name="kg_password_instructions" msgid="5753646556186936819">"Escribe la contraseña."</string>
<string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"La tarjeta SIM está inhabilitada. Para continuar, ingresa el código PUK. Si quieres obtener más información, ponte en contacto con el proveedor."</string>
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Ingresa el código PIN deseado"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Confirmar código PIN deseado"</string>
@@ -1641,7 +1646,7 @@
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"Hasta la(s) <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"Hasta la hora <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (próxima alarma)"</string>
- <string name="zen_mode_forever" msgid="1916263162129197274">"Hasta que desactives No interrumpir"</string>
+ <string name="zen_mode_forever" msgid="1916263162129197274">"Hasta que desactives No molestar"</string>
<string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Hasta que desactives No molestar"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Contraer"</string>
@@ -1701,7 +1706,7 @@
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Presiona para ver archivos"</string>
<string name="pin_target" msgid="3052256031352291362">"Fijar"</string>
<string name="unpin_target" msgid="3556545602439143442">"No fijar"</string>
- <string name="app_info" msgid="6856026610594615344">"Información de la app"</string>
+ <string name="app_info" msgid="6856026610594615344">"Información de apps"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="reset_retail_demo_mode_title" msgid="2370249087943803584">"¿Deseas restablecer el dispositivo?"</string>
<string name="reset_retail_demo_mode_text" msgid="5481925817590883246">"Presiona para restablecer el dispositivo"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Cambia al modo de entrada de texto para ingresar la hora."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Cambia al modo de reloj para ingresar la hora."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Opciones de autocompletar"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Guardar para Autocompletar"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"El contenido no puede autocompletarse"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"¿Quieres guardar el contenido en <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"¿Quieres guardar el contenido de <xliff:g id="TYPE">%1$s</xliff:g> en <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"¿Guardar <xliff:g id="TYPE_0">%1$s</xliff:g> y <xliff:g id="TYPE_1">%2$s</xliff:g> en <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"¿Guardar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> y <xliff:g id="TYPE_2">%3$s</xliff:g> en <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"¿Quieres guardar el contenido en <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"¿Quieres guardar tu <xliff:g id="TYPE">%1$s</xliff:g> en <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"¿Quieres guardar tu <xliff:g id="TYPE_0">%1$s</xliff:g> y <xliff:g id="TYPE_1">%2$s</xliff:g> en <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"¿Quieres guardar tu <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> y <xliff:g id="TYPE_2">%3$s</xliff:g> en <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Guardar"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"No, gracias"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"contraseña"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 08bff7d..02c91db 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -98,7 +98,14 @@
<string name="RestrictedOnNormalContent" msgid="1579434198284512182">"Tu operador ha suspendido temporalmente las llamadas de voz en esta ubicación"</string>
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Tu operador ha suspendido temporalmente las llamadas de emergencia y de voz en esta ubicación"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"No se puede establecer conexión con la red"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para mejorar la recepción, prueba a cambiar el tipo de red seleccionado en Sistema > Red e Internet > Redes móviles > Tipo de red preferida."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para mejorar la recepción, prueba a cambiar el tipo de red seleccionado en Sistema > Red e Internet > Redes móviles > Tipo de red preferido."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de llamada"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de devolución de llamada de emergencia"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Alertas de datos móviles"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Mensajes SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensajes de voz"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Llamada por Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Un dispositivo ha solicitado el modo TTY FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Un dispositivo ha solicitado el modo TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Un dispositivo ha solicitado el modo TTY VCO"</string>
@@ -136,7 +143,7 @@
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Llamada Wi-Fi de %s"</item>
</string-array>
- <string name="wifi_calling_off_summary" msgid="8720659586041656098">"No"</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="1988279625335345908">"Preferencia a datos móviles"</string>
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Solo conexión Wi-Fi"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contenido de una ventana con la que estés interactuando."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar la exploración táctil"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Los elementos que tocas se dicen en voz alta y se puede explorar la pantalla mediante gestos."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Activar la accesibilidad web mejorada"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Es posible que se instalen secuencias de comandos para que el contenido de las aplicaciones sea más accesible."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observar el texto que escribes"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Incluye datos personales como números de tarjetas de crédito y contraseñas."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Controla la ampliación de la pantalla"</string>
@@ -987,8 +992,8 @@
<string name="no" msgid="5141531044935541497">"Cancelar"</string>
<string name="dialog_alert_title" msgid="2049658708609043103">"Atención"</string>
<string name="loading" msgid="7933681260296021180">"Cargando..."</string>
- <string name="capital_on" msgid="1544682755514494298">"SÍ"</string>
- <string name="capital_off" msgid="6815870386972805832">"NO"</string>
+ <string name="capital_on" msgid="1544682755514494298">"ACTIVADO"</string>
+ <string name="capital_off" msgid="6815870386972805832">"DESACTIVADO"</string>
<string name="whichApplication" msgid="4533185947064773386">"Completar acción utilizando"</string>
<string name="whichApplicationNamed" msgid="8260158865936942783">"Completar acción con %1$s"</string>
<string name="whichApplicationLabel" msgid="7425855495383818784">"Completar acción"</string>
@@ -1069,7 +1074,7 @@
<string name="dump_heap_text" msgid="4809417337240334941">"El proceso <xliff:g id="PROC">%1$s</xliff:g> ha superado su límite de memoria de <xliff:g id="SIZE">%2$s</xliff:g>. Hay un volcado de pila disponible que puedes compartir con su desarrollador (ten cuidado, ya que puede incluir información personal a la que tenga acceso la aplicación)."</string>
<string name="sendText" msgid="5209874571959469142">"Selecciona una acción para el texto"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volumen del timbre"</string>
- <string name="volume_music" msgid="5421651157138628171">"Volumen multimedia"</string>
+ <string name="volume_music" msgid="5421651157138628171">"Volumen de multimedia"</string>
<string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Reproduciendo a través de Bluetooth"</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Tono de silencio establecido"</string>
<string name="volume_call" msgid="3941680041282788711">"Volumen de la llamada"</string>
@@ -1080,7 +1085,7 @@
<string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Volumen de Bluetooth"</string>
<string name="volume_icon_description_ringer" msgid="3326003847006162496">"Volumen del tono"</string>
<string name="volume_icon_description_incall" msgid="8890073218154543397">"Volumen de llamada"</string>
- <string name="volume_icon_description_media" msgid="4217311719665194215">"Volumen multimedia"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"Volumen de multimedia"</string>
<string name="volume_icon_description_notification" msgid="7044986546477282274">"Volumen de notificaciones"</string>
<string name="ringtone_default" msgid="3789758980357696936">"Tono por defecto"</string>
<string name="ringtone_default_with_actual" msgid="1767304850491060581">"Predeterminado (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
@@ -1467,7 +1472,7 @@
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"El acceso directo a accesibilidad ha desactivado <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Selecciona la función que se utilizará cuando toques el botón Accesibilidad:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para cambiar las funciones, mantén pulsado el botón Accesibilidad."</string>
- <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliación"</string>
+ <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliar"</string>
<string name="user_switched" msgid="3768006783166984410">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="user_switching_message" msgid="2871009331809089783">"Cambiando a <xliff:g id="NAME">%1$s</xliff:g>…"</string>
<string name="user_logging_out_message" msgid="8939524935808875155">"Cerrando la sesión de <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado por el administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Actualizado por el administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Eliminado por el 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>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Para mejorar la duración de la batería, la función de ahorro de baterí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 batería se desactiva automáticamente cuando el dispositivo se está cargando."</string>
<string name="data_saver_description" msgid="6015391409098303235">"El ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano, lo que permite reducir el uso de datos. Una aplicación activa podrá acceder a los datos, aunque con menos frecuencia. Esto significa que, por ejemplo, algunas imágenes no se muestren hasta que no las toques."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"¿Activar ahorro de datos?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activar"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Cambia al modo de introducción de texto para escribir la hora."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Cambia al modo de reloj para escribir la hora."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Opciones de Autocompletar"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Guardar en la función Autocompletar"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"El contenido no se puede autocompletar"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"¿Guardar en <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"¿Guardar <xliff:g id="TYPE">%1$s</xliff:g> en <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"¿Guardar <xliff:g id="TYPE_0">%1$s</xliff:g> y <xliff:g id="TYPE_1">%2$s</xliff:g> en <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"¿Guardar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> y <xliff:g id="TYPE_2">%3$s</xliff:g> en <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"¿Guardar en <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"¿Guardar <xliff:g id="TYPE">%1$s</xliff:g> en <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"¿Guardar <xliff:g id="TYPE_0">%1$s</xliff:g> y <xliff:g id="TYPE_1">%2$s</xliff:g> en <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"¿Guardar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> y <xliff:g id="TYPE_2">%3$s</xliff:g> en <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Guardar"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"No, gracias"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"contraseña"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 4bd9ef8..cb63659 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Teie operaator on hääl- ja hädaabikõned selles asukohas ajutiselt peatanud"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Võrguga ei saa ühendust"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Vastuvõtu parandamiseks muutke valitud tüüpi jaotises Süsteem > Võrk ja Internet > Mobiilsidevõrgud > Eelistatud võrgutüüp."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Teatised"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Kõnede suunamine"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Hädaolukorra tagasihelistusrežiim"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Mobiilse andmeside teatised"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS-sõnumid"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Kõnepostisõnumid"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"WiFi-kõned"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Partner taotles TTY-režiimi TÄIELIK"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Partner taotles TTY-režiimi HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Partner taotles TTY-režiimi VCO"</string>
@@ -281,15 +288,13 @@
<string name="permgrouplab_sensors" msgid="416037179223226722">"Kehaandurid"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"juurdepääs anduri andmetele teie eluliste näitajate kohta"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Akna sisu toomine"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Tutvuge kasutatava akna sisuga."</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kasutatava akna sisu kontrollimine."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Puudutusega sirvimise sisselülitamine"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Puudutatud üksuste nimed esitatakse häälega ja ekraani saab sirvida puudutustega."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Veebi täiustatud juurdepääsu sisselülitamine"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Rakenduse sisu kättesaadavamaks muutmiseks võidakse installida skripte."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Sisestatud teksti jälgimine"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Sisaldab isiklikke andmeid, nt krediitkaardi numbreid ja paroole."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Ekraani suurenduse juhtimine"</string>
- <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Saate juhtida ekraani suumitaset ja asendit."</string>
+ <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Ekraani suumitaseme ja asendi juhtimine."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Liigutuste tegemine"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Saate puudutada, pühkida, sõrmi kokku-lahku liigutada ja teisi liigutusi teha."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Sõrmejälje liigutused"</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Administraator on selle installinud"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Administraator on seda värskendanud"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Administraator on selle kustutanud"</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>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Aku kestuse parandamiseks vähendab akusäästja teie seadme toimivust ning piirab vibreerimist, 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>
<string name="data_saver_description" msgid="6015391409098303235">"Andmekasutuse vähendamiseks keelab andmeside mahu säästja mõne rakenduse puhul andmete taustal saatmise ja vastuvõtmise. Rakendus, mida praegu kasutate, pääseb andmesidele juurde, kuid võib seda teha väiksema sagedusega. Seetõttu võidakse näiteks kujutised kuvada alles siis, kui neid puudutate."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Lül. andmemahu säästja sisse?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Lülita sisse"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Aktiveerige kellaaja sisestamiseks tekstisisestusrežiim."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Aktiveerige kellaaja sisestamiseks kellarežiim."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Automaatse täitmise valikud"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Automaattäitesse salvestamine"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Sisu ei saa automaatselt täita"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Kas salvestada sildiga <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Kas salvestada <xliff:g id="TYPE">%1$s</xliff:g> sildiga <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Kas salvestada <xliff:g id="TYPE_0">%1$s</xliff:g> ja <xliff:g id="TYPE_1">%2$s</xliff:g> teenusesse <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Kas salvestada <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ja <xliff:g id="TYPE_2">%3$s</xliff:g> teenusesse <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Kas salvestada teenusesse <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Kas salvestada üksus <xliff:g id="TYPE">%1$s</xliff:g> teenusesse <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Kas salvestada üksused <xliff:g id="TYPE_0">%1$s</xliff:g> ja <xliff:g id="TYPE_1">%2$s</xliff:g> teenusesse <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Kas salvestada üksused <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ja <xliff:g id="TYPE_2">%3$s</xliff:g> teenusesse <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Salvesta"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Tänan, ei"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"parool"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 5c1b423ca..3c79b78 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Operadoreak aldi baterako eten ditu ahots- eta larrialdi-deiak kokapen honetan"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ezin da konektatu sarera"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Seinalea hobea izan dadin, aldatu hautatutako sare mota Sistema > Sareak eta Internet > Sare mugikorrak > Sare mota hobetsia atalean."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Abisuak"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Dei-desbideratzea"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Larrialdi-deiak soilik jasotzeko modua"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Datu mugikorren abisuak"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS mezuak"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Erantzungailuko mezuak"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi bidezko deiak"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Beste gailuak TTY osagarria FULL moduan erabiltzea eskatu du"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Beste gailuak TTY osagarria HCO moduan erabiltzea eskatu du"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Beste gailuak TTY osagarria VCO moduan erabiltzea eskatu du"</string>
@@ -219,7 +226,7 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Telefonoaren aukerak"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Pantailaren blokeoa"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Itzali"</string>
- <string name="global_action_emergency" msgid="7112311161137421166">"Larrialdiak"</string>
+ <string name="global_action_emergency" msgid="7112311161137421166">"Larrialdi-deiak"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"Akatsen txostena"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Sortu akatsen txostena"</string>
<string name="bugreport_message" msgid="398447048750350456">"Gailuaren uneko egoerari buruzko informazioa bilduko da, mezu elektroniko gisa bidaltzeko. Minutu batzuk igaroko dira akatsen txostena sortzen hasten denetik bidaltzeko prest egon arte. Itxaron, mesedez."</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Arakatu irekita daukazun leihoko edukia."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktibatu ukipen bidez arakatzeko eginbidea"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Sakatutako elementuak ozen esango dira eta pantaila keinu bidez arakatu ahal izango da."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Aktibatu web-erabilerraztasun hobetua"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Scriptak instala daitezke aplikazioaren edukia erabilerrazagoa egiteko."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Behatu idazten duzun testua"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Ez da salbuespenik egiten datu pertsonalekin, hala nola, kreditu-txartelen zenbakiekin eta pasahitzekin."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Kontrolatu pantailaren zoom-maila"</string>
@@ -705,7 +710,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Desblokeatzeko edo larrialdi-deia egiteko, sakatu Menua."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Desblokeatzeko, sakatu Menua."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Desblokeatzeko, marraztu eredua"</string>
- <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Larrialdiak"</string>
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Larrialdi-deiak"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Itzuli deira"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Eredua zuzena da!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Saiatu berriro"</string>
@@ -1604,7 +1609,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Administratzaileak instalatu du"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Administratzaileak eguneratu du"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"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>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Bateriak gehiago iraun dezan, bateria-aurrezleak gailuaren errendimendua murrizten du, eta dardara, kokapen-zerbitzuak eta atzeko planoko datu gehienak mugatzen ditu. Posta elektronikoa, mezuak eta sinkronizatzen diren gainerako zerbitzuak ez dira eguneratuko ireki ezean.\n\nGailua kargatzeko konektatutakoan, bateria-aurrezlea automatikoki desaktibatuko da."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Datu-erabilera murrizteko, atzeko planoan datuak bidaltzea eta jasotzea galarazten die datu-aurrezleak aplikazio batzuei. Unean erabiltzen ari zaren aplikazioak atzi ditzake datuak, baina baliteke maiztasun txikiagoarekin atzitzea. Horrela, adibidez, baliteke irudiak ez erakustea haiek sakatu arte."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Datu-aurrezlea aktibatu?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktibatu"</string>
@@ -1733,11 +1738,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Aldatu testu modura ordua zehazteko."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Aldatu erloju modura ordua zehazteko."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Betetze automatikoaren aukerak"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Gorde betetze automatikoarekin erabiltzeko"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Ezin dira bete automatikoki eremuak"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> zerbitzuan gorde?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="LABEL">%2$s</xliff:g> zerbitzuan gorde nahi duzu <xliff:g id="TYPE">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g> eta <xliff:g id="TYPE_1">%2$s</xliff:g> gorde nahi dituzu <xliff:g id="LABEL">%3$s</xliff:g> behar denean erabiltzeko?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> eta <xliff:g id="TYPE_2">%3$s</xliff:g> gorde nahi dituzu <xliff:g id="LABEL">%4$s</xliff:g> behar denean erabiltzeko?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> zerbitzuan gorde nahi duzu?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> <b><xliff:g id="LABEL">%2$s</xliff:g></b> zerbitzuan gorde nahi duzu?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> eta <xliff:g id="TYPE_1">%2$s</xliff:g> <b><xliff:g id="LABEL">%3$s</xliff:g></b> zerbitzuan gorde nahi dituzu?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> eta <xliff:g id="TYPE_2">%3$s</xliff:g> <b><xliff:g id="LABEL">%4$s</xliff:g></b> zerbitzuan gorde nahi dituzu?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Gorde"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Ez, eskerrik asko"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"pasahitza"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 25bdc11..beef14c 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"شرکت مخابراتی شما موقتاً تماسهای صوتی و اضطراری را در این مکان به حالت تعلیق درآورده است"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"شبکه دردسترس نیست"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"برای بهبود دریافت، نوع شبکهای را که انتخاب کردهاید در «سیستم» > «شبکه و اینترنت» > «شبکههای تلفن همراه» > «نوع شبکه ترجیحی» تغییر دهید."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"هشدارها"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"بازارسال تماس"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"حالت پاسخ تماس اضطراری"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"هشدارهای داده تلفن همراه"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"پیامکها"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"پیامهای پست صوتی"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"تماس ازطریق Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"دستگاه مرتبط درخواست TTY حالت FULL کرد"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"دستگاه مرتبط درخواست TTY حالت HCO کرد"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"دستگاه مرتبط درخواست TTY حالت VCO کرد"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"محتوای پنجرهای را که درحال تعامل با آن هستید بررسی میکند."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"فعالسازی کاوش لمسی"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"موارد ضربه زدهشده با صدای بلند خوانده میشوند و با استفاده از حرکات اشاره میتوانید صفحه را کاوش کنید."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"فعالسازی دسترسپذیری پیشرفته برای وب"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"ممکن است جهت افزایش دسترسپذیری به محتوای برنامه، اسکریپتهایی نصب شود."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"نوشتاری را که تایپ میکنید مشاهده کند"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"اطلاعات شخصی مانند شماره کارت اعتباری و گذرواژهها را لحاظ میکند."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"کنترل درشتنمایی نمایشگر"</string>
@@ -1471,7 +1476,7 @@
<string name="user_switched" msgid="3768006783166984410">"کاربر کنونی <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="2871009331809089783">"در حالت تغییر به <xliff:g id="NAME">%1$s</xliff:g>…"</string>
<string name="user_logging_out_message" msgid="8939524935808875155">"در حال خروج از سیستم <xliff:g id="NAME">%1$s</xliff:g>…"</string>
- <string name="owner_name" msgid="2716755460376028154">"دارنده"</string>
+ <string name="owner_name" msgid="2716755460376028154">"مالک"</string>
<string name="error_message_title" msgid="4510373083082500195">"خطا"</string>
<string name="error_message_change_not_allowed" msgid="1238035947357923497">"سرپرست سیستم شما این تغییر را مجاز نمیداند"</string>
<string name="app_not_found" msgid="3429141853498927379">"برنامهای برای انجام این عملکرد موجود نیست"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"برای وارد کردن زمان، به حالت وارد کردن نوشتار تغییر وضعیت دهید."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"برای وارد کردن زمان، به حالت ساعت تغییر وضعیت دهید."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"گزینههای تکمیل خودکار"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"ذخیره کردن برای تکمیل خودکار"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"تکمیل خودکار محتوا ممکن نیست"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"در <xliff:g id="LABEL">%1$s</xliff:g> ذخیره شود؟"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> در <xliff:g id="LABEL">%2$s</xliff:g> ذخیره شود؟"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>، <xliff:g id="TYPE_1">%2$s</xliff:g> در <xliff:g id="LABEL">%3$s</xliff:g> ذخیره شود؟"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>، <xliff:g id="TYPE_1">%2$s</xliff:g>، <xliff:g id="TYPE_2">%3$s</xliff:g> در <xliff:g id="LABEL">%4$s</xliff:g> ذخیره شود؟"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"در <b><xliff:g id="LABEL">%1$s</xliff:g></b> ذخیره شود؟"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> در <b><xliff:g id="LABEL">%2$s</xliff:g></b> ذخیره شود؟"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> و <xliff:g id="TYPE_1">%2$s</xliff:g> در <b><xliff:g id="LABEL">%3$s</xliff:g></b> ذخیره شوند؟"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>، <xliff:g id="TYPE_1">%2$s</xliff:g> و <xliff:g id="TYPE_2">%3$s</xliff:g> در <b><xliff:g id="LABEL">%4$s</xliff:g></b> ذخیره شوند؟"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"ذخیره"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"نه سپاسگزارم"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"گذرواژه"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 5d12753..44614d7 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Operaattorisi on väliaikaisesti keskeyttänyt ääni- ja hätäpuhelut tästä sijainnista."</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ei yhteyttä verkkoon"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Voit yrittää parantaa kuuluvuutta vaihtamalla tyypin asetusta. Valitse Järjestelmä > Verkko > Internet > Mobiiliverkot > Ensisijainen verkko."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Ilmoitukset"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Soitonsiirto"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Hätäpuhelujen takaisinsoittotila"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Mobiilidatailmoitukset"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Tekstiviestit"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Vastaajaviestit"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-puhelut"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Toinen käyttäjä vaihtoi TTY-tilaksi TÄYSI"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Toinen käyttäjä vaihtoi TTY-tilaksi HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Toinen käyttäjä vaihtoi TTY-tilaksi VCO"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Tarkistaa käyttämäsi ikkunan sisältö."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ottaa kosketuksella tutkimisen käyttöön"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Kosketetut kohteet sanotaan ääneen, ja ruudulla voi liikkua eleiden avulla."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Ottaa verkon paremman esteettömyyden käyttöön"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Sovellus voi asentaa ohjelmia tehdäkseen sisällöstään esteettömämmän."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Tarkkailla kirjoittamaasi tekstiä"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Sisältää henkilökohtaisia tietoja, kuten luottokortin numeroita ja salasanoja."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Näytön suurentamisen hallinnointi"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Vaihda ajan syöttämiseen tekstitilassa."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Vaihda ajan syöttämiseen kellotilassa."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Automaattisen täytön asetukset"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Tallenna automaattista täyttöä varten"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Sisältöä ei voi täyttää automaattisesti."</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Tallennetaanko kohteeseen <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Tallennetaanko <xliff:g id="TYPE">%1$s</xliff:g> kohteeseen <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Tallennetaanko <xliff:g id="TYPE_0">%1$s</xliff:g> ja <xliff:g id="TYPE_1">%2$s</xliff:g> palveluun <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Tallennetaanko <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ja <xliff:g id="TYPE_2">%3$s</xliff:g> palveluun <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Tallennetaanko tämä palveluun <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Tallennetaanko <xliff:g id="TYPE">%1$s</xliff:g> palveluun <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Tallennetaanko <xliff:g id="TYPE_0">%1$s</xliff:g> ja <xliff:g id="TYPE_1">%2$s</xliff:g> palveluun <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Tallennetaanko <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ja <xliff:g id="TYPE_2">%3$s</xliff:g> palveluun <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Tallenna"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Ei kiitos"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"salasana"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 6bcc8ae..20780fd 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Votre fournisseur de services a momentanément suspendu les appels vocaux et d\'urgence pour ce lieu"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Impossible de joindre le réseau"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Pour améliorer la réception, essayez de changer le type de réseau sélectionné, sous Système > Réseaux et Internet > Réseaux cellulaires > Type de réseau préféré."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertes"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Transfert d\'appel"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode de rappel d\'urgence"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Alertes de données cellulaires"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Messages texte"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Messages vocaux"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Appels Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Mode TTY COMPLET demandé par un pair"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Mode TTY HCO demandé par un pair"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Mode TTY VCO demandé par un pair"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecter le contenu d\'une fenêtre avec laquelle vous interagissez."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activer la fonctionnalité Explorer au toucher"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Les éléments sélectionnés sont énoncés à voix haute. Vous pouvez explorer l\'écran à l\'aide de gestes."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Activer l\'accessibilité Web améliorée"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Vous pouvez installer des scripts pour rendre le contenu des applications plus accessible."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observer le texte que vous saisissez"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Inclut des données personnelles telles que les numéros de cartes de paiement et les mots de passe."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Contrôler l\'agrandissement de l\'écran"</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installé par votre administrateur"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Mise à jour par votre administrateur"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"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>
+ <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\nL\'économiseur d\'énergie se désactive automatiquement lorsque votre appareil est en charge."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Pour aider à diminuer l\'utilisation des données, la fonction Économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Une application que vous utilisez actuellement peut accéder à des données, mais peut le faire moins souvent. Cela peut signifier, par exemple, que les images ne s\'affichent pas jusqu\'à ce que vous les touchiez."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Activer l\'Économiseur de données?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activer"</string>
@@ -1641,7 +1646,7 @@
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (alarme suivante)"</string>
- <string name="zen_mode_forever" msgid="1916263162129197274">"Jusqu\'à ce que vous désactiviez le mode « Ne pas déranger »"</string>
+ <string name="zen_mode_forever" msgid="1916263162129197274">"Jusqu\'à ce que vous désactiviez ce mode"</string>
<string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Jusqu\'à ce que vous désactiviez le mode « Ne pas déranger »"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Réduire"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Passer au mode Entrée de texte pour entrer l\'heure."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Passer au mode Horloge pour entrer l\'heure."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Options de remplissage automatique"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Enregistrer pour le remplissage automatique"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Le contenu ne peut pas être entré automatiquement"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Enregistrer sous <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Enregistrer <xliff:g id="TYPE">%1$s</xliff:g> sous <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Enregistrer <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> sous <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Enregistrer <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> sous <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Enregistrer dans <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Enregistrer <xliff:g id="TYPE">%1$s</xliff:g> dans <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Enregistrer <xliff:g id="TYPE_0">%1$s</xliff:g> et <xliff:g id="TYPE_1">%2$s</xliff:g> dans <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Enregistrer <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> et <xliff:g id="TYPE_2">%3$s</xliff:g> dans <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Enregistrer"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Non, merci"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"mot de passe"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 5b7b377..65f8d78 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -20,7 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="byteShort" msgid="8340973892742019101">"o"</string>
+ <string name="byteShort" msgid="8340973892742019101">"octet(s)"</string>
<string name="kilobyteShort" msgid="7542884022844556968">"Ko"</string>
<string name="megabyteShort" msgid="6355851576770428922">"Mo"</string>
<string name="gigabyteShort" msgid="3259882455212193214">"Go"</string>
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Votre opérateur a momentanément suspendu les appels vocaux et d\'urgence pour ce lieu"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Impossible d\'accéder au réseau"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Pour améliorer la réception, essayez de modifier le type sélectionné sous Système > Réseau et Internet > Réseaux mobiles > Type de réseau préféré."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertes"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Transfert d\'appel"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode de rappel d\'urgence"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Alertes relatives aux données mobiles"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Messages vocaux"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Appels Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Mode TTY demandé par l\'interlocuteur : COMPLET"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Mode TTY demandé par l\'interlocuteur : HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Mode TTY demandé par l\'interlocuteur : VCO"</string>
@@ -265,7 +272,7 @@
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"accéder à vos contacts"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Position"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"accéder à la position de cet appareil"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"accéder à la position de l\'appareil"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"accéder à votre agenda"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecter le contenu d\'une fenêtre avec laquelle vous interagissez"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activer la fonctionnalité Explorer au toucher"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Les éléments sélectionnés sont énoncés à voix haute. Vous pouvez explorer l\'écran à l\'aide de gestes."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Activer l\'accessibilité Web améliorée"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Vous pouvez installer des scripts pour rendre le contenu des applications plus accessible."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observer le texte que vous saisissez"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Inclut des données personnelles telles que les numéros de cartes de paiement et les mots de passe."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Contrôler l\'agrandissement de l\'écran"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Passer en mode saisie de texte pour la saisie de l\'heure."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Passer en mode horloge pour la saisie de l\'heure."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Options de saisie automatique"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Enregistrer pour la saisie automatique"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Le contenu ne peut pas être saisi automatiquement"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Enregistrer dans \"<xliff:g id="LABEL">%1$s</xliff:g>\" ?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Enregistrer \"<xliff:g id="TYPE">%1$s</xliff:g>\" dans \"<xliff:g id="LABEL">%2$s</xliff:g>\" ?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Enregistrer <xliff:g id="TYPE_0">%1$s</xliff:g> et <xliff:g id="TYPE_1">%2$s</xliff:g> sur <xliff:g id="LABEL">%3$s</xliff:g> ?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Enregistrer <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> et <xliff:g id="TYPE_2">%3$s</xliff:g> sur <xliff:g id="LABEL">%4$s</xliff:g> ?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Enregistrer dans <b><xliff:g id="LABEL">%1$s</xliff:g></b> ?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Enregistrer <xliff:g id="TYPE">%1$s</xliff:g> dans <b><xliff:g id="LABEL">%2$s</xliff:g></b> ?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Enregistrer <xliff:g id="TYPE_0">%1$s</xliff:g> et <xliff:g id="TYPE_1">%2$s</xliff:g> dans <b><xliff:g id="LABEL">%3$s</xliff:g></b> ?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Enregistrer <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> et <xliff:g id="TYPE_2">%3$s</xliff:g> dans <b><xliff:g id="LABEL">%4$s</xliff:g></b> ?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Enregistrer"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Non, merci"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"mot de passe"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index eb220f4..bc2dda1 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"O teu operador suspendeu temporalmente as chamadas de emerxencia e de voz nesta localización"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Non se pode conectar coa rede"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para mellorar a recepción, proba a cambiar o tipo seleccionado en Sistema > Rede e Internet > Redes de telefonía móbil > Tipo de rede preferido."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de chamadas"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de devolución de chamadas de emerxencia"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Alertas de datos móbiles"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Mensaxes SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensaxes de correo de voz"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas por wifi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Outro dispositivo solicitou o modo TTY COMPLETO"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Outro dispositivo solicitou o modo TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Outro dispositivo solicitou o modo TTY VCO"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona o contido dunha ventá coa que estás interactuando."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar a exploración táctil"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Os elementos que toques pronunciaranse en voz alta e a pantalla poderá explorarse mediante xestos."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Activar a accesibilidade web mellorada"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"É posible que se instalen scripts para que o contido da aplicación resulte máis accesible."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observar o texto que escribes"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Inclúe datos persoais como números e contrasinais de tarxetas de crédito."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Controlar ampliación da pantalla"</string>
@@ -539,8 +544,8 @@
<string name="permdesc_handoverStatus" msgid="4788144087245714948">"Permite a esta aplicación recibir información acerca das transferencias actuais de Android Beam"</string>
<string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"eliminar certificados DRM"</string>
<string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Permite a unha aplicación eliminar os certificados DRM. As aplicacións normais non o deberían precisar nunca."</string>
- <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"vincular a un servizo de mensaxería"</string>
- <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Permite ao propietario vincularse á interface de nivel superior dun servizo de mensaxería. As aplicacións normais non deberían necesitar este permiso."</string>
+ <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"vincular a un servizo de mensaxaría"</string>
+ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Permite ao propietario vincularse á interface de nivel superior dun servizo de mensaxaría. As aplicacións normais non deberían necesitar este permiso."</string>
<string name="permlab_bindCarrierServices" msgid="3233108656245526783">"vincular aos servizos do operador"</string>
<string name="permdesc_bindCarrierServices" msgid="1391552602551084192">"Permite ao titular vincularse aos servizos do operador. As aplicacións normais non deberían necesitar este permiso."</string>
<string name="permlab_access_notification_policy" msgid="4247510821662059671">"acceso ao modo Non molestar"</string>
@@ -593,9 +598,9 @@
<item msgid="2374913952870110618">"Personalizado"</item>
</string-array>
<string-array name="postalAddressTypes">
- <item msgid="6880257626740047286">"Particular"</item>
+ <item msgid="6880257626740047286">"Casa"</item>
<item msgid="5629153956045109251">"Traballo"</item>
- <item msgid="4966604264500343469">"Outros"</item>
+ <item msgid="4966604264500343469">"Outro"</item>
<item msgid="4932682847595299369">"Personalizado"</item>
</string-array>
<string-array name="imAddressTypes">
@@ -645,9 +650,9 @@
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Aniversario"</string>
<string name="eventTypeOther" msgid="7388178939010143077">"Outros"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Personalizado"</string>
- <string name="emailTypeHome" msgid="449227236140433919">"Inicio"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"Particular"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Traballo"</string>
- <string name="emailTypeOther" msgid="2923008695272639549">"Outros"</string>
+ <string name="emailTypeOther" msgid="2923008695272639549">"Outro"</string>
<string name="emailTypeMobile" msgid="119919005321166205">"Móbil"</string>
<string name="postalTypeCustom" msgid="8903206903060479902">"Personalizado"</string>
<string name="postalTypeHome" msgid="8165756977184483097">"Particular"</string>
@@ -852,7 +857,7 @@
<string name="searchview_description_query" msgid="5911778593125355124">"Consulta de busca"</string>
<string name="searchview_description_clear" msgid="1330281990951833033">"Borrar consulta"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Enviar consulta"</string>
- <string name="searchview_description_voice" msgid="2453203695674994440">"Busca de voz"</string>
+ <string name="searchview_description_voice" msgid="2453203695674994440">"Busca por voz"</string>
<string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Activar a exploración táctil?"</string>
<string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quere activar a exploración táctil. Cando a exploración táctil estea activada, poderás escoitar ou ver descricións do contido seleccionado ou realizar xestos para interactuar coa tableta."</string>
<string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quere activar a exploración táctil. Cando a exploración táctil estea activada, poderás escoitar ou ver descricións do contido seleccionado ou realizar xestos para interactuar co teléfono."</string>
@@ -1702,7 +1707,7 @@
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Toca para ver os ficheiros"</string>
<string name="pin_target" msgid="3052256031352291362">"Fixar"</string>
<string name="unpin_target" msgid="3556545602439143442">"Soltar"</string>
- <string name="app_info" msgid="6856026610594615344">"Información da aplicación"</string>
+ <string name="app_info" msgid="6856026610594615344">"Información de aplicacións"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="reset_retail_demo_mode_title" msgid="2370249087943803584">"Queres restablecer o dispositivo?"</string>
<string name="reset_retail_demo_mode_text" msgid="5481925817590883246">"Toca aquí para restablecer o dispositivo"</string>
@@ -1733,11 +1738,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Cambia ao modo de entrada de texto para introducir a hora."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Cambiar ao modo de reloxo para introducir a hora."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Opcións de autocompletar"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Garda a información no servizo Autocompletar"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Os contidos non se poden autocompletar"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Queres gardar o contido en: <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Queres gardar o contido (<xliff:g id="TYPE">%1$s</xliff:g>) en: <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Queres gardar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> en: <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Queres gardar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g> en: <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Queres gardar o contido en: <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Queres gardar <xliff:g id="TYPE">%1$s</xliff:g> en: <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Queres gardar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> en: <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Queres gardar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g> en: <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Gardar"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Non, grazas"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"contrasinal"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 58adbca..f70639f 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"તમારા કૅરિઅરે આ સ્થાને વૉઇસ અને કટોકટીના કૉલ અસ્થાયી રૂપે સસ્પેન્ડ કર્યા છે"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"નેટવર્ક પર પહોંચી શકાતું નથી"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"રિસેપ્શનને બહેતર બનાવવા માટે, સિસ્ટમ > નેટવર્ક અને ઇન્ટરનેટ > મોબાઇલ નેટવર્ક > પસંદગીનો નેટવર્ક પ્રકારમાં પસંદ કરેલો પ્રકાર બદલવાનો પ્રયાસ કરો."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"ચેતવણીઓ"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"કૉલ ફૉર્વર્ડિંગ"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"કટોકટી કૉલબૅક મોડ"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"મોબાઇલ ડેટા ચેતવણીઓ"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS સંદેશા"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"વૉઇસમેઇલ સંદેશા"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi કૉલિંગ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"પીઅરે TTY મોડ પૂર્ણની વિનંતી કરી"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"પીઅરે TTY મોડ HCO ની વિનંતી કરી"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"પીઅરે TTY મોડ VCO ની વિનંતી કરી"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"તમે જેની સાથે ક્રિયાપ્રતિક્રિયા કરી રહ્યાં છો તે વિંડોની સામગ્રીની તપાસ કરો."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ટચ કરીને અન્વેષણ કરો સક્ષમ કરો"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"ટૅપ કરેલ આઇટમ્સ મોટેથી બોલવામાં આવશે અને હાવભાવની મદદથી સ્ક્રીનનું અન્વેષણ કરી શકાય છે."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"વિસ્તૃત વેબ ઍક્સેસિબિલિટી ચાલુ કરો"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"ઍપ્લિકેશન સામગ્રીને વધુ ઍક્સેસિબલ બનાવવા માટે સ્ક્રિપ્ટ્સ ઇન્સ્ટોલ કરી શકાય છે."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"તમે લખો તે ટેક્સ્ટનું અવલોકન કરો"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"ક્રેડિટ કાર્ડ નંબર્સ અને પાસવર્ડ્સ જેવો વ્યક્તિગત ડેટા શામેલ છે."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"પ્રદર્શન વિસ્તૃતિકરણ નિયંત્રિત કરો"</string>
@@ -1700,7 +1705,7 @@
<string name="profile_encrypted_message" msgid="6964994232310195874">"કાર્ય પ્રોફાઇલ અનલૉક કરવા ટૅપ કરો"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> થી કનેક્ટ કરેલું છે"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"ફાઇલો જોવા માટે ટૅપ કરો"</string>
- <string name="pin_target" msgid="3052256031352291362">"પિન કરો"</string>
+ <string name="pin_target" msgid="3052256031352291362">"પિન"</string>
<string name="unpin_target" msgid="3556545602439143442">"અનપિન કરો"</string>
<string name="app_info" msgid="6856026610594615344">"ઍપ્લિકેશન માહિતી"</string>
<string name="negative_duration" msgid="5688706061127375131">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
@@ -1733,11 +1738,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"સમય દાખલ કરવા માટે ટેક્સ્ટ ઇનપુટ મોડમાં સ્વિચ કરો."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"સમય દાખલ કરવા માટે ઘડિયાળ મોડમાં સ્વિચ કરો."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"સ્વતઃભરણના વિકલ્પો"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"સ્વતઃભરણ માટે સાચવો"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"કન્ટેન્ટ સ્વતઃ ભરી શકાતું નથી"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> માં સાચવીએ?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> ને <xliff:g id="LABEL">%2$s</xliff:g> માં સાચવીએ?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="LABEL">%3$s</xliff:g>માં <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> સાચવીએ?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="LABEL">%4$s</xliff:g>માં <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> સાચવીએ?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b>માં સાચવીએ?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g>ને <b><xliff:g id="LABEL">%2$s</xliff:g></b>માં સાચવીએ?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> અને <xliff:g id="TYPE_1">%2$s</xliff:g>ને <b><xliff:g id="LABEL">%3$s</xliff:g></b>માં સાચવીએ?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> અને <xliff:g id="TYPE_2">%3$s</xliff:g>ને <b><xliff:g id="LABEL">%4$s</xliff:g></b>માં સાચવીએ?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"સાચવો"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"નહીં આભાર"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"પાસવર્ડ"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 5e7edfa..556ba9e 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"आपके वाहक ने इस स्थान पर वॉइस और आपातकालीन कॉल कुछ समय के लिए बंद कर दिए हैं"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"नेटवर्क तक नहीं पहुंच पा रहे हैं"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"रिसेप्शन बेहतर करने के लिए, सिस्टम > नेटवर्क और इंटरनेट > मोबाइल नेटवर्क > पसंदीदा नेटवर्क प्रकार पर जाकर, चुना गया प्रकार बदलकर देखें."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"सूचनाएं"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"कॉल अग्रेषण"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"आपातकालीन कॉलबैक मोड"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"मोबाइल डेटा सूचनाएं"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS संदेश"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"वॉइसमेल संदेश"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"वाई-फ़ाई कॉलिंग"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"पीयर ने TTY मोड पूर्ण का अनुरोध किया"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"पीयर ने TTY मोड HCO का अनुरोध किया"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"पीयर ने TTY मोड VCO का अनुरोध किया"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"उस विंडो की सामग्री का निरीक्षण करें जिससे आप सहभागिता कर रहे हैं."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"स्पर्श द्वारा एक्सप्लोर करें को चालू करें"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"टैप किए गए आइटम ज़ोर से बोले जाएंगे और स्क्रीन को हावभाव के उपयोग से एक्सप्लोर किया जा सकेगा."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"एन्हांस की गई वेब आसान तरीका चालू करें"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"ऐप्स सामग्री को अधिक पहुंच-योग्य बनाने के लिए स्क्रिप्ट इंस्टॉल किए जा सकते हैं."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"आपके द्वारा लिखे हुए लेख को ध्यान से देखें"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"क्रेडिट कार्ड नंबर और पासवर्ड जैसा व्यक्तिगत डेटा शामिल होता है."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"प्रदर्शन आवर्धन नियंत्रित करें"</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"आपके व्यवस्थापक ने इंस्टॉल किया है"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"आपके व्यवस्थापक ने अपडेट किया है"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"आपके व्यवस्थापक ने हटा दिया है"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"बैटरी जीवन काल को बेहतर बनाने में सहायता के लिए, बैटरी सेवर आपके डिवाइस के प्रदर्शन को कम कर देता है और कंपन, स्थान सेवाओं और अधिकांश पृष्ठभूमि डेटा को सीमित कर देता है. हो सकता है कि ईमेल, संदेश सेवा तथा समन्वयन पर आधारित अन्य ऐप्स तब तक ना खुलें जब तक कि आप उन्हें नहीं खोलते.\n\nजब आपका डिवाइस चार्ज हो रहा होता है तो बैटरी सेवर अपने आप बंद हो जाता है."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"बैटरी लाइफ़ बेहतर बनाने में सहायता के लिए, बैटरी सेवर आपके डिवाइस के प्रदर्शन को कम कर देता है और कंपन, स्थान सेवाओं और अधिकांश पृष्ठभूमि डेटा को सीमित कर देता है. हो सकता है कि ईमेल, संदेश सेवा और सिंक पर आधारित अन्य ऐप्स तब तक ना खुलें जब तक कि आप उन्हें नहीं खोलते.\n\nजब आपका डिवाइस चार्ज हो रहा होता है तो बैटरी सेवर अपने आप बंद हो जाता है."</string>
<string name="data_saver_description" msgid="6015391409098303235">"डेटा उपयोग कम करने में सहायता के लिए, डेटा बचतकर्ता कुछ ऐप्लिकेशन को पृष्ठभूमि में डेटा भेजने या प्राप्त करने से रोकता है. आपके द्वारा वर्तमान में उपयोग किया जा रहा एक ऐप्लिकेशन डेटा एक्सेस कर सकता है, लेकिन वह ऐसा कभी-कभी ही करेगा. उदाहरण के लिए, इसका अर्थ यह हो सकता है कि चित्र तब तक दिखाई नहीं देंगे जब तक कि आप उन्हें टैप नहीं करते."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"डेटा बचतकर्ता चालू करें?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"चालू करें"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"समय इनपुट के लिए लेख इनपुट मोड पर जाएं."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"समय इनपुट के लिए घड़ी मोड पर जाएं."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"ऑटोमैटिक भरने के विकल्प"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"ऑटोमैटिक भरने के लिए सहेजें"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"सामग्रियां ऑटोमैटिक रूप से भरी जा सकती हैं"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> में सहेजें?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> को <xliff:g id="LABEL">%2$s</xliff:g> में सहेजें?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> को <xliff:g id="LABEL">%3$s</xliff:g> में सहेजें?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> को <xliff:g id="LABEL">%4$s</xliff:g> में सहेजें?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> में सहेजें?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> को <b><xliff:g id="LABEL">%2$s</xliff:g></b> में सहेजें?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> और <xliff:g id="TYPE_1">%2$s</xliff:g> को <b><xliff:g id="LABEL">%3$s</xliff:g></b> में सहेजें?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> और <xliff:g id="TYPE_2">%3$s</xliff:g> को <b><xliff:g id="LABEL">%4$s</xliff:g></b> में सहेजें?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"सहेजें"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"नहीं, धन्यवाद"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"पासवर्ड"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index d95f8c8..c8083e7 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -100,6 +100,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Vaš je mobilni operater privremeno obustavio glasovne i hitne pozive na ovoj lokaciji"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Pristup mreži nije moguć"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Za bolji prijem pokušajte odabrati drugu vrstu mreže u odjeljku Sustav > Mreža i internet > Mobilne mreže > Željena vrsta mreže."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozorenja"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmjeravanje poziva"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Način hitnog povratnog poziva"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Upozorenja o mobilnim podacima"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS poruke"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Poruke govorne pošte"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi pozivi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Način TTY FULL koji zahtijeva paralelni uređaj"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Način TTY HCO koji zahtijeva paralelni uređaj"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Način TTY VCO koji zahtijeva paralelni uređaj"</string>
@@ -268,7 +275,7 @@
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakti"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"pristupati vašim kontaktima"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokacija"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"pristupiti lokaciji ovog uređaja"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"pristup lokaciji ovog uređaja"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"pristupati kalendaru"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
@@ -284,15 +291,13 @@
<string name="permgrouplab_sensors" msgid="416037179223226722">"Biometrijski senzori"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pristupiti podacima senzora o vašim vitalnim znakovima"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Dohvaćati sadržaj prozora"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Istražite sadržaj prozora koji upotrebljavate."</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Pregledat će sadržaj prozora koji upotrebljavate."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Uključiti značajku Istraži dodirom"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Dodirnute stavke izgovorit će se naglas, a zaslon se može istraživati pokretima."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Uključiti poboljšanu pristupačnost weba"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Kako bi sadržaj aplikacije bio pristupačniji, mogu se instalirati skripte."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Pratiti tekst koji pišete"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Uključuje osobne podatke kao što su brojevi kreditnih kartica i zaporke."</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Kontrola uvećanja zaslona"</string>
- <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Kontrolira razinu zumiranja i položaj zaslona."</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Kontrolirati uvećanje zaslona"</string>
+ <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Kontrolirat će stupanj i mjesto zumiranja."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Izvođenje pokreta"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Može dodirnuti, prijeći prstom, spojiti prste i izvoditi druge pokrete."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Pokreti za otisak prsta"</string>
@@ -1488,7 +1493,7 @@
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Prečac pristupačnosti isključio je uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Odaberite značajku koju ćete upotrebljavati kada dodirnete gumb Pristupačnost:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Da biste promijenili značajke, dodirnite i zadržite gumb Pristupačnost."</string>
- <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Povećanje"</string>
+ <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Povećavanje"</string>
<string name="user_switched" msgid="3768006783166984410">"Trenutačni korisnik <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="2871009331809089783">"Prebacivanje na korisnika <xliff:g id="NAME">%1$s</xliff:g>…"</string>
<string name="user_logging_out_message" msgid="8939524935808875155">"Odjavljivanje korisnika <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -1625,7 +1630,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalirao administrator"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ažurirao administrator"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"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>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Da bi se produljilo trajanje baterije, ušteda baterije smanjuje performanse uređaja i ograničava vibraciju, lokacijske usluge i većinu pozadinskih radnji. 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>
<string name="data_saver_description" msgid="6015391409098303235">"Da bi se smanjila potrošnja podataka, Ušteda podataka onemogućuje nekim aplikacijama slanje ili primanje podataka u pozadini. Aplikacija koju trenutačno upotrebljavate može pristupiti podacima, no možda će to činiti rjeđe. To može značiti da se, na primjer, slike neće prikazivati dok ih ne dodirnete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Uključiti Uštedu podataka?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Uključi"</string>
@@ -1763,11 +1768,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Prijeđite na način unosa teksta da biste unijeli vrijeme."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Prijeđite na način rada sata da biste unijeli vrijeme."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Opcije automatskog popunjavanja"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Spremanje za Automatsko popunjavanje"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Sadržaj se ne može automatski popuniti"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Želi te li to spremiti u aplikaciju <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Želite li spremiti <xliff:g id="TYPE">%1$s</xliff:g> u aplikaciju <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Želite li spremiti <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> u <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Želite li spremiti <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> u <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Želite li spremiti na uslugu <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Želite li da se podatak (<xliff:g id="TYPE">%1$s</xliff:g>) spremi na uslugu <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Želite li da se <xliff:g id="TYPE_0">%1$s</xliff:g> i <xliff:g id="TYPE_1">%2$s</xliff:g> spreme na uslugu <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Želite li da se <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> i <xliff:g id="TYPE_2">%3$s</xliff:g> spreme na uslugu <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Spremi"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Ne, hvala"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"zaporku"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 9e5c53e..d528e94 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Szolgáltatója ezen a helyen átmenetileg felfüggesztette a hang- és segélyhívásokat"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"A hálózat nem érhető el"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"A vétel javítása érdekében próbálja módosítani a kiválasztott hálózattípust a Rendszer > Hálózat és internet > Mobilhálózatok > Preferált hálózattípus menüben."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Értesítések"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Hívásátirányítás"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Sürgősségi visszahívás mód"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Mobiladat-forgalommal kapcsolatos értesítések"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS-ek"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Hangpostaüzenetek"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-hívás"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Partner által kért TTY-mód: FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Partner által kért TTY-mód: HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Partner által kért TTY-mód: VCO"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"A használt ablak tartalmának vizsgálata."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Felfedezés érintéssel bekapcsolása"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"A megérintett elemeket a rendszer hangosan kimondja, a képernyő pedig felfedezhető kézmozdulatok használatával."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Internetes kisegítő lehetőségek bővítése"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Szkripteket lehet telepíteni, hogy könnyebb legyen hozzáférni az alkalmazások tartalmához."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"A gépelt szöveg figyelése"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Beleértve a személyes adatokat, például a hitelkártyaszámokat és jelszavakat."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"A kijelző nagyításának vezérlése"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Időbevitelhez váltson szövegbeviteli módba."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Időbevitelhez váltson óramódba."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Az automatikus kitöltés beállítási lehetőségei"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Mentés az Automatikus kitöltéshez"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"A tartalmakat nem lehet automatikusan kitölteni"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Menti ide: <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> mentése ide: <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Menti a(z) <xliff:g id="LABEL">%3$s</xliff:g> szolgáltatásba a következőket: <xliff:g id="TYPE_0">%1$s</xliff:g> és <xliff:g id="TYPE_1">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Menti a(z) <xliff:g id="LABEL">%4$s</xliff:g> szolgáltatásba a következőket: <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> és <xliff:g id="TYPE_2">%3$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Menti ide: <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Menti a következőt: <xliff:g id="TYPE">%1$s</xliff:g> ide: <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Menti a következőket: <xliff:g id="TYPE_0">%1$s</xliff:g> és <xliff:g id="TYPE_1">%2$s</xliff:g> ide: <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Menti a következőket: <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> és <xliff:g id="TYPE_2">%3$s</xliff:g> ide: <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Mentés"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Nem, köszönöm"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"jelszó"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index d6a75d5..f33e777 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -82,7 +82,7 @@
<string name="ThreeWCMmi" msgid="9051047170321190368">"Երեք կողմով զանգ"</string>
<string name="RuacMmi" msgid="7827887459138308886">"Անցանկալի վրդովեցնող զանգերի մերժում"</string>
<string name="CndMmi" msgid="3116446237081575808">"Զանգող համարի առաքում"</string>
- <string name="DndMmi" msgid="1265478932418334331">"Չխանգարել"</string>
+ <string name="DndMmi" msgid="1265478932418334331">"Չանհանգստացնել"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Զանգողի ID-ն լռելյայն սահմանափակված է: Հաջորդ զանգը` սահմանափակված"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Զանգողի ID-ն լռելյայն սահմանափակված է: Հաջորդ զանգը` չսահմանափակված"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Զանգողի ID-ն լռելյայն չսահմանափակված է: Հաջորդ զանգը` Սահմանափակված"</string>
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Ձեր օպերատորն այս վայրում ժամանակավորապես կասեցրել է ձայնային և շտապ կանչերը"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ցանցն անհասանելի է"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Ազդանշանի ընդունման որակը բարելավելու համար փոխեք ցանցի տեսակը՝ անցնելով Համակարգ > Ցանց և ինտերնետ > Բջջային ցանցեր > Ցանկալի ցանցի տեսակը։"</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Ծանուցումներ"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Զանգի վերահասցեավորում"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Շտապ հետկանչի ռեժիմ"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Բջջային տվյալների ծանուցումներ"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS հաղորդագրություններ"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Ձայնային փոստի հաղորդագրություններ"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Զանգեր Wi-Fi-ի միջոցով"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Բաժանորդի սարքում ընտրված է հեռատիպի ԲՈԼՈՐԸ ռեժիմը"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Բաժանորդի սարքում ընտրված է հեռատիպի HCO ռեժիմը"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Բաժանորդի սարքում ընտրված է հեռատիպի VCO ռեժիմը"</string>
@@ -264,32 +271,30 @@
<string name="managed_profile_label" msgid="5289992269827577857">"Անցնել աշխատանքային պրոֆիլին"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Կոնտակտներ"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"օգտագործել ձեր կոնտակտները"</string>
- <string name="permgrouplab_location" msgid="7275582855722310164">"Տեղադրություն"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"օգտագործել այս սարքի տեղադրությունը"</string>
+ <string name="permgrouplab_location" msgid="7275582855722310164">"Տեղորոշում"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"տեղորոշել այս սարքը"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Օրացույց"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"օգտագործել օրացույցը"</string>
- <string name="permgrouplab_sms" msgid="228308803364967808">"Կարճ հաղորդագրություն"</string>
+ <string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"ուղարկել և դիտել SMS-ները"</string>
- <string name="permgrouplab_storage" msgid="1971118770546336966">"Պահոց"</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"Հիշողություն"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"օգտագործել լուսանկարները, մեդիա ֆայլերը և ձեր սարքում պահվող մյուս ֆայլերը"</string>
- <string name="permgrouplab_microphone" msgid="171539900250043464">"Բարձրախոս"</string>
+ <string name="permgrouplab_microphone" msgid="171539900250043464">"Խոսափող"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ձայնագրել"</string>
- <string name="permgrouplab_camera" msgid="4820372495894586615">"Ֆոտոխցիկ"</string>
+ <string name="permgrouplab_camera" msgid="4820372495894586615">"Տեսախցիկ"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"լուսանկարել և տեսագրել"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Հեռախոս"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"կատարել զանգեր և կառավարել զանգերը"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Մարմնի սենսորներ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"օգտագործել սենսորների տվյալները ձեր օրգանիզմի վիճակի մասին"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Առբերել պատուհանի բովանդակությունը"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Ստուգեք պատուհանի բովանդակությունը, որի հետ փոխգործակցում եք:"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Վերլուծել գործող պատուհանի բովանդակությունը"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Միացնել Հպման միջոցով հետազոտումը"</string>
- <string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Ուսումնաիրեք էկրանը այն շոշափելով։ Այս կամ այն տարրին հպելուց հետո դրանք բարձրաձայն կնկարագրվեն։"</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Միացնել ընդլայնված վեբ մատչելիությունը"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Հնարավոր է սկրիպտներ տեղադրվեն` ծրագրի բովանդակությունն ավելի մատչելի դարձնելու համար:"</string>
- <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Զննել ձեր մուտքագրած տեքստը"</string>
- <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Ներառում է անձնական տվյալներ, ինչպիսիք են վարկային քարտերի համարները և գաղտնաբառերը:"</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Ցուցասարքի խոշորացման կառավարում"</string>
- <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Ցուցասարքի մասշտաբավորման և դիրքավորման կառավարում:"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Հնչեցնել սեղմվող տարրերը և թույլատրել սարքի կառավարումը ժեստերի միջոցով"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Մշակել մուտքագրվող տեքստը"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Այդ թվում անձնական տվյալներ, օրինակ վարկային քարտերի համարներն ու գաղտնաբառերը"</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Կառավարել պատկերի մասշտաբը"</string>
+ <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Կառավարել պատկերի մասշտաբն ու դիրքը"</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Կատարել ժեստեր"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Կարող է հպել, թերթել, պտղունցել և կատարել այլ ժեստեր:"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Մատնահետքերի սկաների ժեստեր"</string>
@@ -337,7 +342,7 @@
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Այս հավելվածը կարող է ցուցադրվել այլ հավելվածների վերևում"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Այս հավելվածը կարող է ցուցադրվել այլ հավելվածների կամ էկրանի այլ հատվածների վերևում: Դա կարող է խոչընդոտել հավելվածի նորմալ օգտագործմանը և փոխել այլ հավելվածների տեսքը:"</string>
<string name="permlab_runInBackground" msgid="7365290743781858803">"աշխատել ֆոնում"</string>
- <string name="permdesc_runInBackground" msgid="7370142232209999824">"Այս հավելվածը կարող է աշխատել ֆոնում և ավելի արագ սպառել մարտկոցի լիցքը։"</string>
+ <string name="permdesc_runInBackground" msgid="7370142232209999824">"Այս հավելվածը կարող է աշխատել ֆոնային ռեժիմում և ավելի արագ սպառել մարտկոցի լիցքը։"</string>
<string name="permlab_useDataInBackground" msgid="8694951340794341809">"տվյալներ օգտագործել ֆոնում"</string>
<string name="permdesc_useDataInBackground" msgid="6049514223791806027">"Այս հավելվածը կարող է տվյալներ օգտագործել ֆոնում և ավելացնել տվյալների օգտագործման ծավալը։"</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"միշտ աշխատեցնել հավելվածը"</string>
@@ -458,7 +463,7 @@
<string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Թույլ է տալիս հավելվածին հեռախոսը միացնել WiMAX ցանցին և անջատել այդ ցանցից:"</string>
<string name="permlab_bluetooth" msgid="6127769336339276828">"զուգակցվել Bluetooth սարքերի հետ"</string>
<string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Թույլ է տալիս հավելվածին տեսնել Bluetooth-ի կարգավորումը պլանշետի վրա և կապվել ու կապեր ընդունել զուգակցված սարքերի հետ:"</string>
- <string name="permdesc_bluetooth" product="tv" msgid="3974124940101104206">"Թույլ է տալիս հավելվածին տեսնել Bluetooth-ի կազմաձևումը հեռուստացույցի վրա և կապակցվել ու թույլ տալ կապակցումները զուգավորված սարքերի հետ:"</string>
+ <string name="permdesc_bluetooth" product="tv" msgid="3974124940101104206">"Թույլ է տալիս հավելվածին տեսնել Bluetooth-ի կազմաձևումը հեռուստացույցի վրա և կապակցվել ու թույլ տալ կապակցումները զուգակցված սարքերի հետ:"</string>
<string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Թույլ է տալիս հավելվածին տեսնել Bluetooth-ի կարգավորումը հեռախոսի վրա և կապվել ու կապեր ընդունել զուգակցված սարքերի հետ:"</string>
<string name="permlab_nfc" msgid="4423351274757876953">"վերահսկել Մոտ Տարածությամբ Հաղորդակցումը"</string>
<string name="permdesc_nfc" msgid="7120611819401789907">"Թույլ է տալիս հավելվածին հաղորդակցվել Մոտ տարածությամբ հաղորդակցման (NFC) պիտակների, քարտերի և ընթերցիչների հետ:"</string>
@@ -773,7 +778,7 @@
<string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> վիջեթ:"</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Օգտատիրոջ ընտրիչ"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"Կարգավիճակ"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Ֆոտոխցիկ"</string>
+ <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Տեսախցիկ"</string>
<string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Մեդիա կարգավորումներ"</string>
<string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Վիջեթների վերադասավորումը մեկնարկել է:"</string>
<string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Վիջեթի վերադասավորումն ավարտվեց:"</string>
@@ -976,8 +981,8 @@
<string name="dial" msgid="4204975095406423102">"Հեռախոս"</string>
<string name="map" msgid="5441053548030107189">"Քարտեզ"</string>
<string name="browse" msgid="6079864138582486027">"Բացել"</string>
- <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Պահոցային տարածքը սպառվում է"</string>
- <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Համակարգի որոշ գործառույթներ հնարավոր է չաշխատեն"</string>
+ <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Հիշողությունը սպառվում է"</string>
+ <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Որոշ գործառույթներ կարող են չաշխատել"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Համակարգի համար բավարար հիշողություն չկա: Համոզվեք, որ ունեք 250ՄԲ ազատ տարածություն և վերագործարկեք:"</string>
<string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ն աշխատեցվում է"</string>
<string name="app_running_notification_text" msgid="1197581823314971177">"Հպեք` լրացուցիչ տեղեկություններ ստանալու կամ հավելվածն անջատելու համար:"</string>
@@ -1178,7 +1183,7 @@
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"ՏՐԱՄԱԴՐԵԼ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ՄԵՐԺԵԼ"</string>
<string name="select_input_method" msgid="8547250819326693584">"Փոխել ստեղնաշարը"</string>
- <string name="show_ime" msgid="2506087537466597099">"Պահել էկրանին մինչդեռ ֆիզիկական ստեղնաշարն ակտիվ է"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Պահել էկրանին, երբ ֆիզիկական ստեղնաշարն ակտիվ է"</string>
<string name="hardware" msgid="194658061510127999">"Ցույց տալ վիրտուալ ստեղնաշարը"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Կազմաձևեք ֆիզիկական ստեղնաշարը"</string>
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Հպեք՝ լեզուն և դասավորությունն ընտրելու համար"</string>
@@ -1357,7 +1362,7 @@
<string name="storage_usb" msgid="3017954059538517278">"USB կրիչ"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Խմբագրել"</string>
<string name="data_usage_warning_title" msgid="3620440638180218181">"Տվյալների օգտագործման զգուշացում"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Հպեք և տեսեք օգտագործումը և կարգավորումները:"</string>
+ <string name="data_usage_warning_body" msgid="6660692274311972007">"Հպեք՝ թրաֆիկն ու կարգավորումները տեսնելու համար"</string>
<string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G տվյալների սահմանաչափը սպառվել է"</string>
<string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G տվյալների սահմանաչափը սպառվել է"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Բջջային ինտերնետի սահմանաչափը լրացել է"</string>
@@ -1562,7 +1567,7 @@
<string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Չեղարկված է"</string>
<string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Բովանդակության գրելու սխալ"</string>
<string name="reason_unknown" msgid="6048913880184628119">"անհայտ"</string>
- <string name="reason_service_unavailable" msgid="7824008732243903268">"Տպելու ծառայությունն ակտիվացված չէ"</string>
+ <string name="reason_service_unavailable" msgid="7824008732243903268">"Տպման ծառայությունն ակտիվացված չէ"</string>
<string name="print_service_installed_title" msgid="2246317169444081628">"<xliff:g id="NAME">%s</xliff:g> ծառայությունը տեղադրվել է"</string>
<string name="print_service_installed_message" msgid="5897362931070459152">"Հպեք` միացնելու համար"</string>
<string name="restr_pin_enter_admin_pin" msgid="8641662909467236832">"Մուտքագրեք ադմինիստրատորի PIN կոդը"</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Տեղադրվել է ձեր ադմինիստրատորի կողմից"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Թարմացվել է ձեր ադմինիստրատորի կողմից"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Ջնջվել է ձեր ադմինիստրատորի կողմից"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"Մարտկոցի աշխատանքի ժամկետը երկարացնելու նպատակով, մարտկոցի էներգիայի խնայման գործառույթը սահմանափակում է սարքի աշխատանքը, թրթռոցը, տեղադրության ծառայությունները և հետնաշերտում աշխատող շատ գործընթացներ: Էլփոստը, հաղորդագրությունների փոխանակումը և տվյալների համաժամեցումից կախված այլ հավելվածները կարող են չթարմացվել, եթե դուք դրանք չգործարկեք:\n\nԵրբ ձեր սարքը լիցքավորվում է, մարտկոցի էներգիայի խնայման գործառույթն ինքնաշխատորեն անջատվում է:"</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Մարտկոցի աշխատանքի ժամկետը երկարացնելու համար տնտեսման ռեժիմում սահմանափակվում են սարքի արտադրողականությունը, թրթռոցը, տեղորոշման ծառայությունները և տվյալների ֆոնային փոխանցումը: Տվյալների համաժամեցումից կախված հավելվածները կարող են չթարմացվել, եթե դուք դրանք չգործարկեք:\n\n Մարտկոցի տնտեսման գործառույթն ավտոմատ կերպով անջատվում է սարքի լիցքավորման ժամանակ։"</string>
<string name="data_saver_description" msgid="6015391409098303235">"Տվյալների օգտագործումը նվազեցնելու նպատակով «Թրաֆիկի խնայումը» որոշ հավելվածներին թույլ չի տալիս ուղարկել կամ ստանալ տվյալներ ֆոնային ռեժիմում: Արդեն իսկ գործարկված հավելվածը կարող է օգտագործել տվյալները, սակայն ոչ այնքան հաճախ: Օրինակ՝ պատկերները կցուցադրվեն միայն դրանք հպելուց հետո:"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Միացնե՞լ թրաֆիկի խնայումը:"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Միացնել"</string>
@@ -1726,17 +1731,18 @@
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"USB վրիպազերծում"</string>
<string name="time_picker_hour_label" msgid="2979075098868106450">"ժամ"</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"րոպե"</string>
- <string name="time_picker_header_text" msgid="143536825321922567">"Կարգավորել ժամը"</string>
+ <string name="time_picker_header_text" msgid="143536825321922567">"Ժամը"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"Մուտքագրեք վավեր ժամ"</string>
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Մուտքագրեք ժամը"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Ժամը մուտքագրելու համար միացրեք տեքստի մուտքագրման ռեժիմը:"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Ժամը մուտքագրելու համար միացրեք ժամացույցի ռեժիմը:"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Ինքնալրացման ընտրանքները"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Պահել ինքնալրացման համար"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Բովանդակության ինքնալրացումը հնարավոր չէ"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Պահե՞լ <xliff:g id="LABEL">%1$s</xliff:g>-ում։"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Պահե՞լ <xliff:g id="TYPE">%1$s</xliff:g> <xliff:g id="LABEL">%2$s</xliff:g>-ում։"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Պահե՞լ <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> տվյալները <xliff:g id="LABEL">%3$s</xliff:g>-ում։"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Պահե՞լ <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> տվյալները <xliff:g id="LABEL">%4$s</xliff:g>-ում։"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Պահե՞լ <b><xliff:g id="LABEL">%1$s</xliff:g></b>-ում:"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Պահե՞լ <xliff:g id="TYPE">%1$s</xliff:g>-ը <b><xliff:g id="LABEL">%2$s</xliff:g></b>-ում:"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Պահե՞լ <xliff:g id="TYPE_0">%1$s</xliff:g>-ը և <xliff:g id="TYPE_1">%2$s</xliff:g>-ը <b><xliff:g id="LABEL">%3$s</xliff:g></b>-ում:"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Պահե՞լ <xliff:g id="TYPE_0">%1$s</xliff:g>-ը, <xliff:g id="TYPE_1">%2$s</xliff:g>-ը և <xliff:g id="TYPE_2">%3$s</xliff:g>-ը <b><xliff:g id="LABEL">%4$s</xliff:g></b>-ում:"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Պահել"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Ոչ"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"գաղտնաբառ"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index cd4e63e..9ba2120b 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Operator menangguhkan panggilan suara dan darurat di lokasi ini untuk sementara"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Tidak dapat menjangkau jaringan"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Untuk meningkatkan penerimaan sinyal, coba ubah jenis yang dipilih di Sistem > Jaringan & Internet > Jaringan seluler > Jenis jaringan pilihan."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Notifikasi"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Penerusan panggilan"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode panggilan balik darurat"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Notifikasi data seluler"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Pesan SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Notifikasi pesan suara"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Panggilan Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Rekan meminta Mode TTY PENUH"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Rekan meminta Mode TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Rekan meminta Mode TTY VCO"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Memeriksa konten jendela tempat Anda berinteraksi."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Mengaktifkan Jelajahi dengan Sentuhan"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Item yang diketuk akan diucapkan dengan jelas dan layar dapat dijelajahi menggunakan isyarat."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Mengaktifkan aksesibilitas web yang disempurnakan"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skrip mungkin dipasang agar konten aplikasi lebih dapat diakses."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Mengamati teks yang Anda ketik"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Meliputi data pribadi seperti nomor kartu kredit dan sandi."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Mengontrol perbesaran layar"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Beralih ke mode masukan teks untuk masukan waktu."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Beralih ke mode jam untuk masukan waktu."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Opsi Isiotomatis"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Simpan untuk Isiotomatis"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Konten tidak dapat diisi otomatis"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Simpan ke <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Simpan <xliff:g id="TYPE">%1$s</xliff:g> ke <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Simpan <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ke <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Simpan <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> ke <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Simpan ke <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Simpan <xliff:g id="TYPE">%1$s</xliff:g> ke <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Simpan <xliff:g id="TYPE_0">%1$s</xliff:g> dan <xliff:g id="TYPE_1">%2$s</xliff:g> ke <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Simpan <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, dan <xliff:g id="TYPE_2">%3$s</xliff:g> ke <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Simpan"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Lain kali"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"sandi"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index d87725e..30d83e1 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Símafyrirtækið þitt hefur tímabundið lokað fyrir símtöl og neyðarsímtöl á þessum stað"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ekki næst samband við símkerfi"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Reyndu að breyta valinni gerð í Kerfi > Netkerfi og internet > Farsímakerfi > Valin símkerfistegund til að bæta móttökuskilyrðin."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Tilkynningar"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Símtalsflutningur"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Stilling fyrir svarhringingu neyðarsímtala"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Tilkynningar fyrir farsímagögn"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS-skilaboð"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Talhólfsskilaboð"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi símtöl"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Jafningi bað um FULLA stillingu fjarrita"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Jafningi bað um HCO-stillingu fjarrita"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Jafningi bað um VCO-stillingu fjarrita"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kanna innihald glugga sem þú ert að nota."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Kveikja á snertikönnun"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Snert atriði verða lesin upphátt og hægt er að kanna skjáinn með bendingum."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Kveikja á auknu vefaðgengi"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Hægt er að setja upp skriftur til að bæta aðgengi að efni forrits."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Fylgjast með texta sem þú slærð inn"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Felur í sér persónuleg gögn á borð við kreditkortanúmer og aðgangsorð."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Stilla skjástærð"</string>
@@ -1725,7 +1730,7 @@
<string name="app_category_productivity" msgid="3742083261781538852">"Aðstoð"</string>
<string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"Geymslurými tækis"</string>
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"USB-villuleit"</string>
- <string name="time_picker_hour_label" msgid="2979075098868106450">"klukkustund"</string>
+ <string name="time_picker_hour_label" msgid="2979075098868106450">"klst."</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"mínúta"</string>
<string name="time_picker_header_text" msgid="143536825321922567">"Stilla tíma"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"Færðu inn gildan tíma"</string>
@@ -1733,11 +1738,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Skipta yfir í textastillingu til að færa inn tíma."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Skipta yfir í klukkustillingu til að færa inn tíma."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Valkostir sjálfvirkrar útfyllingar"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Vista fyrir sjálfvirka útfyllingu"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Ekki er hægt að fylla innihald út sjálfkrafa"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Vista í <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Vista <xliff:g id="TYPE">%1$s</xliff:g> í <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Vista <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> á <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Vista <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> á <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Vista á <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Vista <xliff:g id="TYPE">%1$s</xliff:g> á <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Vista <xliff:g id="TYPE_0">%1$s</xliff:g> og <xliff:g id="TYPE_1">%2$s</xliff:g> á <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Vista <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> og <xliff:g id="TYPE_2">%3$s</xliff:g> á <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Vista"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Nei, takk"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"aðgangsorð"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 06850c8..61be91c 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Il tuo operatore ha sospeso temporaneamente le telefonate e le chiamate di emergenza per questa località"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Impossibile raggiungere la rete"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Per migliorare la ricezione, prova a modificare il tipo selezionato in Sistema > Rete e Internet > Reti mobili > Tipo di rete preferito."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Avvisi"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Deviazione chiamate"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modalità di richiamata di emergenza"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Avvisi relativi ai dati mobili"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Messaggi vocali"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Chiamate Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer ha richiesto la modalità TTY FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer ha richiesto la modalità TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer ha richiesto la modalità TTY VCO"</string>
@@ -284,11 +291,9 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Esaminare i contenuti di una finestra con cui interagisci."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Attivare Esplora al tocco"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Gli elementi toccati verranno pronunciati ad alta voce e sarà possibile esplorare lo schermo utilizzando i gesti."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Attivare accessibilità web migliorata"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Potrebbero essere installati script per rendere più accessibili i contenuti delle app."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Osservare il testo digitato"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Sono inclusi dati personali come numeri di carte di credito e password."</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Controlla l\'ingrandimento del display"</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Controllare l\'ingrandimento del display"</string>
<string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Controlla il livello di zoom e la posizione del display."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Esegui gesti"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Consente di toccare, far scorrere, pizzicare ed eseguire altri gesti."</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Passa alla modalità di immissione testo per inserire l\'ora."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Passa alla modalità orologio per inserire l\'ora."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Opzioni di compilazione automatica"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Salva per Compilazione automatica"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Impossibile compilare automaticamente i contenuti"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Salvare in <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Salvare <xliff:g id="TYPE">%1$s</xliff:g> in <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Salvare <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> su <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Salvare <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g> su <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Salvare in <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Salvare <xliff:g id="TYPE">%1$s</xliff:g> in <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Salvare <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> in <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Salvare <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g> in <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Salva"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"No, grazie"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"password"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 846ce56..18518f8 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -54,10 +54,10 @@
<string name="serviceErased" msgid="1288584695297200972">"המחיקה בוצעה בהצלחה."</string>
<string name="passwordIncorrect" msgid="7612208839450128715">"סיסמה שגויה."</string>
<string name="mmiComplete" msgid="8232527495411698359">"MMI הושלם."</string>
- <string name="badPin" msgid="9015277645546710014">"ה-PIN הישן שהקלדת שגוי."</string>
+ <string name="badPin" msgid="9015277645546710014">"קוד הגישה הישן שהקלדת שגוי."</string>
<string name="badPuk" msgid="5487257647081132201">"ה-PUK שהקלדת שגוי."</string>
- <string name="mismatchPin" msgid="609379054496863419">"קודי ה-PIN שהקלדת לא תואמים."</string>
- <string name="invalidPin" msgid="3850018445187475377">"הקלד PIN שאורכו 4 עד 8 ספרות."</string>
+ <string name="mismatchPin" msgid="609379054496863419">"קודי הגישה שהקלדת לא תואמים."</string>
+ <string name="invalidPin" msgid="3850018445187475377">"הקלד קוד גישה שאורכו 4 עד 8 ספרות."</string>
<string name="invalidPuk" msgid="8761456210898036513">"הקלד PUK באורך 8 מספרים או יותר."</string>
<string name="needPuk" msgid="919668385956251611">"כרטיס ה-SIM נעול באמצעות PUK. הקלד את קוד PUK כדי לבטל את נעילתו."</string>
<string name="needPuk2" msgid="4526033371987193070">"הקלד PUK2 כדי לבטל את חסימת כרטיס ה-SIM."</string>
@@ -78,7 +78,7 @@
<string name="CwMmi" msgid="9129678056795016867">"שיחה ממתינה"</string>
<string name="BaMmi" msgid="455193067926770581">"חסימת שיחות"</string>
<string name="PwdMmi" msgid="7043715687905254199">"שינוי סיסמה"</string>
- <string name="PinMmi" msgid="3113117780361190304">"שנה את ה-PIN"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"שנה את קוד הגישה"</string>
<string name="CnipMmi" msgid="3110534680557857162">"מספר מתקשר נמצא"</string>
<string name="CnirMmi" msgid="3062102121430548731">"מספר מתקשר חסוי"</string>
<string name="ThreeWCMmi" msgid="9051047170321190368">"שיחה עם שלושה משתתפים"</string>
@@ -101,6 +101,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"הספק שלך השעה באופן זמני את האפשרות לבצע שיחות חירום ושיחות קוליות רגילות ממיקום זה"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"לא ניתן להתחבר לרשת"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"כדי לשפר את הקליטה, נסה לשנות את הסוג הנבחר ב\'מערכת\' > \'רשת ואינטרנט\' > \'רשתות סלולריות\' > \'סוג רשת מועדף\'."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"התראות"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"העברת שיחות"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"מצב \'התקשרות חזרה בחירום\'"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"התראות לגבי חבילת הגלישה"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"הודעות SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"הודעות קוליות"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"שיחות Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"העמית ביקש TTY במצב FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"העמית ביקש TTY במצב HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"העמית ביקש TTY במצב VCO"</string>
@@ -290,8 +297,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"בדוק את התוכן של חלון שאיתו אתה מבצע אינטראקציה."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"הפעלה של \'גילוי באמצעות מגע\'"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"פריטים שעליהם תקיש יוקראו בקול, ותוכל לנווט במסך באמצעות תנועות."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"הפעלה של גישה משופרת לאינטרנט"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"ייתכן שסקריפטים יותקנו על מנת להקל את הגישה אל תוכן של אפליקציות."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"הצגת טקסט בזמן הקלדה"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"כולל נתונים אישיים כמו מספרי כרטיס אשראי וסיסמאות."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"שליטה בהגדלת התצוגה"</string>
@@ -552,7 +557,7 @@
<string name="permlab_access_notification_policy" msgid="4247510821662059671">"גישה אל \'נא לא להפריע\'"</string>
<string name="permdesc_access_notification_policy" msgid="3296832375218749580">"מאפשר לאפליקציה לקרוא ולכתוב את התצורה של \'נא לא להפריע\'."</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"הגדר כללי סיסמה"</string>
- <string name="policydesc_limitPassword" msgid="2502021457917874968">"קביעת האורך הנדרש והתווים המותרים בסיסמאות ובקודי PIN של מסך הנעילה."</string>
+ <string name="policydesc_limitPassword" msgid="2502021457917874968">"קביעת האורך הנדרש והתווים המותרים בסיסמאות ובקודי הגישה של מסך הנעילה."</string>
<string name="policylab_watchLogin" msgid="5091404125971980158">"מעקב אחר ניסיונות לביטול של נעילת המסך"</string>
<string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"ניהול מעקב אחר מספר הסיסמאות השגויות שמוקלדות בעת ביטול נעילת המסך, וביצוע נעילה של הטאבלט, או מחיקה של כל נתוני הטאבלט, אם מוקלדות יותר מדי סיסמאות שגויות."</string>
<string name="policydesc_watchLogin" product="TV" msgid="2707817988309890256">"מעקב אחר מספר הסיסמאות השגויות שהוזנו בעת נעילת המסך, ונעילת הטלוויזיה או מחיקה של כל נתוני הטלוויזיה אם הוזנו סיסמאות שגויות רבות מדי."</string>
@@ -575,7 +580,7 @@
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"הגדר את שרת ה-Proxy הכללי של המכשיר"</string>
<string name="policydesc_setGlobalProxy" msgid="8459859731153370499">"הגדרה של שרת ה-proxy הגלובלי שבו ייעשה שימוש כשהמדיניות פועלת. רק הבעלים של המכשיר יכול להגדיר את שרת ה-proxy הגלובלי."</string>
<string name="policylab_expirePassword" msgid="5610055012328825874">"הגדרת תפוגה לסיסמת מסך הנעילה"</string>
- <string name="policydesc_expirePassword" msgid="5367525762204416046">"שינוי התדירות לדרישת השינוי של הסיסמה, ה-PIN או קו ביטול הנעילה של מסך הנעילה."</string>
+ <string name="policydesc_expirePassword" msgid="5367525762204416046">"שינוי התדירות לדרישת השינוי של הסיסמה, קוד הגישה או קו ביטול הנעילה של מסך הנעילה."</string>
<string name="policylab_encryptedStorage" msgid="8901326199909132915">"הגדר הצפנת אחסון"</string>
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"דרוש שנתוני אפליקציות מאוחסנות יהיו מוצפנים."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"השבת מצלמות"</string>
@@ -696,14 +701,14 @@
<string name="sipAddressTypeWork" msgid="6920725730797099047">"עבודה"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"אחר"</string>
<string name="quick_contacts_not_available" msgid="746098007828579688">"לא נמצאה אפליקציה להצגת התוכן הזה."</string>
- <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"הקלד קוד PIN"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"הקלד את קוד ה-PUK וקוד ה-PIN החדש"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"הקלד קוד גישה"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"הקלד את קוד ה-PUK וקוד הגישה החדש"</string>
<string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"קוד PUK"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"קוד PIN חדש"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"קוד גישה חדש"</string>
<string name="keyguard_password_entry_touch_hint" msgid="2644215452200037944"><font size="17">"הקש כדי להקליד את הסיסמה"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"הקלד סיסמה לביטול הנעילה"</string>
- <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"הקלד קוד PIN לביטול הנעילה"</string>
- <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"קוד PIN שגוי"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"הקלד קוד גישה לביטול הנעילה"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"קוד גישה שגוי"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"כדי לבטל את הנעילה, לחץ על \'תפריט\' ולאחר מכן על 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"מספר חירום"</string>
<string name="lockscreen_carrier_default" msgid="6169005837238288522">"אין שירות"</string>
@@ -741,7 +746,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">%1$d</xliff:g> פעמים. \n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
<string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"הקלדת סיסמה שגויה <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים.\n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
- <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"הקלדת קוד PIN שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים.\n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"הקלדת קוד גישה שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים.\n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
<string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"שרטטת באופן שגוי את קו ביטול הנעילה <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטאבלט באמצעות פרטי הכניסה שלך ל-Google.\n\nנסה שוב בעוד <xliff:g id="NUMBER_2">%3$d</xliff:g> שניות."</string>
<string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="5316664559603394684">"שרטטת את קו ביטול הנעילה <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים באופן שגוי. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטלוויזיה באמצעות כניסה לחשבון Google שלך.\n\n נסה שוב בעוד <xliff:g id="NUMBER_2">%3$d</xliff:g> שניות."</string>
<string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"שרטטת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטלפון באמצעות פרטי הכניסה שלך ל-Google.\n\n נסה שוב בעוד <xliff:g id="NUMBER_2">%3$d</xliff:g> שניות."</string>
@@ -788,7 +793,7 @@
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"ביטול נעילה באמצעות הסטה."</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_pin_unlock" msgid="2469687111784035046">"ביטול נעילה באמצעות קוד גישה."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ביטול נעילה באמצעות סיסמה."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"אזור ציור קו."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"אזור הסטה."</string>
@@ -1162,16 +1167,16 @@
<string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"הזמנה להתחבר"</string>
<string name="wifi_p2p_from_message" msgid="570389174731951769">"מאת:"</string>
<string name="wifi_p2p_to_message" msgid="248968974522044099">"אל:"</string>
- <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"הקלד את קוד ה-PIN הנדרש."</string>
- <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"הקלד את קוד הגישה הנדרש."</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"קוד גישה:"</string>
<string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"הטאבלט יתנתק מרשת ה-Wi-Fi באופן זמני בשעה שהוא מחובר אל <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
<string name="wifi_p2p_frequency_conflict_message" product="tv" msgid="3087858235069421128">"הטלוויזיה תנותק באופן זמני מה-Wi-Fi בזמן שהיא מתחברת אל <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
<string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"הטלפון יתנתק מרשת ה-Wi-Fi באופן זמני בשעה שהוא מחובר אל <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
<string name="select_character" msgid="3365550120617701745">"הוסף תו"</string>
<string name="sms_control_title" msgid="7296612781128917719">"שולח הודעות SMS"</string>
<string name="sms_control_message" msgid="3867899169651496433">"<b> <xliff:g id="APP_NAME">%1$s</xliff:g> </ b> שולח מספר רב של הודעות SMS. האם ברצונך לאפשר לאפליקציה זו להמשיך לשלוח הודעות?"</string>
- <string name="sms_control_yes" msgid="3663725993855816807">"אפשר"</string>
- <string name="sms_control_no" msgid="625438561395534982">"דחה"</string>
+ <string name="sms_control_yes" msgid="3663725993855816807">"כן, זה בסדר"</string>
+ <string name="sms_control_no" msgid="625438561395534982">"לא, אין מצב"</string>
<string name="sms_short_code_confirm_message" msgid="1645436466285310855">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> רוצה לשלוח הודעה אל <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b>."</string>
<string name="sms_short_code_details" msgid="5873295990846059400">"הדבר "<b>"עלול לגרום לחיובים"</b>" בחשבון המכשיר הנייד שלך."</string>
<string name="sms_premium_short_code_details" msgid="7869234868023975"><b>"הדבר יגרום לחיובים בחשבון המכשיר הנייד שלך."</b></string>
@@ -1216,7 +1221,7 @@
<string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"שיתוף דוח על באג…"</string>
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"מנהל המערכת ביקש דוח על באג כדי לסייע בפתרון בעיות במכשיר זה. ייתכן שאפליקציות ונתונים ישותפו."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"שתף"</string>
- <string name="decline_remote_bugreport_action" msgid="6230987241608770062">"דחה"</string>
+ <string name="decline_remote_bugreport_action" msgid="6230987241608770062">"לא, אין מצב"</string>
<string name="select_input_method" msgid="8547250819326693584">"שינוי מקלדת"</string>
<string name="show_ime" msgid="2506087537466597099">"השאר אותו במסך בזמן שהמקלדת הפיזית פעילה"</string>
<string name="hardware" msgid="194658061510127999">"הצג מקלדת וירטואלית"</string>
@@ -1291,8 +1296,8 @@
<string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"האפליקציות הבאות מבקשות אישור לגשת לחשבונך, כעת ובעתיד."</string>
<string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"האם ברצונך לאפשר בקשה זו?"</string>
<string name="grant_permissions_header_text" msgid="6874497408201826708">"בקשת גישה"</string>
- <string name="allow" msgid="7225948811296386551">"אפשר"</string>
- <string name="deny" msgid="2081879885755434506">"דחה"</string>
+ <string name="allow" msgid="7225948811296386551">"כן, זה בסדר"</string>
+ <string name="deny" msgid="2081879885755434506">"לא, אין מצב"</string>
<string name="permission_request_notification_title" msgid="6486759795926237907">"בקשת הרשאה"</string>
<string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"נדרשת הרשאה\nלחשבון <xliff:g id="ACCOUNT">%s</xliff:g>."</string>
<string name="forward_intent_to_owner" msgid="1207197447013960896">"אתה משתמש באפליקציה זו מחוץ לפרופיל העבודה שלך"</string>
@@ -1463,21 +1468,21 @@
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"שכחת את הקו"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"קו ביטול נעילה שגוי"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"סיסמה שגויה"</string>
- <string name="kg_wrong_pin" msgid="1131306510833563801">"מספר PIN שגוי"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"קוד גישה שגוי"</string>
<string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"נסה שוב בעוד <xliff:g id="NUMBER">%1$d</xliff:g> שניות."</string>
<string name="kg_pattern_instructions" msgid="398978611683075868">"שרטט את קו ביטול הנעילה"</string>
- <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"הזן מספר PIN ל-SIM"</string>
- <string name="kg_pin_instructions" msgid="2377242233495111557">"הזן מספר PIN"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"הזן קוד גישה ל-SIM"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"הזן קוד גישה"</string>
<string name="kg_password_instructions" msgid="5753646556186936819">"הזן את הסיסמה"</string>
<string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"כרטיס ה-SIM מושבת כעת. הזן קוד PUK כדי להמשיך. פנה אל הספק לפרטים."</string>
- <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"הזן את קוד ה-PIN הרצוי"</string>
- <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"אשר את קוד ה-PIN הרצוי"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"הזן את קוד הגישה הרצוי"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"אשר את קוד הגישה הרצוי"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"מבטל נעילה של כרטיס SIM…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"קוד PIN שגוי."</string>
- <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"הקלד מספר PIN שאורכו 4 עד 8 ספרות."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"קוד גישה שגוי."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"הקלד קוד גישה שאורכו 4 עד 8 ספרות."</string>
<string name="kg_invalid_sim_puk_hint" msgid="6025069204539532000">"קוד PUK צריך להיות בן 8 ספרות."</string>
<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_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"קודי הגישה אינם תואמים"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ניסיונות רבים מדי לשרטוט קו ביטול נעילה."</string>
<string name="kg_login_instructions" msgid="1100551261265506448">"כדי לבטל את הנעילה, היכנס באמצעות חשבון Google שלך."</string>
<string name="kg_login_username_hint" msgid="5718534272070920364">"שם משתמש (אימייל)"</string>
@@ -1486,7 +1491,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">%1$d</xliff:g> פעמים. \n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"הקלדת קוד גישה שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. \n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"הקלדת סיסמה שגויה <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים.\n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"שרטטת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. \n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%2$d</xliff:g> שניות."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"ביצעת <xliff:g id="NUMBER_0">%1$d</xliff:g> ניסיונות שגויים לביטול נעילת הטלפון. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, הטאבלט יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו."</string>
@@ -1608,14 +1613,14 @@
<string name="print_service_installed_title" msgid="2246317169444081628">"שירות <xliff:g id="NAME">%s</xliff:g> מותקן"</string>
<string name="print_service_installed_message" msgid="5897362931070459152">"הקש כדי להפעיל"</string>
<string name="restr_pin_enter_admin_pin" msgid="8641662909467236832">"הזן את קוד הגישה של מנהל המכשיר"</string>
- <string name="restr_pin_enter_pin" msgid="3395953421368476103">"הזן מספר PIN"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"הזן קוד גישה"</string>
<string name="restr_pin_incorrect" msgid="8571512003955077924">"שגוי"</string>
- <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"מספר PIN נוכחי"</string>
- <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"מספר PIN חדש"</string>
- <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"אשר את מספר ה-PIN החדש"</string>
- <string name="restr_pin_create_pin" msgid="8017600000263450337">"צור מספר PIN לשינוי הגבלות"</string>
- <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"מספרי ה-PIN לא תואמים. נסה שוב."</string>
- <string name="restr_pin_error_too_short" msgid="8173982756265777792">"מספר ה-PIN קצר מדי. חייב להיות באורך 4 ספרות לפחות."</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"קוד גישה נוכחי"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"קוד גישה חדש"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"אשר את קוד הגישה החדש"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"צור קוד גישה לשינוי הגבלות"</string>
+ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"קודי הגישה לא תואמים. נסה שוב."</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"קוד הגישה קצר מדי. חייב להיות באורך 4 ספרות לפחות."</string>
<plurals name="restr_pin_countdown" formatted="false" msgid="9061246974881224688">
<item quantity="two">נסה שוב בעוד <xliff:g id="COUNT">%d</xliff:g> שניות</item>
<item quantity="many">נסה שוב בעוד <xliff:g id="COUNT">%d</xliff:g> שניות</item>
@@ -1641,13 +1646,13 @@
<string name="lock_to_app_toast_locked" msgid="7849470948648628704">"לא ניתן לבטל את ההצמדה של האפליקציה הזו"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"המסך מוצמד"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"הצמדת המסך בוטלה"</string>
- <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"בקש PIN לפני ביטול הצמדה"</string>
+ <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"בקש קוד גישה לפני ביטול הצמדה"</string>
<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="6875717669960212648">"הותקנה על ידי מנהל המערכת"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"עודכנה על ידי מנהל המערכת"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"נמחקה על ידי מנהל המערכת"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"כדי לעזור בשיפור חיי הסוללה, תכונת החיסכון בסוללה מצמצמת את פעולות המכשיר ומגבילה רטט, שירותי מיקום ואת רוב נתוני הרקע. אימייל, העברת הודעות ואפליקציות אחרות המסתמכות על סנכרון עשויות שלא להתעדכן, אלא אם תפתח אותן.\n\nתכונת החיסכון בסוללה מושבתת אוטומטית כשהמכשיר בטעינה."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"כדי לעזור בשיפור חיי הסוללה, תכונת החיסכון בסוללה מצמצמת את פעולות המכשיר ומגבילה רטט, שירותי מיקום ואת רוב נתוני הרקע. אימייל, העברת הודעות ואפליקציות אחרות המסתמכות על סנכרון עשויות שלא להתעדכן, אלא אם פותחים אותן.\n\nתכונת החיסכון בסוללה מושבתת אוטומטית כשהמכשיר בטעינה."</string>
<string name="data_saver_description" msgid="6015391409098303235">"כדי לסייע בהפחתת השימוש בנתונים, חוסך הנתונים (Data Saver) מונע מאפליקציות מסוימות שליחה או קבלה של נתונים ברקע. אפליקציה שבה אתה משתמש כרגע יכולה לגשת לנתונים, אבל בתדירות נמוכה יותר. משמעות הדבר היא, למשל, שתמונות יוצגו רק לאחר שתקיש עליהן."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"האם להפעיל את חוסך הנתונים (Data Saver)?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"הפעל"</string>
@@ -1794,11 +1799,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"העבר למצב קלט טקסט לצורך הזנת השעה"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"העבר למצב שעון לצורך הזנת השעה"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"אפשרויות מילוי אוטומטי"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"שמירה לצורך מילוי אוטומטי"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"לא ניתן למלא את התוכן באופן אוטומטי"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"לשמור ב-<xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"לשמור <xliff:g id="TYPE">%1$s</xliff:g> ב-<xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"לשמור את <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ב-<xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"לשמור את <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> ב-<xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"לשמור בשירות <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"האם לשמור <xliff:g id="TYPE">%1$s</xliff:g> בשירות <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"האם לשמור <xliff:g id="TYPE_0">%1$s</xliff:g> ו<xliff:g id="TYPE_1">%2$s</xliff:g> בשירות <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"האם לשמור <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ו<xliff:g id="TYPE_2">%3$s</xliff:g> בשירות <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"שמור"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"לא, תודה"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"סיסמה"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index f627b22..f5da17e 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -99,7 +99,14 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"この場所では、携帯通信会社により音声通話と緊急通報が一時的に停止されています"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ネットワークにアクセスできません"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"受信状態を改善するには、[システム] > [ネットワークとインターネット] > [モバイル ネットワーク] > [優先ネットワーク タイプ] で選択したタイプを変更してみてください。"</string>
- <string name="peerTtyModeFull" msgid="6165351790010341421">"ピアから、TTYモードをFULLにするようリクエストされました"</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"通知"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"電話の転送"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"緊急通報待機モード"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"モバイルデータ通知"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS メッセージ"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ボイスメール メッセージ"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 通話"</string>
+ <string name="peerTtyModeFull" msgid="6165351790010341421">"ピアから、TTY モードを FULL にするようリクエストされました"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ピアから、TTYモードをHCOにするようリクエストされました"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ピアから、TTYモードをVCOにするようリクエストされました"</string>
<string name="peerTtyModeOff" msgid="3280819717850602205">"ピアから、TTYモードをOFFにするようリクエストされました"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ユーザーがアクセスしているウィンドウのコンテンツを検査します。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"タッチガイドの有効化"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"タップしたアイテムが読み上げられ、ジェスチャーで画面のガイドを利用できます。"</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"ウェブアクセシビリティ拡張の有効化"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"スクリプトをインストールしてアプリコンテンツにアクセスしやすくできます。"</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"入力テキストの監視"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"クレジットカードの番号やパスワードなどの個人データが含まれます。"</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"画面の拡大の制御"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"時刻をテキストで入力するモードに切り替えます。"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"時刻を時計で入力するモードに切り替えます。"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"自動入力のオプション"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"保存して自動入力で使用"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"コンテンツを自動入力できません"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> に保存しますか?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g>を <xliff:g id="LABEL">%2$s</xliff:g> に保存しますか?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>、<xliff:g id="TYPE_1">%2$s</xliff:g>を <xliff:g id="LABEL">%3$s</xliff:g> に保存しますか?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>、<xliff:g id="TYPE_1">%2$s</xliff:g>、<xliff:g id="TYPE_2">%3$s</xliff:g>を <xliff:g id="LABEL">%4$s</xliff:g> に保存しますか?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> に保存しますか?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g>を <b><xliff:g id="LABEL">%2$s</xliff:g></b> に保存しますか?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g>、<xliff:g id="TYPE_1">%2$s</xliff:g>を <b><xliff:g id="LABEL">%3$s</xliff:g></b> に保存しますか?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>、<xliff:g id="TYPE_1">%2$s</xliff:g>、<xliff:g id="TYPE_2">%3$s</xliff:g>を <b><xliff:g id="LABEL">%4$s</xliff:g></b> に保存しますか?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"はい"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"いいえ"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"パスワード"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 6157f6b..bf0f5da 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"ხმოვანი და გადაუდებელი ზარები დროებით შეიზღუდა თქვენი ოპერატორის მიერ ამ მდებარეობაზე"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ქსელთან დაკავშირება ვერ ხერხდება"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"მიღების გასაუმჯობესებლად ცადეთ არჩეული ტიპის შეცვლა აქ: სისტემა > ქსელი და ინტერნეტი > მობილური ქსელები > ქსელის სასურველი ტიპი."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"გაფრთხილებები"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"ზარის გადამისამართება"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"გადაუდებელი გადმორეკვის რეჟიმი"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"მობილური ინტერნეტის შეტყობინებები"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS შეტყობინებები"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ხმოვანი ფოსტის შეტყობინებები"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"დარეკვა Wi-Fi-ს მეშვეობით"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"მოთხოვნილია კვანძი TTY რეჟიმი FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"მოთხოვნილია კვანძი TTY რეჟიმი HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"მოთხოვნილია კვანძი TTY რეჟიმი VCO"</string>
@@ -281,11 +288,9 @@
<string name="permgrouplab_sensors" msgid="416037179223226722">"სხეულის სენსორები"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"თქვენი სასიცოცხლო ფუნქციების შესახებ სენსორის მონაცემებზე წვდომა"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ფანჯრის კონტენტის მოძიება"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"შეამოწმეთ იმ ფანჯრის კონტექტი, რომელშიც მუშაობთ."</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"იმ ფანჯრის კონტენტის შემოწმება, რომელშიც მუშაობთ."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"„შეხებით აღმოჩენის“ ჩართვა"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"ერთეულები, რომლებსაც შეეხებით, წაიკითხება ხმამაღლა, ხოლო ეკრანის დათვალიერება ჟესტების მეშვეობით იქნება შესაძლებელი."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"ვებზე გამარტივებული წვდომის დამატებითი შესაძლებლობების ჩართვა"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"შესაძლებელია სკრიპტების ინსტალაცია აპის კონტენტის წვდომადობის უზრუნველსაყოფად."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"თქვენ მიერ აკრეფილ ტექსტზე დაკვირვება"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"შეიცავს ისეთ პირად მონაცემებს, როგორიცაა საკრედიტო ბარათის ნომრები და პაროლები."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"ერანის გადიდების მართვა"</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"დაინსტალირებულია თქვენი ადმინისტრატორის მიერ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"განახლებულია თქვენი ადმინისტრატორის მიერ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"წაიშალა თქვენი ადმინისტრატორის მიერ"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"ელემენტის მოქმედების ვადის გაუმჯობესებისათვის, ელემენტის დამზოგი ამცირებს თქვენი მოწყობილობის შესრულებას და ზღუდავს ვიბრაციას, ადგილმდებარეობის მომსახურებებს და ძირითად ფონურ მონაცემებს. ელ-ფოსტა, შეტყობინებები და სხვა სინქრონიზაციაზე დაყრდნობილი აპლიკაციების განახლება არ მოხდება მათ გახსნეამდე. \n\n ელემენტის დამზოგველი ავტომატურად გამოირთვება, როდესაც თქვენს მოწყობილობას დამტენთან შეაერთებთ."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"ელემენტის მოქმედების ვადის გაუმჯობესებისათვის, ელემენტის დამზოგი ამცირებს თქვენი მოწყობილობის ფუნქციონალობას და ზღუდავს ვიბრაციას, ადგილმდებარეობის მომსახურებებს და ძირითად ფონურ მონაცემებს. ელფოსტა, შეტყობინებები და სხვა სინქრონიზაციაზე დაყრდნობილი აპების განახლება არ მოხდება მათ გახსნამდე. \n\n ელემენტის დამზოგველი ავტომატურად გამოირთვება, როდესაც თქვენს მოწყობილობას დამტენთან შეაერთებთ."</string>
<string name="data_saver_description" msgid="6015391409098303235">"მობილური ინტერნეტის მოხმარების შემცირების მიზნით, მონაცემთა დამზოგველი ზოგიერთ აპს ფონურ რეჟიმში მონაცემთა გაგზავნასა და მიღებას შეუზღუდავს. თქვენ მიერ ამჟამად გამოყენებული აპი მაინც შეძლებს მობილურ ინტერნეტზე წვდომას, თუმცა ამას ნაკლები სიხშირით განახორციელებს. ეს ნიშნავს, რომ, მაგალითად, სურათები არ გამოჩნდება მანამ, სანამ მათ საგანგებოდ არ შეეხებით."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ჩაირთოს მონაცემთა დამზოგველი?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ჩართვა"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"დროის შეყვანისთვის ტექსტის შეყვანის რეჟიმზე გადართვა."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"დროის შეყვანისთვის საათის რეჟიმზე გადართვა."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"ავტომატური შევსების ვარიანტები"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"ავტომატური შევსებისთვის შენახვა"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"კონტენტის ავტომატური შევსება ვერ მოხერხდება"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"გსურთ „<xliff:g id="LABEL">%1$s</xliff:g>“-ში შენახვა?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"გსურთ, შეინახოთ <xliff:g id="TYPE">%1$s</xliff:g> „<xliff:g id="LABEL">%2$s</xliff:g>“-ში?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"გსურთ, <xliff:g id="LABEL">%3$s</xliff:g>-ში შეინახოთ <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"გსურთ, <xliff:g id="LABEL">%4$s</xliff:g>-ში შეინახოთ <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"გსურთ, შეინახოთ <b><xliff:g id="LABEL">%1$s</xliff:g>-ში</b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"გსურთ, შეინახოთ <xliff:g id="TYPE">%1$s</xliff:g> <b><xliff:g id="LABEL">%2$s</xliff:g>-ში</b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"გსურთ, შეინახოთ <xliff:g id="TYPE_0">%1$s</xliff:g> და <xliff:g id="TYPE_1">%2$s</xliff:g> <b><xliff:g id="LABEL">%3$s</xliff:g>-ში</b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"გსურთ, შეინახოთ <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, და <xliff:g id="TYPE_2">%3$s</xliff:g> <b><xliff:g id="LABEL">%4$s</xliff:g>-ში</b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"შენახვა"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"არა, გმადლობთ"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"პაროლი"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index bf7fdf6..7b30f28 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Оператор осы жерде дауыстық қоңыраулар мен жедел қызметке қоңырауларды уақытша тоқтатты"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Желіге қосылу мүмкін емес"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Қабылдауды жақсарту үшін \"Жүйе > Желі және интернет > Мобильдік желілер > Қалаған желі түрі\" тармағынан түрді өзгертіп көріңіз."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Дабылдар"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Қоңырауды басқа нөмірге бағыттау"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Шұғыл кері қоңырау шалу режимі"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Мобильдік деректер дабылдары"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS хабарлары"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Дауыстық пошта хабарлары"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi қоңыраулары"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Пир TTY режимі ТОЛЫҚ сұрады"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Пир TTY режимінің HCO сұрады"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Пир TTY режимінің VCO сұрады"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Ашық тұрған терезе мазмұнын тексеру."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Түртілген элементтерді дыбыстау функциясын қосу"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Түртілген элементтер дауыстап айтылады және экранды қимылдар арқылы зерттеуге болады."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Ғаламторға кірудің жетілдірілген әдісін қосу"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Қолданба мазұнына кіруді жеңілдету үшін скрипт орнатылуы мүмкін."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Терілген мәтінді тексеру"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Кредит карта нөмірі және кілтсөздер сияқты жеке деректерді қоса."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Дисплей ұлғайтуды басқару"</string>
@@ -1733,11 +1738,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Уақытты енгізу үшін мәтін енгізу режиміне өтіңіз."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Уақытты енгізу үшін сағат режиміне өтіңіз."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Автотолтыру опциялары"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Автотолтыру үшін сақтау"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Мазмұндар автотолтырылмайды"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> жүйесінде сақталсын ба?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> деректері <xliff:g id="LABEL">%2$s</xliff:g> жүйесінде сақталсын ба?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> <xliff:g id="LABEL">%3$s</xliff:g> ішіне сақтау керек пе?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> <xliff:g id="LABEL">%4$s</xliff:g> ішіне сақтау керек пе?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"\"<xliff:g id="LABEL">%1$s</xliff:g>\" қызметінде сақталсын ба?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> \"<xliff:g id="LABEL">%2$s</xliff:g>\" қызметінде сақталсын ба?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> және <xliff:g id="TYPE_1">%2$s</xliff:g> \"<xliff:g id="LABEL">%3$s</xliff:g>\" қызметінде сақталсын ба?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> және <xliff:g id="TYPE_2">%3$s</xliff:g> \"<xliff:g id="LABEL">%4$s</xliff:g>\" қызметінде сақталсын ба?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Сақтау"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Жоқ, рақмет"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"құпия сөз"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 7e97f95..59c8c20 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"ក្រុមហ៊ុនបម្រើសេវាទូរសព្ទរបស់អ្នកបានផ្អាកការហៅដោយសំឡេង និងការហៅបន្ទាន់ជាបណ្តោះអាសន្ននៅទីតាំងនេះ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"មិនអាចភ្ជាប់ទៅបណ្តាញបានទេ"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ដើម្បីកែលម្អការទទួលយក សាកល្បងប្តូរប្រភេទដែលបានជ្រើសរើសនៅ ប្រព័ន្ធ > បណ្តាញ និងអ៊ីនធឺណិត > បណ្តាញទូរសព្ទចល័ត > ប្រភេទបណ្តាញដែលចង់ប្រើ។"</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"ការជូនដំណឹង"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"ការបញ្ជូនការហៅទូរសព្ទបន្ត"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"មុខងារហៅត្រឡប់វិញបន្ទាន់"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"ការជូនដំណឹងអំពីទិន្នន័យទូរសព្ទចល័ត"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"សារ SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"សារជាសំឡេង"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"ការហៅទូរសព្ទតាម Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ម៉ាស៊ីនកូនបានស្នើ TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ម៉ាស៊ីនកូនបានស្នើ TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ម៉ាស៊ីនកូនបានស្នើ TTY Mode VCO"</string>
@@ -274,20 +281,18 @@
<string name="permgroupdesc_storage" msgid="637758554581589203">"ចូលដំណើការរូបភាព មេឌៀ និងឯកសារនៅលើឧបករណ៍របស់អ្នក"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"មីក្រូហ្វូន"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ថតសំឡេង"</string>
- <string name="permgrouplab_camera" msgid="4820372495894586615">"ម៉ាស៊ីនថត"</string>
+ <string name="permgrouplab_camera" msgid="4820372495894586615">"កាមេរ៉ា"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ថតរូប និងថតវីដេអូ"</string>
- <string name="permgrouplab_phone" msgid="5229115638567440675">"ទូរស័ព្ទ"</string>
+ <string name="permgrouplab_phone" msgid="5229115638567440675">"ទូរសព្ទ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ហៅទូរស័ព្ទ និងគ្រប់គ្រងការហៅទូរស័ព្ទ"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"ឧបករណ៍ចាប់សញ្ញារាងកាយ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ចូលដំណើរការទិន្នន័យឧបករណ៍ចាប់សញ្ញាអំពីស្ថានភាពសុខភាពរបស់អ្នក"</string>
- <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ទៅយកមាតិកាបង្អួច"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ពិនិត្យមាតិកាបង្អួចដែលអ្នកកំពុងទាក់ទងជាមួយ។"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ទាញយកមាតិកាវិនដូ"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ពិនិត្យមាតិកាវិនដូដែលអ្នកកំពុងទាក់ទងជាមួយ។"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"បើកការរកមើលដោយប៉ះ"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"ធាតុដែលបានប៉ះនឹងត្រូវបានអានឮៗ ហើយអេក្រង់នោះអាចត្រូវបានស្វែងរកដោយប្រើកាយវិការ។"</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"បើកការចូលដំណើរការបណ្ដាញដែលបានធ្វើឲ្យប្រសើរ"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"ស្គ្រីបអាចត្រូវបានដំឡើង ដើម្បីធ្វើឲ្យមាតិកាកម្មវិធីអាចចូលដំណើរការបានកាន់តែច្រើន។"</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"មើលអត្ថបទដែលវាយ"</string>
- <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"រួមបញ្ចូលទិន្នន័យផ្ទាល់ខ្លួន ដូចជាលេខកាតឥណទាន និងពាក្យសម្ងាត់។"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"រួមបញ្ចូលទិន្នន័យផ្ទាល់ខ្លួន ដូចជាលេខបណ្ណឥណទាន និងពាក្យសម្ងាត់។"</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"គ្រប់គ្រងការពង្រីកអេក្រង់"</string>
<string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"គ្រប់គ្រងការកំណត់ទីតាំង និងកម្រិតពង្រីករបស់អេក្រង់"</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"ធ្វើកាយវិការ"</string>
@@ -1076,7 +1081,7 @@
<string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"កំណត់សំឡេងរោទ៍ស្ងាត់"</string>
<string name="volume_call" msgid="3941680041282788711">"កម្រិតសំឡេងហៅចូល"</string>
<string name="volume_bluetooth_call" msgid="2002891926351151534">"កម្រិតសំឡេងហៅចូលតាមប៊្លូធូស"</string>
- <string name="volume_alarm" msgid="1985191616042689100">"កម្រិតសំឡេងរោទ៍"</string>
+ <string name="volume_alarm" msgid="1985191616042689100">"កម្រិតសំឡេងម៉ោងរោទ៍"</string>
<string name="volume_notification" msgid="2422265656744276715">"កម្រិតសំឡេងការជូនដំណឹង"</string>
<string name="volume_unknown" msgid="1400219669770445902">"កម្រិតសំឡេង"</string>
<string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"កម្រិតសំឡេងប៊្លូធូស"</string>
@@ -1397,7 +1402,7 @@
<string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s មិនគាំទ្រប្រវត្តិរូបការងារ"</string>
<string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"កុំព្យូទ័របន្ទះ"</string>
<string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"ទូរទស្សន៍"</string>
- <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"ទូរស័ព្ទ"</string>
+ <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"ទូរសព្ទ"</string>
<string name="default_audio_route_name_headphones" msgid="8119971843803439110">"កាស"</string>
<string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"ភ្ជាប់អូប៉ាល័រ"</string>
<string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
@@ -1605,7 +1610,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ដំឡើងដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ធ្វើបច្ចុប្បន្នភាពដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"លុបដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"ដើម្បីជួយឲ្យថាមពលថ្មប្រសើរឡើង កម្មវិធីសន្សំសំចៃថាមពលថ្មកាត់បន្ថយប្រតិបត្តិការឧបករណ៍របស់អ្នក និងកម្រិតភាពញ័រ សេវាកម្មទីតាំង និងទិន្នន័យផ្ទៃខាងក្រោយស្ទើរតែទាំងអស់។ ការផ្ញើសារអ៊ីម៉ែល និងកម្មវិធីផ្សេងទៀតដែលពឹងផ្អែកលើការធ្វើសមកាលកម្មអាចនឹងមិនធ្វើបច្ចុប្បន្នភាពទេ លុះត្រាតែអ្នកបើកពួកវា។\n\nកម្មវិធីសន្សំសំចៃបិទដោយស្វ័យប្រវត្តិ នៅពេលដែលឧបករណ៍របស់អ្នកកំពុងសាកថ្ម។"</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"ដើម្បីជួយឲ្យថាមពលថ្មប្រសើរឡើង កម្មវិធីសន្សំសំចៃថ្មកាត់បន្ថយប្រតិបត្តិការឧបករណ៍របស់អ្នក និងកម្រិតភាពញ័រ សេវាកម្មទីតាំង និងទិន្នន័យផ្ទៃខាងក្រោយស្ទើរតែទាំងអស់។ អ៊ីមែល ការផ្ញើសារ និងកម្មវិធីផ្សេងទៀតដែលពឹងផ្អែកលើការធ្វើសមកាលកម្មអាចនឹងមិនដំឡើងកំណែទេ លុះត្រាតែអ្នកបើកពួកវា។\n\nកម្មវិធីសន្សំសំចៃថ្មបិទដោយស្វ័យប្រវត្តិ នៅពេលដែលឧបករណ៍របស់អ្នកកំពុងសាកថ្ម។"</string>
<string name="data_saver_description" msgid="6015391409098303235">"ដើម្បីជួយកាត់បន្ថយការប្រើប្រាស់ទិន្នន័យ កម្មវិធីសន្សំសំចៃទិន្នន័យរារាំងកម្មវិធីមួយចំនួនមិនឲ្យបញ្ជូន ឬទទួលទិន្នន័យនៅផ្ទៃខាងក្រោយទេ។ កម្មវិធីដែលអ្នកកំពុងប្រើនាពេលបច្ចុប្បន្នអាចចូលប្រើប្រាស់ទិន្នន័យបាន ប៉ុន្តែអាចនឹងមិនញឹកញាប់ដូចមុនទេ។ ឧទាហរណ៍ រូបភាពមិនបង្ហាញទេ លុះត្រាតែអ្នកប៉ះរូបភាពទាំងនោះ។"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"បើកកម្មវិធីសន្សំសំចៃទិន្នន័យឬ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"បើក"</string>
@@ -1685,7 +1690,7 @@
<string name="language_selection_title" msgid="2680677278159281088">"បន្ថែមភាសា"</string>
<string name="country_selection_title" msgid="2954859441620215513">"ចំណូលចិត្តតំបន់"</string>
<string name="search_language_hint" msgid="7042102592055108574">"វាយបញ្ចូលឈ្មោះភាសា"</string>
- <string name="language_picker_section_suggested" msgid="8414489646861640885">"បានស្នើ"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"បានណែនាំ"</string>
<string name="language_picker_section_all" msgid="3097279199511617537">"ភាសាទាំងអស់"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"តំបន់ទាំងអស់"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"ស្វែងរក"</string>
@@ -1734,11 +1739,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"ប្តូរទៅមុខងារបញ្ចូលអក្សរសម្រាប់ការបញ្ចូលម៉ោង។"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"ប្តូរទៅមុខងារនាឡិកាសម្រាប់ការបញ្ចូលម៉ោង។"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"ជម្រើសបំពេញដោយស្វ័យប្រវត្តិ"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"រក្សាទុកសម្រាប់បំពេញដោយស្វ័យប្រវត្តិ"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"មិនអាចបំពេញមាតិកាដោយស្វ័យប្រវត្តិបានទេ"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"រក្សាទុកទៅក្នុង <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"រក្សាទុក <xliff:g id="TYPE">%1$s</xliff:g> ទៅក្នុង <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"រក្សាទុក <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ទៅក្នុង <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"រក្សាទុក <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> ទៅក្នុង <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"រក្សាទុកទៅក្នុង <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"រក្សាទុក <xliff:g id="TYPE">%1$s</xliff:g> ទៅក្នុង <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"រក្សាទុក <xliff:g id="TYPE_0">%1$s</xliff:g> និង <xliff:g id="TYPE_1">%2$s</xliff:g> ទៅក្នុង <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"រក្សាទុក <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, និង <xliff:g id="TYPE_2">%3$s</xliff:g> ទៅក្នុង <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"រក្សាទុក"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"ទេ អរគុណ"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"ពាក្យសម្ងាត់"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 94f4df8..906c88c 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"ನಿಮ್ಮ ವಾಹಕವು ಈ ಸ್ಥಳದಲ್ಲಿ ತಾತ್ಕಾಲಿಕವಾಗಿ ಧ್ವನಿ ಮತ್ತು ತುರ್ತು ಕರೆಗಳನ್ನು ಅಮಾನತ್ತುಗೊಳಿಸಿದೆ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ನೆಟ್ವರ್ಕ್ ತಲುಪಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕ ಪಡೆಯುವುದನ್ನು ಸುಧಾರಿಸಲು, ಆಯ್ಕೆ ಮಾಡಿರುವ ವಿಧವನ್ನು ಸಿಸ್ಟಂ > ನೆಟ್ವರ್ಕ್ ಮತ್ತು ಇಂಟರ್ನೆಟ್ > ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ಗಳು > ಆದ್ಯತೆಯ ನೆಟ್ವರ್ಕ್ ವಿಧದಲ್ಲಿ ಬದಲಿಸಿ ನೋಡಿ."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"ಎಚ್ಚರಿಕೆಗಳು"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"ಕರೆ ಫಾರ್ವರ್ಡ್ ಮಾಡುವಿಕೆ"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ತುರ್ತು ಕಾಲ್ಬ್ಯಾಕ್ ಮೋಡ್"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"ಮೊಬೈಲ್ ಡೇಟಾ ಎಚ್ಚರಿಕೆಗಳು"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"ಎಸ್ಎಂಎಸ್ ಸಂದೇಶಗಳು"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ಧ್ವನಿಮೇಲ್ ಸಂದೇಶಗಳು"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ VCO"</string>
@@ -191,7 +198,7 @@
<string name="power_dialog" product="tv" msgid="6153888706430556356">"ಟಿವಿ ಆಯ್ಕೆಗಳು"</string>
<string name="power_dialog" product="default" msgid="1319919075463988638">"ಫೋನ್ ಆಯ್ಕೆಗಳು"</string>
<string name="silent_mode" msgid="7167703389802618663">"ಶಾಂತ ಮೋಡ್"</string>
- <string name="turn_on_radio" msgid="3912793092339962371">"ವೈರ್ಲೆಸ್ ಆನ್ ಮಾಡು"</string>
+ <string name="turn_on_radio" msgid="3912793092339962371">"ವೈರ್ಲೆಸ್ ಆನ್ ಮಾಡಿ"</string>
<string name="turn_off_radio" msgid="8198784949987062346">"ವೈರ್ಲೆಸ್ ಆಫ್ ಮಾಡು"</string>
<string name="screen_lock" msgid="799094655496098153">"ಸ್ಕ್ರೀನ್ ಲಾಕ್"</string>
<string name="power_off" msgid="4266614107412865048">"ಪವರ್ ಆಫ್ ಮಾಡು"</string>
@@ -280,16 +287,14 @@
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ಫೋನ್ ಕರೆ ಮಾಡಲು ಹಾಗೂ ನಿರ್ವಹಿಸಲು"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"ದೇಹ ಸೆನ್ಸರ್ಗಳು"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ನಿಮ್ಮ ಮುಖ್ಯ ಲಕ್ಷಣಗಳ ಕುರಿತು ಸೆನ್ಸಾರ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
- <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ವಿಂಡೋ ವಿಷಯವನ್ನು ಹಿಂಪಡೆದುಕೊಳ್ಳುತ್ತದೆ"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ನೀವು ಸಂವಹನ ನಡೆಸುತ್ತಿರುವ ವಿಂಡೋದ ವಿಷಯವನ್ನು ಪರೀಕ್ಷಿಸಿ."</string>
- <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ಸ್ಪರ್ಶಿಸುವ ಮೂಲಕ ಎಕ್ಸ್ಪ್ಲೋರ್ ಆನ್ ಮಾಡಿ"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ವಿಂಡೋ ವಿಷಯವನ್ನು ಹಿಂಪಡೆಯುತ್ತದೆ"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ನೀವು ಬಳಸುತ್ತಿರುವ ವಿಂಡೋದ ವಿಷಯ ಪರೀಕ್ಷಿಸುತ್ತದೆ."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ಸ್ಪರ್ಶ-ಎಕ್ಸ್ಪ್ಲೋರ್ ಆನ್ ಮಾಡುತ್ತದೆ"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"ಟ್ಯಾಪ್ ಮಾಡಲಾದ ಐಟಂಗಳನ್ನು ಗಟ್ಟಿಯಾಗಿ ಹೇಳಲಾಗುತ್ತದೆ ಮತ್ತು ಗೆಸ್ಚರ್ಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಪರದೆಯನ್ನು ಎಕ್ಸ್ಪ್ಲೋರ್ ಮಾಡಬಹುದಾಗಿದೆ."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"ವರ್ಧಿತ ವೆಬ್ ಪ್ರವೇಶಿಸುವಿಕೆ ಆನ್ ಆಗುವಿಕೆ"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"ಅಪ್ಲಿಕೇಶನ್ ವಿಷಯ ಇನ್ನಷ್ಟು ಲಭ್ಯವಾಗುವಂತೆ ಮಾಡಲು ಸ್ಕ್ರಿಪ್ಟ್ಗಳನ್ನು ಸ್ಥಾಪಿಸಬಹುದಾಗಿದೆ."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"ನೀವು ಟೈಪ್ ಮಾಡುವ ಪಠ್ಯವನ್ನು ಗಮನಿಸುತ್ತದೆ"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಸಂಖ್ಯೆಗಳು ಮತ್ತು ಪಾಸ್ವರ್ಡ್ಗಳಂತಹ ವೈಯಕ್ತಿಕ ಡೇಟಾವನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ."</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"ಪ್ರದರ್ಶನದ ವರ್ಧಕವನ್ನು ನಿಯಂತ್ರಿಸಿ"</string>
- <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"ಪ್ರದರ್ಶನದ ಝೂಮ್ ಮಟ್ಟ ಮತ್ತು ಸ್ಥಾನ ನಿರ್ಧಾರವನ್ನು ನಿಯಂತ್ರಿಸಿ."</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"ಡಿಸ್ಪ್ಲೇ ವರ್ಧಕ ನಿಯಂತ್ರಿಸುತ್ತದೆ"</string>
+ <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"ಪ್ರದರ್ಶನದ ಝೂಮ್ ಮಟ್ಟ ಮತ್ತು ಸ್ಥಳ ನಿರ್ಧಾರವನ್ನು ನಿಯಂತ್ರಿಸಿ."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"ಗೆಸ್ಚರ್ಗಳನ್ನು ಮಾಡಿ"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"ಟ್ಯಾಪ್ ಮಾಡಬಹುದು, ಸ್ವೈಪ್ ಮಾಡಬಹುದು, ಪಿಂಚ್ ಮಾಡಬಹುದು ಮತ್ತು ಇತರ ಗೆಸ್ಚರ್ಗಳನ್ನು ಮಾಡಬಹುದು."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೂಚಕಗಳು"</string>
@@ -380,8 +385,8 @@
<string name="permdesc_writeCalendar" product="tablet" msgid="1675270619903625982">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಲೆಂಡರ್ನ ಮಾಲೀಕರಿಂದ ಬಂದಿರಬಹುದಾದ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅವರ ಮಾಲೀಕರಿಗೆ ತಿಳಿಸದಂತೆ ಘಟನೆಗಳು ಬದಲಾಯಿಸುವುದು."</string>
<string name="permdesc_writeCalendar" product="tv" msgid="9017809326268135866">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಟಿವಿಯಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಲೆಂಡರ್ನ ಮಾಲೀಕರಿಂದ ಬಂದಿರಬಹುದಾದ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅವರ ಮಾಲೀಕರಿಗೆ ತಿಳಿಸದಂತೆ ಘಟನೆಗಳು ಬದಲಾಯಿಸುವುದು."</string>
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಫೋನ್ನಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಲೆಂಡರ್ನ ಮಾಲೀಕರಿಂದ ಬಂದಿರಬಹುದಾದ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅವರ ಮಾಲೀಕರಿಗೆ ತಿಳಿಸದಂತೆ ಘಟನೆಗಳು ಬದಲಾಯಿಸುವುದು."</string>
- <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"ಹೆಚ್ಚುವರಿ ಸ್ಥಾನ ಪೂರೈಕೆದಾರರ ಆದೇಶಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
- <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"ಹೆಚ್ಚಿನ ಸ್ಥಾನ ಪೂರೈಕೆದಾರ ಆದೇಶಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು GPS ಅಥವಾ ಇತರ ಸ್ಥಾನ ಮೂಲಗಳ ಕಾರ್ಯಾಚರಣೆಯಲ್ಲಿ ಮಧ್ಯ ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸಬಹುದು."</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"ಹೆಚ್ಚುವರಿ ಸ್ಥಳ ಪೂರೈಕೆದಾರರ ಆದೇಶಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"ಹೆಚ್ಚಿನ ಸ್ಥಳ ಪೂರೈಕೆದಾರ ಆದೇಶಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು GPS ಅಥವಾ ಇತರ ಸ್ಥಳ ಮೂಲಗಳ ಕಾರ್ಯಾಚರಣೆಯಲ್ಲಿ ಮಧ್ಯ ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸಬಹುದು."</string>
<string name="permlab_accessFineLocation" msgid="251034415460950944">"ನಿಖರ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ (GPS ಮತ್ತು ನೆಟ್ವರ್ಕ್-ಆಧಾರಿತ)"</string>
<string name="permdesc_accessFineLocation" msgid="5821994817969957884">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಸೆಲ್ ಟವರ್ಗಳು ಮತ್ತು ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ನಂತಹ GPS ಅಥವಾ ನೆಟ್ವರ್ಕ್ ಮೂಲಗಳ ಆಧಾರದ ಮೇಲೆ ಪಡೆಯಬಹುದು. ಈ ಸ್ಥಳ ಸೇವೆಗಳನ್ನು ಆನ್ ಮಾಡಿರಬೇಕು ಮತ್ತು ಅವುಗಳನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಸಾಧ್ಯವಾಗುವಂತೆ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿ ಅವುಗಳು ಲಭ್ಯವಿರಬೇಕು. ಇದು ಬ್ಯಾಟರಿ ಬಳಕೆಯನ್ನು ಹೆಚ್ಚಿಸಬಹುದು."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"ಅಂದಾಜು ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ (ನೆಟ್ವರ್ಕ್-ಆಧಾರಿತ)"</string>
@@ -499,8 +504,8 @@
<string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"ನಿಮ್ಮ SD ಕಾರ್ಡ್ನ ವಿಷಯಗಳನ್ನು ಮಾರ್ಪಡಿಸಿ ಅಥವಾ ಅಳಿಸಿ"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"USB ಸಂಗ್ರಹಣೆಗೆ ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"SD ಕಾರ್ಡ್ಗೆ ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
- <string name="permlab_use_sip" msgid="2052499390128979920">"SIP ಕರೆಗಳನ್ನು ಮಾಡಿ/ಸ್ವೀಕರಿಸಿ"</string>
- <string name="permdesc_use_sip" msgid="2297804849860225257">"SIP ಕರೆಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ಸ್ವೀಕರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
+ <string name="permlab_use_sip" msgid="2052499390128979920">"ಎಸ್ಐಪಿ ಕರೆಗಳನ್ನು ಮಾಡಿ/ಸ್ವೀಕರಿಸಿ"</string>
+ <string name="permdesc_use_sip" msgid="2297804849860225257">"ಎಸ್ಐಪಿ ಕರೆಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ಸ್ವೀಕರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_register_sim_subscription" msgid="3166535485877549177">"ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಿಮ್ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಿ"</string>
<string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"ಅಪ್ಲಿಕೇಶನ್ಗೆ ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಿಮ್ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಲು ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_register_call_provider" msgid="108102120289029841">"ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಿ"</string>
@@ -712,7 +717,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ"</string>
<string name="lockscreen_storage_locked" msgid="9167551160010625200">"ಎಲ್ಲ ವೈಶಿಷ್ಟ್ಯಗಳು ಮತ್ತು ಡೇಟಾಗೆ ಅನ್ಲಾಕ್ ಮಾಡಿ"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"ಗರಿಷ್ಠ ಫೇಸ್ ಅನ್ಲಾಕ್ ಪ್ರಯತ್ನಗಳು ಮೀರಿವೆ"</string>
- <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"ಯಾವುದೇ ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ"</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ"</string>
<string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿ ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ."</string>
<string name="lockscreen_missing_sim_message" product="tv" msgid="1943633865476989599">"ಟಿವಿಯಲ್ಲಿ ಯಾವುದೇ ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ."</string>
<string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"ಫೋನ್ನಲ್ಲಿ ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ."</string>
@@ -724,7 +729,7 @@
<string name="lockscreen_transport_next_description" msgid="573285210424377338">"ಮುಂದಿನ ಟ್ರ್ಯಾಕ್"</string>
<string name="lockscreen_transport_pause_description" msgid="3980308465056173363">"ವಿರಾಮಗೊಳಿಸು"</string>
<string name="lockscreen_transport_play_description" msgid="1901258823643886401">"ಪ್ಲೇ ಮಾಡು"</string>
- <string name="lockscreen_transport_stop_description" msgid="5907083260651210034">"ನಿಲ್ಲಿಸು"</string>
+ <string name="lockscreen_transport_stop_description" msgid="5907083260651210034">"ನಿಲ್ಲಿಸಿ"</string>
<string name="lockscreen_transport_rew_description" msgid="6944412838651990410">"ರಿವೈಂಡ್ ಮಾಡು"</string>
<string name="lockscreen_transport_ffw_description" msgid="42987149870928985">"ವೇಗವಾಗಿ ಮುಂದಕ್ಕೆ"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"ತುರ್ತು ಕರೆಗಳು ಮಾತ್ರ"</string>
@@ -752,7 +757,7 @@
<string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"ಅನ್ಲಾಕ್ ಮಾಡಲು, ನಿಮ್ಮ Google ಖಾತೆ ಬಳಸಿಕೊಂಡು ಸೈನ್ ಇನ್ ಮಾಡಿ."</string>
<string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"ಬಳಕೆದಾರಹೆಸರು (ಇಮೇಲ್)"</string>
<string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"ಪಾಸ್ವರ್ಡ್"</string>
- <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"ಸೈನ್ ಇನ್ ಮಾಡು"</string>
+ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"ಸೈನ್ ಇನ್"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"ಅಮಾನ್ಯ ಬಳಕೆದಾರಹೆಸರು ಅಥವಾ ಪಾಸ್ವರ್ಡ್."</string>
<string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"ನಿಮ್ಮ ಬಳಕೆದಾರಹೆಸರು ಅಥವಾ ಪಾಸ್ವರ್ಡ್ ಮರೆತಿರುವಿರಾ?\n"<b>"google.com/accounts/recovery"</b>" ಗೆ ಭೇಟಿ ನೀಡಿ."</string>
<string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ..."</string>
@@ -845,7 +850,7 @@
<string name="prepend_shortcut_label" msgid="2572214461676015642">"ಮೆನು+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
- <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"ಅಳಿಸು"</string>
+ <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"ಅಳಿಸಿ"</string>
<string name="search_go" msgid="8298016669822141719">"ಹುಡುಕಿ"</string>
<string name="search_hint" msgid="1733947260773056054">"ಹುಡುಕಿ…"</string>
<string name="searchview_description_search" msgid="6749826639098512120">"ಹುಡುಕಿ"</string>
@@ -961,7 +966,7 @@
<string name="paste" msgid="5629880836805036433">"ಅಂಟಿಸಿ"</string>
<string name="paste_as_plain_text" msgid="5427792741908010675">"ಸರಳ ಪಠ್ಯದಂತೆ ಅಂಟಿಸು"</string>
<string name="replace" msgid="5781686059063148930">"ಸ್ಥಾನಾಂತರಿಸು..."</string>
- <string name="delete" msgid="6098684844021697789">"ಅಳಿಸು"</string>
+ <string name="delete" msgid="6098684844021697789">"ಅಳಿಸಿ"</string>
<string name="copyUrl" msgid="2538211579596067402">"URL ನಕಲಿಸು"</string>
<string name="selectTextMode" msgid="1018691815143165326">"ಪಠ್ಯವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="undo" msgid="7905788502491742328">"ರದ್ದುಗೊಳಿಸಿ"</string>
@@ -969,7 +974,7 @@
<string name="autofill" msgid="3035779615680565188">"ಸ್ವಯಂತುಂಬುವಿಕೆ"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"ಪಠ್ಯದ ಆಯ್ಕೆ"</string>
<string name="addToDictionary" msgid="4352161534510057874">"ನಿಘಂಟಿಗೆ ಸೇರಿಸಿ"</string>
- <string name="deleteText" msgid="6979668428458199034">"ಅಳಿಸು"</string>
+ <string name="deleteText" msgid="6979668428458199034">"ಅಳಿಸಿ"</string>
<string name="inputMethod" msgid="1653630062304567879">"ಇನ್ಪುಟ್ ವಿಧಾನ"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"ಪಠ್ಯದ ಕ್ರಮಗಳು"</string>
<string name="email" msgid="4560673117055050403">"ಇಮೇಲ್"</string>
@@ -987,7 +992,7 @@
<string name="no" msgid="5141531044935541497">"ರದ್ದುಮಾಡಿ"</string>
<string name="dialog_alert_title" msgid="2049658708609043103">"ಗಮನಿಸಿ"</string>
<string name="loading" msgid="7933681260296021180">"ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string>
- <string name="capital_on" msgid="1544682755514494298">"ಆನ್ ಮಾಡು"</string>
+ <string name="capital_on" msgid="1544682755514494298">"ಆನ್ ಮಾಡಿ"</string>
<string name="capital_off" msgid="6815870386972805832">"ಆಫ್ ಮಾಡು"</string>
<string name="whichApplication" msgid="4533185947064773386">"ಇದನ್ನು ಬಳಸಿಕೊಂಡು ಕ್ರಿಯೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಿ"</string>
<string name="whichApplicationNamed" msgid="8260158865936942783">"%1$s ಬಳಸಿಕೊಂಡು ಕ್ರಿಯೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಿ"</string>
@@ -1117,7 +1122,7 @@
<string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"ವೈ-ಫೈ ಡೈರೆಕ್ಟ್ ಆನ್ ಆಗಿದೆ"</string>
<string name="wifi_p2p_enabled_notification_message" msgid="8064677407830620023">"ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="accept" msgid="1645267259272829559">"ಸ್ವೀಕರಿಸು"</string>
- <string name="decline" msgid="2112225451706137894">"ನಿರಾಕರಿಸು"</string>
+ <string name="decline" msgid="2112225451706137894">"ನಿರಾಕರಿಸಿ"</string>
<string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"ಆಹ್ವಾನವನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ"</string>
<string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"ಸಂಪರ್ಕಗೊಳ್ಳಲು ಆಹ್ವಾನ"</string>
<string name="wifi_p2p_from_message" msgid="570389174731951769">"ಇಂದ:"</string>
@@ -1130,8 +1135,8 @@
<string name="select_character" msgid="3365550120617701745">"ಅಕ್ಷರವನ್ನು ಸೇರಿಸಿ"</string>
<string name="sms_control_title" msgid="7296612781128917719">"SMS ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="sms_control_message" msgid="3867899169651496433">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ಹೆಚ್ಚಿನ ಸಂಖ್ಯೆಯ SMS ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸುತ್ತಿದೆ. ಸಂದೇಶಗಳ ಕಳುಹಿಸುವಿಕೆಯನ್ನು ಮುಂದುವರಿಸುವಂತೆ ಈ ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸಲು ನೀವು ಬಯಸುವಿರಾ?"</string>
- <string name="sms_control_yes" msgid="3663725993855816807">"ಅನುಮತಿಸು"</string>
- <string name="sms_control_no" msgid="625438561395534982">"ನಿರಾಕರಿಸು"</string>
+ <string name="sms_control_yes" msgid="3663725993855816807">"ಅನುಮತಿಸಿ"</string>
+ <string name="sms_control_no" msgid="625438561395534982">"ನಿರಾಕರಿಸಿ"</string>
<string name="sms_short_code_confirm_message" msgid="1645436466285310855">"<b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b> ಗೆ ಸಂದೇಶವನ್ನು ಕಳುಹಿಸಲು <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ಬಯಸುತ್ತದೆ."</string>
<string name="sms_short_code_details" msgid="5873295990846059400">"ಇದು ನಿಮ್ಮ ಮೊಬೈಲ್ ಖಾತೆಯಲ್ಲಿ "<b>"ಶುಲ್ಕಗಳನ್ನು ವಿಧಿಸುವುದಕ್ಕೆ ಕಾರಣವಾಗಬಹುದು"</b>"."</string>
<string name="sms_premium_short_code_details" msgid="7869234868023975"><b>"ಇದು ನಿಮ್ಮ ಮೊಬೈಲ್ ಖಾತೆಯಲ್ಲಿ ಶುಲ್ಕಗಳನ್ನು ವಿಧಿಸುವುದಕ್ಕೆ ಕಾರಣವಾಗುತ್ತದೆ."</b></string>
@@ -1139,7 +1144,7 @@
<string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"ರದ್ದುಮಾಡಿ"</string>
<string name="sms_short_code_remember_choice" msgid="5289538592272218136">"ನನ್ನ ಆಯ್ಕೆಯನ್ನು ನೆನಪಿಡು"</string>
<string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"ನೀವು ಇದನ್ನು ನಂತರದಲ್ಲಿ ಸೆಟ್ಟಿಂಗ್ಗಳು > ಅಪ್ಲಿಕೇಶನ್ಗಳಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು"</string>
- <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"ಯಾವಾಗಲೂ ಅನುಮತಿಸು"</string>
+ <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ"</string>
<string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"ಎಂದಿಗೂ ಅನುಮತಿಸದಿರು"</string>
<string name="sim_removed_title" msgid="6227712319223226185">"ಸಿಮ್ ಕಾರ್ಡ್ ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
<string name="sim_removed_message" msgid="2333164559970958645">"ನೀವು ಮಾನ್ಯವಾದ ಸಿಮ್ ಕಾರ್ಡ್ ಮರುಪ್ರಾರಂಭಿಸುವವರೆಗೆ ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ ಲಭ್ಯವಿರುವುದಿಲ್ಲ."</string>
@@ -1177,9 +1182,9 @@
<string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"ಬಗ್ ವರದಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತಿದೆ…"</string>
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"ಈ ಸಾಧನದ ಸಮಸ್ಯೆ ನಿವಾರಿಸುವಲ್ಲಿ ಸಹಾಯ ಮಾಡಲು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಬಗ್ ವರದಿಯನ್ನು ವಿನಂತಿಸಿದ್ದಾರೆ. ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"ಹಂಚಿಕೊಳ್ಳಿ"</string>
- <string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ನಿರಾಕರಿಸು"</string>
+ <string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ನಿರಾಕರಿಸಿ"</string>
<string name="select_input_method" msgid="8547250819326693584">"ಕೀಬೋರ್ಡ್ ಬದಲಿಸಿ"</string>
- <string name="show_ime" msgid="2506087537466597099">"ಭೌತಿಕ ಕೀಬೋರ್ಡ್ ಸಕ್ರಿಯವಾಗಿರುವಾಗ ಅದನ್ನು ಪರದೆಯ ಮೇಲೆ ಇರಿಸಿಕೊಳ್ಳಿ"</string>
+ <string name="show_ime" msgid="2506087537466597099">"ಭೌತಿಕ ಕೀಬೋರ್ಡ್ ಸಕ್ರಿಯವಾಗಿರುವಾಗ ಅದನ್ನು ಪರದೆಯ ಮೇಲಿರಿಸಿ"</string>
<string name="hardware" msgid="194658061510127999">"ವರ್ಚ್ಯುಯಲ್ ಕೀಬೋರ್ಡ್ ತೋರಿಸು"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"ಭೌತಿಕ ಕೀಬೋರ್ಡ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಿ"</string>
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ಭಾಷೆ ಮತ್ತು ವಿನ್ಯಾಸವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
@@ -1252,8 +1257,8 @@
<string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"ಇದೀಗ ಮತ್ತು ಭವಿಷ್ಯದಲ್ಲಿ ಈ ಕೆಳಗಿನ ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಪ್ರವೇಶಿಸಲು ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಿವೆ."</string>
<string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"ನೀವು ಈ ವಿನಂತಿಗೆ ಅನುಮತಿಸಲು ಬಯಸುವಿರಾ?"</string>
<string name="grant_permissions_header_text" msgid="6874497408201826708">"ಪ್ರವೇಶದ ವಿನಂತಿ"</string>
- <string name="allow" msgid="7225948811296386551">"ಅನುಮತಿಸು"</string>
- <string name="deny" msgid="2081879885755434506">"ನಿರಾಕರಿಸು"</string>
+ <string name="allow" msgid="7225948811296386551">"ಅನುಮತಿಸಿ"</string>
+ <string name="deny" msgid="2081879885755434506">"ನಿರಾಕರಿಸಿ"</string>
<string name="permission_request_notification_title" msgid="6486759795926237907">"ಅನುಮತಿ ವಿನಂತಿಸಲಾಗಿದೆ"</string>
<string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"<xliff:g id="ACCOUNT">%s</xliff:g> ಖಾತೆಗಾಗಿ\n ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಲಾಗಿದೆ."</string>
<string name="forward_intent_to_owner" msgid="1207197447013960896">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ನ ಹೊರಗೆ ನೀವು ಈ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ"</string>
@@ -1301,8 +1306,8 @@
<string name="websearch" msgid="4337157977400211589">"ವೆಬ್ ಹುಡುಕಾಟ"</string>
<string name="find_next" msgid="5742124618942193978">"ಮುಂದಿನದನ್ನು ಹುಡುಕಿ"</string>
<string name="find_previous" msgid="2196723669388360506">"ಹಿಂದಿನದನ್ನು ಹುಡುಕಿ"</string>
- <string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g> ಅವರಿಂದ ಸ್ಥಾನ ವಿನಂತಿ"</string>
- <string name="gpsNotifTitle" msgid="5446858717157416839">"ಸ್ಥಾನ ವಿನಂತಿ"</string>
+ <string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g> ಅವರಿಂದ ಸ್ಥಳ ವಿನಂತಿ"</string>
+ <string name="gpsNotifTitle" msgid="5446858717157416839">"ಸ್ಥಳ ವಿನಂತಿ"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) ಅವರಿಂದ ವಿನಂತಿಸಲಾಗಿದೆ"</string>
<string name="gpsVerifYes" msgid="2346566072867213563">"ಹೌದು"</string>
<string name="gpsVerifNo" msgid="1146564937346454865">"ಇಲ್ಲ"</string>
@@ -1311,7 +1316,7 @@
<string name="sync_really_delete" msgid="2572600103122596243">"ಐಟಂಗಳನ್ನು ಅಳಿಸಿ"</string>
<string name="sync_undo_deletes" msgid="2941317360600338602">"ಅಳಿಸುವಿಕೆಯನ್ನು ರದ್ದುಗೊಳಿಸಿ"</string>
<string name="sync_do_nothing" msgid="3743764740430821845">"ಈಗ ಏನೂ ಮಾಡಬೇಡಿ"</string>
- <string name="choose_account_label" msgid="5655203089746423927">"ಖಾತೆಯೊಂದನ್ನು ಆರಿಸು"</string>
+ <string name="choose_account_label" msgid="5655203089746423927">"ಖಾತೆ ಆಯ್ಕೆ ಮಾಡಿ"</string>
<string name="add_account_label" msgid="2935267344849993553">"ಒಂದು ಖಾತೆ ಸೇರಿಸಿ"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"ಖಾತೆ ಸೇರಿಸಿ"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"ಹೆಚ್ಚಿಸಿ"</string>
@@ -1334,7 +1339,7 @@
<string name="date_picker_next_month_button" msgid="5559507736887605055">"ಮುಂದಿನ ತಿಂಗಳು"</string>
<string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
<string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"ರದ್ದುಮಾಡಿ"</string>
- <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ಅಳಿಸು"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ಅಳಿಸಿ"</string>
<string name="keyboardview_keycode_done" msgid="1992571118466679775">"ಮುಗಿದಿದೆ"</string>
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ಮೋಡ್ ಬದಲಾವಣೆ"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
@@ -1461,7 +1466,7 @@
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ತೆಗೆದುಹಾಕು"</string>
<string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"ವಾಲ್ಯೂಮ್ ಅನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾದ ಮಟ್ಟಕ್ಕಿಂತಲೂ ಹೆಚ್ಚು ಮಾಡುವುದೇ?\n\nದೀರ್ಘ ಅವಧಿಯವರೆಗೆ ಹೆಚ್ಚಿನ ವಾಲ್ಯೂಮ್ನಲ್ಲಿ ಆಲಿಸುವುದರಿಂದ ನಿಮ್ಮ ಆಲಿಸುವಿಕೆ ಸಾಮರ್ಥ್ಯಕ್ಕೆ ಹಾನಿಯುಂಟು ಮಾಡಬಹುದು."</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="8404780875025725199">"ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್ಕಟ್ ಬಳಸುವುದೇ?"</string>
- <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"ಶಾರ್ಟ್ಕಟ್ ಆನ್ ಆಗಿರುವಾಗ, ಎರಡೂ ಧ್ವನಿ ಬಟನ್ಗಳನ್ನು 3 ಸೆಕೆಂಡ್ಗಳವರೆಗೆ ಒತ್ತಿಹಿಡಿದರೆ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯವು ಪ್ರಾರಂಭವಾಗುತ್ತದೆ.\n\nಪ್ರಸ್ತುತ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯ: \n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n ಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಪ್ರವೇಶಿಸುವಿಕೆಯಲ್ಲಿ ನೀವು ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬದಲಾಯಿಸಬಹುದು."</string>
+ <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"ಶಾರ್ಟ್ಕಟ್ ಆನ್ ಆಗಿರುವಾಗ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯ ಆನ್ ಮಾಡಲು, ಎರಡೂ ವಾಲ್ಯೂಮ್ ಬಟನ್ಗಳನ್ನು ನೀವು 3 ಸೆಕೆಂಡುಗಳ ಕಾಲ ಒತ್ತಬೇಕು.\n\nಪ್ರಸ್ತುತ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯ: \n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n ಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಪ್ರವೇಶಿಸುವಿಕೆಯಲ್ಲಿ ನೀವು ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬದಲಾಯಿಸಬಹುದು."</string>
<string name="disable_accessibility_shortcut" msgid="627625354248453445">"ಶಾರ್ಟ್ಕಟ್ ಆಫ್ ಮಾಡಿ"</string>
<string name="leave_accessibility_shortcut_on" msgid="7653111894438512680">"ಶಾರ್ಟ್ಕಟ್ ಬಳಸಿ"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್ಕಟ್, <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ಅನ್ನು ಆನ್ ಮಾಡಿದೆ"</string>
@@ -1604,10 +1609,10 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸ್ಥಾಪಿಸಿದ್ದಾರೆ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಅಪ್ಡೇಟ್ ಮಾಡಿದ್ದಾರೆ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಅಳಿಸಿದ್ದಾರೆ"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"ನಿಮ್ಮ ಬ್ಯಾಟರಿಯ ಬಾಳಿಕೆಯನ್ನು ಸುಧಾರಿಸಲು ಸಹಾಯ ಮಾಡಲು, ಬ್ಯಾಟರಿ ಉಳಿಕೆಯು ನಿಮ್ಮ ಸಾಧನದ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ ಮತ್ತು ವೈಬ್ರೇಷನ್, ಸ್ಥಳ ಸೇವೆಗಳು ಹಾಗೂ ಹೆಚ್ಚಿನ ಹಿನ್ನೆಲೆ ಡೇಟಾವನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ. ಸಿಂಕ್ ಮಾಡುವುದನ್ನು ಅವಲಂಬಿಸಿರುವ ಇಮೇಲ್, ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ, ಮತ್ತು ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನೀವು ತೆರೆಯದ ಹೊರತು ನವೀಕರಣಗೊಳ್ಳುವುದಿಲ್ಲ.\n\nನಿಮ್ಮ ಸಾಧನವು ಚಾರ್ಜ್ ಆಗುತ್ತಿರುವ ಸಮಯದಲ್ಲಿ ಬ್ಯಾಟರಿ ಉಳಿಕೆಯು ಆಫ್ ಆಗುತ್ತದೆ."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"ಬ್ಯಾಟರಿಯ ಬಾಳಿಕೆಯನ್ನು ಸುಧಾರಿಸುವ ನಿಟ್ಟಿನಲ್ಲಿ, ಬ್ಯಾಟರಿ ಉಳಿಕೆಯು ನಿಮ್ಮ ಸಾಧನದ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ ಮತ್ತು ವೈಬ್ರೇಷನ್, ಸ್ಥಳ ಸೇವೆಗಳು ಹಾಗೂ ಹೆಚ್ಚಿನ ಹಿನ್ನೆಲೆ ಡೇಟಾವನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ. ಸಿಂಕ್ ಮಾಡುವಿಕೆಯನ್ನು ಅವಲಂಬಿಸಿರುವ ಇಮೇಲ್, ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ ಮತ್ತು ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನೀವು ತೆರೆಯದ ಹೊರತು ಅಪ್ಡೇಟ್ ಆಗುವುದಿಲ್ಲ.\n\nನಿಮ್ಮ ಸಾಧನವು ಚಾರ್ಜ್ ಆಗುತ್ತಿರುವಾಗ ಬ್ಯಾಟರಿ ಉಳಿಕೆಯು ಆಫ್ ಆಗುತ್ತದೆ."</string>
<string name="data_saver_description" msgid="6015391409098303235">"ಡೇಟಾ ಬಳಕೆ ಕಡಿಮೆ ಮಾಡುವ ನಿಟ್ಟಿನಲ್ಲಿ, ಡೇಟಾ ಸೇವರ್ ಕೆಲವು ಅಪ್ಲಿಕೇಶನ್ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೇಟಾ ಕಳುಹಿಸುವುದನ್ನು ಅಥವಾ ಸ್ವೀಕರಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ನೀವು ಪ್ರಸ್ತುತ ಬಳಸುತ್ತಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು ಆದರೆ ಪದೇ ಪದೇ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಇದರರ್ಥ, ಉದಾಹರಣೆಗೆ, ನೀವು ಅವುಗಳನ್ನು ಟ್ಯಾಪ್ ಮಾಡುವವರೆಗೆ ಆ ಚಿತ್ರಗಳು ಕಾಣಿಸಿಕೊಳ್ಳುವುದಿಲ್ಲ."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ಡೇಟಾ ಉಳಿಸುವಿಕೆಯನ್ನು ಆನ್ ಮಾಡುವುದೇ?"</string>
- <string name="data_saver_enable_button" msgid="7147735965247211818">"ಆನ್ ಮಾಡು"</string>
+ <string name="data_saver_enable_button" msgid="7147735965247211818">"ಆನ್ ಮಾಡಿ"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
<item quantity="one">%1$d ನಿಮಿಷಗಳವರೆಗೆ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ವರೆಗೆ)</item>
<item quantity="other">%1$d ನಿಮಿಷಗಳವರೆಗೆ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ವರೆಗೆ)</item>
@@ -1690,7 +1695,7 @@
<string name="locale_search_menu" msgid="2560710726687249178">"ಹುಡುಕಿ"</string>
<string name="work_mode_off_title" msgid="2615362773958585967">"ಉದ್ಯೋಗ ಮೋಡ್ ಆನ್ ಮಾಡುವುದೇ?"</string>
<string name="work_mode_off_message" msgid="2961559609199223594">"ಇದು ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ಜೊತೆಗೆ ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಹಿನ್ನೆಲೆ ಸಿಂಕ್ ಮತ್ತು ಸಂಬಂಧಿತ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆನ್ ಮಾಡುತ್ತದೆ"</string>
- <string name="work_mode_turn_on" msgid="2062544985670564875">"ಆನ್ ಮಾಡು"</string>
+ <string name="work_mode_turn_on" msgid="2062544985670564875">"ಆನ್ ಮಾಡಿ"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"ನೀವು ಹೊಸ ಸಂದೇಶಗಳನ್ನು ಹೊಂದಿರುವಿರಿ"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"ವೀಕ್ಷಿಸಲು SMS ಅಪ್ಲಿಕೇಶನ್ ತೆರೆಯಿರಿ"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"ಕೆಲವು ಕಾರ್ಯನಿರ್ವಹಣೆಗಳು ಸೀಮಿತವಾಗಿರಬಹುದು"</string>
@@ -1715,7 +1720,7 @@
<string name="suspended_widget_accessibility" msgid="6712143096475264190">"<xliff:g id="LABEL">%1$s</xliff:g> ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="conference_call" msgid="3751093130790472426">"ಕಾನ್ಫರೆನ್ಸ್ ಕರೆ"</string>
<string name="tooltip_popup_title" msgid="5253721848739260181">"ಟೂಲ್ಟಿಪ್"</string>
- <string name="app_category_game" msgid="5431836943981492993">"ಆಟಗಳು"</string>
+ <string name="app_category_game" msgid="5431836943981492993">"ಗೇಮ್ಗಳು"</string>
<string name="app_category_audio" msgid="1659853108734301647">"ಸಂಗೀತ ಮತ್ತು ಆಡಿಯೋ"</string>
<string name="app_category_video" msgid="2728726078629384196">"ಸಿನಿಮಾಗಳು ಮತ್ತು ವೀಡಿಯೊ"</string>
<string name="app_category_image" msgid="4867854544519846048">"ಫೋಟೋಗಳು ಮತ್ತು ಚಿತ್ರಗಳು"</string>
@@ -1733,11 +1738,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"ಸಮಯವನ್ನು ನಮೂದಿಸಲು ಪಠ್ಯದ ನಮೂನೆಗೆ ಬದಲಿಸಿ."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"ಸಮಯವನ್ನು ನಮೂದಿಸಲು ಗಡಿಯಾರದ ನಮೂನೆಗೆ ಬದಲಿಸಿ."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"ಸ್ವಯಂತುಂಬುವಿಕೆ ಆಯ್ಕೆಗಳು"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"ಸ್ವಯಂ ಭರ್ತಿಗಾಗಿ ಉಳಿಸಿ"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"ವಿಷಯಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಭರ್ತಿಯಾಗಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> ನಲ್ಲಿ ಉಳಿಸಬೇಕೆ?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> ಅನ್ನು <xliff:g id="LABEL">%2$s</xliff:g> ನಲ್ಲಿ ಉಳಿಸಬೇಕೆ?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ಅನ್ನು <xliff:g id="LABEL">%3$s</xliff:g>ಗೆ ಉಳಿಸಬೇಕೆ?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> ಅನ್ನು <xliff:g id="LABEL">%4$s</xliff:g> ಗೆ ಉಳಿಸಬೇಕೆ?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b>ನಲ್ಲಿ ಉಳಿಸುವುದೇ?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> ಅನ್ನು <b><xliff:g id="LABEL">%2$s</xliff:g></b>ನಲ್ಲಿ ಉಳಿಸುವುದೇ?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> ಹಾಗೂ <xliff:g id="TYPE_1">%2$s</xliff:g> ಅನ್ನು <b><xliff:g id="LABEL">%3$s</xliff:g></b>ನಲ್ಲಿ ಉಳಿಸುವುದೇ?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, ಹಾಗೂ <xliff:g id="TYPE_2">%3$s</xliff:g> ಅನ್ನು <b><xliff:g id="LABEL">%4$s</xliff:g></b>ನಲ್ಲಿ ಉಳಿಸುವುದೇ?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"ಉಳಿಸಿ"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"ಬೇಡ"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"ಪಾಸ್ವರ್ಡ್"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index a24eb06..db2e038 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"이동통신사에서 이 위치에서의 음성 및 긴급 통화를 일시적으로 정지했습니다."</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"네트워크에 연결할 수 없습니다."</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"수신 상태를 개선하려면 시스템 > 네트워크 및 인터넷 > 모바일 네트워크 > 기본 네트워크 유형에서 선택된 유형을 변경해 보세요."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"알림"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"착신전환"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"긴급 콜백 모드"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"모바일 데이터 알림"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS 메시지"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"음성사서함 메시지"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 통화"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"피어가 TTY 모드 FULL을 요청했습니다."</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"피어가 TTY 모드 HCO를 요청했습니다."</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"피어가 TTY 모드 VCO를 요청했습니다."</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"상호작용 중인 창의 콘텐츠를 검사합니다."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"터치하여 탐색 사용"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"항목을 탭하면 소리 내어 알려주며 동작을 사용하여 화면을 탐색할 수 있습니다."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"향상된 웹 접근성 기능 사용"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"스크립트를 설치하여 앱 콘텐츠에 더 간편하게 액세스할 수 있습니다."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"입력하는 텍스트 살펴보기"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"신용카드 번호와 비밀번호 등의 개인 데이터를 포함합니다."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"디스플레이 배율 제어"</string>
@@ -1121,7 +1126,7 @@
<string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"초대장을 보냈습니다."</string>
<string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"연결하도록 초대"</string>
<string name="wifi_p2p_from_message" msgid="570389174731951769">"보낸사람:"</string>
- <string name="wifi_p2p_to_message" msgid="248968974522044099">"받는사람:"</string>
+ <string name="wifi_p2p_to_message" msgid="248968974522044099">"수신:"</string>
<string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"필수 PIN 입력:"</string>
<string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
<string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>에 연결되어 있는 동안 일시적으로 태블릿의 Wi-Fi 연결이 해제됩니다."</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"시간 입력을 위해 텍스트 입력 모드로 전환합니다."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"시간 입력을 위해 시계 모드로 전환합니다."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"자동완성 옵션"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"자동완성에 저장"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"콘텐츠를 자동완성할 수 없습니다."</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g>에 저장하시겠습니까?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g>을(를) <xliff:g id="LABEL">%2$s</xliff:g>에 저장하시겠습니까?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="LABEL">%3$s</xliff:g>에 <xliff:g id="TYPE_0">%1$s</xliff:g> 및 <xliff:g id="TYPE_1">%2$s</xliff:g>을(를) 저장하시겠습니까?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="LABEL">%4$s</xliff:g>에 <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> 및 <xliff:g id="TYPE_2">%3$s</xliff:g>을(를) 저장하시겠습니까?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b>에 저장하시겠습니까?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g>을(를) <b><xliff:g id="LABEL">%2$s</xliff:g></b>에 저장하시겠습니까?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> 및 <xliff:g id="TYPE_1">%2$s</xliff:g>을(를) <b><xliff:g id="LABEL">%3$s</xliff:g></b>에 저장하시겠습니까?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g>을(를) <b><xliff:g id="LABEL">%4$s</xliff:g></b>에 저장하시겠습니까?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"저장"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"사용 안함"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"비밀번호"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index f4d15aa..05ca65e 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -73,7 +73,7 @@
<string name="ColpMmi" msgid="3065121483740183974">"Туташкан линия ID-си"</string>
<string name="ColrMmi" msgid="4996540314421889589">"Туташкан линия ID-син Чектөө"</string>
<string name="CfMmi" msgid="5123218989141573515">"Чалууну багыттоо"</string>
- <string name="CwMmi" msgid="9129678056795016867">"Чалууну кармоо"</string>
+ <string name="CwMmi" msgid="9129678056795016867">"Чалууну кармап туруу"</string>
<string name="BaMmi" msgid="455193067926770581">"Чалууга тыюу салуу"</string>
<string name="PwdMmi" msgid="7043715687905254199">"Сырсөздү өзгөртүү"</string>
<string name="PinMmi" msgid="3113117780361190304">"PIN өзгөртүү"</string>
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Операторуңуз аудио чалууларды жана өзгөчө кырдаалдагы чалууларды бул аймактан убактылуу токтотуп койду"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Тармакка туташпай жатат"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Кабыл алуу мүмкүнчүлүгүн жакшыртуу үчүн Тутум > Тармак жана Интернет > Мобилдик тармактар > Тандалган тармак бөлүмүнөн тармактын түрүн өзгөртүп көрүңүз."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Эскертүүлөр"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Чалууну башка номерге багыттоо"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Шашылыш кайра чалуу режими"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Мобилдик Интернеттин эскертүүлөрү"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS билдирүүлөрү"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Үн почтасынын билдирүүлөрү"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi аркылуу чалуу"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer TTY режимин FULL кылууну суранды"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer TTY режимин HCO кылууну суранды"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer TTY режимин VCO кылууну суранды"</string>
@@ -265,7 +272,7 @@
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Байланыштар"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"байланыштарыңызды көрүүгө"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Жайгашкан жер"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"түзмөктүн жайгашкан жери тууралуу дайындарды көрүүгө"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"түзмөктүн жайгашкан жерин аныктоого"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Күнбарак"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"жылнаамаңызды пайдалануу"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
@@ -280,16 +287,14 @@
<string name="permgroupdesc_phone" msgid="6234224354060641055">"телефон чалуу жана аларды башкаруу"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Дене сенсорлору"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"организмдин абалына көз салган сенсордун дайындарына мүмкүнчүлүк алуу"</string>
- <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Терезе мазмунун алуу"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Сиз иштеп жаткан терезенин мазмунун изилдөө."</string>
- <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Сыйпалап изилдөөнү жандыруу"</string>
- <string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Тапталган нерселер угузулат жана экранды жаңсап изилдесе болот."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Жакшыртылган веб жеткиликтүүлүгүн жандыруу"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Колдонмонун мазмунун жеткиликтүүрөөк кылыш үчүн скрипттер орнотулушу мүмкүн."</string>
- <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Терип жаткан текстти текшерүү"</string>
- <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Кредиттик карта номурлары жана сырсөздөр сыяктуу өздүк берилиштерди камтыйт."</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Дисплейди чоңойтууну башкаруу"</string>
- <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Экрандагы сүрөттүн өлчөмүн өзгөртүү жана жайгаштыруу."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Терезедеги мазмунду алып турат"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Учурда ачылып турган терезедеги маалыматты талдайт."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\"Сыйпалап изилдөө\" мүмкүнчүлүгүн иштетет"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Басылып жаткан элементтерди айтып турат жана түзмөктү жаңсоолор менен башкаруу мүмкүнчүлүгүн иштетет."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Терилип жаткан текстти текшерип турат"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Ошону менен катар, насыя карталарынын номерлери жана сырсөздөр сыяктуу жеке маалыматты да."</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Көрүнүштү чоңойтуп кичирейтет"</string>
+ <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Экрандагы сүрөттү тууралап жайгаштырып, өлчөмүн өзгөртөт."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Жаңсоолорду аткаруу"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Таптап, серпип, чымчып жана башка жаңсоолорду аткара алат."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Манжа изинин жаңсоолору"</string>
@@ -699,7 +704,7 @@
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Кулпуну ачуу үчүн PIN кодду териңиз"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"PIN-код туура эмес."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Кулпусун ачуу үчүн, Менюна андан соң 0 баскычын басыңыз."</string>
- <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Шашылыш чалуу номери"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Өзгөчө кырдаалдар кызматы"</string>
<string name="lockscreen_carrier_default" msgid="6169005837238288522">"Байланыш жок"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Экран кулпуланды."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Кулпусун ачып же Шашылыш чалуу аткаруу үчүн менюну басыңыз."</string>
@@ -712,7 +717,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Дагы аракет кылыңыз"</string>
<string name="lockscreen_storage_locked" msgid="9167551160010625200">"Элементтердин жана дайындардын кулпусун ачуу"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Жүзүнөн таанып ачуу аракеттеринин чегинен аштыңыз"</string>
- <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM-карта жок"</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM карта жок"</string>
<string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"Планшетте SIM-карта жок."</string>
<string name="lockscreen_missing_sim_message" product="tv" msgid="1943633865476989599">"Сыналгыда SIM-карта жок."</string>
<string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"Телефондо SIM-карта жок."</string>
@@ -1168,8 +1173,8 @@
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI үчүн USB"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB аксессуарга байланышты"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Кошумча параметрлерди ачуу үчүн таптап коюңуз."</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"USB аркылуу мүчүлүштүктөрдү оңдоо туташтырылган"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB арклуу мүчүлштктрдү жоюну өчр үчн тийп коюңуз."</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"Мүчүлүштүктөрдү USB аркылуу оңдоо иштетилген"</string>
+ <string name="adb_active_notification_message" msgid="4948470599328424059">"Мүчүлштктрдү USB аркл оңдну өчр үчн тийп коюңуз."</string>
<!-- no translation found for adb_active_notification_message (8470296818270110396) -->
<skip />
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Мүчүлүштүк тууралуу кабар алынууда…"</string>
@@ -1312,8 +1317,8 @@
<string name="sync_undo_deletes" msgid="2941317360600338602">"Жок кылынганды кайтаруу"</string>
<string name="sync_do_nothing" msgid="3743764740430821845">"Азырынча эч нерсе кылбайм"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Каттоо эсебин тандаңыз"</string>
- <string name="add_account_label" msgid="2935267344849993553">"Эсеп кошуу"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"Эсеп кошуу"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"Каттоо эсебин кошуу"</string>
+ <string name="add_account_button_label" msgid="3611982894853435874">"Каттоо эсебин кошуу"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Жогорулатуу"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Төмөндөтүү"</string>
<string name="number_picker_increment_scroll_mode" msgid="5259126567490114216">"<xliff:g id="VALUE">%s</xliff:g> жолу басып, кармап туруңуз."</string>
@@ -1357,7 +1362,7 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB түзмөгү"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB эстутуму"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Өзгөртүү"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Дайындарды колдонууну чектөө"</string>
+ <string name="data_usage_warning_title" msgid="3620440638180218181">"Трафикти чектөө"</string>
<string name="data_usage_warning_body" msgid="6660692274311972007">"Колдонулушун жана жөндөөлөрүн көрүү үчүн таптаңыз."</string>
<string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G дайындар чегине жетти"</string>
<string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G дайындар чегине жетти"</string>
@@ -1403,7 +1408,7 @@
<string name="default_audio_route_category_name" msgid="3722811174003886946">"Тутум"</string>
<string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Bluetooth аудио"</string>
<string name="wireless_display_route_description" msgid="9070346425023979651">"Зымсыз дисплей"</string>
- <string name="media_route_button_content_description" msgid="591703006349356016">"Тандалгандар"</string>
+ <string name="media_route_button_content_description" msgid="591703006349356016">"Тышкы экранга чыгаруу"</string>
<string name="media_route_chooser_title" msgid="1751618554539087622">"Түзмөккө туташуу"</string>
<string name="media_route_chooser_title_for_remote_display" msgid="3395541745872017583">"Сырткы экранга чыгаруу"</string>
<string name="media_route_chooser_searching" msgid="4776236202610828706">"Түзмөктөр изделүүдө..."</string>
@@ -1604,7 +1609,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Администраторуңуз орнотуп койгон"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Администраторуңуз жаңыртып койгон"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Администраторуңуз жок кылып салган"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"Батареянын өмүрүн узартуу үчүн, батареяны үнөмдөгүч түзмөгүңүздүн ишинин майнаптуулугун азайтып, дирилдөө, жайгашкан жерди аныктоо кызматтары жана фондук дайындардын көпчүлүгүн чектеп коёт. Электрондук почта, билдирүү жазышуу жана башка шайкештештирүүгө байланыштуу колдонмолор ачылмайынча жаңыртылбай калышы мүмкүн.\n\nБатарея үнөмдөгүч түзмөгүңүз кубатталып жатканда автоматтык түрдө өчүп калат."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Батареянын өмүрүн узартуу үчүн, кубатты үнөмдөө режими түзмөгүңүздүн ишин солгундатып, дирилдөө функциясын, жайгашкан жерди аныктоо кызматын жана дайындардын фондо өткөрүлүшүн чектеп коёт. Электрондук почта, билдирүү жазышуу сыяктуу шайкештириле турган дайындар колдонмо ачылганда гана жаңырат.\n\nБатареянын кубатын үнөмдөө режими түзмөгүңүз кубатталып жатканда автоматтык түрдө өчүп калат."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Трафиктин колдонулушун үнөмдөө режиминде айрым колдонмолор дайындарды фондо өткөрө алышпайт. Учурда сиз пайдаланып жаткан колдонмо дайындарды өткөрөт, бирок адаттагыдан азыраак өткөргөндүктөн, анын айрым функциялары башкача иштеши мүмкүн. Мисалы, сүрөттөр басылмайынча жүктөлбөйт."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Дайындарды үнөмдөгүч күйсүнбү?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Күйгүзүү"</string>
@@ -1733,11 +1738,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Убакытты текст киргизүү режиминде киргизиңиз."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Убакытты дубал саатынын режиминде киргизиңиз."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Автотолтуруу опциялары"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Автотолтуруу функциясына сактап коюу"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Мазмундарды автотолтуруу мүмкүн эмес"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> кызматында сакталсынбы?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> <xliff:g id="LABEL">%2$s</xliff:g> кызматында сакталсынбы?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g> менен <xliff:g id="TYPE_1">%2$s</xliff:g> <xliff:g id="LABEL">%3$s</xliff:g> кызматында сакталсынбы?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> жана <xliff:g id="TYPE_2">%3$s</xliff:g> <xliff:g id="LABEL">%4$s</xliff:g> кызматында сакталсынбы?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> кызматында сакталсынбы?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> <b><xliff:g id="LABEL">%2$s</xliff:g></b> кызматында сакталсынбы?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> жана <xliff:g id="TYPE_1">%2$s</xliff:g> <b><xliff:g id="LABEL">%3$s</xliff:g></b> кызматында сакталсынбы?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> жана <xliff:g id="TYPE_2">%3$s</xliff:g> <b><xliff:g id="LABEL">%4$s</xliff:g></b> кызматында сакталсынбы?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Сактоо"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Жок, рахмат"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"сырсөз"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index e57c851..4f2eb19 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"ຜູ້ໃຫ້ບໍລິການຂອງທ່ານໄດ້ລະງັບການນຳໃຊ້ການໂທສຽງ ແລະ ການໂທສຸກເສີນຢູ່ບ່ອນນີ້ໄວ້ຊົ່ວຄາວ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t reach network"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ເພື່ອປັບປຸງການຮັບສັນຍານ, ໃຫ້ລອງປ່ຽນປະເພດທີ່ເລືອກໄວ້ທີ່ ລະບົບ > ເຄືອຂ່າຍ ແລະ ອິນເຕີເນັດ > ເຄືອຂ່າຍມືຖື > ປະເພດເຄືອຂ່າຍທີ່ຕ້ອງການ."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"ການເຕືອນ"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"ການໂອນສາຍ"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ໂໝດໂທກັບສຸກເສີນ"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"ການແຈ້ງເຕືອນອິນເຕີເນັດມືຖື"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"ຂໍ້ຄວາມ SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ຂໍ້ຄວາມສຽງ"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"ການໂທ Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ໂໝດ TTY ທີ່ເພື່ອນຂໍນັ້ນເຕັມແລ້ວ"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ໂໝດ TTY ທີ່ເພື່ອນຂໍ HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ໂໝດ TTY ທີ່ເພື່ອນຂໍ VCO"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ກວດກາເນື້ອຫາຂອງໜ້າຈໍທີ່ທ່ານກຳລັງມີປະຕິສຳພັນນຳ."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ເປີດໃຊ້ \"ການສຳຫຼວດໂດຍສຳພັດ\""</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"ລາຍການທີ່ແຕະຈະຖືກເວົ້າອອກມາ ແລະ ສາມາດສຳຫຼວດໜ້າຈໍໄດ້ດ້ວຍທ່າທາງໄດ້."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"ເປີດການເຂົ້າເຖິງເວັບທີ່ມີປະສິດທິພາບຫຼາຍຂຶ້ນ"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"ສະຄຣິບອາດຖືກຕິດຕັ້ງ ເພື່ອເຮັດໃຫ້ເນື້ອຫາແອັບຯເຂົ້າເຖິງໄດ້ຫຼາຍຂຶ້ນ."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"ຕິດຕາມເບິ່ງຂໍ້ຄວາມທີ່ທ່ານພິມ"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"ຮວມທັງຂໍ້ມູນສ່ວນໂຕເຊັ່ນ: ເລກບັດເຄຣດິດ ແລະລະຫັດຜ່ານ."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"ຄວບຄຸມການຂະຫຍາຍຈໍສະແດງຜົນ"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"ສະຫຼັບໄປໃຊ້ໂໝດປ້ອນຂໍ້ຄວາມສຳລັບການປ້ອນເວລາ."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"ສະຫຼັບໄປໃຊ້ໂໝດໂມງສຳລັບການປ້ອນເວລາ."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"ຕົວເລືອກການຕື່ມຂໍ້ມູນອັດຕະໂນມັດ"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"ບັນທຶກໄວ້ຕື່ມຂໍ້ມູນອັດຕະໂນມັດ"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"ບໍ່ສາມາດຕື່ມຂໍ້ມູນເນື້ອຫາອັດຕະໂນມັດໄດ້"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"ບັນທຶກໄປໃສ່ <xliff:g id="LABEL">%1$s</xliff:g> ບໍ?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"ບັນທຶກ <xliff:g id="TYPE">%1$s</xliff:g> ໄປໃສ່ <xliff:g id="LABEL">%2$s</xliff:g> ບໍ?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"ບັນທຶກ <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ໄປໃສ່ <xliff:g id="LABEL">%3$s</xliff:g> ບໍ?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"ບັນທຶກ <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> ໄປໃສ່ <xliff:g id="LABEL">%4$s</xliff:g> ບໍ?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"ບັນທຶກໃສ່ <b><xliff:g id="LABEL">%1$s</xliff:g></b> ບໍ?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"ບັນທຶກ <xliff:g id="TYPE">%1$s</xliff:g> ໃສ່ <b><xliff:g id="LABEL">%2$s</xliff:g></b> ບໍ?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"ບັນທຶກ <xliff:g id="TYPE_0">%1$s</xliff:g> ແລະ <xliff:g id="TYPE_1">%2$s</xliff:g> ໃສ່ <b><xliff:g id="LABEL">%3$s</xliff:g></b> ບໍ?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"ບັນທຶກ <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ແລະ <xliff:g id="TYPE_2">%3$s</xliff:g> ໃສ່ <b><xliff:g id="LABEL">%4$s</xliff:g></b> ບໍ?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"ບັນທຶກ"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"ບໍ່, ຂອບໃຈ"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"ລະຫັດຜ່ານ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index e98c66c..99ef41ca 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -101,6 +101,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Jūsų operatorius laikinai sustabdė balso skambučius ir skambučius pagalbos numeriais šioje vietovėje"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nepavyko pasiekti tinklo"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Kad pagerintumėte ryšį, pabandykite pakeisti tipą, pasirinktą skiltyje „Nustatymai“ > „Tinklas ir internetas“ > „Mobiliojo ryšio tinklai“ > „Pageidaujamas tinklo tipas“."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Įspėjimai"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Skambučio peradresavimas"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Atskambinimo pagalbos numeriu režimas"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Mobiliojo ryšio duomenų įspėjimai"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS pranešimai"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Balso pašto pranešimai"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"„Wi-Fi“ skambinimas"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Lygiavertis naudotojas pateikė užklausą dėl TTY režimo FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Lygiavertis naudotojas pateikė užklausą dėl TTY režimo HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Lygiavertis naudotojas pateikė užklausą dėl TTY režimo VCO"</string>
@@ -290,11 +297,9 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Tikrinti lango, su kuriuo sąveikaujate, turinį."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Įjungti „Naršyti paliečiant“"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Paliesti elementai bus ištariami garsiai. Be to, ekrane gali būti naršoma naudojant gestus."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Įjungti patobulintą žiniatinklio pasiekiamumą"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Gali būti įdiegti scenarijai, kad būtų lengviau pasiekti programų turinį."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Stebėti jūsų įvedamą tekstą"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Įtraukiami asmeniniai duomenys, pavyzdžiui, kredito kortelių numeriai ir slaptažodžiai."</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Ekrano didinimo valdymas"</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Valdyti ekrano didinimą"</string>
<string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Valdykite ekrano mastelio keitimo lygį ir pozicijos nustatymą."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Veiksmai gestais"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Galima paliesti, perbraukti, suimti ir atlikti kitus veiksmus gestais."</string>
@@ -1647,7 +1652,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Įdiegė administratorius"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atnaujino administratorius"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"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 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>
+ <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 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>
<string name="data_saver_description" msgid="6015391409098303235">"Kad padėtų sumažinti duomenų naudojimą, Duomenų taupymo priemonė neleidžia kai kurioms programoms siųsti ar gauti duomenų fone. Šiuo metu naudojama programa gali pasiekti duomenis, bet tai bus daroma rečiau. Tai gali reikšti, kad, pvz., vaizdai nebus pateikiami, jei jų nepaliesite."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Įj. Duomenų taupymo priemonę?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Įjungti"</string>
@@ -1794,11 +1799,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Laiko įvestį pateikti perjungus į teksto įvesties režimą."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Laiko įvestį pateikti perjungus į laikrodžio režimą."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Automatinio pildymo parinktys"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Išsaugoti Automatinio pildymo paslaugoje"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Turinio negalima pildyti automatiškai"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Išsaugoti skiltyje „<xliff:g id="LABEL">%1$s</xliff:g>“?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Išsaugoti <xliff:g id="TYPE">%1$s</xliff:g> skiltyje „<xliff:g id="LABEL">%2$s</xliff:g>“?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Išsaugoti <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> sistemoje „<xliff:g id="LABEL">%3$s</xliff:g>“?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Išsaugoti <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> sistemoje „<xliff:g id="LABEL">%4$s</xliff:g>“?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Išsaugoti sistemoje <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Išsaugoti <xliff:g id="TYPE">%1$s</xliff:g> sistemoje <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Išsaugoti <xliff:g id="TYPE_0">%1$s</xliff:g> ir <xliff:g id="TYPE_1">%2$s</xliff:g> sistemoje <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Išsaugoti <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ir <xliff:g id="TYPE_2">%3$s</xliff:g> sistemoje <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Išsaugoti"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Ne, ačiū"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"slaptažodį"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 4251a52..c01ab61 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -100,6 +100,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Jūsu mobilo sakaru operators uz laiku apturēja balss un ārkārtas izsaukumus šajā atrašanās vietā."</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nevar sasniegt tīklu"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Lai uzlabotu uztveršanu, mainiet atlasīto veidu sadaļā Sistēma > Tīkls un internets > Mobilie tīkli > Ieteicamais tīkla veids."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Brīdinājumi"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Zvanu pāradresācija"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Ārkārtas atzvana režīms"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Mobilo datu brīdinājumi"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Īsziņas"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Balss pasta ziņojumi"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi zvani"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Vienādranga ierīce pieprasīja teksta tālruņa režīmu FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Vienādranga ierīce pieprasīja teksta tālruņa režīmu HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Vienādranga ierīce pieprasīja teksta tālruņa režīmu VCO"</string>
@@ -287,11 +294,9 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Skatīt tā loga saturu, ar kuru mijiedarbojaties."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivizēt funkciju “Pārlūkot pieskaroties”."</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Tiks izrunāti to vienumu nosaukumi, kuriem pieskarsieties, un ekrānu varēsiet pārlūkot ar žestiem."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Ieslēgt uzlaboto tīmekļa pieejamību."</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Var tikt instalēti skripti, lai padarītu lietotņu saturu pieejamāku."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Skatīt ierakstīto tekstu."</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Ietver personas datus, piemēram, kredītkartes numurus un paroles."</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Displeja palielinājuma kontrole"</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Kontrolēt displeja palielinājumu."</string>
<string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Kontrolējiet displeja tālummaiņas līmeni un pozicionēšanu."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Žestu izpilde"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Atbalsta pieskaršanos, vilkšanu, savilkšanu un citus žestus."</string>
@@ -1763,11 +1768,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Lai ievadītu laiku, ieslēdziet teksta ievades režīmu."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Lai ievadītu laiku, ieslēdziet pulksteņa režīmu."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Automātiskās aizpildes opcijas"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Saglabāt automātiskajai aizpildei"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Saturu nevar automātiski aizpildīt."</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Vai saglabāt pakalpojumā <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Vai saglabāt <xliff:g id="TYPE">%1$s</xliff:g> pakalpojumā <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Vai saglabāt informāciju (<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>) iezīmē <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Vai saglabāt informāciju (<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g>) iezīmē <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Vai saglabāt pakalpojumā <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Vai saglabāt vienumu “<xliff:g id="TYPE">%1$s</xliff:g>” pakalpojumā <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Vai saglabāt vienumus “<xliff:g id="TYPE_0">%1$s</xliff:g>” un “<xliff:g id="TYPE_1">%2$s</xliff:g>” pakalpojumā <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Vai saglabāt vienumus “<xliff:g id="TYPE_0">%1$s</xliff:g>”, “<xliff:g id="TYPE_1">%2$s</xliff:g>” un “<xliff:g id="TYPE_2">%3$s</xliff:g>” pakalpojumā <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Saglabāt"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Nē, paldies"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"paroli"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 2fb9553..bb2527c 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Вашиот оператор привремено ги суспендираше говорните и итните повици на локацијава"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Не може да се дојде до мрежата"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"За подобрување на приемот, обидете се да го промените избраниот тип во: Систем > Мрежа и интернет > Мобилни мрежи > Претпочитан тип мрежа."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Предупредувања"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Проследување повик"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим на итен повратен повик"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Предупредувања за мобилен интернет"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS-пораки"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Пораки од говорна пошта"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Повикување преку Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Рамноправен уред го побара режимот на TTY „FULL“"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Рамноправен уред го побара режимот на TTY „HCO“"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Рамноправен уред го побара режимот на TTY „VCO“"</string>
@@ -280,16 +287,14 @@
<string name="permgroupdesc_phone" msgid="6234224354060641055">"упатува и управува со телефонски повици"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Телесни сензори"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"пристапува до податоците од сензорите за виталните знаци"</string>
- <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Врати содржина на прозорец"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Провери ја содржината на прозорецот со кој се комуницира."</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Преземе содржина на прозорец"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Ја следи содржината на прозорецот со кој се комуницира."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Вклучи „Истражувај со допир“"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Допрените ставки ќе се изговорат на глас и екранот може да се истражува со движења."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Вклучи подобрена пристапност кон веб"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"За содржината на апликацијата да биде подостапна, може да се инсталираат скрипти."</string>
- <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Набљудувај го напишаниот текст"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Го следи напишаниот текст"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Опфаќа лични податоци како што се броеви на кредитни картички и лозинки."</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Контролирајте го зголемувањето на екранот"</string>
- <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Контролирајте го нивото на зумирање и позиционирање на екранот."</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Го контролира зголемувањето на екранот"</string>
+ <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Го контролира нивото на зумирање и позиционирање на екранот."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Користете движења"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Може да допрете, повлечете, штипнете и да користите други движења."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Движења за отпечатоци"</string>
@@ -645,7 +650,7 @@
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Годишнина"</string>
<string name="eventTypeOther" msgid="7388178939010143077">"Други"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Приспособени"</string>
- <string name="emailTypeHome" msgid="449227236140433919">"Почетна страница"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"Приватна е-пошта"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Работа"</string>
<string name="emailTypeOther" msgid="2923008695272639549">"Други"</string>
<string name="emailTypeMobile" msgid="119919005321166205">"Мобилен"</string>
@@ -995,9 +1000,9 @@
<string name="whichViewApplication" msgid="3272778576700572102">"Отвори со"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Отвори со %1$s"</string>
<string name="whichViewApplicationLabel" msgid="2666774233008808473">"Отвори"</string>
- <string name="whichEditApplication" msgid="144727838241402655">"Уреди со"</string>
- <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Уреди со %1$s"</string>
- <string name="whichEditApplicationLabel" msgid="7183524181625290300">"Уреди"</string>
+ <string name="whichEditApplication" msgid="144727838241402655">"Измени со"</string>
+ <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Измени со %1$s"</string>
+ <string name="whichEditApplicationLabel" msgid="7183524181625290300">"Измени"</string>
<string name="whichSendApplication" msgid="6902512414057341668">"Сподели со"</string>
<string name="whichSendApplicationNamed" msgid="2799370240005424391">"Сподели со %1$s"</string>
<string name="whichSendApplicationLabel" msgid="4579076294675975354">"Сподели"</string>
@@ -1069,7 +1074,7 @@
<string name="dump_heap_text" msgid="4809417337240334941">"Процесот <xliff:g id="PROC">%1$s</xliff:g> го надмина ограничувањето на меморијата на својот процес од <xliff:g id="SIZE">%2$s</xliff:g>. Достапна ви е слика од меморијата да ја споделите со неговиот програмер. Бидете внимателни: сликата од меморијата може да содржи кои било од вашите лични информации до кои апликацијата има пристап."</string>
<string name="sendText" msgid="5209874571959469142">"Избери дејство за текст"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Јачина на звук на ѕвонче"</string>
- <string name="volume_music" msgid="5421651157138628171">"Јачина на звук на медиуми"</string>
+ <string name="volume_music" msgid="5421651157138628171">"Јачина на аудио/видео звук"</string>
<string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Се репродуцира преку Bluetooth"</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Поставено ѕвонење на тивко"</string>
<string name="volume_call" msgid="3941680041282788711">"Јачина на звук на дојдовен повик"</string>
@@ -1080,7 +1085,7 @@
<string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Јачина на звук на Bluetooth"</string>
<string name="volume_icon_description_ringer" msgid="3326003847006162496">"Јачина на звук на мелодија"</string>
<string name="volume_icon_description_incall" msgid="8890073218154543397">"Јачина на звук на повик"</string>
- <string name="volume_icon_description_media" msgid="4217311719665194215">"Јачина на звук на медиуми"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"Јачина на аудио/видео звук"</string>
<string name="volume_icon_description_notification" msgid="7044986546477282274">"Јачина на звук на известување"</string>
<string name="ringtone_default" msgid="3789758980357696936">"Стандардна мелодија"</string>
<string name="ringtone_default_with_actual" msgid="1767304850491060581">"Стандардна (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
@@ -1358,7 +1363,7 @@
<string name="storage_usb_drive" msgid="6261899683292244209">"УСБ-меморија"</string>
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> УСБ-меморија"</string>
<string name="storage_usb" msgid="3017954059538517278">"УСБ меморија"</string>
- <string name="extract_edit_menu_button" msgid="8940478730496610137">"Уреди"</string>
+ <string name="extract_edit_menu_button" msgid="8940478730496610137">"Измени"</string>
<string name="data_usage_warning_title" msgid="3620440638180218181">"Известување за потрошен сообраќај"</string>
<string name="data_usage_warning_body" msgid="6660692274311972007">"Допрете за употреба и поставки."</string>
<string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Постигна лимит за 2G-3G податоци"</string>
@@ -1735,11 +1740,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Префрлете се на режимот за внесување текст за да внесете време."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Префрлете се на режимот за часовник за да внесете време."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Опции за автоматско пополнување"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Зачувајте за автоматско пополнување"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Содржините не може автоматски да се пополнат"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Да се зачува во <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Да се зачува <xliff:g id="TYPE">%1$s</xliff:g> во <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Да се зачуваат <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> во <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Да се зачуваат <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> во <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Да се зачува во <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Да се зачува <xliff:g id="TYPE">%1$s</xliff:g> во <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Да се зачуваат <xliff:g id="TYPE_0">%1$s</xliff:g> и <xliff:g id="TYPE_1">%2$s</xliff:g> во <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Да се зачуваат <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> и <xliff:g id="TYPE_2">%3$s</xliff:g> во <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Зачувај"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Не, благодарам"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"лозинка"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 8f80f1ad..178bc3d 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"ഈ ലൊക്കേഷനിൽ നിങ്ങളുടെ കാരിയർ വോയ്സ് കോളുകളും അടിയന്തിര കോളുകളും തൽക്കാലം നിർത്തിവച്ചിരിക്കുകയാണ്"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്യാനാവുന്നില്ല"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"സ്വീകരണം മെച്ചപ്പെടുത്തുന്നതിന് സിസ്റ്റം > നെറ്റ്വർക്കും ഇന്റർനെറ്റും > മൊബൈൽ നെറ്റ്വർക്കുകൾ > തിരഞ്ഞെടുത്ത നെറ്റ്വർക്ക് തരം എന്നതിൽ തിരഞ്ഞെടുത്തിരിക്കുന്ന തരം മാറ്റിക്കൊണ്ട് ശ്രമിച്ചുനോക്കുക."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"അലേർട്ടുകൾ"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"കോൾ ഫോർവേഡിംഗ്"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"അടിയന്തര കോൾബാക്ക് മോഡ്"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"മൊബൈൽ ഡാറ്റ അലേർട്ടുകൾ"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS സന്ദേശങ്ങൾ"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"വോയ്സ്മെയിൽ സന്ദേശങ്ങൾ"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"വൈഫൈ കോളിംഗ്"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് \'ഫുൾ\'"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് VCO"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"നിങ്ങൾ സംവദിക്കുന്ന ഒരു വിൻഡോയുടെ ഉള്ളടക്കം പരിശോധിക്കുക."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"സ്പർശനം വഴി പര്യവേക്ഷണം ചെയ്യുക ഓൺ ചെയ്യുക"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"ടാപ്പുചെയ്ത ഇനങ്ങൾ ഉച്ചത്തിൽ പറയപ്പെടും, ജെസ്റ്ററുകൾ ഉപയോഗിച്ച് സ്ക്രീൻ അടുത്തറിയാവുന്നതാണ്."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"മെച്ചപ്പെടുത്തിയ വെബ് ഉപയോഗസഹായി ഓണാക്കുക"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"അപ്ലിക്കേഷൻ ഉള്ളടക്കം കൂടുതൽ ആക്സസ്സുചെയ്യാൻ കഴിയുന്നതാക്കാൻ സ്ക്രിപ്റ്റുകൾ ഇൻസ്റ്റാളുചെയ്യാനിടയുണ്ട്."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"നിങ്ങൾ ടൈപ്പുചെയ്യുന്ന വാചകം നിരീക്ഷിക്കുക"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"ക്രെഡിറ്റ് കാർഡ് നമ്പറുകളും പാസ്വേഡുകളും പോലുള്ള വ്യക്തിഗത ഡാറ്റ ഉൾപ്പെടുന്നു."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"ഡിസ്പ്ലേ മാഗ്നിഫിക്കേഷൻ നിയന്ത്രിക്കുക"</string>
@@ -1121,7 +1126,7 @@
<string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"ക്ഷണം അയച്ചു"</string>
<string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"കണക്റ്റുചെയ്യാനുള്ള ക്ഷണം"</string>
<string name="wifi_p2p_from_message" msgid="570389174731951769">"അയച്ചത്:"</string>
- <string name="wifi_p2p_to_message" msgid="248968974522044099">"സ്വീകർത്താവ്:"</string>
+ <string name="wifi_p2p_to_message" msgid="248968974522044099">"ടു:"</string>
<string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"ആവശ്യമായ പിൻ ടൈപ്പുചെയ്യുക:"</string>
<string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"പിൻ:"</string>
<string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"ടാബ്ലെറ്റ് <xliff:g id="DEVICE_NAME">%1$s</xliff:g> എന്നതിൽ കണക്റ്റുചെയ്തിരിക്കുമ്പോൾ അത് താൽക്കാലികമായി Wi-Fi-യിൽ നിന്നും വിച്ഛേദിക്കപ്പെടും."</string>
@@ -1725,7 +1730,7 @@
<string name="app_category_productivity" msgid="3742083261781538852">"ഉല്പ്പാദനക്ഷമത"</string>
<string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"ഉപകരണ സ്റ്റോറേജ്"</string>
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"USB ഡീബഗ്ഗിംഗ്"</string>
- <string name="time_picker_hour_label" msgid="2979075098868106450">"മണിക്കൂര്"</string>
+ <string name="time_picker_hour_label" msgid="2979075098868106450">"മണി."</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"മിനിറ്റ്"</string>
<string name="time_picker_header_text" msgid="143536825321922567">"സമയം സജ്ജീകരിക്കുക"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"ശരിയായ സമയം നൽകുക"</string>
@@ -1733,11 +1738,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"സമയം നൽകുന്നതിന് ടെക്സ്റ്റ് ഇൻപുട്ട് മോഡിലേക്ക് മാറുക."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"സമയം നൽകുന്നതിന് ക്ലോക്ക് മോഡിലേക്ക് മാറുക."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"സ്വയമേവ പൂരിപ്പിക്കൽ ഓപ്ഷനുകൾ"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"സ്വയമേവ പൂരിപ്പിക്കാനായി സംരക്ഷിക്കുക"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"ഉള്ളടക്കങ്ങൾ സ്വയമേവ പൂരിപ്പിക്കാൻ കഴിയില്ല"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> എന്നതിലേക്ക് സംരക്ഷിക്കണോ?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> <xliff:g id="LABEL">%2$s</xliff:g> എന്നതിലേക്ക് സംരക്ഷിക്കണോ?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> എന്നിവ <xliff:g id="LABEL">%3$s</xliff:g> എന്നതിൽ സംരക്ഷിക്കട്ടെ?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> എന്നിവ <xliff:g id="LABEL">%4$s</xliff:g> എന്നതിൽ സംരക്ഷിക്കട്ടെ?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b>എന്നതിലേക്ക് സംരക്ഷിക്കണോ?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> എന്നതിനെ <b><xliff:g id="LABEL">%2$s</xliff:g></b>എന്നതിലേക്ക് സംരക്ഷിക്കണോ?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> എന്നിവ<b><xliff:g id="LABEL">%3$s</xliff:g></b>എന്നതിലേക്ക് സംരക്ഷിക്കണോ?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> എന്നിവ<b><xliff:g id="LABEL">%4$s</xliff:g></b>എന്നതിലേക്ക് സംരക്ഷിക്കണോ?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"സംരക്ഷിക്കുക"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"വേണ്ട, നന്ദി"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"പാസ്വേഡ്"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 88aacda..5cf213a 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Таны оператор компани энэ байршилд дуу хоолой, яаралтай дуудлагыг түр хаасан байна"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Сүлжээнд холбогдох боломжгүй байна"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Хүлээн авалтыг сайжруулахын тулд систем, сүлжээ, интернэт, мобайл сүлжээнд сонгосон сүлжээний төрлийг өөрчилнө үү."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Сануулга"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Дуудлага шилжүүлэх"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Яаралтай дуудлага хийх горим"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Мобайл дата сануулга"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS мессеж"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Дуут шуудангийн мессеж"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi дуудлага"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Хандлагын цэгт хүсэлт тавьсан TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Хандлагын цэгт хүсэлт тавьсан TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Хандлагын цэгт хүсэлт тавьсан TTY Mode VCO"</string>
@@ -190,7 +197,7 @@
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Таблетын сонголтууд"</string>
<string name="power_dialog" product="tv" msgid="6153888706430556356">"Телевиз сонголтууд"</string>
<string name="power_dialog" product="default" msgid="1319919075463988638">"Утасны сонголт"</string>
- <string name="silent_mode" msgid="7167703389802618663">"Чимээгүй горим"</string>
+ <string name="silent_mode" msgid="7167703389802618663">"Дуугүй горим"</string>
<string name="turn_on_radio" msgid="3912793092339962371">"Утасгүй холбоог асаах"</string>
<string name="turn_off_radio" msgid="8198784949987062346">"Утасгүй сүлжээг унтраах уу"</string>
<string name="screen_lock" msgid="799094655496098153">"Дэлгэцний түгжээ"</string>
@@ -231,7 +238,7 @@
<item quantity="other">Алдааны тайлангийн дэлгэцийн зургийг <xliff:g id="NUMBER_1">%d</xliff:g> секундад авна.</item>
<item quantity="one">Алдааны тайлангийн дэлгэцийн зургийг <xliff:g id="NUMBER_0">%d</xliff:g> секундад авна.</item>
</plurals>
- <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Чимээгүй горим"</string>
+ <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Дуугүй горим"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Дуу хаагдсан"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Дуу асав"</string>
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Нислэгийн горим"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Таны харилцан үйлчлэх цонхны контентоос шалгах."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Хүрч танихыг асаах"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Товшсон зүйлсийг чангаар хэлэх ба дэлгэцийг дохио ашиглан таних боломжтой."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Сайжруулсан вэб хандалтыг асаах"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Апп контентод илүү хялбар хандуулахын тулд скриптыг суулгана."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Бичсэн текстээ ажиглах"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Кредит картын дугаар болон нууц үг зэрэг хувийн датаг агуулж байна."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Дэлгэцийн өсгөлтийг хянах"</string>
@@ -1730,11 +1735,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Цагийг оруулахын тулд текст оруулах горимд шилжүүлнэ үү."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Цагийг оруулахын тулд цагийн горимд шилжүүлнэ үү."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Автоматаар бөглөх хэсгийн сонголт"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Автоматаар бөглөх хэсэгт хадгалах"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Агуулгыг автоматаар бөглөх боломжгүй"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g>-д хадгалах уу?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g>-г <xliff:g id="LABEL">%2$s</xliff:g>-д хадгалах уу?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>-г <xliff:g id="LABEL">%3$s</xliff:g>-д хадгалах уу?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g>-г <xliff:g id="LABEL">%4$s</xliff:g>-д хадгалах уу?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b>-д хадгалах уу?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g>-г <b><xliff:g id="LABEL">%2$s</xliff:g></b>-д хадгалах уу?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>-г <b><xliff:g id="LABEL">%3$s</xliff:g></b>-д хадгалах уу?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g>-г <b><xliff:g id="LABEL">%4$s</xliff:g></b>-д хадгалах уу?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Хадгалах"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Үгүй, баярлалаа"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"нууц үг"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 43c18da7..7f41449 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"आपल्या वाहकाने या स्थानावर व्हॉइस आणि आणीबाणी कॉल तात्पुरते निलंबित केले आहेत"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"नेटवर्कवर पोहोचूू शकत नाही"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"रिसेप्शन सुधारण्यासाठी प्रणाली > नेटवर्क आणि इंटरनेट > मोबाइल नेटवर्क > प्राधान्य दिलेला नेटवर्क प्रकार येथे निवडलेला प्रकार बदलून पहा."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"अलर्ट"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"कॉल फॉरवर्डिंग"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"इमर्जन्सी कॉलबॅक मोड"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"मोबाइल डेटा अलर्ट"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS संदेश"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"व्हॉइसमेल संदेश"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi कॉलिंग"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"समवयस्क व्यक्तीने TTY मोड पूर्ण ची विनंती केली"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"समवयस्क व्यक्तीने TTY मोड HCO ची विनंती केली"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"समवयस्क व्यक्तीने TTY मोड VCO ची विनंती केली"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"आपण परस्परसंवाद करीत असलेल्या विंडोची सामग्री तपासा."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"स्पर्श करून अन्वेषण चालू करा"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"टॅप केलेले आयटम मोठ्याने बोलले जातील आणि जेश्चरचा वापर करून स्क्रीन एक्सप्लोर केली जाऊ शकते."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"वर्धित केलेली वेब प्रवेशयोग्यता चालू करा"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"अॅप सामग्री अधिक प्रवेशयोग्य बनविण्यासाठी कदाचित स्क्रिप्ट स्थापित केली जाऊ शकतात."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"आपण टाइप करता त्या मजकुराचे निरीक्षण करा"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"क्रेडिट कार्ड नंबर आणि संकेतशब्द यासारखा वैयक्तिक डेटा समाविष्ट करते."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"प्रदर्शन विस्तृतीकरण नियंत्रित करा"</string>
@@ -443,9 +448,9 @@
<string name="permlab_changeWifiState" msgid="6550641188749128035">"वाय-फाय वरून कनेक्ट करा आणि डिस्कनेक्ट करा"</string>
<string name="permdesc_changeWifiState" msgid="7137950297386127533">"वाय-फाय प्रवेश बिंदूंवर कनेक्ट करण्यासाठी आणि त्यावरून डिस्कनेक्ट करण्यासाठी आणि वाय-फाय नेटवर्कसाठी डिव्हाइस कॉन्फिगरेशनमध्ये बदल करण्यासाठी अॅप ला अनुमती देते."</string>
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"वाय-फाय मल्टिकास्ट रिसेप्शनला अनुमती द्या"</string>
- <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"मल्टिकास्ट पत्ते वापरून फक्त आपल्या टॅब्लेटवर नाही, तर वाय-फाय नेटवर्कवरील सर्व डिव्हाइसेसवर पाठविलेले पॅकेट प्राप्त करण्यासाठी अॅप ला अनुमती देते. हे गैर-मल्टिकास्ट मोडपेक्षा अधिक उर्जा वापरते."</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"मल्टिकास्ट पत्ते वापरून फक्त आपल्या टॅब्लेटवर नाही, तर वाय-फाय नेटवर्कवरील सर्व डिव्हाइसेसवर पाठविलेले पॅकेट प्राप्त करण्यासाठी अॅप ला अनुमती देते. हे गैर-मल्टिकास्ट मोडपेक्षा अधिक पॉवर वापरते."</string>
<string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"केवळ आपला टीव्ही न वापरता, एकाधिक पत्ते वापरून एका वाय-फाय नेटवकवरील सर्व डिव्हाइसवर पाठविलेली पॅकेट प्राप्त करण्यासाठी अॅपला अनुमती देते."</string>
- <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"मल्टिकास्ट पत्ते वापरून फक्त आपल्या फोनवर नाही, तर वाय-फाय नेटवर्कवरील सर्व डिव्हाइसेसवर पाठविलेले पॅकेट प्राप्त करण्यासाठी अॅप ला अनुमती देते. हे गैर-मल्टिकास्ट मोडपेक्षा अधिक उर्जा वापरते."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"मल्टिकास्ट पत्ते वापरून फक्त आपल्या फोनवर नाही, तर वाय-फाय नेटवर्कवरील सर्व डिव्हाइसेसवर पाठविलेले पॅकेट प्राप्त करण्यासाठी अॅप ला अनुमती देते. हे गैर-मल्टिकास्ट मोडपेक्षा अधिक पॉवर वापरते."</string>
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"ब्लूटुथ सेटिंग्जवर प्रवेश करा"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"स्थानिक ब्लूटुथ टॅबलेट कॉन्फिगर करण्याकरिता आणि दूरस्थ डिव्हाइसेस शोधण्यासाठी आणि त्यासह जोडण्यासाठी अॅप ला अनुमती देते."</string>
<string name="permdesc_bluetoothAdmin" product="tv" msgid="3373125682645601429">"स्थानिक ब्लूटुथ टीव्ही कॉन्फिगर करण्यासाठी आणि दूरस्थ डिव्हाइसेससह शोधण्यासाठी आणि जोडण्यासाठी अॅपला अनुमती देते."</string>
@@ -1604,7 +1609,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"आपल्या प्रशासकाने स्थापित केले"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"आपल्या प्रशासकाने अद्यतनित केले"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"आपल्या प्रशासकाने हटवले"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"बॅटरीचे आयुष्य सुधारित करण्यात मदत करण्यासाठी, बॅटरी बचतकर्ता आपल्या डिव्हाइसचे कार्यप्रदर्शन कमी करतो आणि कंपन, स्थान सेवा आणि बराच पार्श्वभूमी डेटा मर्यादित करतो. संकालनावर अवलंबून असणारे ईमेल, संदेशन आणि इतर अॅप्स आपण उघडल्याशिवाय अद्यतनित होऊ शकत नाहीत.\n\nआपले डिव्हाइस चार्ज होत असते तेव्हा बॅटरी बचतकर्ता स्वयंचलितपणे बंद होतो."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"बॅटरी लाइफ सुधारित करण्यासाठी, बॅटरी बचतकर्ता आपल्या डिव्हाइसचे कार्यप्रदर्शन कमी करतो आणि कंपन, स्थान सेवा आणि बराच पार्श्वभूमी डेटा मर्यादित करतो. संकालनावर अवलंबून असणारे ईमेल, संदेशन आणि इतर अॅप्स आपण उघडल्याशिवाय अद्यतनित होऊ शकत नाहीत.\n\nआपले डिव्हाइस चार्ज होत असते तेव्हा बॅटरी बचतकर्ता स्वयंचलितपणे बंद होतो."</string>
<string name="data_saver_description" msgid="6015391409098303235">"डेटा वापर कमी करण्यात मदत करण्यासाठी, डेटा सर्व्हर काही अॅप्सना पार्श्वभूमीमध्ये डेटा पाठविण्यास किंवा प्राप्त करण्यास प्रतिबंधित करतो. आपण सध्या वापरत असलेला अॅप डेटामध्ये प्रवेश करू शकतो परंतु तसे तो खूप कमी वेळा करू शकतो. याचा अर्थ, उदाहरणार्थ, आपण प्रतिमा टॅप करेपर्यंत त्या प्रदर्शित करणार नाहीत असा असू शकतो."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"डेटा बचतकर्ता चालू करायचा?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"चालू करा"</string>
@@ -1733,11 +1738,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"वेळ इनपुटसाठी मजकूर इनपुट मोडवर स्विच करा."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"वेळ इनपुटसाठी घड्याळ मोडवर स्विच करा."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"स्वयं-भरण पर्याय"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"स्वत: भरण्यासाठी सेव्ह करा"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"सामग्रींची स्वयं-भरणा करता येणार नाही"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> वर जतन करायचे?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="LABEL">%2$s</xliff:g> वर <xliff:g id="TYPE">%1$s</xliff:g> जतन करायचे?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="LABEL">%3$s</xliff:g> वर <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> जतन करायचे का?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="LABEL">%4$s</xliff:g> वर <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> जतन करायचे का?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> मध्ये सेव्ह करायचे का?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<b><xliff:g id="LABEL">%2$s</xliff:g></b>मध्ये <xliff:g id="TYPE">%1$s</xliff:g> सेव्ह करायची?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<b><xliff:g id="LABEL">%3$s</xliff:g></b>मध्ये <xliff:g id="TYPE_0">%1$s</xliff:g> आणि <xliff:g id="TYPE_1">%2$s</xliff:g> सेव्ह करायची?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<b><xliff:g id="LABEL">%4$s</xliff:g></b>मध्ये <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> आणि <xliff:g id="TYPE_2">%3$s</xliff:g> सेव्ह करायची?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"जतन करा"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"नाही धन्यवाद"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"संकेतशब्द"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index e414985..5d5c4f3 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Pembawa anda telah menggantung panggilan suara dan kecemasan di lokasi ini untuk sementara waktu"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Tidak dapat mencapai rangkaian"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Untuk memperbaik penerimaan, cuba tukar jenis rangkaian yang dipilih di Sistem > Rangkaian & Internet > Rangkaian mudah alih > Jenis rangkaian pilihan."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Makluman"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Pemajuan panggilan"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mod paggil balik kecemasan"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Makluman data mudah alih"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Mesej SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mesej mel suara"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Panggilan Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Rakan meminta Mod TTY PENUH"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Rakan meminta Mod TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Rakan meminta Mod TTY VCO"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Periksa kandungan tetingkap yang berinteraksi dengan anda."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Hidupkan Jelajah melalui Sentuhan"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Item yang diketik akan dituturkan dengan lantang dan skrin boleh dijelajah menggunakan gerak isyarat."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Hidupkan kebolehcapaian web dipertingkat"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skrip boleh dipasang untuk menjadikan kandungan apl lebih mudah diakses."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Perhatikan teks yang anda taip"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Termasuk data peribadi seperti nombor kad kredit dan kata laluan."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Kawal pembesaran paparan"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Beralih ke mod input teks untuk input masa."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Beralih ke mod jam untuk input masa."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Pilihan autolengkap"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Simpan untuk Autolengkap"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Kandungan tidak boleh dilengkapkan secara automatik"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Simpan ke <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Simpan <xliff:g id="TYPE">%1$s</xliff:g> ke <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Simpan <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ke <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Simpan <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> ke <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Simpan ke <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Simpan <xliff:g id="TYPE">%1$s</xliff:g> ke <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Simpan <xliff:g id="TYPE_0">%1$s</xliff:g> dan <xliff:g id="TYPE_1">%2$s</xliff:g> ke <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Simpan <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> dan <xliff:g id="TYPE_2">%3$s</xliff:g> ke <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Simpan"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Tidak, terima kasih"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"kata laluan"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index dd71d43..d880658 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -21,7 +21,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"ကီလိုဘိုက်"</string>
+ <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
<string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
<string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
<string name="terabyteShort" msgid="231613018159186962">"TB"</string>
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"သင်၏ ဝန်ဆောင်မှုပေးသူသည် ဤတည်နေရာအတွက် ဖုန်းခေါ်ဆိုမှု နှင့် အရေးပေါ်ခေါ်ဆိုမှုများကို ခေတ္တရပ်ဆိုင်းထားပါသည်"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ကွန်ရက်ကို ချိတ်ဆက်၍မရပါ"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"လိုင်းဖမ်းယူမှု ကောင်းမွန်စေရန် စနစ် > ကွန်ရက်နှင့် အင်တာနက် > မိုဘိုင်းကွန်ရက်များ > အသုံးပြုလိုသည့် ကွန်ရက်အမျိုးအစားတွင် ရွေးချယ်ထားသည့် အမျိုးအစားကို ပြောင်းကြည့်ပါ။"</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"သတိပေးချက်များ"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"အဝင်ခေါ်ဆိုမှုအား ထပ်ဆင့်ပို့ခြင်း"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"အရေးပေါ် ပြန်လည်ခေါ်ဆိုနိုင်သောမုဒ်"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"မိုဘိုင်းဒေတာ သတိပေးချက်များ"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS မက်ဆေ့ဂျ်များ"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"အသံမေးလ် မက်ဆေ့ဂျ်များ"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi ခေါ်ဆိုမှု"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"အခြားစက်မှ TTY မုဒ် FULL ပြုရန် တောင်းဆို၏"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"အခြားစက်မှ TTY မုဒ် HCO ပြုရန် တောင်းဆို၏"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"TTY မုဒ် VCO ပြုရန် အခြားစက်မှ တောင်းဆို၏"</string>
@@ -265,7 +272,7 @@
<string name="permgrouplab_contacts" msgid="3657758145679177612">"အဆက်အသွယ်များ"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"သင့် အဆက်အသွယ်များအား ဝင်ရောက်သုံးရန်"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"တည်နေရာ"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"ဤစက်ပစ္စည်း၏ တည်နေရာကို ရယူ"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"ဤစက်ပစ္စည်း၏ တည်နေရာကို ရယူရန်"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ပြက္ခဒိန်"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"သင့်ပြက္ခဒိန်အား ဝင်ရောက်သုံးရန်"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"စာတိုစနစ်"</string>
@@ -280,15 +287,13 @@
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ရန်နှင့် စီမံရန်"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"ခန္ဓာကိုယ် အာရုံခံကိရိယာများ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"သင်၏ အဓိကကျသော လက္ခဏာများအကြောင်း အာရုံခံကိရိယာဒေတာကို ရယူသုံးစွဲရန်"</string>
- <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ဝင်းဒိုးမှာပါရှိသည်များကို ထုတ်ယူခြင်း"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"သင် အပြန်အလှန်လုပ်နေသော ဝင်းဒိုးမှာပါရှိသည်များကို သေချာစွာ ကြည့်ရှုစစ်ဆေးပါ"</string>
- <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ထိတို့ခြင်းဖြင့် ရှာဖွေပေးနိုင်တာကို ဖွင့်လိုက်ပါ"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ဝင်းဒိုးတွင် ပါရှိသည်များကို ပြန်လည်ရယူရန်"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"သင်အသုံးပြုနေသော ဝင်းဒိုးတွင် ပါရှိသည်များကို ကြည့်ရှုစစ်ဆေးသည်။"</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"တို့ထိခြင်းဖြင့် ရှာဖွေမှုကို ဖွင့်ရန်"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"တို့လိုက်သည့်အရာများကို အသံထွက်ဖတ်ပေးပါလိမ့်မည်။ လက်ဟန်အမူအရာများကို အသုံးပြု၍ မျက်နှာပြင်ကို လေ့လာနိုင်ပါသည်။"</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"ပိုမိုကောင်းမွန်သော ဝဘ်ရယူသုံးစွဲနိုင်မှုကို ဖွင့်ရန်"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"အပလီကေးရှင်းကို ပိုမိုပြည့်စုံစေရန် စကရစ်များကို သွင်းနိုင်ပါတယ်"</string>
- <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"ရိုက်သောစာများကို သေချာစွာ စစ်ဆေးပါ"</string>
- <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"အရေးကြီးသော ကိုယ်ရေးအချက်အလက်များဖြစ်တဲ့ ခရက်ဒစ်ကဒ်နံပါတ်များနှင့် စကားဝှက်များ ပါဝင်ပါတယ်."</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"မျက်နှာပြင် ချဲ့ခြင်းကို ထိန်းချုပ်ပါ"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"ရိုက်သောစာများကို စောင့်ကြည့်ရန်"</string>
+ <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"ကိုယ်ရေးအချက်အလက်များဖြစ်သော ခရက်ဒစ်ကဒ်နံပါတ်နှင့် စကားဝှက်များ ပါဝင်သည်။"</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"မျက်နှာပြင် ချဲ့ခြင်းကို ထိန်းချုပ်ရန်"</string>
<string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"မျက်နှာပြင် ဇူးမ်အရွယ်နှင့် နေရာချထားခြင်းကို ထိန်းချုပ်ပါ။"</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"လက်ဟန်များ အသုံးပြုပါ"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"တို့ခြင်း၊ ပွတ်ဆွဲခြင်း၊ နှင့် အခြား လက်ဟန်များကို အသုံးပြုနိုင်ပါသည်။"</string>
@@ -579,7 +584,7 @@
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"ပင်မစာမျက်နှာ"</item>
<item msgid="869923650527136615">"မိုဘိုင်း"</item>
- <item msgid="7897544654242874543">"အလုပ်အကိုင်"</item>
+ <item msgid="7897544654242874543">"အလုပ်"</item>
<item msgid="1103601433382158155">"အလုပ်ဖက်စ်"</item>
<item msgid="1735177144948329370">"အိမ်ဖက်စ်"</item>
<item msgid="603878674477207394">"ပေဂျာ"</item>
@@ -588,24 +593,24 @@
</string-array>
<string-array name="emailAddressTypes">
<item msgid="8073994352956129127">"ပင်မစာမျက်နှာ"</item>
- <item msgid="7084237356602625604">"အလုပ်အကိုင်"</item>
+ <item msgid="7084237356602625604">"အလုပ်"</item>
<item msgid="1112044410659011023">"တခြား"</item>
<item msgid="2374913952870110618">"မိမိစိတ်ကြိုက်"</item>
</string-array>
<string-array name="postalAddressTypes">
<item msgid="6880257626740047286">"ပင်မစာမျက်နှာ"</item>
- <item msgid="5629153956045109251">"အလုပ်အကိုင်"</item>
+ <item msgid="5629153956045109251">"အလုပ်"</item>
<item msgid="4966604264500343469">"တခြား"</item>
<item msgid="4932682847595299369">"မိမိစိတ်ကြိုက်"</item>
</string-array>
<string-array name="imAddressTypes">
<item msgid="1738585194601476694">"ပင်မစာမျက်နှာ"</item>
- <item msgid="1359644565647383708">"အလုပ်အကိုင်"</item>
+ <item msgid="1359644565647383708">"အလုပ်"</item>
<item msgid="7868549401053615677">"တခြား"</item>
<item msgid="3145118944639869809">"မိမိစိတ်ကြိုက်"</item>
</string-array>
<string-array name="organizationTypes">
- <item msgid="7546335612189115615">"အလုပ်အကိုင်"</item>
+ <item msgid="7546335612189115615">"အလုပ်"</item>
<item msgid="4378074129049520373">"တခြား"</item>
<item msgid="3455047468583965104">"မိမိစိတ်ကြိုက်"</item>
</string-array>
@@ -622,7 +627,7 @@
<string name="phoneTypeCustom" msgid="1644738059053355820">"မိမိစိတ်ကြိုက်"</string>
<string name="phoneTypeHome" msgid="2570923463033985887">"အိမ်"</string>
<string name="phoneTypeMobile" msgid="6501463557754751037">"မိုဘိုင်း"</string>
- <string name="phoneTypeWork" msgid="8863939667059911633">"အလုပ်အကိုင်"</string>
+ <string name="phoneTypeWork" msgid="8863939667059911633">"အလုပ်"</string>
<string name="phoneTypeFaxWork" msgid="3517792160008890912">"အလုပ်ဖက်စ်"</string>
<string name="phoneTypeFaxHome" msgid="2067265972322971467">"အိမ်ဖက်စ်"</string>
<string name="phoneTypePager" msgid="7582359955394921732">"ပေဂျာ"</string>
@@ -645,17 +650,17 @@
<string name="eventTypeAnniversary" msgid="3876779744518284000">"အထိမ်းအမှတ်"</string>
<string name="eventTypeOther" msgid="7388178939010143077">"တခြား"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"မိမိစိတ်ကြိုက်"</string>
- <string name="emailTypeHome" msgid="449227236140433919">"ပင်မစာမျက်နှာ"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"အိမ်"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"အလုပ်"</string>
<string name="emailTypeOther" msgid="2923008695272639549">"တခြား"</string>
<string name="emailTypeMobile" msgid="119919005321166205">"မိုဘိုင်း"</string>
<string name="postalTypeCustom" msgid="8903206903060479902">"မိမိစိတ်ကြိုက်"</string>
<string name="postalTypeHome" msgid="8165756977184483097">"ပင်မစာမျက်နှာ"</string>
- <string name="postalTypeWork" msgid="5268172772387694495">"အလုပ်အကိုင်"</string>
+ <string name="postalTypeWork" msgid="5268172772387694495">"အလုပ်"</string>
<string name="postalTypeOther" msgid="2726111966623584341">"တခြား"</string>
<string name="imTypeCustom" msgid="2074028755527826046">"မိမိစိတ်ကြိုက်"</string>
<string name="imTypeHome" msgid="6241181032954263892">"ပင်မစာမျက်နှာ"</string>
- <string name="imTypeWork" msgid="1371489290242433090">"အလုပ်အကိုင်"</string>
+ <string name="imTypeWork" msgid="1371489290242433090">"အလုပ်"</string>
<string name="imTypeOther" msgid="5377007495735915478">"တခြား"</string>
<string name="imProtocolCustom" msgid="6919453836618749992">"မိမိစိတ်ကြိုက်"</string>
<string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
@@ -667,7 +672,7 @@
<string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
<string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
<string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
- <string name="orgTypeWork" msgid="29268870505363872">"အလုပ်အကိုင်"</string>
+ <string name="orgTypeWork" msgid="29268870505363872">"အလုပ်"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"တခြား"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"မိမိစိတ်ကြိုက်"</string>
<string name="relationTypeCustom" msgid="3542403679827297300">"မိမိစိတ်ကြိုက်"</string>
@@ -687,7 +692,7 @@
<string name="relationTypeSpouse" msgid="394136939428698117">"အိမ်ထောင်ဖက်"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"မိမိစိတ်ကြိုက်"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"ပင်မစာမျက်နှာ"</string>
- <string name="sipAddressTypeWork" msgid="6920725730797099047">"အလုပ်အကိုင်"</string>
+ <string name="sipAddressTypeWork" msgid="6920725730797099047">"အလုပ်"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"တခြား"</string>
<string name="quick_contacts_not_available" msgid="746098007828579688">"ဤအဆက်အသွယ်အား ကြည့်ရှုရန် အပလီကေးရှင်းမတွေ့ပါ"</string>
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN ကုဒ် ရိုက်ထည့်ပါ"</string>
@@ -751,7 +756,7 @@
<string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"အကြိမ်ရေ များစွာ ပုံဆွဲသော့ဖွင့်ရန် ကြိုးစားခြင်း"</string>
<string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"သော့ဖွင့်ရန် Google အကောင့်ဖြင့် ဝင်ပါ"</string>
<string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"သုံးစွဲသူ အမှတ် (အီးမေးလ်)"</string>
- <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"လျို့ဝှက် နံပါတ်"</string>
+ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"စကားဝှက်"</string>
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"ဝင်ရန်"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"အသုံးပြုသူအမည် သို့မဟုတ် လျို့ဝှက် နံပါတ် မှားယွင်းနေသည်"</string>
<string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"သုံးစွဲသူ အမည် သို့ စကားဝှင်ကို မေ့နေပါသလား။ \n"<b>"google.com/accounts/recovery"</b>" ကို သွားရောက်ပါ။"</string>
@@ -838,7 +843,7 @@
<string name="save_password_message" msgid="767344687139195790">"ဤလျှို့ဝှက်စကားဝှက်အား ဘရောင်ဇာကိုမှတ်ခိုင်းမည်လား"</string>
<string name="save_password_notnow" msgid="6389675316706699758">"ယခုမလုပ်ပါ"</string>
<string name="save_password_remember" msgid="6491879678996749466">"မှတ်ထားရန်"</string>
- <string name="save_password_never" msgid="8274330296785855105">"ဘယ်တော့မှ"</string>
+ <string name="save_password_never" msgid="8274330296785855105">"လုံးဝ မလုပ်ပါ"</string>
<string name="open_permission_deny" msgid="7374036708316629800">"သင့်ဆီမှာ ဒီစာမျက်နှာကို ဖွင့်ရန် ခွင့်ပြုချက် မရှိပါ။"</string>
<string name="text_copied" msgid="4985729524670131385">"clipboardထံ စာသားအားကူးယူမည်"</string>
<string name="more_item_label" msgid="4650918923083320495">"နောက်ထပ်"</string>
@@ -1604,7 +1609,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"သင်၏ စီမံခန့်ခွဲသူက ထည့်သွင်းထားသည်"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"သင်၏ စီမံခန့်ခွဲသူက အပ်ဒိတ်လုပ်ထားသည်"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"သင်၏ စီမံခန့်ခွဲသူက ဖျက်လိုက်ပါပြီ"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"ဘက်ထရီသက်တမ်း ကြာရှည်ခံရန်၊ ဘက်ထရီအားထိန်းသည် သင့်ကိရိယာ၏ ဆောင်ရွက်ချက်ကို လျှော့ပေးပြီး တုန်ခါမှု၊ တည်နေရာဝန်ဆောင်မှုများနှင့်၊ နောက်ခံဒေတာအများစုကို ကန့်သတ်ပေး၏။ စင့်လုပ်ပေးရလေ့ရှိသည့် အီးမေးလ်၊ စာပို့ခြင်းနှင့်၊ အခြားအပလီကေးရှင်းများကို ၎င်းတို့အား သင် ဖွင့်မှသာ အပ်ဒိတ်လုပ်မည်ဖြစ်၏။ \n\n ကိရိယာအား အားသွင်းနေစဉ် ဘက်ထရီအားထိန်းအား အလိုအလျောက် ပိတ်ထားသည်။"</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"ဘက်ထရီသက်တမ်း ကြာရှည်ခံရန် ဘက်ထရီအားထိန်းသည် သင့်ကိရိယာ၏ ဆောင်ရွက်ချက်ကိုလျှော့ပေးပြီး တုန်ခါမှု၊ တည်နေရာဝန်ဆောင်မှုများနှင့် နောက်ခံဒေတာအများစုကို ကန့်သတ်ပေး၏။ စင့်ခ်လုပ်ပေးရလေ့ရှိသည့် အီးမေးလ်၊ စာပို့ခြင်းနှင့် အခြားအပလီကေးရှင်းများကို ၎င်းတို့အား သင် ဖွင့်မှသာ အပ်ဒိတ်လုပ်မည်ဖြစ်၏။ \n\n ကိရိယာအား အားသွင်းနေစဉ် ဘက်ထရီအားထိန်းကို အလိုအလျောက် ပိတ်ထားသည်။"</string>
<string name="data_saver_description" msgid="6015391409098303235">"ဒေတာအသုံးလျှော့ချနိုင်ရန် အက်ပ်များကို နောက်ခံတွင် ဒေတာပို့ခြင်းနှင့် လက်ခံခြင်းမရှိစေရန် ဒေတာချွေတာမှုစနစ်က တားဆီးထားပါသည်။ ယခုအက်ပ်ဖြင့် ဒေတာအသုံးပြုနိုင်သော်လည်း အကြိမ်လျှော့၍သုံးရပါမည်။ ဥပမာ၊ သင် မတို့မချင်း ပုံများပေါ်လာမည် မဟုတ်ပါ။"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ဒေတာအသုံးပြုမှု ချွေတာမှုစနစ်ကို ဖွင့်မလား။"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ဖွင့်ပါ"</string>
@@ -1729,15 +1734,16 @@
<string name="time_picker_minute_label" msgid="5168864173796598399">"မိနစ်"</string>
<string name="time_picker_header_text" msgid="143536825321922567">"အချိန်သတ်မှတ်ရန်"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"မှန်ကန်သည့် အမည်တစ်ခု ထည့်ရန်"</string>
- <string name="time_picker_prompt_label" msgid="7588093983899966783">"အချိန်ကို ရိုက်ရန်"</string>
+ <string name="time_picker_prompt_label" msgid="7588093983899966783">"အချိန်ကို ထည့်ရန်"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"အချိန်ထည့်သွင်းရန် စာသားထည့်သွင်းမှုမုဒ်သို့ ပြောင်းပါ။"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"အချိန်ထည့်သွင်းမှုအတွက် နာရီမုဒ်သို့ ပြောင်းပါ။"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"အော်တိုဖြည့် ရွေးချယ်စရာများ"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"အော်တိုဖြည့်ရန်အတွက် သိမ်းပါ"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"အကြောင်းအရာများကို အော်တိုဖြည့်၍မရပါ"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> သို့ သိမ်းဆည်းလိုပါသလား။"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> ကို <xliff:g id="LABEL">%2$s</xliff:g> သို့ သိမ်းဆည်းလိုပါသလား။"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>၊ <xliff:g id="TYPE_1">%2$s</xliff:g> ကို <xliff:g id="LABEL">%3$s</xliff:g> သို့ သိမ်းဆည်းလိုပါသလား။"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>၊ <xliff:g id="TYPE_1">%2$s</xliff:g>၊ <xliff:g id="TYPE_2">%3$s</xliff:g> ကို <xliff:g id="LABEL">%4$s</xliff:g> သို့ သိမ်းဆည်းလိုပါသလား။"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> တွင် သိမ်းဆည်းလိုပါသလား။"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> ကို <b><xliff:g id="LABEL">%2$s</xliff:g></b> တွင် သိမ်းဆည်းလိုပါသလား။"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> နှင့် <xliff:g id="TYPE_1">%2$s</xliff:g> ကို <b><xliff:g id="LABEL">%3$s</xliff:g></b> တွင် သိမ်းဆည်းလိုပါသလား။"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>၊ <xliff:g id="TYPE_1">%2$s</xliff:g> နှင့် <xliff:g id="TYPE_2">%3$s</xliff:g> ကို <b><xliff:g id="LABEL">%4$s</xliff:g></b> တွင် သိမ်းဆည်းလိုပါသလား။"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"သိမ်းရန်"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"မလိုပါ"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"စကားဝှက်"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 9c638ec..c659435 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Operatøren din har midlertidig suspendert tale- og nødanrop på dette stedet"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Får ikke kontakt med nettverket"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"For å forbedre signalet, prøv å endre valgt nettverkstype i System > Nettverk og Internett > Mobilnettverk > Foretrukket nettverkstype."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Varsler"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Viderekobling"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modusen nødsamtale-tilbakeringing"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Varsler for mobildata"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS-meldinger"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Talepostmeldinger"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-anrop"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Motpart ba om TTY-modus FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Motpart ba om TTY-modus HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Motpart ba om TTY-modus VCO"</string>
@@ -281,15 +288,13 @@
<string name="permgrouplab_sensors" msgid="416037179223226722">"Kroppssensorer"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"få tilgang til sensordata om de vitale tegnene dine"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"hente innhold i vinduer"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Den analyserer innholdet i vinduer du samhandler med."</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Appen analyserer innholdet i vinduer du samhandler med."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"slå på berøringsutforsking"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Elementer du trykker på, leses høyt, og skjermen kan utforskes ved bruk av bevegelser."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"slå på forbedret nettilgjengelighet"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skript kan installeres for å gjøre appinnhold mer tilgjengelig."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"observere teksten du skriver inn"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Dette omfatter personlige data, som kredittkortnumre og passord."</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Kontrollér forstørrelse for skjermen"</string>
- <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Kontrollér zoomenivået og plasseringen for skjermen."</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Styre skjermforstørrelsen"</string>
+ <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Appen kan styre zoomnivået og plassering på skjermen."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Gjøre bevegelser"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Kan trykke, sveipe, klype og gjøre andre bevegelser."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Bevegelser på fingeravtrykkssensor"</string>
@@ -712,7 +717,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Prøv på nytt"</string>
<string name="lockscreen_storage_locked" msgid="9167551160010625200">"Lås opp for å få alle funksjoner og data"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Du har overskredet grensen for opplåsingsforsøk med Ansiktslås"</string>
- <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM-kortet mangler"</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM-kort mangler"</string>
<string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"Nettbrettet mangler SIM-kort."</string>
<string name="lockscreen_missing_sim_message" product="tv" msgid="1943633865476989599">"Det er ikke noe SIM-kort i TV-en."</string>
<string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"Ikke noe SIM-kort i telefonen."</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installert av administratoren din"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Oppdatert av administratoren din"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Slettet av administratoren din"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"For å forlenge 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>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Med batterisparing forlenges batteritiden ved at bruk av for eksempel vibrasjon, posisjonstjenester og bakgrunnsdata reduseres. 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>
<string name="data_saver_description" msgid="6015391409098303235">"Datasparing hindrer at apper kan sende og motta data i bakgrunnen. Apper du bruker i øyeblikket, bruker ikke data i like stor grad – for eksempel vises ikke bilder før du trykker på dem."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Vil du slå på Datasparing?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Slå på"</string>
@@ -1726,17 +1731,18 @@
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"USB-feilsøking"</string>
<string name="time_picker_hour_label" msgid="2979075098868106450">"time"</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"minutt"</string>
- <string name="time_picker_header_text" msgid="143536825321922567">"Still inn klokkeslett"</string>
+ <string name="time_picker_header_text" msgid="143536825321922567">"Still klokken"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"Angi et gyldig klokkeslett"</string>
- <string name="time_picker_prompt_label" msgid="7588093983899966783">"Skriv inn klokkeslett"</string>
+ <string name="time_picker_prompt_label" msgid="7588093983899966783">"Skriv hva klokken er"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Bytt til tekstinndatamodus for tidsinndata."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Bytt til klokkemodus for tidsinndata."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Alternativer for autofyll"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Lagre for autofyll"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Innhold kan ikke fylles ut automatisk"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Vil du lagre i <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Vil du lagre <xliff:g id="TYPE">%1$s</xliff:g> i <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Vil du lagre <xliff:g id="TYPE_0">%1$s</xliff:g> og <xliff:g id="TYPE_1">%2$s</xliff:g> til <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Vil du lagre <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> og <xliff:g id="TYPE_2">%3$s</xliff:g> til <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Vil du lagre i <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Vil du lagre <xliff:g id="TYPE">%1$s</xliff:g> i <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Vil du lagre <xliff:g id="TYPE_0">%1$s</xliff:g> og <xliff:g id="TYPE_1">%2$s</xliff:g> i <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Vil du lagre <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> og <xliff:g id="TYPE_2">%3$s</xliff:g> i <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Lagre"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Nei takk"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"passord"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 86c18d6..19e425a 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"तपाईंको सेवा प्रदायकले अस्थायी रूपमा यस स्थानमा भ्वाइस तथा आपतकालीन कलहरू निलम्बित गरेको छ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"नेटवर्कमाथि पहुँच राख्न सकिँदैन"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"रिसेप्सनमा सुधार गर्न, प्रणाली > नेटवर्क र इन्टरनेट > मोबाइल नेटवर्कहरू > रुचाइएको नेटवर्कको प्रकार मा गएर चयन गरिएको प्रकार परिवर्तन गरी हेर्नुहोस्।"</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"अलर्टहरू"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"कल फर्वार्ड गर्ने सेवा"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"आपतकालीन कलब्याक मोड"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"मोबाइल डेटाका अलर्टहरू"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS सन्देशहरू"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"भ्वाइस मेल सन्देशहरू"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi कल"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"सहकर्मी अनुरोध गरियो। TTY मोड पूर्ण"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"सहकर्मी अनुरोध गरियो। TTY मोड HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"सहकर्मी अनुरोध गरियो। TTY मोड VCO"</string>
@@ -265,7 +272,7 @@
<string name="permgrouplab_contacts" msgid="3657758145679177612">"सम्पर्कहरू"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"तपाईँको सम्पर्कमाथि पहुँच गर्नुहोस्"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"स्थान"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"यस यन्त्रको स्थानमाथि पहुँच गर्नुहोस्"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"यस यन्त्रको स्थानमाथि पहुँच"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"पात्रो"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"तपाईंको पात्रोमाथि पहुँच गर्नुहोस्"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"तपाईँको अन्तरक्रिया भइरहेको विन्डोको सामग्रीको निरीक्षण गर्नुहोस्।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"छोएर गरिने खोजलाई सुचारु गर्नुहोस्"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"ट्याप गरिएका वस्तुहरू चर्को स्वरमा बोलिने छन् र इसाराहरूको प्रयोग गरेर स्क्रिनमा अन्वेषण गर्न सकिन्छ।"</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"उच्च वेब पहुँचलाई सुचारु गर्नुहोस्"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"अनुप्रयोगको सामग्रीलाई थप पहुँचयोग्य बनाउन लिपिहरू स्थापना गर्न सक्नु हुन्छ।"</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"आफुले टाइप गरेको पाठको निरीक्षण गर्नुहोस्"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"व्यक्तिगत डेटा जस्तै क्रेडिट कार्ड नम्बरहरू र पासवर्डहरू समावेश गर्दछ।"</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"प्रदर्शन आवर्धन नियन्त्रण गर्नुहोस्"</string>
@@ -1738,11 +1743,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"समय इनपुट गर्न पाठ इनपुट मोडमा स्विच गर्नुहोस्।"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"समय इनपुट गर्न घडी मोडमा स्विच गर्नुहोस्।"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"स्वतः भरणका विकल्पहरू"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"स्वत: भरणका लागि सुरक्षित गर्नुहोस्"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"सामग्रीहरूलाई स्वत: भरण गर्न मिल्दैन"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> मा सुरक्षित गर्ने हो?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> लाई <xliff:g id="LABEL">%2$s</xliff:g> मा सुरक्षित गर्ने हो?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> लाई <xliff:g id="LABEL">%3$s</xliff:g> मा सुरक्षित गर्ने हो?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> लाई <xliff:g id="LABEL">%4$s</xliff:g> मा सुरक्षित गर्ने हो?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> मा सुरक्षित गर्ने हो?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> लाई <b><xliff:g id="LABEL">%2$s</xliff:g></b> मा सुरक्षित गर्ने हो?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> र <xliff:g id="TYPE_1">%2$s</xliff:g> लाई <b><xliff:g id="LABEL">%3$s</xliff:g></b> मा सुरक्षित गर्ने हो?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> र <xliff:g id="TYPE_2">%3$s</xliff:g> लाई to <b><xliff:g id="LABEL">%4$s</xliff:g></b> मा सुरक्षित गर्ने हो?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"सुरक्षित गर्नुहोस्"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"पर्दैन, धन्यवाद"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"पासवर्ड"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index af8c0a2..4875b9f 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -59,8 +59,8 @@
<string name="mismatchPin" msgid="609379054496863419">"De pincodes die je hebt ingevoerd, komen niet overeen."</string>
<string name="invalidPin" msgid="3850018445187475377">"Voer een pincode van 4 tot 8 cijfers in."</string>
<string name="invalidPuk" msgid="8761456210898036513">"Typ een pukcode die 8 cijfers of langer is."</string>
- <string name="needPuk" msgid="919668385956251611">"Je SIM-kaart is vergrendeld met de pukcode. Typ de pukcode om te ontgrendelen."</string>
- <string name="needPuk2" msgid="4526033371987193070">"Voer de PUK2-code in om de SIM-kaart te ontgrendelen."</string>
+ <string name="needPuk" msgid="919668385956251611">"Je simkaart is vergrendeld met de pukcode. Typ de pukcode om te ontgrendelen."</string>
+ <string name="needPuk2" msgid="4526033371987193070">"Voer de PUK2-code in om de simkaart te ontgrendelen."</string>
<string name="enablePin" msgid="209412020907207950">"Mislukt. Schakel SIM/RUIM-vergrendeling in."</string>
<plurals name="pinpuk_attempts" formatted="false" msgid="1251012001539225582">
<item quantity="other">Je hebt nog <xliff:g id="NUMBER_1">%d</xliff:g> pogingen over voordat de simkaart wordt vergrendeld.</item>
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Je provider heeft spraak- en noodoproepen tijdelijk opgeschort op deze locatie"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Kan netwerk niet bereiken"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Als je de ontvangst wilt verbeteren, kun je het netwerktype wijzigen dat is geselecteerd bij Systeem > Netwerk en internet > Mobiele netwerken > Voorkeursnetwerktype."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Meldingen"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Oproep doorschakelen"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modus voor noodoproepen"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Meldingen voor mobiele data"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Sms\'jes"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemailberichten"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Bellen via wifi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Door peer aangevraagde TTY-modus VOL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Door peer aangevraagde TTY-modus HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Door peer aangevraagde TTY-modus VCO"</string>
@@ -283,10 +290,8 @@
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Content van vensters ophalen"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"De content inspecteren van een venster waarmee je interactie hebt."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\'Verkennen via aanraking\' inschakelen"</string>
- <string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Aangetikte items worden hardop benoemd en het scherm kan worden verkend door middel van gebaren."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Verbeterde internettoegankelijkheid inschakelen"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Er kunnen scripts worden geïnstalleerd om app-content toegankelijker te maken."</string>
- <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Tekst observeren die u typt"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Aangetikte items worden hardop benoemd en het scherm kan worden verkend via gebaren."</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Tekst observeren die je typt"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Omvat persoonlijke gegevens zoals creditcardnummers en wachtwoorden."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Schermvergroting bedienen"</string>
<string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Bedien het zoomniveau en de positionering van het scherm."</string>
@@ -713,9 +718,9 @@
<string name="lockscreen_storage_locked" msgid="9167551160010625200">"Ontgrendelen voor alle functies en gegevens"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Maximaal aantal pogingen voor Ontgrendelen via gezichtsherkenning overschreden"</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Geen simkaart"</string>
- <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"Geen SIM-kaart in tablet."</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"Geen simkaart in tablet."</string>
<string name="lockscreen_missing_sim_message" product="tv" msgid="1943633865476989599">"Geen simkaart in de tv."</string>
- <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"Geen SIM-kaart in telefoon."</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"Geen simkaart in telefoon."</string>
<string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"Plaats een simkaart."</string>
<string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"De simkaart ontbreekt of kan niet worden gelezen. Plaats een simkaart."</string>
<string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"Onbruikbare simkaart."</string>
@@ -729,10 +734,10 @@
<string name="lockscreen_transport_ffw_description" msgid="42987149870928985">"Vooruitspoelen"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"Alleen noodoproepen"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"Netwerk vergrendeld"</string>
- <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM-kaart is vergrendeld met pukcode."</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"Simkaart is vergrendeld met pukcode."</string>
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"Raadpleeg de gebruikershandleiding of neem contact op met de klantenservice."</string>
- <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM-kaart is vergrendeld."</string>
- <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM-kaart ontgrendelen..."</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"Simkaart is vergrendeld."</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Simkaart ontgrendelen..."</string>
<string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"Je hebt je ontgrendelingspatroon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer onjuist getekend. \n\nProbeer het opnieuw over <xliff:g id="NUMBER_1">%2$d</xliff:g> seconden."</string>
<string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"Je hebt je wachtwoord <xliff:g id="NUMBER_0">%1$d</xliff:g> keer onjuist getypt. \n\nProbeer het opnieuw over <xliff:g id="NUMBER_1">%2$d</xliff:g> seconden."</string>
<string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"Je hebt je pincode <xliff:g id="NUMBER_0">%1$d</xliff:g> keer onjuist getypt. \n\nProbeer het opnieuw over <xliff:g id="NUMBER_1">%2$d</xliff:g> seconden."</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Geïnstalleerd door je beheerder"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Geüpdatet door je beheerder"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Verwijderd door je beheerder"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"Accubesparing beperkt de prestaties van je apparaat, de trilstand, locatieservices en de meeste achtergrondgegevens om de gebruiksduur van de accu te verlengen.\n\nAccubesparing wordt automatisch uitgeschakeld terwijl je apparaat wordt opgeladen."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Batterijbesparing beperkt de prestaties van je apparaat, de trilstand, locatieservices en de meeste achtergrondgegevens om de gebruiksduur van de batterij te verlengen.\n\nBatterijbesparing wordt automatisch uitgeschakeld terwijl je apparaat wordt opgeladen."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Databesparing beperkt het datagebruik door te voorkomen dat sommige apps gegevens verzenden of ontvangen op de achtergrond. De apps die je open hebt, kunnen nog steeds data verbruiken, maar doen dit minder vaak. Afbeeldingen worden dan bijvoorbeeld niet weergegeven totdat je erop tikt."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Databesparing inschakelen?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Inschakelen"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Schakel naar de tekstinvoermodus om de tijd in te voeren."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Schakel naar de klokmodus om de tijd in te voeren."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Opties voor automatisch aanvullen"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Opslaan voor Automatisch aanvullen"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Content kan niet automatisch worden aangevuld"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Opslaan in <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> opslaan in <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g> en <xliff:g id="TYPE_1">%2$s</xliff:g> opslaan in <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> en <xliff:g id="TYPE_2">%3$s</xliff:g> opslaan in <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Opslaan in <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> opslaan in <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> en <xliff:g id="TYPE_1">%2$s</xliff:g> opslaan in <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> en <xliff:g id="TYPE_2">%3$s</xliff:g> opslaan in <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Opslaan"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Nee, bedankt"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"Wachtwoord"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 702e2fb..78a5517 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਵੱਲੋਂ ਇਸ ਟਿਕਾਣੇ \'ਤੇ ਆਵਾਜ਼ੀ ਅਤੇ ਸੰਕਟਕਾਲੀਨ ਕਾਲਾਂ ਨੂੰ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਮੁਅੱਤਲ ਕੀਤਾ ਗਿਆ ਹੈ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ਨੈੱਟਵਰਕ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ਸਿਗਨਲ ਪ੍ਰਾਪਤੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਸਿਸਟਮ > ਨੈੱਟਵਰਕ ਅਤੇ ਇੰਟਰਨੈੱਟ > ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ > ਤਰਜੀਹੀ ਨੈੱਟਵਰਕ ਦੀ ਕਿਸਮ \'ਤੇ ਚੁਣੀ ਗਈ ਕਿਸਮ ਨੂੰ ਬਦਲਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"ਸੁਚੇਤਨਾਵਾਂ"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"ਕਾਲ ਫਾਰਵਾਰਡਿੰਗ"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ਸੰਕਟਕਾਲੀਨ ਕਾਲਬੈਕ ਮੋਡ"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"ਮੋਬਾਈਲ ਡੈਟਾ ਸੁਚੇਤਨਾਵਾਂ"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS ਸੁਨੇਹੇ"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ਵੌਇਸਮੇਲ ਸੁਨੇਹੇ"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi‑Fi ਕਾਲਿੰਗ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ਪੀਅਰ ਨੇ TTY Mode FULL ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ਪੀਅਰ ਨੇ TTY Mode HCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ਪੀਅਰ ਨੇ TTY Mode VCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ਇੱਕ ਵਿੰਡੋ ਦੀ ਸਮੱਗਰੀ ਦੀ ਜਾਂਚ ਕਰੋ, ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਇੰਟਰੈਕਟ ਕਰ ਰਹੇ ਹੋ।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ਐਕਸਪਲੋਰ ਬਾਇ ਟਚ ਚਾਲੂ ਕਰੋ"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"ਟੈਪ ਕੀਤੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਉੱਚੀ ਆਵਾਜ਼ ਵਿੱਚ ਬੋਲਿਆ ਜਾਵੇਗਾ ਅਤੇ ਸਕ੍ਰੀਨ ਦੀ ਸੰਕੇਤਾਂ ਦੀ ਵਰਤੋਂ ਨਾਲ ਪੜਚੋਲ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ।"</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"ਵਧੀ ਹੋਈ ਵੈਬ ਪਹੁੰਚਯੋਗਤਾ ਚਾਲੂ ਕਰੋ"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"ਐਪ ਸਮੱਗਰੀ ਨੂੰ ਵੱਧ ਪਹੁੰਚਯੋਗ ਬਣਾਉਣ ਲਈ ਸਕ੍ਰਿਪਟਾਂ ਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕਦੀਆਂ।"</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"ਜੋ ਟੈਕਸਟ ਤੁਸੀਂ ਟਾਈਪ ਕਰਦੇ ਹੋ, ਉਸਦਾ ਨਿਰੀਖਣ ਕਰੋ"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"ਇਸ ਵਿੱਚ ਨਿੱਜੀ ਡੈਟਾ ਸ਼ਾਮਲ ਹੈ ਜਿਵੇਂ ਕ੍ਰੈਡਿਟ ਕਾਰਡ ਨੰਬਰ ਅਤੇ ਪਾਸਵਰਡ।"</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"ਡਿਸਪਲੇ ਵੱਡਦਰਸ਼ੀ ਨੂੰ ਨਿਯੰਤ੍ਰਿਤ ਕਰੋ"</string>
@@ -1733,11 +1738,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"ਸਮਾਂ ਇਨਪੁੱਟ ਕਰਨ ਲਈ ਲਿਖਤ ਇਨਪੁੱਟ ਮੋਡ \'ਤੇ ਬਦਲੀ ਕਰੋ।"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"ਸਮਾਂ ਇਨਪੁੱਟ ਕਰਨ ਲਈ ਘੜੀ ਮੋਡ \'ਤੇ ਬਦਲੀ ਕਰੋ।"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"ਆਟੋਫਿਲ ਵਿਕਲਪ"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"ਆਟੋਫਿਲ ਲਈ ਰੱਖਿਅਤ ਕਰੋ"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"ਸਮੱਗਰੀਆਂ ਨੂੰ ਆਟੋਫਿਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> ਨੂੰ <xliff:g id="LABEL">%2$s</xliff:g> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ਨੂੰ <xliff:g id="LABEL">%3$s</xliff:g> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> ਨੂੰ <xliff:g id="LABEL">%4$s</xliff:g> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> ਨੂੰ <b><xliff:g id="LABEL">%2$s</xliff:g></b> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> ਅਤੇ <xliff:g id="TYPE_1">%2$s</xliff:g> ਨੂੰ <b><xliff:g id="LABEL">%3$s</xliff:g></b> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, ਅਤੇ <xliff:g id="TYPE_2">%3$s</xliff:g> ਨੂੰ <b><xliff:g id="LABEL">%4$s</xliff:g></b> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"ਰੱਖਿਅਤ ਕਰੋ"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"ਨਹੀਂ ਧੰਨਵਾਦ"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"ਪਾਸਵਰਡ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index dee76d5..5f01dd4 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -101,6 +101,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Twój operator tymczasowo zawiesił połączenia głosowe i alarmowe w tej lokalizacji"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Brak zasięgu sieci"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Aby poprawić odbiór, zmień typ sieci – wybierz System > Sieć i internet > Sieci komórkowe > Preferowany typ sieci."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerty"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Przekierowanie połączeń"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Tryb alarmowego połączenia zwrotnego"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Alerty o mobilnej transmisji danych"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS-y"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Wiadomości poczty głosowej"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Połączenia przez Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Drugie urządzenie zażądało trybu „TTY pełny”"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Drugie urządzenie zażądało trybu „TTY HCO”"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Drugie urządzenie zażądało trybu „TTY VCO”"</string>
@@ -290,8 +297,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Sprawdzanie zawartości okna, z którego korzystasz."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Włączenie czytania dotykiem"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Klikane elementy będą wymawiane na głos, a ekran można przeglądać, używając gestów."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Włączenie ułatwień dostępu w internecie"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Można zainstalować skrypty, by zawartość aplikacji była łatwiej dostępna."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Obserwowanie wpisywanego tekstu"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Obejmuje informacje osobiste, takie jak numery kart kredytowych i hasła."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Regulowanie powiększenia ekranu"</string>
@@ -1794,11 +1799,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Aby wprowadzić czas, włącz tryb wprowadzania tekstu."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Aby wprowadzić czas, włącz tryb zegara."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Opcje autouzupełniania"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Zapisywanie na potrzeby Autouzupełniania"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Nie można automatycznie uzupełnić treści"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Zapisać w: <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Zapisać element <xliff:g id="TYPE">%1$s</xliff:g> w: <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Zapisać: <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> w: <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Zapisać: <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> w: <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Zapisać w: <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> – zapisać w: <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> i <xliff:g id="TYPE_1">%2$s</xliff:g> – zapisać w: <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> i <xliff:g id="TYPE_2">%3$s</xliff:g> – zapisać w: <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Zapisz"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Nie, dziękuję"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"hasło"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 2212c06..05ac675 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Sua operadora suspendeu temporariamente as chamadas de voz e de emergência neste local"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Não foi possível acessar a rede"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para melhorar a recepção, tente alterar o tipo selecionado em Sistema > Rede & Internet > Redes móveis > Tipo de rede preferencial."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Encaminhamento de chamada"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de retorno de chamada de emergência"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Alertas de dados móveis"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Mensagens SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensagens do correio de voz"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas por Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"TTD modo COMPLETO solicitado"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"TTD modo HCO solicitado"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"TTD modo VCO solicitado"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecionar o conteúdo da janela com a qual você está interagindo."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ativar Explorar por toque"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Itens tocados serão falados em voz alta, e a tela poderá ser explorada por meio de gestos."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Ativar acessibilidade na Web aprimorada"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Scripts podem ser instalados para tornar o conteúdo do app mais acessível."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observar o texto digitado"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Inclui dados pessoais, como números de cartão de crédito e senhas."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Controlar ampliação da tela"</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado pelo seu administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atualizado pelo seu administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"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>
+ <string name="battery_saver_description" msgid="1960431123816253034">"A economia de bateria reduz o desempenho e os limites de vibração do dispositivo, os serviços de localização e a maioria dos dados em segundo plano para aumentar a duração da bateria. E-mails, mensagens e outros aplicativos que dependem de sincronização não serão atualizados, a não ser que você os abra.\n\nA economia de bateria é desligada automaticamente quando o dispositivo está sendo carregado."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você esteja usando no momento pode acessar dados, mas com menos frequência. Isso pode significar que as imagens não serão exibidas até que você toque nelas."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ativar Economia de dados?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ativar"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Alterne para o modo de entrada de texto para informar o horário."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Alterne para o modo de relógio para informar o horário."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Opções de preenchimento automático"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Salvar no Preenchimento automático"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Não é possível preencher os conteúdos automaticamente"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Salvar em <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Salvar <xliff:g id="TYPE">%1$s</xliff:g> em <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Salvar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Salvar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g> em <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Salvar em <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Salvar <xliff:g id="TYPE">%1$s</xliff:g> em <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Salvar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Salvar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g> em <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Salvar"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Não, obrigado"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"senha"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 241b2fe..e78386e 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"O seu operador suspendeu temporariamente as chamadas de voz e de emergência nesta localização"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Não é possível ligar à rede"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para melhorar a receção, experimente alterar o tipo selecionado em Sistema > Rede e Internet > Redes móveis > Tipo de rede preferido."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Reencaminhamento de chamadas"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de chamada de retorno de emergência"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Alertas de dados móveis"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Mensagens SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensagens de correio de voz"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"O par solicitou o modo COMPLETO de teletipo"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"O par solicitou o modo HCO de teletipo"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"O par solicitou o modo VCO de teletipo"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecionar o conteúdo de uma janela com a qual está a interagir."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ativar Explorar Através do Toque"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Os itens em que tocar serão pronunciados em voz alta e o ecrã poderá ser explorado através de gestos."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Ativar a acessibilidade Web melhorada"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Poderão ser instalados scripts para tornar o conteúdo da aplicação mais acessível."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observar o texto que escreve"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Inclui dados pessoais, como números de cartões de crédito e palavras-passe."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Controlar a ampliação do ecrã"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Mude para o modo de introdução de texto para a introdução da hora."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Mude para o modo de relógio para a introdução da hora."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Opções de preenchimento automático"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Guardar para o Preenchimento automático"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Não é possível preencher automaticamente o conteúdo"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Pretende guardar no <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Pretende guardar o(a) <xliff:g id="TYPE">%1$s</xliff:g> no <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Pretende guardar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> no <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Pretende guardar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g> no <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Pretende guardar no <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Pretende guardar <xliff:g id="TYPE">%1$s</xliff:g> no <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Pretende guardar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> no <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Pretende guardar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g> no <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Guardar"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Não, obrigado"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"palavra-passe"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 2212c06..05ac675 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Sua operadora suspendeu temporariamente as chamadas de voz e de emergência neste local"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Não foi possível acessar a rede"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para melhorar a recepção, tente alterar o tipo selecionado em Sistema > Rede & Internet > Redes móveis > Tipo de rede preferencial."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Encaminhamento de chamada"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de retorno de chamada de emergência"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Alertas de dados móveis"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Mensagens SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensagens do correio de voz"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas por Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"TTD modo COMPLETO solicitado"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"TTD modo HCO solicitado"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"TTD modo VCO solicitado"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecionar o conteúdo da janela com a qual você está interagindo."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ativar Explorar por toque"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Itens tocados serão falados em voz alta, e a tela poderá ser explorada por meio de gestos."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Ativar acessibilidade na Web aprimorada"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Scripts podem ser instalados para tornar o conteúdo do app mais acessível."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observar o texto digitado"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Inclui dados pessoais, como números de cartão de crédito e senhas."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Controlar ampliação da tela"</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado pelo seu administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atualizado pelo seu administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"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>
+ <string name="battery_saver_description" msgid="1960431123816253034">"A economia de bateria reduz o desempenho e os limites de vibração do dispositivo, os serviços de localização e a maioria dos dados em segundo plano para aumentar a duração da bateria. E-mails, mensagens e outros aplicativos que dependem de sincronização não serão atualizados, a não ser que você os abra.\n\nA economia de bateria é desligada automaticamente quando o dispositivo está sendo carregado."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você esteja usando no momento pode acessar dados, mas com menos frequência. Isso pode significar que as imagens não serão exibidas até que você toque nelas."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ativar Economia de dados?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ativar"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Alterne para o modo de entrada de texto para informar o horário."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Alterne para o modo de relógio para informar o horário."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Opções de preenchimento automático"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Salvar no Preenchimento automático"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Não é possível preencher os conteúdos automaticamente"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Salvar em <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Salvar <xliff:g id="TYPE">%1$s</xliff:g> em <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Salvar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Salvar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g> em <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Salvar em <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Salvar <xliff:g id="TYPE">%1$s</xliff:g> em <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Salvar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Salvar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g> em <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Salvar"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Não, obrigado"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"senha"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index f347a8e..7785e72b 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -100,6 +100,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Operatorul dvs. a suspendat temporar apelurile vocale și de urgență în această locație"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nu se poate stabili conexiunea la rețea"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Pentru o recepție mai bună, încercați să schimbați tipul selectat în Sistem > Rețea și internet > Rețele mobile > Tip preferat de rețea."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerte"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Redirecționarea apelurilor"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mod de apelare inversă de urgență"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Alerte de date mobile"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Mesaje SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mesaje din mesageria vocală"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Apelare prin Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Cealaltă persoană a solicitat modul TTY cu setarea COMPLET"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Cealaltă persoană a solicitat modul TTY cu setarea HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Cealaltă persoană a solicitat modul TTY cu setarea VCO"</string>
@@ -287,8 +294,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspectează conținutul unei ferestre cu care interacționați."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activează funcția Explorați prin atingere"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Elementele atinse vor fi rostite cu voce tare, iar ecranul poate fi explorat utilizând gesturi."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Activează accesibilitatea web îmbunătățită"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Pot fi instalate scripturi pentru a face conținutul aplicațiilor mai accesibil."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Remarcă textul pe care îl introduceți"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Include date personale, cum ar fi numere ale cardurilor de credit sau parole."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Controlați mărirea pe afișaj"</string>
@@ -1162,7 +1167,7 @@
<string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"Permiteți întotdeauna"</string>
<string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"Nu permiteți niciodată"</string>
<string name="sim_removed_title" msgid="6227712319223226185">"Card SIM eliminat"</string>
- <string name="sim_removed_message" msgid="2333164559970958645">"Rețeaua mobilă va fi indisponibilă până când reporniți cu o cartelă SIM validă introdusă."</string>
+ <string name="sim_removed_message" msgid="2333164559970958645">"Rețeaua mobilă va fi indisponibilă până când reporniți cu un card SIM valid introdus."</string>
<string name="sim_done_button" msgid="827949989369963775">"Terminat"</string>
<string name="sim_added_title" msgid="3719670512889674693">"Card SIM adăugat"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Reporniți dispozitivul pentru a accesa rețeaua mobilă."</string>
@@ -1763,11 +1768,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Pentru a introduce ora, comutați la modul de introducere a textului."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Pentru a introduce ora, comutați la modul ceas."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Opțiuni de completare automată"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Salvați pentru completare automată"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Conținutul nu poate fi completat automat"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Salvați în <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Salvați <xliff:g id="TYPE">%1$s</xliff:g> în <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Salvați <xliff:g id="TYPE_0">%1$s</xliff:g> și <xliff:g id="TYPE_1">%2$s</xliff:g> în <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Salvați <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> și <xliff:g id="TYPE_2">%3$s</xliff:g> în <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Salvați în <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Salvați <xliff:g id="TYPE">%1$s</xliff:g> în <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Salvați <xliff:g id="TYPE_0">%1$s</xliff:g> și <xliff:g id="TYPE_1">%2$s</xliff:g> în <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Salvați <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> și <xliff:g id="TYPE_2">%3$s</xliff:g> în <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Salvați"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Nu, mulțumesc"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"parolă"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index e32823f..b84b808 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -101,6 +101,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Ваш оператор временно заблокировал голосовые и экстренные вызовы в этом месте."</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Сеть недоступна"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Чтобы улучшить сигнал, попробуйте выбрать другой тип сети в настройках (раздел \"Мобильные сети\")."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Оповещения"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Переадресация вызовов"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим экстренных обратных вызовов"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Оповещения, связанные с мобильным Интернетом"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Голосовые сообщения"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Звонки по Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"На устройстве абонента выбран режим телетайпа \"ВСЕ\""</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"На устройстве абонента выбран режим телетайпа HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"На устройстве абонента выбран режим телетайпа VCO"</string>
@@ -222,7 +229,7 @@
<string name="global_actions" product="tv" msgid="7240386462508182976">"Настройки телевизора"</string>
<string name="global_actions" product="default" msgid="2406416831541615258">"Параметры телефона"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Блокировка экрана"</string>
- <string name="global_action_power_off" msgid="4471879440839879722">"Отключить питание"</string>
+ <string name="global_action_power_off" msgid="4471879440839879722">"Выключить"</string>
<string name="global_action_emergency" msgid="7112311161137421166">"Экстренный вызов"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"Отчет об ошибке"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Отчет об ошибке"</string>
@@ -290,8 +297,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Анализировать содержимое активного окна."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Включать Изучение касанием"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Озвучивать нажимаемые элементы и разрешать управление устройством с помощью жестов."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Включать спец. возможности для Интернета"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Могут быть установлены дополнительные скрипты."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Обрабатывать набираемый текст"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"В том числе личные данные, например номера кредитных карт и пароли."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Управлять масштабом изображения"</string>
@@ -1186,7 +1191,7 @@
<string name="sim_done_button" msgid="827949989369963775">"Готово"</string>
<string name="sim_added_title" msgid="3719670512889674693">"SIM-карта добавлена"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Перезагрузите устройство для доступа к мобильной сети."</string>
- <string name="sim_restart_button" msgid="4722407842815232347">"Перезапуск"</string>
+ <string name="sim_restart_button" msgid="4722407842815232347">"Перезапустить"</string>
<string name="carrier_app_dialog_message" msgid="7066156088266319533">"Чтобы SIM-карта работала корректно, установите и запустите приложение оператора."</string>
<string name="carrier_app_dialog_button" msgid="7900235513678617329">"СКАЧАТЬ"</string>
<string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"НЕ СЕЙЧАС"</string>
@@ -1794,11 +1799,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Чтобы ввести время, перейдите в режим ввода текста."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Чтобы ввести время, перейдите в режим часов."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Параметры автозаполнения"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Сохраните данные для автозаполнения"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Ошибка автозаполнения"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Сохранить в <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g>: сохранить в <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Сохранить данные (<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>) в \"<xliff:g id="LABEL">%3$s</xliff:g>\"?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Сохранить данные (<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g>) в \"<xliff:g id="LABEL">%4$s</xliff:g>\"?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Сохранить в <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Сохранить <xliff:g id="TYPE">%1$s</xliff:g> в <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Сохранить <xliff:g id="TYPE_0">%1$s</xliff:g> и <xliff:g id="TYPE_1">%2$s</xliff:g> в <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Сохранить <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> и <xliff:g id="TYPE_2">%3$s</xliff:g> в <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Сохранить"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Нет, спасибо"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"Пароль"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 6c595fb..7b0478b 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"ඔබගේ වාහකයා මෙම ස්ථානයේ හඬ සහ හදිසි ඇමතුම් තාවකාලිකව අත්හිටුවා ඇත"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ජාලය වෙත ළඟා විය නොහැකිය"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ප්රතිග්රහණය වැඩි දියුණු කිරීමට, පද්ධතිය > ජාලය සහ අන්තර්ජාලය > ජංගම ජාල > වඩා කැමති ජාල වර්ගය තුළ තෝරන ලද වර්ගය වෙනස් කිරීම උත්සාහ කරන්න."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"ඇඟවීම්"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"ඇමතුම ප්රතියොමු කිරීම"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"හදිසි අවස්ථා පසු ඇමතුම් ප්රකාරය"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"ජංගම දත්ත ඇඟවීම්"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS පණිවිඩ"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"හඬ තැපැල් පණිවිඩ"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi ඇමතීම"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"සම ඉල්ලීම් කළ TTY ප්රකාරය පූර්ණයි"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"සම ඉල්ලීම් කළ TTY ප්රකාරය HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"සම ඉල්ලීම් කළ TTY ප්රකාරය VCO"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ඔබ අන්තර්ක්රියාකාරී වන කවුළුවේ අන්තර්ගතය පරීක්ෂා කරන්න."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ස්පර්ශයෙන් ගවේෂණය සක්රිය කරන්න"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"තට්ටු කළ අයිතම හඬ නගා කියවනු ඇති අතර ඉංගිති භාවිතයෙන් තිරය ගවේෂණය කිරීමට හැකිය."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"උසස් වෙබ් ප්රවේශ්යතාව සක්රිය කරන්න"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"යෙදුම් අන්තර්ගතයට ප්රවේශ්යතාවය වැඩිවන ලෙස සකස් කිරීමට ඇතැම් විට ස්ක්රිප්ට් ස්ථාපනය කර ඇත."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"ඔබ ටයිප් කළ පෙළ බලන්න"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"ණයවරපත් අංක සහ මුරපද වැනි පුද්ගලික දත්ත ඇතුළත් වේ."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"සංදර්ශනයේ විශාලනය පාලනය කරන්න"</string>
@@ -1734,11 +1739,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"වේලා ආදානය සඳහා ආදාන ප්රකාරය වෙත මාරු වෙන්න."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"වේලා ආදානය සඳහා ඔරලෝසු ප්රකාරය වෙත මාරු වෙන්න."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"ස්වයංක්රිය පිරවුම් විකල්ප"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"ස්වයං පිරවුම සඳහා සුරකින්න"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"අන්තර්ගතය ස්වයං පිරවුම් කළ නොහැකිය"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> වෙත සුරකින්නද?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> <xliff:g id="LABEL">%2$s</xliff:g> වෙත සුරකින්නද?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="LABEL">%3$s</xliff:g> වෙත <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> සුරකින්නද?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="LABEL">%4$s</xliff:g> වෙත <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> සුරකින්නද?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> වෙත සුරකින්නද?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> <b><xliff:g id="LABEL">%2$s</xliff:g></b> වෙත සුරකින්නද?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> සහ <xliff:g id="TYPE_1">%2$s</xliff:g> <b><xliff:g id="LABEL">%3$s</xliff:g></b> වෙත සුරකින්නද?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, සහ <xliff:g id="TYPE_2">%3$s</xliff:g> <b><xliff:g id="LABEL">%4$s</xliff:g></b> වෙත සුරකින්නද?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"සුරකින්න"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"එපා ස්තූතියි"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"මුරපදය"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index af5268e..8782dc9 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -33,7 +33,7 @@
<string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> hod."</string>
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hod. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hod. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string>
+ <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
<string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
@@ -92,15 +92,22 @@
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Služba nie je poskytovaná."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Nemôžete meniť nastavenia identifikácie volajúceho."</string>
<string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Žiadna dátová služba"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="1236071219598685236">"Žiadne núdzové hovory"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="1236071219598685236">"Tiesňové volania nie sú k dispozícii"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Žiadne hlasové hovory"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Žiadne hlasové ani núdzové hovory"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hlasové ani tiesňové volania nie sú k dispozícii"</string>
<string name="RestrictedOnDataContent" msgid="8997474569390996587">"Váš operátor dočasne pozastavil dátovú službu na tomto mieste"</string>
<string name="RestrictedOnEmergencyContent" msgid="4573217945494650061">"Váš operátor dočasne pozastavil núdzové hovory z tohto miesta"</string>
<string name="RestrictedOnNormalContent" msgid="1579434198284512182">"Váš operátor dočasne pozastavil hlasové hovory z tohto miesta"</string>
- <string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Váš operátor dočasne pozastavil hlasové a núdzové hovory z tohto miesta"</string>
+ <string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Váš operátor v tejto oblasti dočasne blokuje hlasové a tiesňové hovory"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nepodarilo sa pripojiť k sieti"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Ak chcete vylepšiť príjem, skúste zmeniť vybratý typ siete v časti Systém > Sieť a internet > Mobilné siete > Preferovaný typ siete."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozornenia"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Presmerovanie hovorov"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Režim tiesňového spätného volania"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Upozornenia na mobilné dáta"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Správy SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Správy hlasovej schránky"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Volanie cez Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Používateľ, s ktorým komunikujete, požiadal o režim FULL textového telefónu"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Používateľ, s ktorým komunikujete, požiadal o režim HCO textového telefónu"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Používateľ, s ktorým komunikujete, požiadal o režim VCO textového telefónu"</string>
@@ -290,12 +297,10 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Môžete preskúmať obsah okna, s ktorým pracujete."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Zapnúť funkciu Preskúmanie dotykom"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Po klepnutí na položku sa vysloví jej názov a obrazovku je možné preskúmať pomocou gest."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Zapnúť vylepšenú dostupnosť na webe"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Môže nainštalovať skripty na sprístupnenie obsahu aplikácie."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Sledovať zadávaný text"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Sledovanie zahŕňa osobné údaje ako sú čísla kreditných kariet a heslá."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Ovládanie priblíženia obrazovky"</string>
- <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Ovládajte úroveň priblíženia/oddialenia obrazovky a umiestnenie"</string>
+ <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Ovládajte umiestnenie a úroveň priblíženia obrazovky."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Gestá"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Je možné použiť klepnutie, prejdenie, stiahnutie prstami a ďalšie gestá."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gestá odtlačkov prstov"</string>
@@ -318,8 +323,8 @@
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Umožňuje aplikácii prijímať a spracovávať správy SMS. Znamená to, že aplikácia môže sledovať správy odoslané na vaše zariadenie alebo ich odstrániť bez toho, aby sa vám zobrazili."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"prijímať textové správy (MMS)"</string>
<string name="permdesc_receiveMms" msgid="533019437263212260">"Umožňuje aplikácii prijímať a spracovávať správy MMS. Znamená to, že aplikácia môže sledovať správy odoslané na vaše zariadenie alebo ich odstrániť bez toho, aby sa vám zobrazili."</string>
- <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"čítať správy Cell Broadcast"</string>
- <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Umožňuje aplikácii čítať správy Cell Broadcast prijaté vaším zariadením. Upozornenia Cell Broadcast sú doručované na určitých miestach a upozorňujú na núdzové situácie. Škodlivé aplikácie môžu pri prijatí núdzovej správy Cell Broadcast narušiť výkonnosť alebo prevádzku vášho zariadenia."</string>
+ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"čítať správy informačných služieb"</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Umožňuje aplikácii čítať správy informačných služieb prijaté vaším zariadením. Správy informačných služieb sa doručujú na určitých miestach a upozorňujú na tiesňové situácie. Škodlivé aplikácie môžu pri prijatí správy informačnej služby narušiť výkonnosť alebo prevádzku vášho zariadenia."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"čítať odoberané informačné kanály"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Umožňuje aplikácii získať podrobnosti o aktuálne synchronizovaných informačných kanáloch."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"posielať a zobrazovať SMS"</string>
@@ -705,7 +710,7 @@
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Zadajte kód PIN na odomknutie"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Nesprávny kód PIN."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Ak chcete telefón odomknúť, stlačte Menu a následne 0."</string>
- <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Číslo tiesňového volania"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Číslo tiesňovej linky"</string>
<string name="lockscreen_carrier_default" msgid="6169005837238288522">"Žiadny signál"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Obrazovka je uzamknutá."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Ak chcete odomknúť telefón alebo uskutočniť tiesňové volanie, stlačte Menu."</string>
@@ -718,7 +723,7 @@
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"Skúsiť znova"</string>
<string name="lockscreen_storage_locked" msgid="9167551160010625200">"Všetky funkcie a dáta získate po odomknutí"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"Prekročili ste maximálny povolený počet pokusov o odomknutie tvárou"</string>
- <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Nie je vložená SIM karta"</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Žiadna SIM karta"</string>
<string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"V tablete nie je žiadna SIM karta."</string>
<string name="lockscreen_missing_sim_message" product="tv" msgid="1943633865476989599">"V televízore nie je žiadna SIM karta."</string>
<string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"V telefóne nie je žiadna SIM karta."</string>
@@ -879,8 +884,8 @@
<string name="days" msgid="4774547661021344602">"dní"</string>
<string name="hour" msgid="2126771916426189481">"hodina"</string>
<string name="hours" msgid="894424005266852993">"hodiny"</string>
- <string name="minute" msgid="9148878657703769868">"min."</string>
- <string name="minutes" msgid="5646001005827034509">"min."</string>
+ <string name="minute" msgid="9148878657703769868">"min"</string>
+ <string name="minutes" msgid="5646001005827034509">"min"</string>
<string name="second" msgid="3184235808021478">"s"</string>
<string name="seconds" msgid="3161515347216589235">"s"</string>
<string name="week" msgid="5617961537173061583">"týždeň"</string>
@@ -1509,7 +1514,7 @@
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Skratka dostupnosti vypla službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Klepnutím na tlačidlo dostupnosti vyberte požadovanú funkciu:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Ak chcete zmeniť funkcie, klepnite na tlačidlo dostupnosti a podržte ho"</string>
- <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Lupa"</string>
+ <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Priblíženie"</string>
<string name="user_switched" msgid="3768006783166984410">"Aktuálny používateľ je <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="2871009331809089783">"Prepína sa na účet <xliff:g id="NAME">%1$s</xliff:g>…"</string>
<string name="user_logging_out_message" msgid="8939524935808875155">"Prebieha odhlásenie používateľa <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -1647,15 +1652,15 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Nainštaloval správca"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Aktualizoval správca"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Odstránil správca"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"S cieľom predĺžiť výdrž batérie zníži šetrič batérie výkonnosť zariadenia a obmedzí vibrácie, služby určovania polohy a dátové prenosy na pozadí. Pošta, čet a ďalšie aplikácie, ktoré sa spoliehajú na synchronizáciu, sa možno nebudú aktualizovať, dokiaľ ich neotvoríte.\n\nPri nabíjaní zariadenia sa šetrič batérie automaticky vypne."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Šetrič batérie zníži výkonnosť zariadenia a obmedzí vibrácie, služby určovania polohy a dátové prenosy na pozadí, aby predĺžil výdrž batérie. Pošta, čet a ďalšie aplikácie, ktoré sa spoliehajú na synchronizáciu, sa možno nebudú aktualizovať, dokiaľ ich neotvoríte.\n\nPri nabíjaní zariadenia sa šetrič batérie automaticky vypne."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Šetrič dát bráni niektorým aplikáciám odosielať alebo prijímať dáta na pozadí s cieľom znížiť spotrebu dát. Aplikácia, ktorú momentálne používate, môže prenášať dáta, ale môže to robiť menej často. Znamená to napríklad, že sa nezobrazia obrázky, kým na ne neklepnete."</string>
- <string name="data_saver_enable_title" msgid="4674073932722787417">"Zapnúť Šetrič dát?"</string>
+ <string name="data_saver_enable_title" msgid="4674073932722787417">"Chcete zapnúť šetrič dát?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Zapnúť"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
<item quantity="few">%1$d minúty (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="many">%1$d minúty (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">%1$d minút (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Minútu (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">1 minútu (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="6830154222366042597">
<item quantity="few">Na %1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1667,7 +1672,7 @@
<item quantity="few">%1$d hodiny (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="many">%1$d hodiny (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">%1$d hodín (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Hodinu (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">1 hodinu (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="few">Na %1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1679,7 +1684,7 @@
<item quantity="few">%d minúty</item>
<item quantity="many">%d minúty</item>
<item quantity="other">%d minút</item>
- <item quantity="one">Minútu</item>
+ <item quantity="one">1 minútu</item>
</plurals>
<plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2199350154433426128">
<item quantity="few">Na %d min</item>
@@ -1691,7 +1696,7 @@
<item quantity="few">%d hodiny</item>
<item quantity="many">%d hodiny</item>
<item quantity="other">%d hodín</item>
- <item quantity="one">Hodinu</item>
+ <item quantity="one">1 hodinu</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="few">Na %d h</item>
@@ -1701,8 +1706,8 @@
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (ďalší budík)"</string>
- <string name="zen_mode_forever" msgid="1916263162129197274">"Dokým nevypnete stav Nerušiť"</string>
- <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Dokým nevypnete stav Nerušiť"</string>
+ <string name="zen_mode_forever" msgid="1916263162129197274">"Dokiaľ nevypnete režim Nerušiť"</string>
+ <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Dokiaľ nevypnete režim Nerušiť"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Zbaliť"</string>
<string name="zen_mode_feature_name" msgid="5254089399895895004">"Nerušiť"</string>
@@ -1788,17 +1793,18 @@
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"Ladenie cez USB"</string>
<string name="time_picker_hour_label" msgid="2979075098868106450">"hodina"</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"minúta"</string>
- <string name="time_picker_header_text" msgid="143536825321922567">"Nastavenie času"</string>
+ <string name="time_picker_header_text" msgid="143536825321922567">"Nastaviť čas"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"Zadajte platný čas"</string>
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Zadajte čas"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Ak chcete zadať čas, prepnite na textový režim vstupu"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Ak chcete zadať čas, prepnite na režim hodín."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Možnosti automatického dopĺňania"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Uložiť do Automatického dopĺňania"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Obsah nie je možné automaticky vyplniť"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Uložiť do zariadenia <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Uložiť <xliff:g id="TYPE">%1$s</xliff:g> do zariadenia <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Uložiť <xliff:g id="TYPE_0">%1$s</xliff:g> a <xliff:g id="TYPE_1">%2$s</xliff:g> do služby <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Uložiť <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> a <xliff:g id="TYPE_2">%3$s</xliff:g> do služby <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Uložiť do služby <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Uložiť <xliff:g id="TYPE">%1$s</xliff:g> do služby <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Uložiť <xliff:g id="TYPE_0">%1$s</xliff:g> a <xliff:g id="TYPE_1">%2$s</xliff:g> do služby <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Uložiť <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> a <xliff:g id="TYPE_2">%3$s</xliff:g> do služby <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Uložiť"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Nie, vďaka"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"heslo"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 877add7..d6643d7 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -101,6 +101,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Vaš operater je na tej lokaciji začasno onemogočil glasovne klice in klice v sili"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Povezave z omrežjem ni mogoče vzpostaviti"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Če želite izboljšati sprejem, poskusite zamenjati vrsto omrežja v možnostih »Sistem« > »Omrežje in internet« > »Mobilna omrežja« > »Prednostna vrsta omrežja«."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Opozorila"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmerjanje klicev"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Način za povratni klic v sili"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Opozorila o prenosu podatkov v mobilnem omrežju"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Sporočila SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Sporočila v odzivniku"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Klicanje prek Wi-Fi-ja"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Enakovredna naprava je zahtevala način TTY FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Enakovredna naprava je zahtevala način TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Enakovredna naprava je zahtevala način TTY VCO"</string>
@@ -290,11 +297,9 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Preverjanje vsebine okna, ki ga uporabljate."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Vklopiti raziskovanje z dotikom"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Elementi, ki se jih dotaknete, bodo izrečeni na glas, zaslon pa lahko raziskujete s potezami."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Vklopiti izboljšano dostopnost spleta za ljudi s posebnimi potrebami"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Za boljšo dostopnost vsebine aplikacije je mogoče namestiti skripte."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Opazovati besedilo, ki ga natipkate"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Vključuje osebne podatke, kot so številke kreditnih kartic in gesla."</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Nadziranje povečave prikaza"</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Nadzirati povečave prikaza"</string>
<string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Nadziranje stopnje povečave in položaja prikaza."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Izvajanje potez"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Mogoče je izvajanje dotikov, vlečenja, primikanja in razmikanja prstov ter drugih potez."</string>
@@ -1794,11 +1799,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Preklopite na način za vnašanje besedila, da vnesete čas."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Preklopite na način ure, da vnesete čas."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Možnosti samodejnega izpolnjevanja"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Shranjevanje v storitev samodejnega izpolnjevanja"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Vsebine ni mogoče samodejno izpolniti"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Shrani v <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Shrani <xliff:g id="TYPE">%1$s</xliff:g> v <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Želite shraniti <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> v <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Želite shraniti <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> v <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Želite shraniti pod oznako <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Želite <xliff:g id="TYPE">%1$s</xliff:g> shraniti pod oznako <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Želite <xliff:g id="TYPE_0">%1$s</xliff:g> in <xliff:g id="TYPE_1">%2$s</xliff:g> shraniti pod oznako <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Želite <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> in <xliff:g id="TYPE_2">%3$s</xliff:g> shraniti pod oznako <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Shrani"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Ne, hvala"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"geslo"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index b645553..1bd2b74 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Operatori yt ka pezulluar përkohësisht telefonatat zanore dhe të urgjencës në këtë vendndodhje"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Rrjeti i paarritshëm"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Për të përmirësuar marrjen e sinjalit, provo të ndryshosh llojin e zgjedhur te Sistemi > Rrjeti dhe interneti > Lloji i preferuar i rrjetit."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Sinjalizimet"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Transferimi i telefonatave"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modaliteti i \"Kthimit të telefonatës së urgjencës\""</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Sinjalizimet për të dhënat celulare"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Mesazhet SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mesazhet e postës zanore"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Telefonata me Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Homologu yt kërkoi modalitet \"TTY\" të plotë"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Homologu kërkoi modalitet \"TTY\" të llojit \"HCO\""</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Homologu yt kërkoi modalitet \"TTY\" të llojit \"VCO\""</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspekton përmbajtjen e dritares me të cilën po ndërvepron."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivizojë funksionin \"Eksploro me prekje\""</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Artikujt e trokitur do të lexohen me zë të lartë dhe ekrani mund të eksplorohet duke përdorur gjestet."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Aktivizojë qasjen e përmirësuar në ueb"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skriptet mund të instalohen për ta bërë përmbajtjen e aplikacionit më të qasshme."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Vëzhgojë tekstin që shkruan"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Përfshi të dhënat personale si numrat e kartave të kreditit si dhe fjalëkalimet."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Kontrollo zmadhimin e ekranit"</string>
@@ -1069,7 +1074,7 @@
<string name="dump_heap_text" msgid="4809417337240334941">"Procesi <xliff:g id="PROC">%1$s</xliff:g> ka kaluar kufirin e tij të memories së procesit me <xliff:g id="SIZE">%2$s</xliff:g>. Mundësohet stivimi e skedarëve fiktivë në mënyrë që t\'i ndani me zhvilluesit e tyre. Bëni kujdes pasi stiva e skedarëve fiktivë mund të përmbajë ndonjë informacion tëndin personal ku aplikacioni ka qasje."</string>
<string name="sendText" msgid="5209874571959469142">"Zgjidh një veprim për tekstin"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volumi i ziles"</string>
- <string name="volume_music" msgid="5421651157138628171">"volumi i klipit \"media\""</string>
+ <string name="volume_music" msgid="5421651157138628171">"Volumi i medias"</string>
<string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Luajtje përmes \"bluetooth-it\""</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Zilja \"në heshjte\" u caktua"</string>
<string name="volume_call" msgid="3941680041282788711">"Volumi i telefonatës"</string>
@@ -1080,7 +1085,7 @@
<string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Volumi i \"bluetooth-it\""</string>
<string name="volume_icon_description_ringer" msgid="3326003847006162496">"Volumi i ziles"</string>
<string name="volume_icon_description_incall" msgid="8890073218154543397">"Volumi i telefonatës"</string>
- <string name="volume_icon_description_media" msgid="4217311719665194215">"volumi i klipit \"media\""</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"Volumi i medias"</string>
<string name="volume_icon_description_notification" msgid="7044986546477282274">"Volumi i njoftimeve"</string>
<string name="ringtone_default" msgid="3789758980357696936">"Zile e paracaktuar."</string>
<string name="ringtone_default_with_actual" msgid="1767304850491060581">"I parazgjedhur (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
@@ -1604,7 +1609,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instaluar nga administratori"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Përditësuar nga administratori"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Fshirë nga administratori"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"Për të përmirësuar jetëgjatësinë e baterisë, opsioni i kursimit të baterisë ul rendimentin e pajisjes tënde si dhe kufizon dridhjet dhe shumicën e të dhënave në sfond. Mail-i, mesazhet dhe aplikacionet e tjera që sinkronizohen automatikisht mund të mos përditësohen pa i hapur.\n\nKursimi i baterisë çaktivizohet automatikisht kur pajisja vihet në ngarkim."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Për të përmirësuar jetëgjatësinë e baterisë, opsioni i kursimit të baterisë ul rendimentin e pajisjes tënde si dhe kufizon dridhjet dhe shumicën e të dhënave në sfond. Email-i, mesazhet dhe aplikacionet e tjera që sinkronizohen automatikisht mund të mos përditësohen pa i hapur.\n\nKursimi i baterisë çaktivizohet automatikisht kur pajisja vihet në ngarkim."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Për të ndihmuar në reduktimin e përdorimit të të dhënave, \"Kursyesi i të dhënave\" pengon që disa aplikacione të dërgojnë apo të marrin të dhëna në sfond. Një aplikacion që po përdor aktualisht mund të ketë qasje te të dhënat, por këtë mund ta bëjë më rrallë. Kjo mund të nënkuptojë, për shembull, se imazhet nuk shfaqen kur troket mbi to."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Të aktivizohet \"Kursyesi i të dhënave\"?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktivizo"</string>
@@ -1733,11 +1738,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Kalo te modaliteti i hyrjes së tekstit për hyrjen e kohës."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Kalo te modaliteti i orës për hyrjen e kohës."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Opsionet e plotësimit automatik"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Ruaje për \"Plotësim automatik\""</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Përmbajtjet nuk mund të plotësohen automatikisht"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Të ruhet te <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Të ruhet <xliff:g id="TYPE">%1$s</xliff:g> te <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Të ruhen <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> te <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Të ruhen <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> te <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Të ruhet te <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Të ruhet <xliff:g id="TYPE">%1$s</xliff:g> te <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Të ruhen <xliff:g id="TYPE_0">%1$s</xliff:g> dhe <xliff:g id="TYPE_1">%2$s</xliff:g> te <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Të ruhen <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> dhe <xliff:g id="TYPE_2">%3$s</xliff:g> te <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Ruaj"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Jo, faleminderit"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"fjalëkalimi"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 6dc7761..44abfb9 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -100,6 +100,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Мобилни оператер је привремено суспендовао гласовне и хитне позиве на овој локацији"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Повезивање са мрежом није успело"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Да бисте побољшали пријем, пробајте да промените изабрани тип у одељку Систем > Мрежа и интернет > Мобилне мреже > Жељени тип мреже."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Обавештења"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Преусмеравање позива"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим за хитан повратни позив"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Обавештења за мобилне податке"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS-ови"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Поруке говорне поште"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Позивање преко Wi-Fi мреже"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Корисник захтева ПОТПУН режим TTY"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Корисник захтева ПРЕНОС ЗВУКА за режим TTY"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Корисник захтева ПРЕНОС ГЛАСА за режим TTY"</string>
@@ -287,8 +294,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Проверава садржај прозора са којим остварујете интеракцију."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Укључи Истраживања додиром"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Ставке које додирнете ће бити изговорене наглас, а можете да се крећете по екрану покретима."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Укључи побољшану приступачност веба"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Могу да се инсталирају скрипте да би садржај апликација био приступачнији."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Прати текст који уносите"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Обухвата личне податке као што су бројеви кредитних картица и лозинке."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Управљај увећањем приказа"</string>
@@ -1763,11 +1768,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Пређите у режим уноса текста ради уноса времена."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Пређите у режим сата ради уноса времена."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Опције аутоматског попуњавања"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Сачувајте за аутоматско попуњавање"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Садржај не може аутоматски да се попуни"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Желите ли да сачувате у: <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Желите ли да сачувате ставку <xliff:g id="TYPE">%1$s</xliff:g> у: <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Желите ли да сачувате ставке <xliff:g id="TYPE_0">%1$s</xliff:g> и <xliff:g id="TYPE_1">%2$s</xliff:g> у <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Желите ли да сачувате ставке <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> и <xliff:g id="TYPE_2">%3$s</xliff:g> у <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Желите ли да сачувате у: <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Желите ли да сачувате ставку <xliff:g id="TYPE">%1$s</xliff:g> у: <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Желите ли да сачувате ставке <xliff:g id="TYPE_0">%1$s</xliff:g> и <xliff:g id="TYPE_1">%2$s</xliff:g> у: <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Желите ли да сачувате ставке <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> и <xliff:g id="TYPE_2">%3$s</xliff:g> у: <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Сачувај"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Не, хвала"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"лозинка"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 90dfd681a..7f3d212 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Operatören har tillfälligt stängt av röst- och nödsamtal på denna plats"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Det går inte att nå nätverket"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Testa om du får bättre mottagning genom att ändra till en annan typ under System > Nätverk och internet > Mobila nätverk > Önskad nätverkstyp."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Aviseringar"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Vidarebefordra samtal"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Läget Återuppringning vid nödsamtal"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Aviseringar för mobildata"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Sms"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Röstmeddelanden"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-samtal"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer-enheten begärde texttelefonläget FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer-enheten begärde texttelefonläget HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer-enheten begärde texttelefonläget VCO"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Granska innehållet i ett fönster som du interagerar med."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivera Explore by touch"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Objekt som användaren trycker på läses upp högt och skärmen kan utforskas med hjälp av rörelser."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Aktivera förbättrad webbtillgänglighet"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skript kan installeras för att göra appens innehåll tillgängligare."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observera text som du skriver"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Omfattar personuppgifter som kreditkortsnummer och lösenord."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Styr skärmförstoringen"</string>
@@ -1178,7 +1183,7 @@
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"DELA"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"AVVISA"</string>
<string name="select_input_method" msgid="8547250819326693584">"Byt tangentbord"</string>
- <string name="show_ime" msgid="2506087537466597099">"Ha kvar den på skärmen när det fysiska tangentbordet används"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Ha kvar det på skärmen när det fysiska tangentbordet används"</string>
<string name="hardware" msgid="194658061510127999">"Visa virtuellt tangentbord"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Konfigurera fysiskt tangentbord"</string>
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tryck om du vill välja språk och layout"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Byt till textinmatningsläget och ange tid."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Byt till klockläget och ange tid."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Alternativ för autofyll"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Spara för Autofyll"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Det gick inte att fylla i innehållet automatiskt"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Vill du spara detta i <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Vill du spara <xliff:g id="TYPE">%1$s</xliff:g> i <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Spara <xliff:g id="TYPE_0">%1$s</xliff:g> och <xliff:g id="TYPE_1">%2$s</xliff:g> i <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Spara <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> och <xliff:g id="TYPE_2">%3$s</xliff:g> i <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Vill du spara innehållet i <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Vill du spara <xliff:g id="TYPE">%1$s</xliff:g> i <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Vill du spara <xliff:g id="TYPE_0">%1$s</xliff:g> och <xliff:g id="TYPE_1">%2$s</xliff:g> i <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Vill du spara <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> och <xliff:g id="TYPE_2">%3$s</xliff:g> i <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Spara"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Nej tack"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"lösenordet"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index d104bb7..52fa3a2 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -45,7 +45,7 @@
<string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Ujumbe wa sauti"</string>
<string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
<string name="mmiError" msgid="5154499457739052907">"Tatizo la muunganisho au msimbo batili MMI."</string>
- <string name="mmiFdnError" msgid="5224398216385316471">"Uendeshaji umepunguzwa kwa namba za upigaji simu za kudumu pekee."</string>
+ <string name="mmiFdnError" msgid="5224398216385316471">"Ni matumizi yanayohusisha nambari za simu zilizobainishwa pekee yatakayowezekana."</string>
<string name="mmiErrorWhileRoaming" msgid="762488890299284230">"Haiwezi kubadilisha mipangilio ya kusambaza simu kutoka kwenye simu yako ukiwa unatumia mitandao mingine."</string>
<string name="serviceEnabled" msgid="8147278346414714315">"Huduma iliwezeshwa"</string>
<string name="serviceEnabledFor" msgid="6856228140453471041">"Huduma iliwezesha kwa:"</string>
@@ -73,7 +73,7 @@
<string name="ColpMmi" msgid="3065121483740183974">"Kitambulisho cha Mstari Uliounganishwa"</string>
<string name="ColrMmi" msgid="4996540314421889589">"Kizuizi cha Kitambulisho cha Mstari Uliounganishwa"</string>
<string name="CfMmi" msgid="5123218989141573515">"Kusambaza simu"</string>
- <string name="CwMmi" msgid="9129678056795016867">"Simu inasubiriwa"</string>
+ <string name="CwMmi" msgid="9129678056795016867">"Simu inayosubiri kupokewa"</string>
<string name="BaMmi" msgid="455193067926770581">"Kuzuia upigaji simu"</string>
<string name="PwdMmi" msgid="7043715687905254199">"Badilisho la nenosiri"</string>
<string name="PinMmi" msgid="3113117780361190304">"Badilisha PIN"</string>
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Mtoa huduma wako amesitisha kwa muda huduma ya kupiga simu za dharura na za sauti mahali hapa"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Haiwezi kufikia mtandao"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Ili kupata mtandao thabiti, jaribu kubadilisha aina iliyochaguliwa katika Mfumo > Mtandao na Intaneti > Mitandao ya simu > Aina ya mtandao unaopendelea."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Arifa"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Kupeleka simu kwenye nambari nyingine"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Hali ya kupiga simu za dharura"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Arifa za matumizi ya data ya simu"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Ujumbe wa SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Ujumbe wa sauti"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Kupiga simu kupitia Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Hali ya TTY iliyoombwa na mtandao mwenza KAMILI"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Hali ya TTY iliyoombwa na mtandao mwenza HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Hali ya TTY iliyoombwa na mtandao mwenza VCO"</string>
@@ -232,9 +239,9 @@
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Mtindo wa kimya"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Sauti Imezimwa"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Sauti imewashwa"</string>
- <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Hali ya ndege"</string>
- <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Hali ya ndege IMEWASHWA"</string>
- <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Hali ya ndege IMEZIMWA"</string>
+ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Hali ya ndegeni"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Hali ya ndegeni IMEWASHWA"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Hali ya ndegeni IMEZIMWA"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Mipangilio"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Mapendekezo"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Usaidizi wa Sauti"</string>
@@ -278,16 +285,14 @@
<string name="permgroupdesc_phone" msgid="6234224354060641055">"piga na udhibiti simu"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Vihisi vya Mwili"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"fikia data ya kitambuzi kuhusu alama zako muhimu"</string>
- <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Rejesha maudhui ya dirisha"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Chunguza maudhui ya dirisha unaloingiliana nalo."</string>
- <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Washa Chunguza kwa Mguso"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Kurejesha maudhui ya dirisha"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kuchunguza maudhui ya dirisha unalotumia."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Kuwasha \'Chunguza kwa Kugusa\'"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Ukigonga vipengee, vitatamka maneno kwa sauti na unaweza kukagua skrini kwa kutumia ishara."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Washa ufikiaji wa wavuti ulioboreshwa"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Hati zinaweza kusakinishwa ili kuyafanya maudhui ya programu kufikiwa zaidi."</string>
- <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Angalia maandishi unayoyacharaza"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Kuangalia maandishi unayoyacharaza"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Inajumuisha data binafsi kama vile nambari za kadi ya mkopo na manenosiri."</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Dhibiti ukuzaji wa onyesho"</string>
- <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Dhibiti kiwango cha kukuza na nafasi cha onyesho."</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Kudhibiti ukuzaji wa onyesho"</string>
+ <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Kudhibiti kiwango cha kukuza na nafasi cha onyesho."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Tekeleza ishara"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Unaweza kugonga, kutelezesha kidole, kubana na kutekeleza ishara zingine."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Ishara za alama ya kidole"</string>
@@ -1067,7 +1072,7 @@
<string name="dump_heap_text" msgid="4809417337240334941">"Mchakato wa <xliff:g id="PROC">%1$s</xliff:g> umezidi kiwango kinachotakikana cha hifadhi cha <xliff:g id="SIZE">%2$s</xliff:g>. Unaweza kupata picha ya hifadhi ili uishiriki na msadini programu wa picha. Tahadhari: picha hii ya hifadhi inaweza kuwa na maelezo yako ya binafsi ambayo yanaweza kufikiwa na programu."</string>
<string name="sendText" msgid="5209874571959469142">"Chagua kitendo kwa ajili ya maandishi"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Sauti ya mlio"</string>
- <string name="volume_music" msgid="5421651157138628171">"Sauti ya media"</string>
+ <string name="volume_music" msgid="5421651157138628171">"Sauti ya muziki"</string>
<string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Inacheza kupitia Bluetooth"</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Mlio wa simu ulionyamaza umewekwa"</string>
<string name="volume_call" msgid="3941680041282788711">"Sauti ya simu inayoendelea"</string>
@@ -1176,7 +1181,7 @@
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"SHIRIKI"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"KATAA"</string>
<string name="select_input_method" msgid="8547250819326693584">"Badilisha kibodi"</string>
- <string name="show_ime" msgid="2506087537466597099">"Iweke kwenye skrini wakati kibodi inapotumika"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Ionyeshe kwenye skrini wakati kibodi halisi inatumika"</string>
<string name="hardware" msgid="194658061510127999">"Onyesha kibodi pepe"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Sanidi kibodi halisi"</string>
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Gonga ili uchague lugha na muundo"</string>
@@ -1601,7 +1606,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Imesakinishwa na msimamizi wako"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Imesasishwa na msimamizi wako"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Imefutwa 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>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Kusaidia kuboresha muda wa matumizi ya betri, kiokoa 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 zinazotegemea usawazishaji huenda zisisasishwe usipozifungua.\n\nKiokoa betri hujizima kiotomatiki wakati kifaa chako kinachaji."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Ili kusaidia kupunguza matumizi ya data, Kiokoa Data huzuia baadhi ya programu kupokea na kutuma data chini chini. Programu ambayo unatumia sasa inaweza kufikia data, lakini si kila wakati. Kwa mfano, haitaonyesha picha hadi utakapozigonga."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ungependa Kuwasha Kiokoa Data?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Washa"</string>
@@ -1681,7 +1686,7 @@
<string name="language_selection_title" msgid="2680677278159281088">"Ongeza lugha"</string>
<string name="country_selection_title" msgid="2954859441620215513">"Mapendeleo ya eneo"</string>
<string name="search_language_hint" msgid="7042102592055108574">"Weka jina la lugha"</string>
- <string name="language_picker_section_suggested" msgid="8414489646861640885">"Inayopendekezwa"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Zinazopendekezwa"</string>
<string name="language_picker_section_all" msgid="3097279199511617537">"Lugha zote"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Maeneo yote"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Tafuta"</string>
@@ -1730,11 +1735,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Badilisha iwe katika hali ya maandishi wakati wa kuweka muda."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Badilisha umbo liwe la saa ya mishale wakati wa kuweka muda."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Chaguo za kujaza otomatiki"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Hifadhi kwa ajili ya Kujaza kiotomatiki"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Maudhui hayawezi kujazwa kiotomatiki"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Ungependa kuhifadhi kwenye <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Ungependa kuhifadhi <xliff:g id="TYPE">%1$s</xliff:g> kwenye <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Ungependa kuhifadhi <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> kwenye <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Ungependa kuhifadhi <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> kwenye <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Ungependa kuhifadhi kwenye <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Ungependa kuhifadhi <xliff:g id="TYPE">%1$s</xliff:g> kwenye <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Ungependa kuhifadhi <xliff:g id="TYPE_0">%1$s</xliff:g> na <xliff:g id="TYPE_1">%2$s</xliff:g> kwenye <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Ungependa kuhifadhi <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, na <xliff:g id="TYPE_2">%3$s</xliff:g> kwenye <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Hifadhi"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Hapana, asante"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"nenosiri"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 1f81757..18b097e 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"உங்கள் தொலைத்தொடர்பு நிறுவனம் குரல் மற்றும் அவசர அழைப்புகளை இந்த இடத்தில் தற்காலிகமாக நிறுத்தியுள்ளது"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"நெட்வொர்க்குடன் இணைக்க முடியவில்லை"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"பெறுதலை மேம்படுத்த, சாதனம் > நெட்வொர்க் & இணையம் > மொபைல் நெட்வொர்க்குகள் > விரும்பும் நெட்வொர்க் வகை என்பதற்குச் சென்று, தேர்ந்தெடுத்த வகையை மாற்றவும்."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"விழிப்பூட்டல்கள்"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"அழைப்புப் பகிர்வு"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"அவசரகாலத் திரும்ப அழைக்கும் பயன்முறை"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"மொபைல் தரவு விழிப்பூட்டல்கள்"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS செய்திகள்"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"குரலஞ்சல் செய்திகள்"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"வைஃபை அழைப்பு"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"TTY Mode FULLஐ இணைச் செயல்பாடு கோரியது"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"TTY Mode HCOஐ இணைச் செயல்பாடு கோரியது"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"TTY Mode VCOஐ இணைச் செயல்பாடு கோரியது"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"நீங்கள் பணியாற்றி கொண்டிருக்கும் சாளரத்தின் உள்ளடக்கத்தைப் பார்க்கலாம்."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"தொடுவதன் மூலம் அறிவதை இயக்கும்"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"தட்டிய உருப்படிகள் சத்தமாகப் படிக்கப்படும், சைகைகளைப் பயன்படுத்தி திரையில் உலாவலாம்."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"மேம்பட்ட இணைய அணுகல்தன்மையை இயக்கும்"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"பயன்பாட்டு உள்ளடக்கத்தை மேலும் எளிதாக அணுகக்கூடியதாக்க ஸ்கிரிப்ட்கள் நிறுவப்படலாம்."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"நீங்கள் தட்டச்சு செய்யும் உரையைக் கவனிக்கும்"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"கிரெடிட் கார்டு எண்கள் மற்றும் கடவுச்சொற்கள் போன்ற தனிப்பட்ட தகவலும் உள்ளடங்கும்."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"திரையின் உருப்பெருக்கத்தைக் கட்டுப்படுத்துதல்"</string>
@@ -1733,11 +1738,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"உரை உள்ளீட்டிற்காக, கடிகாரப் பயன்முறைக்கு மாற்றும்."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"நேர உள்ளீட்டிற்காக, கடிகாரப் பயன்முறைக்கு மாற்றும்."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"தன்னிரப்பி விருப்பங்கள்"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"தன்னிரப்பியில் சேமி"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"உள்ளடக்கத்தைத் தானாக நிரப்ப முடியவில்லை"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> இல் சேமிக்கவா?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g>ஐ <xliff:g id="LABEL">%2$s</xliff:g> இல் சேமிக்கவா?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ஆகியவற்றை <xliff:g id="LABEL">%3$s</xliff:g> இல் சேமிக்கவா?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> ஆகியவற்றை <xliff:g id="LABEL">%4$s</xliff:g> இல் சேமிக்கவா?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> இல் சேமிக்கவா?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g>ஐ <b><xliff:g id="LABEL">%2$s</xliff:g></b> இல் சேமிக்கவா?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> மற்றும் <xliff:g id="TYPE_1">%2$s</xliff:g>ஐ <b><xliff:g id="LABEL">%3$s</xliff:g></b> இல் சேமிக்கவா?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> ஆகியவற்றை <b><xliff:g id="LABEL">%4$s</xliff:g></b> இல் சேமிக்கவா?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"சேமி"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"வேண்டாம்"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"கடவுச்சொல்"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 0fb49d5..d79e52f 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"మీ క్యారియర్ ఈ స్థానంలో వాయిస్ మరియు అత్యవసర కాల్లను తాత్కాలికంగా నిలిపివేసింది"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"నెట్వర్క్ను చేరుకోలేరు"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"స్వీకరణను మెరుగుపరచాలంటే, సిస్టమ్ > నెట్వర్క్ & ఇంటర్నెట్ > మొబైల్ నెట్వర్క్లు > ప్రాధాన్య నెట్వర్క్ రకంలో మీరు ఎంచుకున్న రకాన్ని మార్చి ప్రయత్నించండి."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"హెచ్చరికలు"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"కాల్ ఫార్వార్డింగ్"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"అత్యవసర కాల్బ్యాక్ మోడ్"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"మొబైల్ డేటా హెచ్చరికలు"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS సందేశాలు"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"వాయిస్ మెయిల్ సందేశాలు"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi కాలింగ్"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"అవతలి వారు FULL TTY మోడ్ని అభ్యర్థించారు"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"అవతలి వారు HCO TTY మోడ్ని అభ్యర్థించారు"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"అవతలి వారు VCO TTY మోడ్ని అభ్యర్థించారు"</string>
@@ -281,11 +288,9 @@
<string name="permgrouplab_sensors" msgid="416037179223226722">"శరీర సెన్సార్లు"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"మీ అత్యంత కీలకమైన గుర్తుల గురించి సెన్సార్ డేటాని ప్రాప్యత చేస్తుంది"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"విండో కంటెంట్ను తిరిగి పొందుతుంది"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"మీరు పరస్పర చర్య చేస్తున్న విండో కంటెంట్ను పరిశీలించండి."</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"మీరు పరస్పర చర్య చేస్తున్న విండో కంటెంట్ను పరిశీలిస్తుంది."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"తాకడం ద్వారా విశ్లేషణను ప్రారంభిస్తుంది"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"నొక్కిన అంశాలు బిగ్గరగా చదివి వినిపించబడతాయి మరియు సంజ్ఞలను ఉపయోగించి స్క్రీన్ను విశ్లేషించవచ్చు."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"మెరుగైన వెబ్ ప్రాప్యతను ప్రారంభిస్తుంది"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"అనువర్తన కంటెంట్కు మరింత సులభ ప్రాప్యత సౌలభ్యం అందించడానికి స్క్రిప్ట్లు ఇన్స్టాల్ చేయబడవచ్చు."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"మీరు టైప్ చేస్తున్న వచనాన్ని పరిశీలిస్తుంది"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"క్రెడిట్ కార్డు నంబర్లు మరియు పాస్వర్డ్ల వంటి వ్యక్తిగత డేటాను కలిగి ఉంటుంది."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"డిస్ప్లే మాగ్నిఫికేషన్ను నియంత్రించండి"</string>
@@ -671,7 +676,7 @@
<string name="orgTypeOther" msgid="3951781131570124082">"ఇతరం"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"అనుకూలం"</string>
<string name="relationTypeCustom" msgid="3542403679827297300">"అనుకూలం"</string>
- <string name="relationTypeAssistant" msgid="6274334825195379076">"సహాయకం"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"అసిస్టెంట్"</string>
<string name="relationTypeBrother" msgid="8757913506784067713">"సోదరుడు"</string>
<string name="relationTypeChild" msgid="1890746277276881626">"బిడ్డ"</string>
<string name="relationTypeDomesticPartner" msgid="6904807112121122133">"జీవిత భాగస్వామి"</string>
@@ -1604,7 +1609,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"మీ నిర్వాహకులు ఇన్స్టాల్ చేసారు"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"మీ నిర్వాహకులు నవీకరించారు"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"మీ నిర్వాహకులు తొలగించారు"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"బ్యాటరీ జీవితకాలాన్ని మెరుగుపరచడంలో సహాయపడటానికి, బ్యాటరీ సేవర్ మీ పరికరం పనితీరును తగ్గిస్తుంది మరియు వైబ్రేషన్ను, స్థాన సేవలను మరియు ఎక్కువ నేపథ్య డేటాను పరిమితం చేస్తుంది. ఇమెయిల్, మెసేజింగ్ మరియు సమకాలీకరణపై ఆధారపడే ఇతర అనువర్తనాలు మీరు వాటిని తెరిస్తే మినహా నవీకరించబడవు.\n\nమీ పరికరం ఛార్జ్ అవుతున్నప్పుడు బ్యాటరీ సేవర్ స్వయంచాలకంగా ఆఫ్ అవుతుంది."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"బ్యాటరీ జీవితకాలాన్ని మెరుగుపరచడంలో సహాయపడటానికి, బ్యాటరీ సేవర్ మీ పరికరం పనితీరును తగ్గిస్తుంది మరియు వైబ్రేషన్ను, స్థాన సేవలను మరియు అత్యధిక నేపథ్య డేటాను పరిమితం చేస్తుంది. ఇమెయిల్, మెసేజింగ్ మరియు సమకాలీకరణపై ఆధారపడే ఇతర అనువర్తనాలు మీరు వాటిని తెరిస్తే మినహా నవీకరించబడవు.\n\nమీ పరికరం ఛార్జ్ అవుతున్నప్పుడు బ్యాటరీ సేవర్ స్వయంచాలకంగా ఆఫ్ అవుతుంది."</string>
<string name="data_saver_description" msgid="6015391409098303235">"డేటా వినియోగాన్ని తగ్గించడంలో సహాయకరంగా ఉండటానికి, డేటా సేవర్ కొన్ని అనువర్తనాలను నేపథ్యంలో డేటాను పంపకుండా లేదా స్వీకరించకుండా నిరోధిస్తుంది. మీరు ప్రస్తుతం ఉపయోగిస్తున్న అనువర్తనం డేటాను ప్రాప్యత చేయగలదు కానీ అలా అరుదుగా చేయవచ్చు. అంటే, ఉదాహరణకు, మీరు ఆ చిత్రాలను నొక్కే వరకు అవి ప్రదర్శించబడవు."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"డేటా సేవర్ను ఆన్ చేయాలా?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ఆన్ చేయి"</string>
@@ -1733,11 +1738,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"సమయాన్ని నమోదు చేయడం కోసం వచన నమోదు మోడ్కి మారండి."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"సమయాన్ని నమోదు చేయడం కోసం గడియారం మోడ్కు మారండి."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"స్వీయ పూరింపు ఎంపికలు"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"స్వీయ పూరింపు కోసం సేవ్ చేయండి"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"కంటెంట్లను స్వీయ పూరింపు చేయడం సాధ్యపడదు"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g>కు సేవ్ చేయాలా?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g>ని <xliff:g id="LABEL">%2$s</xliff:g>కు సేవ్ చేయాలా?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>లను <xliff:g id="LABEL">%3$s</xliff:g>కు సేవ్ చేయాలా?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g>లను <xliff:g id="LABEL">%4$s</xliff:g>కు సేవ్ చేయాలా?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b>కు సేవ్ చేయాలా?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g>ని <b><xliff:g id="LABEL">%2$s</xliff:g></b>కు సేవ్ చేయాలా?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> మరియు <xliff:g id="TYPE_1">%2$s</xliff:g>లను <b><xliff:g id="LABEL">%3$s</xliff:g></b>కు సేవ్ చేయాలా?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> మరియు <xliff:g id="TYPE_2">%3$s</xliff:g>లను <b><xliff:g id="LABEL">%4$s</xliff:g></b>కు సేవ్ చేయాలా?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"సేవ్ చేయి"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"వద్దు, ధన్యవాదాలు"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"పాస్వర్డ్"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index ed22eef..2179f70 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"ผู้ให้บริการของคุณระงับการโทรด้วยเสียงและหมายเลขฉุกเฉินที่นี่ชั่วคราว"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"เข้าถึงเครือข่ายไม่ได้"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"เพื่อให้การรับสัญญาณดีขึ้น ลองเปลี่ยนประเภทที่เลือกใน \"การตั้งค่า\" > \"เครือข่ายและอินเทอร์เน็ต\" > \"เครือข่ายมือถือ\" > \"ประเภทเครือข่ายที่ต้องการ\""</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"การแจ้งเตือน"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"การโอนสาย"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"โหมดติดต่อกลับฉุกเฉิน"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"การแจ้งเตือนอินเทอร์เน็ตมือถือ"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"ข้อความ SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ข้อความเสียง"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"การโทรผ่าน Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"อีกฝั่งหนึ่งขอโหมด TTY เป็น \"เต็ม\""</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"อีกฝั่งหนึ่งขอโหมด TTY เป็น \"HCO\""</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"อีกฝั่งหนึ่งขอโหมด TTY เป็น \"VCO\""</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ตรวจสอบเนื้อหาของหน้าต่างที่คุณกำลังโต้ตอบอยู่"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"เปิด \"แตะเพื่อสำรวจ\""</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"ระบบจะพูดออกเสียงรายการที่แตะและหน้าจอสามารถสำรวจได้ด้วยท่าทางสัมผัส"</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"เปิดการเข้าถึงเว็บที่มีประสิทธิภาพมากขึ้น"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"อาจติดตั้งสคริปต์เพื่อทำให้สามารถเข้าถึงเนื้อหาแอปได้ง่ายขึ้น"</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"สังเกตข้อความที่คุณพิมพ์"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"รวมถึงข้อมูลส่วนบุคคล เช่น หมายเลขบัตรเครดิตและรหัสผ่าน"</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"ควบคุมการขยายการแสดงผล"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"สลับไปโหมดป้อนข้อความเพื่อป้อนเวลา"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"สลับไปโหมดนาฬิกาเพื่อป้อนเวลา"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"ตัวเลือกในการป้อนอัตโนมัติ"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"บันทึกไว้ป้อนอัตโนมัติ"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"ไม่สามารถป้อนเนื้อหาอัตโนมัติ"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"บันทึกไปยัง <xliff:g id="LABEL">%1$s</xliff:g> ใช่ไหม"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"บันทึก <xliff:g id="TYPE">%1$s</xliff:g> ไปยัง <xliff:g id="LABEL">%2$s</xliff:g> ใช่ไหม"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"บันทึก <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ไปยัง <xliff:g id="LABEL">%3$s</xliff:g> ไหม"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"บันทึก <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> ไปยัง <xliff:g id="LABEL">%4$s</xliff:g> ไหม"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"บันทึกไปยัง <b><xliff:g id="LABEL">%1$s</xliff:g></b> ใช่ไหม"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"บันทึก <xliff:g id="TYPE">%1$s</xliff:g> ไปยัง <b><xliff:g id="LABEL">%2$s</xliff:g></b> ใช่ไหม"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"บันทึก <xliff:g id="TYPE_0">%1$s</xliff:g> และ <xliff:g id="TYPE_1">%2$s</xliff:g> ไปยัง <b><xliff:g id="LABEL">%3$s</xliff:g></b> ใช่ไหม"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"บันทึก <xliff:g id="TYPE_0">%1$s</xliff:g> <xliff:g id="TYPE_1">%2$s</xliff:g> และ <xliff:g id="TYPE_2">%3$s</xliff:g> ไปยัง <b><xliff:g id="LABEL">%4$s</xliff:g></b> ใช่ไหม"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"บันทึก"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"ไม่เป็นไร"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"รหัสผ่าน"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 8b5962f..90e57c1 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Pansamantalang sinuspinde ng iyong carrier ang mga voice call at emergency na tawag sa lokasyong ito"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Hindi maabot ang network"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Upang lumakas ang reception, subukang baguhin ang uring napili sa System > Network at Internet > Mga mobile network > Gustong uri ng network."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Mga Alerto"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Pagpasa ng tawag"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Mga alerto ng mobile data"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Mga mensaheng SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mga mensahe sa voicemail"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Pagtawag gamit ang Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Hiniling ng peer ang TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Hiniling ng peer ang TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Hiniling ng peer ang TTY Mode VCO"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Siyasatin ang nilalaman ng isang window kung saan ka nakikipag-ugnayan."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"I-on ang Explore by Touch"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Bibigkasin nang malakas ang mga na-tap na item at mae-explore ang screen gamit ang mga galaw."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"I-on ang pinahusay na accessibility sa web"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Maaaring mag-install ng mga script upang gawing mas naa-access ang nilalaman ng app."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Obserbahan ang tekstong tina-type mo"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"May kasamang personal na data tulad ng mga numero ng credit card at password."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Kontrolin ang pag-magnify ng display"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Lumipat sa pamamaraan ng pag-input ng text para sa input na oras."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Lumipat sa mode ng orasan para sa input na oras."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Mga opsyon sa autofill"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"I-save para sa Autofill"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Hindi maaaring ma-autofill ang mga content"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"I-save sa <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"I-save ang <xliff:g id="TYPE">%1$s</xliff:g> sa <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"I-save ang <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> sa <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"I-save ang <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> sa <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"I-save sa <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"I-save ang <xliff:g id="TYPE">%1$s</xliff:g> sa <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"I-save ang <xliff:g id="TYPE_0">%1$s</xliff:g> at <xliff:g id="TYPE_1">%2$s</xliff:g> sa <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"I-save ang <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, at <xliff:g id="TYPE_2">%3$s</xliff:g> sa <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"I-save"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Hindi, salamat na lang"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"password"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 7be1384..5cc96b6 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Operatörünüz bu konumdaki sesli ve acil durum çağrılarını geçici olarak askıya aldı"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ağa erişilemiyor"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Sinyal gücünü iyileştirmek için Sistem > Ağ ve İnternet > Mobil ağlar > Tercih edilen ağ türü\'nden seçili türü değiştirmeyi deneyin."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Uyarılar"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Çağrı yönlendirme"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Acil geri arama modu"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Mobil veri uyarıları"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS mesajları"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Sesli mesajlar"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Kablosuz çağrı"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Karşı taraf TTY Modunu TAM yaptı"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Karşı taraf TTY Modunu HCO yaptı"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Karşı taraf TTY Modunu VCO yaptı"</string>
@@ -284,14 +291,12 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Etkileşim kurduğunuz pencerenin içeriğini inceler."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Dokunarak Keşfet\'i açma"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Dokunulan öğeler sesli olarak okunur ve ekranı keşfetmek için hareketler kullanılabilir."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Gelişmiş web erişilebilirliğini açma"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Uygulamanın erişilebilirliğini artırmak için komut dosyaları yüklenebilir."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Yazdığınız metni izleme"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Kredi kartı ve şifre gibi kişisel bilgiler içerir."</string>
- <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Ekran büyütecini kontrol et"</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Ekran büyütecini kontrol etme"</string>
<string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Ekranın yakınlaştırma seviyesini ve konumunu kontrol edin."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Haraketleri yapma"</string>
- <string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Hafifçe dokunabilir, hızlıca kaydırabilir, sıkıştırabilir ve diğer hareketleri yapabilirsiniz."</string>
+ <string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Dokunabilir, hızlıca kaydırabilir, sıkıştırabilir ve diğer hareketleri yapabilirsiniz."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Parmak izi hareketleri"</string>
<string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Cihazların parmak izi sensörlerinde gerçekleştirilen hareketleri yakalayabilir."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"durum çubuğunu devre dışı bırak veya değiştir"</string>
@@ -1181,7 +1186,7 @@
<string name="show_ime" msgid="2506087537466597099">"Fiziksel klavye etkin durumdayken ekranda tut"</string>
<string name="hardware" msgid="194658061510127999">"Sanal klavyeyi göster"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Fiziksel klavyeyi yapılandırın"</string>
- <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dili ve düzeni seçmek için hafifçe dokunun"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dili ve düzeni seçmek için dokunun"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>, diğer uygulamaların üzerinde görüntüleniyor"</string>
@@ -1268,8 +1273,8 @@
<string name="notification_ranker_binding_label" msgid="774540592299064747">"Bildirim sıralama hizmeti"</string>
<string name="vpn_title" msgid="19615213552042827">"VPN etkinleştirildi"</string>
<string name="vpn_title_long" msgid="6400714798049252294">"VPN, <xliff:g id="APP">%s</xliff:g> tarafından etkinleştirildi"</string>
- <string name="vpn_text" msgid="1610714069627824309">"Ağı yönetmek için hafifçe vurun."</string>
- <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> oturumuna bağlı. Ağı yönetmek için hafifçe vurun."</string>
+ <string name="vpn_text" msgid="1610714069627824309">"Ağı yönetmek için dokunun."</string>
+ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> oturumuna bağlı. Ağı yönetmek için dokunun."</string>
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Her zaman açık VPN\'ye bağlanılıyor…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Her zaman açık VPN\'ye bağlanıldı"</string>
<string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Her zaman açık VPN bağlantısı kesildi"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Zaman girişi için metin girişi moduna geçin."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Zaman girişi için saat moduna geçin."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Otomatik doldurma seçenekleri"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Otomatik Doldurma için kaydedin"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"İçerikler otomatik doldurulamıyor"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> hizmetine kaydedilsin mi?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g>, <xliff:g id="LABEL">%2$s</xliff:g> etkinliğine kaydedilsin mi?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g> ve <xliff:g id="TYPE_1">%2$s</xliff:g> bilgileri <xliff:g id="LABEL">%3$s</xliff:g> hizmetine kaydedilsin mi?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ve <xliff:g id="TYPE_2">%3$s</xliff:g> bilgileri <xliff:g id="LABEL">%4$s</xliff:g> hizmetine kaydedilsin mi?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> hizmetine kaydedilsin mi?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g>, <b><xliff:g id="LABEL">%2$s</xliff:g></b> hizmetine kaydedilsin mi?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> ve <xliff:g id="TYPE_1">%2$s</xliff:g>, <b><xliff:g id="LABEL">%3$s</xliff:g></b> hizmetine kaydedilsin mi?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ve <xliff:g id="TYPE_2">%3$s</xliff:g>, <b><xliff:g id="LABEL">%4$s</xliff:g></b> hizmetine kaydedilsin mi?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Kaydet"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Hayır, teşekkürler"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"şifre"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 6c5846d..0fb047a 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -101,6 +101,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Оператор тимчасово заблокував голосові й екстрені виклики в цьому місці"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Не вдається під’єднатися до мережі"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Щоб покращити якість сигналу, змініть тип у меню \"Система\" > \"Мережа й Інтернет\" > \"Мобільні мережі\" > \"Тип мережі\"."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Сповіщення"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Переадресація виклику"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим екстреного зворотного виклику"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Сповіщення про мобільне передавання даних"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS-повідомлення"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Повідомлення голосової пошти"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Дзвінки через Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Пристрій змінив режим TTY на FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Пристрій змінив режим TTY на HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Пристрій змінив режим TTY на VCO"</string>
@@ -197,7 +204,7 @@
<string name="silent_mode" msgid="7167703389802618663">"Беззвуч. режим"</string>
<string name="turn_on_radio" msgid="3912793092339962371">"Увімкнути радіо"</string>
<string name="turn_off_radio" msgid="8198784949987062346">"Вимкнути радіо"</string>
- <string name="screen_lock" msgid="799094655496098153">"Заблок. екран"</string>
+ <string name="screen_lock" msgid="799094655496098153">"Блокування екрана"</string>
<string name="power_off" msgid="4266614107412865048">"Вимкнути"</string>
<string name="silent_mode_silent" msgid="319298163018473078">"Дзвінок вимкнено"</string>
<string name="silent_mode_vibrate" msgid="7072043388581551395">"Дзвінок на вібросигналі"</string>
@@ -221,7 +228,7 @@
<string name="global_actions" product="tablet" msgid="408477140088053665">"Парам. пристрою"</string>
<string name="global_actions" product="tv" msgid="7240386462508182976">"Параметри ТБ"</string>
<string name="global_actions" product="default" msgid="2406416831541615258">"Параметри телеф."</string>
- <string name="global_action_lock" msgid="2844945191792119712">"Заблок. екран"</string>
+ <string name="global_action_lock" msgid="2844945191792119712">"Блокування екрана"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Вимкнути"</string>
<string name="global_action_emergency" msgid="7112311161137421166">"Екстрений виклик"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"Звіт про помилки"</string>
@@ -290,8 +297,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Перевіряти вміст вікна, з яким ви взаємодієте."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Увімкнути функцію дослідження дотиком"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Активувати голосові підказки для елементів, яких торкаються, і користуватися інтерфейсом за допомогою жестів."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Увімкнути покращення веб-доступності"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Можуть установлюватися сценарії, щоб зробити вміст програми доступнішим."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Переглядати текст, який ви вводите"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Включає особисті дані, як-от номери кредитних карток і паролі."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Контролювати збільшення екрана"</string>
@@ -641,7 +646,7 @@
<string name="phoneTypeOtherFax" msgid="8587657145072446565">"Інший факс"</string>
<string name="phoneTypeRadio" msgid="4093738079908667513">"Радіо"</string>
<string name="phoneTypeTelex" msgid="3367879952476250512">"Телекс"</string>
- <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
+ <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"Телетайп"</string>
<string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Роб. мобільний"</string>
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Роб. пейджер"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Помічник"</string>
@@ -651,12 +656,12 @@
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Річниця"</string>
<string name="eventTypeOther" msgid="7388178939010143077">"Інші"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Указати"</string>
- <string name="emailTypeHome" msgid="449227236140433919">"Дом."</string>
- <string name="emailTypeWork" msgid="3548058059601149973">"Роб."</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"Особиста"</string>
+ <string name="emailTypeWork" msgid="3548058059601149973">"Робоча"</string>
<string name="emailTypeOther" msgid="2923008695272639549">"Інше"</string>
<string name="emailTypeMobile" msgid="119919005321166205">"Мобільний"</string>
<string name="postalTypeCustom" msgid="8903206903060479902">"Указати"</string>
- <string name="postalTypeHome" msgid="8165756977184483097">"Дом."</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"Домашня"</string>
<string name="postalTypeWork" msgid="5268172772387694495">"Роб."</string>
<string name="postalTypeOther" msgid="2726111966623584341">"Інше"</string>
<string name="imTypeCustom" msgid="2074028755527826046">"Указати"</string>
@@ -1317,7 +1322,7 @@
<string name="vpn_lockdown_config" msgid="5099330695245008680">"Торкніться, щоб налаштувати"</string>
<string name="upload_file" msgid="2897957172366730416">"Виберіть файл"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Не вибрано файл"</string>
- <string name="reset" msgid="2448168080964209908">"Віднов."</string>
+ <string name="reset" msgid="2448168080964209908">"Скинути"</string>
<string name="submit" msgid="1602335572089911941">"Надіслати"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Режим авто ввімкн."</string>
<string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Торкніться, щоб вийти з режиму автомобіля."</string>
@@ -1794,11 +1799,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Перейти в текстовий режим, щоб ввести час."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Перейти в режим годинника, щоб ввести час."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Параметри автозаповнення"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Зберегти в службі Автозаповнення"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Вміст не можна заповнити автоматично"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Зберегти в службі <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Зберегти дані (<xliff:g id="TYPE">%1$s</xliff:g>) у службі <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Зберегти дані (<xliff:g id="TYPE_0">%1$s</xliff:g> і <xliff:g id="TYPE_1">%2$s</xliff:g>) у службі <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Зберегти дані (<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> і <xliff:g id="TYPE_2">%3$s</xliff:g>) у службі <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Зберегти дані в службі <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Зберегти дані (<xliff:g id="TYPE">%1$s</xliff:g>) у службі <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Зберегти дані (<xliff:g id="TYPE_0">%1$s</xliff:g> і <xliff:g id="TYPE_1">%2$s</xliff:g>) у службі <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Зберегти дані (<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> і <xliff:g id="TYPE_2">%3$s</xliff:g>) у службі <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Зберегти"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Ні, дякую"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"пароль"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index ccaa412..5c73b69 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"آپ کے کیریئر نے عارضی طور پر اس مقام پر صوتی اور ہنگامی کالز کو معطل کر دیا ہے"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"نیٹ ورک تک نہیں پہنچا جا سکتا"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ریسپشن کو بہتر بنانے کیلئے، سسٹم > نیٹ ورک اور انٹرنیٹ > موبائل نیٹ ورکس > ترجیحی نیٹ ورک کی قسم تبدیل کرنے کی کوشش کریں۔"</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"الرٹس"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"کال آگے منتقل کرنا"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ہنگامی کال بیک وضع"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"موبائل ڈیٹا الرٹس"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS پیغامات"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"صوتی میل پیغامات"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi کالنگ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ہمسر نے TTY وضع مکمل کی درخواست کی"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ہمسر نے TTY وضع HCO کی درخواست کی"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ہمسر نے TTY وضع VCO کی درخواست کی"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"کسی ایسی ونڈو کے مواد کا معائنہ کریں جس کے ساتھ آپ تعامل کر رہے ہیں۔"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ٹچ کے ذریعے دریافت کریں کو آن کرنے کی"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"تھپتھپائے گئے آئٹمز کو باآواز بلند بولا جائے گا اور اشاروں کا استعمال کرکے اسکرین کو دریافت کیا جا سکتا ہے۔"</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"بہتر ویب ایکسیسبیلٹی کو آن کرنے کی"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"ایپ کا مواد مزید قابل رسائی بنانے کیلئے اسکرپٹس کو انسٹال کیا جا سکتا ہے۔"</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"آپکے ٹائپ کردہ متن کا مشاہدہ کرنے کی"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"اس میں ذاتی ڈیٹا جیسے کریڈٹ کارڈ نمبرز اور پاس ورڈز شامل ہیں۔"</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"ڈسپلے بڑا کرنے کے عمل کو کنٹرول کریں"</string>
@@ -1282,7 +1287,7 @@
<string name="submit" msgid="1602335572089911941">"جمع کرائیں"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"کار وضع فعال ہے"</string>
<string name="car_mode_disable_notification_message" msgid="6301524980144350051">"کار موڈ سے خارج ہونے کیلئے تھپتھپائیں۔"</string>
- <string name="tethered_notification_title" msgid="3146694234398202601">"ربط بنانا یا ہاٹ اسپاٹ فعال"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"ٹیتھرنگ یا ہاٹ اسپاٹ فعال"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"سیٹ اپ کرنے کیلئے تھپتھپائیں۔"</string>
<string name="back_button_label" msgid="2300470004503343439">"واپس جائیں"</string>
<string name="next_button_label" msgid="1080555104677992408">"اگلا"</string>
@@ -1733,11 +1738,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"وقت ان پٹ کے لیے ٹیکسٹ ان پٹ وضع پر سوئچ کریں۔"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"وقت ان پٹ کے لیے گھڑی وضع پر سوئچ کریں۔"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"آٹو فل کے اختیارات"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"آٹوفل کیلئے محفوظ کریں"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"موادوں کو آٹو فل نہیں کیا جا سکتا"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> میں محفوظ کریں؟"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> کو <xliff:g id="LABEL">%2$s</xliff:g> میں محفوظ کریں؟"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>، <xliff:g id="TYPE_1">%2$s</xliff:g> کو <xliff:g id="LABEL">%3$s</xliff:g> میں محفوظ کریں؟"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>، <xliff:g id="TYPE_1">%2$s</xliff:g>، <xliff:g id="TYPE_2">%3$s</xliff:g> کو <xliff:g id="LABEL">%4$s</xliff:g> میں محفوظ کریں؟"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> میں محفوظ کریں؟"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> کو <b><xliff:g id="LABEL">%2$s</xliff:g></b> میں محفوظ کریں؟"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> اور <xliff:g id="TYPE_1">%2$s</xliff:g> کو <b><xliff:g id="LABEL">%3$s</xliff:g></b> میں محفوظ کریں؟"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>،<xliff:g id="TYPE_1">%2$s</xliff:g>، اور <xliff:g id="TYPE_2">%3$s</xliff:g> کو <b><xliff:g id="LABEL">%4$s</xliff:g></b> میں محفوظ کریں؟"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"محفوظ کریں"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"نہیں، شکریہ"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"پاس ورڈ"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 35e4455..1f23149 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Aloqa operatoringiz bu joyda ovozli va favqulodda chaqiruvlarni bloklagan"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Tarmoq bilan bog‘lanib bo‘lmadi"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Qabul qilish sifatini yaxshilash uchun Tizim > Tarmoq va Internet > Mobil tarmoqlar > Asosiy tarmoq turi orqali o‘zgartirib ko‘ring."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Ogohlantirishlar"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Chaqiruvlarni uzatish"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Favqulodda qaytarib chaqirish rejimi"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Mobil internetga oid ogohlantirishlar"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS xabarlar"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Ovozli xabarlar"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi chaqiruv"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Teng huquqli ishtirokchi teletayp rejimini FULL (to‘liq) qilib o‘zgartirdi"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Teng huquqli ishtirokchi teletayp rejimini HCO (eshitadi, gapirolmaydi) qilib o‘zgartirdi"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Teng huquqli ishtirokchi teletayp rejimini VCO (gapiradi, eshitolmaydi) qilib o‘zgartirdi"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Joriy oynadagi kontent mazmunini aniqlaydi."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Teginib o‘rganish xizmatini yoqadi"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Tegilgan elementlar nomini talaffuz qiladi va ekran bo‘ylab barmoq orqali kezish imkoniyatini yoqadi."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Internet uchun maxsus imkoniyatlarni yoqadi"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Qo‘shimcha skriptlar o‘rnatilishi mumkin."</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="capability_title_canControlMagnification" msgid="3593493281059424855">"Ekranni kattalashtirishni boshqarish"</string>
@@ -1733,11 +1738,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Vaqtni kiritish uchun matn kiritish rejimiga o‘ting."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Vaqtni kiritish uchun soat rejimiga o‘ting."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Avtomatik to‘ldirish parametrlari"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Avtomatik to‘ldirish xizmatiga saqlash"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Avtomatik to‘ldirib bo‘lmaydi"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"<xliff:g id="LABEL">%1$s</xliff:g> xizmatiga saqlansinmi?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"<xliff:g id="TYPE">%1$s</xliff:g> <xliff:g id="LABEL">%2$s</xliff:g> xizmatiga saqlansinmi?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ma’lumotlari <xliff:g id="LABEL">%3$s</xliff:g> ichiga saqlansinmi?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> ma’lumotlari <xliff:g id="LABEL">%4$s</xliff:g> ichiga saqlansinmi?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"<b><xliff:g id="LABEL">%1$s</xliff:g></b> xizmatiga saqlansinmi?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"<xliff:g id="TYPE">%1$s</xliff:g> <b><xliff:g id="LABEL">%2$s</xliff:g></b> xizmatiga saqlansinmi?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"<xliff:g id="TYPE_0">%1$s</xliff:g> va <xliff:g id="TYPE_1">%2$s</xliff:g> <b><xliff:g id="LABEL">%3$s</xliff:g></b> xizmatiga saqlansinmi?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> va <xliff:g id="TYPE_2">%3$s</xliff:g> <b><xliff:g id="LABEL">%4$s</xliff:g></b> xizmatiga saqlansinmi?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Saqlash"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Yo‘q, kerak emas"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"parol"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index c85f413..fa103cc 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Nhà cung cấp dịch vụ của bạn đã tạm ngưng các cuộc gọi thoại và cuộc gọi khẩn cấp ở vị trí này"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Không thể kết nối mạng"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Để cải thiện khả năng thu tín hiệu, hãy thử thay đổi loại mạng được chọn trong Hệ thống > Mạng và Internet > Mạng di động > Loại mạng ưa thích."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Thông báo"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Chuyển tiếp cuộc gọi"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Chế độ gọi lại khẩn cấp"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Thông báo dữ liệu di động"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Tin nhắn SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Thư thoại"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Gọi qua Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"TTY theo yêu cầu của thiết bị ngang hàng ở chế độ ĐẦY ĐỦ"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"TTY theo yêu cầu của thiết bị ngang hàng ở chế độ HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"TTY theo yêu cầu của thiết bị ngang hàng ở chế độ VCO"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kiểm tra nội dung của cửa sổ bạn đang tương tác."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Bật Khám phá bằng cách chạm"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Mục đã nhấn sẽ được nói to và bạn có thể khám phá màn hình bằng cử chỉ."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Bật khả năng truy cập web nâng cao"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Tập lệnh có thể được cài đặt để làm cho nội dung ứng dụng dễ truy cập hơn."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Xem nội dung bạn nhập"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Bao gồm dữ liệu cá nhân chẳng hạn như số thẻ tín dụng và mật khẩu."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Kiểm soát thu phóng màn hình"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Chuyển sang chế độ nhập văn bản để nhập thời gian."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Chuyển sang chế độ đồng hồ để nhập thời gian."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Tùy chọn tự động điền"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Lưu cho Tự động điền"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Không thể tự động điền nội dung"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Lưu vào <xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Lưu <xliff:g id="TYPE">%1$s</xliff:g> vào <xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Lưu <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> vào <xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Lưu <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> vào <xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Lưu vào <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Lưu <xliff:g id="TYPE">%1$s</xliff:g> vào <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Lưu <xliff:g id="TYPE_0">%1$s</xliff:g> và <xliff:g id="TYPE_1">%2$s</xliff:g> vào <b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Lưu <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> và <xliff:g id="TYPE_2">%3$s</xliff:g> vào <b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Lưu"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Không, cảm ơn"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"mật khẩu"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 2d1a20b..dc66d6f 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"您的运营商在此位置暂时不提供语音通话和紧急呼救服务"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"无法连接网络"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"要改善信号情况,请尝试更改在“系统”>“网络和互联网”>“移动网络”>“首选网络类型”中选择的类型。"</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"提醒"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"来电转接"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"紧急回拨模式"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"移动数据提醒"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"短信"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"语音邮件"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"WLAN 通话"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"对方请求使用“TTY 完整”模式"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"对方请求使用“TTY HCO”模式"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"对方请求使用“TTY VCO”模式"</string>
@@ -281,11 +288,9 @@
<string name="permgrouplab_sensors" msgid="416037179223226722">"身体传感器"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"访问与您的生命体征相关的传感器数据"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"检索窗口内容"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"检查您正与其进行互动的窗口的内容。"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"检测您正访问的窗口的内容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"启用触摸浏览"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"设备将大声读出您点按的内容,同时您可以通过手势来浏览屏幕。"</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"启用网页无障碍增强功能"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"可能会安装程序以便访问应用的内容。"</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"监测您输入的文字"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"包含个人数据,例如信用卡号和密码。"</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"控制显示内容放大功能"</string>
@@ -1123,7 +1128,7 @@
<string name="wifi_p2p_from_message" msgid="570389174731951769">"发件人:"</string>
<string name="wifi_p2p_to_message" msgid="248968974522044099">"收件人:"</string>
<string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"输入所需的PIN码:"</string>
- <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN码:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN 码:"</string>
<string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"平板电脑连接到“<xliff:g id="DEVICE_NAME">%1$s</xliff:g>”时会暂时断开与WLAN的连接"</string>
<string name="wifi_p2p_frequency_conflict_message" product="tv" msgid="3087858235069421128">"电视连接到<xliff:g id="DEVICE_NAME">%1$s</xliff:g>时会暂时断开与 WLAN 的连接"</string>
<string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"手机连接到<xliff:g id="DEVICE_NAME">%1$s</xliff:g>时会暂时断开与WLAN的连接。"</string>
@@ -1178,7 +1183,7 @@
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"分享"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"拒绝"</string>
<string name="select_input_method" msgid="8547250819326693584">"更改键盘"</string>
- <string name="show_ime" msgid="2506087537466597099">"连接到实体键盘时使其在屏幕上保持显示状态"</string>
+ <string name="show_ime" msgid="2506087537466597099">"开启后,连接到实体键盘时,它会一直显示在屏幕上"</string>
<string name="hardware" msgid="194658061510127999">"显示虚拟键盘"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"配置实体键盘"</string>
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"点按即可选择语言和布局"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"切换到文字输入模式来输入时间。"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"切换到时钟模式来输入时间。"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"自动填充选项"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"保存以便用于自动填充"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"无法自动填充内容"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"要保存到<xliff:g id="LABEL">%1$s</xliff:g>吗?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"要将<xliff:g id="TYPE">%1$s</xliff:g>保存到<xliff:g id="LABEL">%2$s</xliff:g>吗?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"要将<xliff:g id="TYPE_0">%1$s</xliff:g>、<xliff:g id="TYPE_1">%2$s</xliff:g>保存到<xliff:g id="LABEL">%3$s</xliff:g>吗?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"要将<xliff:g id="TYPE_0">%1$s</xliff:g>、<xliff:g id="TYPE_1">%2$s</xliff:g>、<xliff:g id="TYPE_2">%3$s</xliff:g>保存到<xliff:g id="LABEL">%4$s</xliff:g>吗?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"要保存到<b><xliff:g id="LABEL">%1$s</xliff:g></b>吗?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"要将<xliff:g id="TYPE">%1$s</xliff:g>保存到<b><xliff:g id="LABEL">%2$s</xliff:g></b>吗?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"要将<xliff:g id="TYPE_0">%1$s</xliff:g>和<xliff:g id="TYPE_1">%2$s</xliff:g>保存到<b><xliff:g id="LABEL">%3$s</xliff:g></b>吗?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"要将<xliff:g id="TYPE_0">%1$s</xliff:g>、<xliff:g id="TYPE_1">%2$s</xliff:g>和<xliff:g id="TYPE_2">%3$s</xliff:g>保存到<b><xliff:g id="LABEL">%4$s</xliff:g></b>吗?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"保存"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"不用了"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"密码"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 902cfea..63cf0b1 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"您的流動網絡供應商已在此地點暫時停權語音和緊急通話"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"無法連接網絡"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"如要改善接收品質,請前往 [系統] > [網絡與互聯網] > [流動網絡] > [偏好的網絡類型],然後變更所選的網絡類型。"</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"通知"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"來電轉接"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"緊急回撥模式"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"流動數據通知"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"短訊"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"留言訊息"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 通話"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"對方曾要求 TTY 模式 (FULL)"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"對方曾要求 TTY 模式 (HCO)"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"對方曾要求 TTY 模式 (VCO)"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"檢查您使用中的視窗內容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"開啟「輕觸探索」功能"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"朗讀您輕按的項目,並可讓您使用手勢探索螢幕。"</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"開啟增強版網頁無障礙設定"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"可能會安裝程式碼,使應用程式內容更易於存取。"</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"記錄您輸入的文字"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"包括個人資料,如信用卡號碼和密碼。"</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"控制顯示屏的放大功能"</string>
@@ -1021,7 +1026,7 @@
<string name="aerr_application_repeated" msgid="3146328699537439573">"「<xliff:g id="APPLICATION">%1$s</xliff:g>」不斷停止運作"</string>
<string name="aerr_process_repeated" msgid="6235302956890402259">"「<xliff:g id="PROCESS">%1$s</xliff:g>」不斷停止運作"</string>
<string name="aerr_restart" msgid="7581308074153624475">"再次開啟應用程式"</string>
- <string name="aerr_report" msgid="5371800241488400617">"傳送意見反映"</string>
+ <string name="aerr_report" msgid="5371800241488400617">"傳送意見"</string>
<string name="aerr_close" msgid="2991640326563991340">"關閉"</string>
<string name="aerr_mute" msgid="1974781923723235953">"忽略直至裝置重新啟動"</string>
<string name="aerr_wait" msgid="3199956902437040261">"等一下"</string>
@@ -1603,7 +1608,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"已由您的管理員安裝"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"已由您的管理員更新"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"已由您的管理員刪除"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"節約電池用量模式有助於延長電池壽命,但這會降低裝置效能,並限制震動、定位服務及大部分背景數據傳輸。除非您啟用,否則電郵、短訊及其他需要使用同步功能的應用程式均不會更新。\n\n當裝置充電時,節約電池用量模式會自動關閉。"</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"為延長電池壽命,省電模式會降低裝置效能,並限制震動、位置資訊服務及大部分背景數據傳輸。如電郵、短訊及其他使用同步功能的應用程式沒有開啟,便不會自動更新。\n\n裝置充電時,省電模式會自動關閉。"</string>
<string name="data_saver_description" msgid="6015391409098303235">"「數據節省程式」可防止部分應用程式在背景收發資料,以節省數據用量。您正在使用的應用程式雖可存取資料,但次數可能會減少。例如,圖片可能需要輕按才會顯示。"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"要啟用數據節省程式嗎?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"開啟"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"切換至文字輸入模式即可輸入時間。"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"切換至時鐘模式即可輸入時間。"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"自動填入選項"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"儲存資料,方便您自動填入"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"無法自動填入內容"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"要儲存至 <xliff:g id="LABEL">%1$s</xliff:g> 嗎?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"要將<xliff:g id="TYPE">%1$s</xliff:g>儲存至 <xliff:g id="LABEL">%2$s</xliff:g> 嗎?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"要將<xliff:g id="TYPE_0">%1$s</xliff:g>和<xliff:g id="TYPE_1">%2$s</xliff:g>儲存至「<xliff:g id="LABEL">%3$s</xliff:g>」嗎?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"要將<xliff:g id="TYPE_0">%1$s</xliff:g>、<xliff:g id="TYPE_1">%2$s</xliff:g>和<xliff:g id="TYPE_2">%3$s</xliff:g>儲存至「<xliff:g id="LABEL">%4$s</xliff:g>」嗎?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"要儲存至「<b><xliff:g id="LABEL">%1$s</xliff:g></b>」嗎?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"要將<xliff:g id="TYPE">%1$s</xliff:g>儲存至「<b><xliff:g id="LABEL">%2$s</xliff:g></b>」嗎?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"要將<xliff:g id="TYPE_0">%1$s</xliff:g>和<xliff:g id="TYPE_1">%2$s</xliff:g>儲存至「<b><xliff:g id="LABEL">%3$s</xliff:g></b>」嗎?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"要將<xliff:g id="TYPE_0">%1$s</xliff:g>、<xliff:g id="TYPE_1">%2$s</xliff:g>和<xliff:g id="TYPE_2">%3$s</xliff:g>儲存至「<b><xliff:g id="LABEL">%4$s</xliff:g></b>」嗎?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"儲存"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"不用了,謝謝"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"密碼"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 91c5df3..97962cf 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -54,17 +54,17 @@
<string name="serviceErased" msgid="1288584695297200972">"清除成功。"</string>
<string name="passwordIncorrect" msgid="7612208839450128715">"密碼錯誤。"</string>
<string name="mmiComplete" msgid="8232527495411698359">"MMI 完成。"</string>
- <string name="badPin" msgid="9015277645546710014">"您輸入的舊 PIN 不正確。"</string>
- <string name="badPuk" msgid="5487257647081132201">"您輸入的 PUK 不正確。"</string>
- <string name="mismatchPin" msgid="609379054496863419">"您輸入的 PIN 碼不符。"</string>
+ <string name="badPin" msgid="9015277645546710014">"你輸入的舊 PIN 不正確。"</string>
+ <string name="badPuk" msgid="5487257647081132201">"你輸入的 PUK 不正確。"</string>
+ <string name="mismatchPin" msgid="609379054496863419">"你輸入的 PIN 碼不符。"</string>
<string name="invalidPin" msgid="3850018445187475377">"輸入 4~8 個數字的 PIN。"</string>
<string name="invalidPuk" msgid="8761456210898036513">"輸入 8 位數以上的 PUK。"</string>
<string name="needPuk" msgid="919668385956251611">"SIM 卡的 PUK 已鎖定。請輸入 PUK 碼解除鎖定。"</string>
<string name="needPuk2" msgid="4526033371987193070">"請輸入 PUK2 以解鎖 SIM 卡。"</string>
<string name="enablePin" msgid="209412020907207950">"操作失敗,請啟用 SIM/RUIM 鎖定。"</string>
<plurals name="pinpuk_attempts" formatted="false" msgid="1251012001539225582">
- <item quantity="other">您還可以再試 <xliff:g id="NUMBER_1">%d</xliff:g> 次。如果仍然失敗,SIM 卡將被鎖定。</item>
- <item quantity="one">您還可以再試 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍然失敗,SIM 卡將被鎖定。</item>
+ <item quantity="other">你還可以再試 <xliff:g id="NUMBER_1">%d</xliff:g> 次。如果仍然失敗,SIM 卡將被鎖定。</item>
+ <item quantity="one">你還可以再試 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍然失敗,SIM 卡將被鎖定。</item>
</plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
@@ -88,7 +88,7 @@
<string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"預設顯示本機號碼,但下一通電話不顯示。"</string>
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"預設顯示本機號碼,下一通電話也繼續顯示。"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"無法提供此服務。"</string>
- <string name="CLIRPermanent" msgid="3377371145926835671">"您無法變更來電顯示設定。"</string>
+ <string name="CLIRPermanent" msgid="3377371145926835671">"你無法變更來電顯示設定。"</string>
<string name="RestrictedOnDataTitle" msgid="1322504692764166532">"無法使用數據連線服務"</string>
<string name="RestrictedOnEmergencyTitle" msgid="1236071219598685236">"無法使用緊急通話服務"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"無法使用語音通話服務"</string>
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"你的電信業者在這個地點暫時不提供語音和緊急通話服務"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"無法連上網路"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"如要改善收訊狀況,請依序開啟 [系統] > [網路與網際網路] > [行動網路] > [偏好的網路類型],然後選取其他網路類型。"</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"快訊"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"來電轉接"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"緊急回撥模式"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"行動數據快訊"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"簡訊"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"語音留言"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 通話"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"通訊對象要求使用 TTY 的 FULL 模式"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"通訊對象要求使用 TTY 的 HCO 模式"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"通訊對象要求使用 TTY 的 VCO 模式"</string>
@@ -127,10 +134,10 @@
<string name="roamingTextSearching" msgid="8360141885972279963">"正在搜尋服務"</string>
<string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi 通話"</string>
<string-array name="wfcOperatorErrorAlertMessages">
- <item msgid="2254967670088539682">"如要透過 Wi-FI 撥打電話及傳送訊息,請先要求您的電信業者開通這項服務,然後再到「設定」啟用 Wi-Fi 通話功能。"</item>
+ <item msgid="2254967670088539682">"如要透過 Wi-FI 撥打電話及傳送訊息,請先要求你的電信業者開通這項服務,然後再到「設定」啟用 Wi-Fi 通話功能。"</item>
</string-array>
<string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="6177300162212449033">"向您的電信業者註冊"</item>
+ <item msgid="6177300162212449033">"向你的電信業者註冊"</item>
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
@@ -184,7 +191,7 @@
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"你的 Work 設定檔已不在這個裝置上"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"裝置受到管理"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"貴機構會管理這個裝置,且可能監控網路流量。輕觸即可瞭解詳情。"</string>
- <string name="factory_reset_warning" msgid="5423253125642394387">"您的裝置資料將遭到清除"</string>
+ <string name="factory_reset_warning" msgid="5423253125642394387">"你的裝置資料將遭到清除"</string>
<string name="factory_reset_message" msgid="7972496262232832457">"無法使用管理員應用程式,系統現在將清除你裝置中的資料。\n\n如有任何問題,請與貴機構的管理員聯絡。"</string>
<string name="me" msgid="6545696007631404292">"我"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"平板電腦選項"</string>
@@ -205,13 +212,13 @@
<string name="reboot_to_reset_title" msgid="4142355915340627490">"恢復原廠設定"</string>
<string name="reboot_to_reset_message" msgid="2432077491101416345">"正在重新啟動…"</string>
<string name="shutdown_progress" msgid="2281079257329981203">"關機中…"</string>
- <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"您的平板電腦將會關機。"</string>
- <string name="shutdown_confirm" product="tv" msgid="476672373995075359">"您的電視即將關閉。"</string>
- <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"您的手錶即將關機。"</string>
+ <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"你的平板電腦將會關機。"</string>
+ <string name="shutdown_confirm" product="tv" msgid="476672373995075359">"你的電視即將關閉。"</string>
+ <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"你的手錶即將關機。"</string>
<string name="shutdown_confirm" product="default" msgid="649792175242821353">"手機即將關機。"</string>
- <string name="shutdown_confirm_question" msgid="2906544768881136183">"您要關機嗎?"</string>
+ <string name="shutdown_confirm_question" msgid="2906544768881136183">"你要關機嗎?"</string>
<string name="reboot_safemode_title" msgid="7054509914500140361">"重新啟動進入安全模式"</string>
- <string name="reboot_safemode_confirm" msgid="55293944502784668">"您要重新啟動進入安全模式嗎?這會將您安裝的所有第三方應用程式全部停用。如要還原這些應用程式,只要再次重新啟動即可。"</string>
+ <string name="reboot_safemode_confirm" msgid="55293944502784668">"你要重新啟動進入安全模式嗎?這會將你安裝的所有第三方應用程式全部停用。如要還原這些應用程式,只要再次重新啟動即可。"</string>
<string name="recent_tasks_title" msgid="3691764623638127888">"最新的"</string>
<string name="no_recent_tasks" msgid="8794906658732193473">"沒有最近用過的應用程式。"</string>
<string name="global_actions" product="tablet" msgid="408477140088053665">"平板電腦選項"</string>
@@ -222,11 +229,11 @@
<string name="global_action_emergency" msgid="7112311161137421166">"緊急電話"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"錯誤報告"</string>
<string name="bugreport_title" msgid="2667494803742548533">"取得錯誤報告"</string>
- <string name="bugreport_message" msgid="398447048750350456">"這會收集您目前裝置狀態的相關資訊,以便透過電子郵件傳送。從錯誤報告開始建立到準備傳送的這段過程可能需要一點時間,敬請耐心等候。"</string>
+ <string name="bugreport_message" msgid="398447048750350456">"這會收集你目前裝置狀態的相關資訊,以便透過電子郵件傳送。從錯誤報告開始建立到準備傳送的這段過程可能需要一點時間,敬請耐心等候。"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"互動式報告"</string>
- <string name="bugreport_option_interactive_summary" msgid="229299488536107968">"在一般情況下,建議您使用這個選項,以便追蹤報告產生進度、輸入更多與問題相關的資訊,以及擷取螢幕畫面。系統可能會省略部分較少使用的區段,藉此縮短報告產生時間。"</string>
+ <string name="bugreport_option_interactive_summary" msgid="229299488536107968">"在一般情況下,建議你使用這個選項,以便追蹤報告產生進度、輸入更多與問題相關的資訊,以及擷取螢幕畫面。系統可能會省略部分較少使用的區段,藉此縮短報告產生時間。"</string>
<string name="bugreport_option_full_title" msgid="6354382025840076439">"完整報告"</string>
- <string name="bugreport_option_full_summary" msgid="7210859858969115745">"如果您的裝置沒有回應或運行速度過慢,或是當您需要所有區段的報告時,建議您使用這個選項來減少系統干擾。這個選項不支援您輸入更多資訊,也不會擷取其他螢幕畫面。"</string>
+ <string name="bugreport_option_full_summary" msgid="7210859858969115745">"如果你的裝置沒有回應或運行速度過慢,或是當你需要所有區段的報告時,建議你使用這個選項來減少系統干擾。這個選項不支援你輸入更多資訊,也不會擷取其他螢幕畫面。"</string>
<plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
<item quantity="other">系統將在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後擷取錯誤報告的螢幕畫面。</item>
<item quantity="one">系統將在 <xliff:g id="NUMBER_0">%d</xliff:g> 秒後擷取錯誤報告的螢幕畫面。</item>
@@ -263,11 +270,11 @@
<string name="user_owner_label" msgid="1119010402169916617">"切換至個人設定檔"</string>
<string name="managed_profile_label" msgid="5289992269827577857">"切換至公司設定檔"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"聯絡人"</string>
- <string name="permgroupdesc_contacts" msgid="6951499528303668046">"存取您的聯絡人"</string>
+ <string name="permgroupdesc_contacts" msgid="6951499528303668046">"存取你的聯絡人"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"位置"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"存取這台裝置的位置資訊"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"日曆"</string>
- <string name="permgroupdesc_calendar" msgid="3889615280211184106">"存取您的日曆"</string>
+ <string name="permgroupdesc_calendar" msgid="3889615280211184106">"存取你的日曆"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"簡訊"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"傳送及查看簡訊"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"儲存"</string>
@@ -279,14 +286,12 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"電話"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"撥打電話及管理通話"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"身體感應器"</string>
- <string name="permgroupdesc_sensors" msgid="7147968539346634043">"存取與您生命徵象相關的感應器資料"</string>
+ <string name="permgroupdesc_sensors" msgid="7147968539346634043">"存取與你生命徵象相關的感應器資料"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"擷取視窗內容"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"檢查您存取的視窗內容。"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"檢查你存取的視窗內容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"啟用輕觸探索功能"</string>
- <string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"朗讀您輕觸的項目,而且可讓您用手勢探索螢幕。"</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"啟用強化網頁協助工具"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"可能會安裝程式碼,使應用程式內容更易於存取。"</string>
- <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"記錄您輸入的文字"</string>
+ <string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"朗讀你輕觸的項目,而且可讓你用手勢探索螢幕。"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"記錄你輸入的文字"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"包括個人資料,如信用卡號碼和密碼。"</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"控管顯示畫面放大功能"</string>
<string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"控管顯示畫面的縮放等級和位置。"</string>
@@ -309,27 +314,27 @@
<string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"接聽電話"</string>
<string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"允許應用程式接聽來電。"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"接收簡訊 (SMS)"</string>
- <string name="permdesc_receiveSms" msgid="6424387754228766939">"允許應用程式接收和處理簡訊。這項設定可讓應用程式監控傳送至您裝置的訊息,或在您閱讀訊息前擅自刪除訊息。"</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"允許應用程式接收和處理簡訊。這項設定可讓應用程式監控傳送至你裝置的訊息,或在你閱讀訊息前擅自刪除訊息。"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"接收簡訊 (MMS)"</string>
- <string name="permdesc_receiveMms" msgid="533019437263212260">"允許應用程式接收和處理多媒體訊息。這項設定可讓應用程式監控傳送至您裝置的訊息,或在您閱讀訊息前擅自刪除訊息。"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"允許應用程式接收和處理多媒體訊息。這項設定可讓應用程式監控傳送至你裝置的訊息,或在你閱讀訊息前擅自刪除訊息。"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"讀取區域廣播訊息"</string>
- <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"允許應用程式讀取您裝置收到的區域廣播訊息。某些地點會發出區域廣播警示,警告您有緊急狀況發生。請注意,惡意應用程式可能會在裝置收到緊急區域廣播時,干擾裝置的效能或運作。"</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"允許應用程式讀取你裝置收到的區域廣播訊息。某些地點會發出區域廣播警示,警告你有緊急狀況發生。請注意,惡意應用程式可能會在裝置收到緊急區域廣播時,干擾裝置的效能或運作。"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"讀取訂閱資訊提供"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"允許應用程式取得目前已同步處理的資訊提供詳細資料。"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"傳送及查看簡訊"</string>
- <string name="permdesc_sendSms" msgid="7094729298204937667">"允許應用程式傳送簡訊,但可能產生非預期的費用。惡意應用程式可能利用此功能擅自傳送簡訊,增加您不必要的額外支出。"</string>
- <string name="permlab_readSms" msgid="8745086572213270480">"讀取您的簡訊 (SMS 或 MMS)"</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"允許應用程式傳送簡訊,但可能產生非預期的費用。惡意應用程式可能利用此功能擅自傳送簡訊,增加你不必要的額外支出。"</string>
+ <string name="permlab_readSms" msgid="8745086572213270480">"讀取你的簡訊 (SMS 或 MMS)"</string>
<string name="permdesc_readSms" product="tablet" msgid="4741697454888074891">"這個應用程式可讀取所有儲存在平板電腦上的簡訊。"</string>
<string name="permdesc_readSms" product="tv" msgid="5796670395641116592">"這個應用程式可讀取所有儲存在電視上的簡訊。"</string>
<string name="permdesc_readSms" product="default" msgid="6826832415656437652">"這個應用程式可讀取所有儲存在手機上的簡訊。"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"接收簡訊 (WAP)"</string>
- <string name="permdesc_receiveWapPush" msgid="748232190220583385">"允許應用程式接收和處理 WAP 訊息。這項權限也能讓應用程式監控訊息,或在您閱讀訊息前擅自刪除訊息。"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"允許應用程式接收和處理 WAP 訊息。這項權限也能讓應用程式監控訊息,或在你閱讀訊息前擅自刪除訊息。"</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"擷取執行中的應用程式"</string>
<string name="permdesc_getTasks" msgid="7454215995847658102">"允許應用程式擷取最近執行工作的資訊。這項設定可讓應用程式找出裝置所用程式的相關資訊。"</string>
<string name="permlab_manageProfileAndDeviceOwners" msgid="7918181259098220004">"管理個人資料和裝置擁有者"</string>
<string name="permdesc_manageProfileAndDeviceOwners" msgid="106894851498657169">"允許應用程式設定個人資料擁有者和裝置擁有者。"</string>
<string name="permlab_reorderTasks" msgid="2018575526934422779">"重新排序正在執行的應用程式"</string>
- <string name="permdesc_reorderTasks" msgid="7734217754877439351">"允許應用程式將工作移至前景或背景。應用程式可以自行處理,不待您操作。"</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"允許應用程式將工作移至前景或背景。應用程式可以自行處理,不待你操作。"</string>
<string name="permlab_enableCarMode" msgid="5684504058192921098">"啟用行車模式"</string>
<string name="permdesc_enableCarMode" msgid="4853187425751419467">"允許應用程式啟用車用模式。"</string>
<string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"關閉其他應用程式"</string>
@@ -356,30 +361,30 @@
<string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"允許應用程式傳送記憶廣播,這類廣播在廣播動作結束後仍繼續存在。請注意,過度使用此功能可能導致平板電腦使用過多的記憶體,導致平板電腦的執行速度變慢或不穩定。"</string>
<string name="permdesc_broadcastSticky" product="tv" msgid="6839285697565389467">"允許應用程式傳送記憶廣播,這類廣播在廣播動作結束後仍繼續存在。如果過度使用,可能會使電視佔用過多記憶體,造成運作速度變慢或穩定性降低。"</string>
<string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"允許應用程式傳送記憶廣播,這類廣播在廣播動作結束後仍繼續存在。請注意,過度使用此功能可能導致手機使用過多的記憶體,導致手機的執行速度變慢或不穩定。"</string>
- <string name="permlab_readContacts" msgid="8348481131899886131">"讀取您的聯絡人"</string>
- <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"允許應用程式讀取平板電腦上儲存的聯絡人資料,包括您與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式儲存您的聯絡人資料,惡意應用程式也可能私自共用聯絡人資料。"</string>
- <string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"允許應用程式讀取電視上儲存的聯絡人資料,包括您與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式儲存您的聯絡人資料,惡意應用程式也可能會逕自洩露您的聯絡人資料。"</string>
- <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"允許應用程式讀取手機上儲存的聯絡人資料,包括您與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式儲存您的聯絡人資料,惡意應用程式也可能私自共用聯絡人資料。"</string>
- <string name="permlab_writeContacts" msgid="5107492086416793544">"修改您的聯絡人"</string>
- <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"允許應用程式讀取平板電腦上儲存的聯絡人資料,包括您與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式刪除聯絡人資料。"</string>
- <string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"允許應用程式修改電視上儲存的聯絡人資料,包括您與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式刪除聯絡人資料。"</string>
- <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"允許應用程式讀取手機上儲存的聯絡人資料,包括您與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式刪除聯絡人資料。"</string>
+ <string name="permlab_readContacts" msgid="8348481131899886131">"讀取你的聯絡人"</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"允許應用程式讀取平板電腦上儲存的聯絡人資料,包括你與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式儲存你的聯絡人資料,惡意應用程式也可能私自共用聯絡人資料。"</string>
+ <string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"允許應用程式讀取電視上儲存的聯絡人資料,包括你與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式儲存你的聯絡人資料,惡意應用程式也可能會逕自洩露你的聯絡人資料。"</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"允許應用程式讀取手機上儲存的聯絡人資料,包括你與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式儲存你的聯絡人資料,惡意應用程式也可能私自共用聯絡人資料。"</string>
+ <string name="permlab_writeContacts" msgid="5107492086416793544">"修改你的聯絡人"</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"允許應用程式讀取平板電腦上儲存的聯絡人資料,包括你與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式刪除聯絡人資料。"</string>
+ <string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"允許應用程式修改電視上儲存的聯絡人資料,包括你與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式刪除聯絡人資料。"</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"允許應用程式讀取手機上儲存的聯絡人資料,包括你與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式刪除聯絡人資料。"</string>
<string name="permlab_readCallLog" msgid="3478133184624102739">"讀取通話紀錄"</string>
<string name="permdesc_readCallLog" msgid="3204122446463552146">"這個應用程式可讀取通話紀錄。"</string>
<string name="permlab_writeCallLog" msgid="8552045664743499354">"寫入通話紀錄"</string>
- <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"允許應用程式修改平板電腦的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能濫用此功能刪除或修改您的通話紀錄。"</string>
- <string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"允許應用程式修改電視的通話紀錄,包括來電和已撥電話相關資料。惡意應用程式可能會藉此清除或修改您的通話紀錄。"</string>
- <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"允許應用程式修改手機的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能濫用此功能刪除或修改您的通話紀錄。"</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"允許應用程式修改平板電腦的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能濫用此功能刪除或修改你的通話紀錄。"</string>
+ <string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"允許應用程式修改電視的通話紀錄,包括來電和已撥電話相關資料。惡意應用程式可能會藉此清除或修改你的通話紀錄。"</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"允許應用程式修改手機的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能濫用此功能刪除或修改你的通話紀錄。"</string>
<string name="permlab_bodySensors" msgid="4683341291818520277">"存取身體感應器 (例如心跳速率監測器)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"允許應用程式存取感測器所收集的資料 (這類感測器可監測您的體能狀態,例如您的心跳速率)。"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"允許應用程式存取感測器所收集的資料 (這類感測器可監測你的體能狀態,例如你的心跳速率)。"</string>
<string name="permlab_readCalendar" msgid="6716116972752441641">"讀取日曆活動和詳細資訊"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="4993979255403945892">"這個應用程式可讀取所有儲存在平板電腦上的日曆活動資訊,以及共用或儲存日曆資料。"</string>
<string name="permdesc_readCalendar" product="tv" msgid="8837931557573064315">"這個應用程式可讀取所有儲存在電視上的日曆活動資訊,以及共用或儲存日曆資料。"</string>
<string name="permdesc_readCalendar" product="default" msgid="4373978642145196715">"這個應用程式可讀取所有儲存在手機上的日曆活動資訊,以及共用或儲存日曆資料。"</string>
<string name="permlab_writeCalendar" msgid="8438874755193825647">"在未經擁有者同意的情況下新增或修改日曆活動,以及傳送電子郵件給邀請對象"</string>
- <string name="permdesc_writeCalendar" product="tablet" msgid="1675270619903625982">"這個應用程式可在平板電腦上新增、移除或變更日曆活動。提醒您,這個應用程式可能會以日曆擁有者的名義傳送訊息,或是在不通知日曆擁有者的情況下變更活動內容。"</string>
- <string name="permdesc_writeCalendar" product="tv" msgid="9017809326268135866">"這個應用程式可在電視上新增、移除或變更日曆活動。提醒您,這個應用程式可能會以日曆擁有者的名義傳送訊息,或是在不通知日曆擁有者的情況下變更活動內容。"</string>
- <string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"這個應用程式可在手機上新增、移除或變更日曆活動。提醒您,這個應用程式可能會以日曆擁有者的名義傳送訊息,或是在不通知日曆擁有者的情況下變更活動內容。"</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="1675270619903625982">"這個應用程式可在平板電腦上新增、移除或變更日曆活動。提醒你,這個應用程式可能會以日曆擁有者的名義傳送訊息,或是在不通知日曆擁有者的情況下變更活動內容。"</string>
+ <string name="permdesc_writeCalendar" product="tv" msgid="9017809326268135866">"這個應用程式可在電視上新增、移除或變更日曆活動。提醒你,這個應用程式可能會以日曆擁有者的名義傳送訊息,或是在不通知日曆擁有者的情況下變更活動內容。"</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"這個應用程式可在手機上新增、移除或變更日曆活動。提醒你,這個應用程式可能會以日曆擁有者的名義傳送訊息,或是在不通知日曆擁有者的情況下變更活動內容。"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"接收額外的位置提供者指令"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"允許應用程式存取額外位置資訊提供者指令。這項設定可能會造成應用程式干擾 GPS 或其他位置資訊來源的運作。"</string>
<string name="permlab_accessFineLocation" msgid="251034415460950944">"存取精確位置 (以 GPS 和網路為依據)"</string>
@@ -399,7 +404,7 @@
<string name="permlab_vibrate" msgid="7696427026057705834">"控制震動"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"允許應用程式控制震動。"</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"直接撥打電話號碼"</string>
- <string name="permdesc_callPhone" msgid="3740797576113760827">"允許應用程式自行撥打電話,但可能產生非預期的費用或撥打非預期的電話。注意:這項權限不允許應用程式撥打緊急電話。惡意應用程式可能利用此功能擅自撥打電話,增加您不必要的額外支出。"</string>
+ <string name="permdesc_callPhone" msgid="3740797576113760827">"允許應用程式自行撥打電話,但可能產生非預期的費用或撥打非預期的電話。注意:這項權限不允許應用程式撥打緊急電話。惡意應用程式可能利用此功能擅自撥打電話,增加你不必要的額外支出。"</string>
<string name="permlab_accessImsCallService" msgid="3574943847181793918">"存取 IMS 撥號服務"</string>
<string name="permdesc_accessImsCallService" msgid="8992884015198298775">"允許應用程式自動使用 IMS 服務撥打電話。"</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"讀取手機狀態和識別碼"</string>
@@ -427,9 +432,9 @@
<string name="permdesc_setTimeZone" product="tv" msgid="888864653946175955">"允許應用程式變更電視的時區。"</string>
<string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"允許應用程式變更手機的時區。"</string>
<string name="permlab_getAccounts" msgid="1086795467760122114">"尋找裝置上的帳戶"</string>
- <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"允許應用程式取得平板電腦上所記憶的帳戶清單,其中可能包括您安裝的應用程式所建立的任何帳戶。"</string>
- <string name="permdesc_getAccounts" product="tv" msgid="4190633395633907543">"允許應用程式取得電視已知的帳戶清單,可能包括您已安裝的應用程式建立的任何帳戶。"</string>
- <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"允許應用程式取得手機上所記憶的帳戶清單,其中可能包括您安裝的應用程式所建立的任何帳戶。"</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"允許應用程式取得平板電腦上所記憶的帳戶清單,其中可能包括你安裝的應用程式所建立的任何帳戶。"</string>
+ <string name="permdesc_getAccounts" product="tv" msgid="4190633395633907543">"允許應用程式取得電視已知的帳戶清單,可能包括你已安裝的應用程式建立的任何帳戶。"</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"允許應用程式取得手機上所記憶的帳戶清單,其中可能包括你安裝的應用程式所建立的任何帳戶。"</string>
<string name="permlab_accessNetworkState" msgid="4951027964348974773">"查看網路連線"</string>
<string name="permdesc_accessNetworkState" msgid="8318964424675960975">"允許應用程式查看網路連線相關資訊,例如有哪些網路,以及已連上哪些網路。"</string>
<string name="permlab_createNetworkSockets" msgid="7934516631384168107">"擁有完整的網路存取權"</string>
@@ -443,9 +448,9 @@
<string name="permlab_changeWifiState" msgid="6550641188749128035">"建立及中斷 Wi-Fi 連線"</string>
<string name="permdesc_changeWifiState" msgid="7137950297386127533">"允許應用程式與 Wi-Fi 存取點連線或中斷連線,並可變更 Wi-Fi 網路的裝置設定。"</string>
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"允許接收 Wi-Fi 多點傳播封包"</string>
- <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"允許應用程式接收透過多點傳播位址傳送給 Wi-Fi 網路上所有裝置 (而不只是傳送給您的平板電腦) 的封包。這項設定會比非多點傳播模式耗用更多電力。"</string>
- <string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"允許應用程式接收透過多點傳播位址傳送給 Wi-Fi 網路上所有裝置 (而不只是傳送給您的電視) 的封包。這項設定會比非多點傳播模式耗用更多電力。"</string>
- <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"允許應用程式接收透過多點傳播位址傳送給 Wi-Fi 網路上所有裝置 (而不只是傳送給您的手機) 的封包。這項設定會比非多點傳播模式耗用更多電力。"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"允許應用程式接收透過多點傳播位址傳送給 Wi-Fi 網路上所有裝置 (而不只是傳送給你的平板電腦) 的封包。這項設定會比非多點傳播模式耗用更多電力。"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"允許應用程式接收透過多點傳播位址傳送給 Wi-Fi 網路上所有裝置 (而不只是傳送給你的電視) 的封包。這項設定會比非多點傳播模式耗用更多電力。"</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"允許應用程式接收透過多點傳播位址傳送給 Wi-Fi 網路上所有裝置 (而不只是傳送給你的手機) 的封包。這項設定會比非多點傳播模式耗用更多電力。"</string>
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"存取藍牙設定"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"允許應用程式設定本機藍牙平板電腦,以及搜尋遠端裝置並配對連線。"</string>
<string name="permdesc_bluetoothAdmin" product="tv" msgid="3373125682645601429">"允許應用程式設定本機藍牙電視,以及搜尋與配對遠端裝置。"</string>
@@ -719,7 +724,7 @@
<string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"插入 SIM 卡。"</string>
<string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"找不到或無法讀取 SIM 卡。請插入 SIM 卡。"</string>
<string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"SIM 卡無法使用。"</string>
- <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"您的 SIM 卡已遭永久停用。\n請與您的無線網路服務供應商聯絡,以取得其他 SIM 卡。"</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"你的 SIM 卡已遭永久停用。\n請與你的無線網路服務供應商聯絡,以取得其他 SIM 卡。"</string>
<string name="lockscreen_transport_prev_description" msgid="6300840251218161534">"上一首曲目"</string>
<string name="lockscreen_transport_next_description" msgid="573285210424377338">"下一首曲目"</string>
<string name="lockscreen_transport_pause_description" msgid="3980308465056173363">"暫停"</string>
@@ -733,18 +738,18 @@
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"參閱《使用者指南》或與客戶服務中心聯絡。"</string>
<string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM 卡已鎖定。"</string>
<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">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string>
- <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"您的密碼已輸錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string>
- <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"您的 PIN 已輸錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"您的解鎖圖案已畫錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,如果再嘗試 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次仍未成功,系統就會要求您使用您的 Google 登入資訊解除平板電腦的鎖定狀態。\n\n請在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="5316664559603394684">"您已畫錯解鎖圖案 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次嘗試機會。如果失敗次數超過限制,您就必須登入 Google 帳戶才能解鎖電視。\n\n請過 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"您的解鎖圖案已畫錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,如果再試 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次仍未成功,系統就會要求您使用您的 Google 登入資訊解除手機的鎖定狀態。\n\n請在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string>
- <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"您嘗試解除這個平板電腦的鎖定已失敗 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次機會。如果失敗次數超過限制,平板電腦將恢復原廠設定,所有使用者資料都會遺失。"</string>
- <string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="950408382418270260">"您嘗試解鎖電視已失敗 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次機會。如果失敗次數超過限制,電視將恢復原廠設定,所有使用者資料都會遺失。"</string>
- <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"您嘗試解除這支手機的鎖定已失敗 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次機會。如果失敗次數超過限制,手機將恢復原廠設定,所有使用者資料都會遺失。"</string>
- <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"您嘗試解除這個平板電腦的鎖定已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次,平板電腦現在將恢復原廠設定。"</string>
- <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="3195755534096192191">"您嘗試解鎖電視已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次,電視現在將恢復原廠設定。"</string>
- <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"您嘗試解除這支手機的鎖定已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次,手機現在將恢復原廠設定。"</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"你的解鎖圖案已畫錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string>
+ <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"你的密碼已輸錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string>
+ <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"你的 PIN 已輸錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"你的解鎖圖案已畫錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,如果再嘗試 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次仍未成功,系統就會要求你使用你的 Google 登入資訊解除平板電腦的鎖定狀態。\n\n請在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="5316664559603394684">"你已畫錯解鎖圖案 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次嘗試機會。如果失敗次數超過限制,你就必須登入 Google 帳戶才能解鎖電視。\n\n請過 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"你的解鎖圖案已畫錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,如果再試 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次仍未成功,系統就會要求你使用你的 Google 登入資訊解除手機的鎖定狀態。\n\n請在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"你嘗試解除這個平板電腦的鎖定已失敗 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次機會。如果失敗次數超過限制,平板電腦將恢復原廠設定,所有使用者資料都會遺失。"</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="950408382418270260">"你嘗試解鎖電視已失敗 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次機會。如果失敗次數超過限制,電視將恢復原廠設定,所有使用者資料都會遺失。"</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"你嘗試解除這支手機的鎖定已失敗 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次機會。如果失敗次數超過限制,手機將恢復原廠設定,所有使用者資料都會遺失。"</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"你嘗試解除這個平板電腦的鎖定已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次,平板電腦現在將恢復原廠設定。"</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="3195755534096192191">"你嘗試解鎖電視已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次,電視現在將恢復原廠設定。"</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"你嘗試解除這支手機的鎖定已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次,手機現在將恢復原廠設定。"</string>
<string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g> 秒後再試一次。"</string>
<string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"忘記解鎖圖案?"</string>
<string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"帳戶解鎖"</string>
@@ -802,7 +807,7 @@
<string name="js_dialog_before_unload_title" msgid="2619376555525116593">"確認瀏覽"</string>
<string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"離開這一頁"</string>
<string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"停留在這一頁"</string>
- <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\n您確定要前往其他網頁瀏覽嗎?"</string>
+ <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\n你確定要前往其他網頁瀏覽嗎?"</string>
<string name="save_password_label" msgid="6860261758665825069">"確認"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"提示:輕觸兩下即可縮放。"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"自動填入功能"</string>
@@ -823,7 +828,7 @@
<string name="autofill_parish" msgid="8202206105468820057">"教區"</string>
<string name="autofill_area" msgid="3547409050889952423">"區"</string>
<string name="autofill_emirate" msgid="2893880978835698818">"大公國"</string>
- <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"讀取您的網路書籤和紀錄"</string>
+ <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"讀取你的網路書籤和紀錄"</string>
<string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"允許應用程式讀取瀏覽器造訪過的所有網址紀錄,以及瀏覽器的所有書籤。注意:這項權限不適用於第三方瀏覽器或其他具備網頁瀏覽功能的應用程式。"</string>
<string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"寫入網路書籤和紀錄"</string>
<string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"允許應用程式修改平板電腦上儲存的瀏覽紀錄或書籤。這項設定會讓應用程式具有清除或修改瀏覽資料的權限。注意:這項權限不適用於第三方瀏覽器或其他具備網頁瀏覽功能的應用程式。"</string>
@@ -832,14 +837,14 @@
<string name="permlab_setAlarm" msgid="1379294556362091814">"設定鬧鐘"</string>
<string name="permdesc_setAlarm" msgid="316392039157473848">"允許應用程式在安裝的鬧鐘應用程式中設定鬧鐘,某些鬧鐘應用程式可能無法執行這項功能。"</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"新增語音留言"</string>
- <string name="permdesc_addVoicemail" msgid="6604508651428252437">"允許應用程式將訊息新增至您的語音信箱收件匣。"</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"允許應用程式將訊息新增至你的語音信箱收件匣。"</string>
<string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"修改瀏覽器地理資訊的權限"</string>
- <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"允許應用程式修改瀏覽器的地理位置權限。請注意,惡意應用程式可能利用此功能允許將您的位置資訊任意傳送給某些網站。"</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"允許應用程式修改瀏覽器的地理位置權限。請注意,惡意應用程式可能利用此功能允許將你的位置資訊任意傳送給某些網站。"</string>
<string name="save_password_message" msgid="767344687139195790">"是否記住此密碼?"</string>
<string name="save_password_notnow" msgid="6389675316706699758">"現在不要"</string>
<string name="save_password_remember" msgid="6491879678996749466">"記住"</string>
<string name="save_password_never" msgid="8274330296785855105">"永不"</string>
- <string name="open_permission_deny" msgid="7374036708316629800">"您沒有開啟這個頁面的權限。"</string>
+ <string name="open_permission_deny" msgid="7374036708316629800">"你沒有開啟這個頁面的權限。"</string>
<string name="text_copied" msgid="4985729524670131385">"文字已複製到剪貼簿。"</string>
<string name="more_item_label" msgid="4650918923083320495">"更多"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"[Menu] +"</string>
@@ -854,8 +859,8 @@
<string name="searchview_description_submit" msgid="2688450133297983542">"提交查詢"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"語音搜尋"</string>
<string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"啟用輕觸探索?"</string>
- <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> 需要啟用「輕觸探索」。開啟這項功能時,系統會在您的手指輕觸螢幕上的物件時顯示或朗讀說明,您也可以執行手勢來與平板電腦互動。"</string>
- <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> 需要啟用「輕觸探索」。開啟這項功能時,系統會在您的手指輕觸螢幕上的物件時顯示或朗讀說明,您也可以執行手勢來與手機互動。"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> 需要啟用「輕觸探索」。開啟這項功能時,系統會在你的手指輕觸螢幕上的物件時顯示或朗讀說明,你也可以執行手勢來與平板電腦互動。"</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> 需要啟用「輕觸探索」。開啟這項功能時,系統會在你的手指輕觸螢幕上的物件時顯示或朗讀說明,你也可以執行手勢來與手機互動。"</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"1 個月以前"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"1 個月前"</string>
<plurals name="last_num_days" formatted="false" msgid="5104533550723932025">
@@ -978,7 +983,7 @@
<string name="browse" msgid="6079864138582486027">"瀏覽"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"儲存空間即將用盡"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"部分系統功能可能無法運作"</string>
- <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"系統儲存空間不足。請確定您已釋出 250MB 的可用空間,然後重新啟動。"</string>
+ <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"系統儲存空間不足。請確定你已釋出 250MB 的可用空間,然後重新啟動。"</string>
<string name="app_running_notification_title" msgid="8718335121060787914">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」目前正在執行"</string>
<string name="app_running_notification_text" msgid="1197581823314971177">"輕觸即可瞭解詳情或停止應用程式。"</string>
<string name="ok" msgid="5970060430562524910">"確定"</string>
@@ -1034,7 +1039,7 @@
<string name="force_close" msgid="8346072094521265605">"確定"</string>
<string name="report" msgid="4060218260984795706">"回報"</string>
<string name="wait" msgid="7147118217226317732">"等待"</string>
- <string name="webpage_unresponsive" msgid="3272758351138122503">"網頁沒有回應。\n\n您要結束嗎?"</string>
+ <string name="webpage_unresponsive" msgid="3272758351138122503">"網頁沒有回應。\n\n你要結束嗎?"</string>
<string name="launch_warning_title" msgid="1547997780506713581">"應用程式已重新導向"</string>
<string name="launch_warning_replace" msgid="6202498949970281412">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」現在正在執行。"</string>
<string name="launch_warning_original" msgid="188102023021668683">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」原先已啟動。"</string>
@@ -1058,7 +1063,7 @@
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> 執行中"</string>
<string name="heavy_weight_notification_detail" msgid="867643381388543170">"輕觸即可切換至應用程式"</string>
<string name="heavy_weight_switcher_title" msgid="7153167085403298169">"切換應用程式?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"其他應用程式已在執行中,您必須停止執行該應用程式,才能啟動新的應用程式。"</string>
+ <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"其他應用程式已在執行中,你必須停止執行該應用程式,才能啟動新的應用程式。"</string>
<string name="old_app_action" msgid="493129172238566282">"返回 <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
<string name="old_app_description" msgid="2082094275580358049">"請勿啟動新的應用程式。"</string>
<string name="new_app_action" msgid="5472756926945440706">"啟動 <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
@@ -1066,7 +1071,7 @@
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> 已超出記憶體上限"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"已取得記憶體快照資料;輕觸即可分享"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"分享記憶體快照資料?"</string>
- <string name="dump_heap_text" msgid="4809417337240334941">"程序「<xliff:g id="PROC">%1$s</xliff:g>」已超出 <xliff:g id="SIZE">%2$s</xliff:g> 的程序記憶體上限。系統已產生記憶體快照資料,可供您與開發人員分享。請注意:記憶體快照資料中可能包含應用程式可存取的個人資訊。"</string>
+ <string name="dump_heap_text" msgid="4809417337240334941">"程序「<xliff:g id="PROC">%1$s</xliff:g>」已超出 <xliff:g id="SIZE">%2$s</xliff:g> 的程序記憶體上限。系統已產生記憶體快照資料,可供你與開發人員分享。請注意:記憶體快照資料中可能包含應用程式可存取的個人資訊。"</string>
<string name="sendText" msgid="5209874571959469142">"選取傳送文字內容的方式"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"鈴聲音量"</string>
<string name="volume_music" msgid="5421651157138628171">"媒體音量"</string>
@@ -1129,25 +1134,25 @@
<string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"手機與 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 連線期間將暫時中斷 Wi-Fi 連線"</string>
<string name="select_character" msgid="3365550120617701745">"插入字元"</string>
<string name="sms_control_title" msgid="7296612781128917719">"傳送 SMS 簡訊"</string>
- <string name="sms_control_message" msgid="3867899169651496433">"<b></b>「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在傳送大量簡訊。您要允許這個應用程式繼續傳送簡訊嗎?"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"<b></b>「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在傳送大量簡訊。你要允許這個應用程式繼續傳送簡訊嗎?"</string>
<string name="sms_control_yes" msgid="3663725993855816807">"允許"</string>
<string name="sms_control_no" msgid="625438561395534982">"拒絕"</string>
<string name="sms_short_code_confirm_message" msgid="1645436466285310855">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> 要求將訊息傳送至 <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b>。"</string>
- <string name="sms_short_code_details" msgid="5873295990846059400">"這"<b>"可能會透過您的行動帳戶計費"</b>"。"</string>
- <string name="sms_premium_short_code_details" msgid="7869234868023975"><b>"這會透過您的行動帳戶計費。"</b></string>
+ <string name="sms_short_code_details" msgid="5873295990846059400">"這"<b>"可能會透過你的行動帳戶計費"</b>"。"</string>
+ <string name="sms_premium_short_code_details" msgid="7869234868023975"><b>"這會透過你的行動帳戶計費。"</b></string>
<string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"傳送"</string>
<string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"取消"</string>
<string name="sms_short_code_remember_choice" msgid="5289538592272218136">"記住我的選擇"</string>
- <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"您日後可在 [設定] > [應用程式] 中進行變更。"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"你日後可在 [設定] > [應用程式] 中進行變更。"</string>
<string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"一律允許"</string>
<string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"一律不允許"</string>
<string name="sim_removed_title" msgid="6227712319223226185">"SIM 卡已移除"</string>
- <string name="sim_removed_message" msgid="2333164559970958645">"您必須先插入有效的 SIM 卡再重新啟動手機,才能使用行動網路。"</string>
+ <string name="sim_removed_message" msgid="2333164559970958645">"你必須先插入有效的 SIM 卡再重新啟動手機,才能使用行動網路。"</string>
<string name="sim_done_button" msgid="827949989369963775">"完成"</string>
<string name="sim_added_title" msgid="3719670512889674693">"SIM 卡已新增"</string>
<string name="sim_added_message" msgid="6599945301141050216">"請重新啟動裝置,才能使用行動網路。"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"重新啟動"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"要讓新的 SIM 卡正常運作,您必須先安裝電信業者提供的應用程式,並開啟該應用程式。"</string>
+ <string name="carrier_app_dialog_message" msgid="7066156088266319533">"要讓新的 SIM 卡正常運作,你必須先安裝電信業者提供的應用程式,並開啟該應用程式。"</string>
<string name="carrier_app_dialog_button" msgid="7900235513678617329">"取得應用程式"</string>
<string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"暫時不要"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"已插入新的 SIM 卡"</string>
@@ -1178,7 +1183,7 @@
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"分享"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"拒絕"</string>
<string name="select_input_method" msgid="8547250819326693584">"變更鍵盤"</string>
- <string name="show_ime" msgid="2506087537466597099">"有連接的實體鍵盤時保持顯示"</string>
+ <string name="show_ime" msgid="2506087537466597099">"連接實體鍵盤時保持顯示"</string>
<string name="hardware" msgid="194658061510127999">"顯示虛擬鍵盤"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"設定實體鍵盤"</string>
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"輕觸即可選取語言和版面配置"</string>
@@ -1248,15 +1253,15 @@
<string name="ime_action_default" msgid="2840921885558045721">"執行"</string>
<string name="dial_number_using" msgid="5789176425167573586">"使用 <xliff:g id="NUMBER">%s</xliff:g>\n撥號"</string>
<string name="create_contact_using" msgid="4947405226788104538">"建立手機號碼為 <xliff:g id="NUMBER">%s</xliff:g>\n的聯絡人"</string>
- <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"下列一或多個應用程式要求取得今後都可存取您帳戶的權限。"</string>
- <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"您確定要允許這個要求嗎?"</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"下列一或多個應用程式要求取得今後都可存取你帳戶的權限。"</string>
+ <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"你確定要允許這個要求嗎?"</string>
<string name="grant_permissions_header_text" msgid="6874497408201826708">"存取權限要求"</string>
<string name="allow" msgid="7225948811296386551">"允許"</string>
<string name="deny" msgid="2081879885755434506">"拒絕"</string>
<string name="permission_request_notification_title" msgid="6486759795926237907">"已要求權限"</string>
<string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"帳戶 <xliff:g id="ACCOUNT">%s</xliff:g> 已提出\n權限要求。"</string>
- <string name="forward_intent_to_owner" msgid="1207197447013960896">"您目前並非透過 Work 設定檔使用這個應用程式"</string>
- <string name="forward_intent_to_work" msgid="621480743856004612">"您目前透過工作設定檔使用這個應用程式"</string>
+ <string name="forward_intent_to_owner" msgid="1207197447013960896">"你目前並非透過 Work 設定檔使用這個應用程式"</string>
+ <string name="forward_intent_to_work" msgid="621480743856004612">"你目前透過工作設定檔使用這個應用程式"</string>
<string name="input_method_binding_label" msgid="1283557179944992649">"輸入法"</string>
<string name="sync_binding_label" msgid="3687969138375092423">"同步處理"</string>
<string name="accessibility_binding_label" msgid="4148120742096474641">"協助工具"</string>
@@ -1306,7 +1311,7 @@
<string name="gpsVerifYes" msgid="2346566072867213563">"是"</string>
<string name="gpsVerifNo" msgid="1146564937346454865">"否"</string>
<string name="sync_too_many_deletes" msgid="5296321850662746890">"已超過刪除上限"</string>
- <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"帳戶 <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> 的<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>會刪除 <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> 個項目。您要如何處理?"</string>
+ <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"帳戶 <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> 的<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>會刪除 <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> 個項目。你要如何處理?"</string>
<string name="sync_really_delete" msgid="2572600103122596243">"刪除這些項目"</string>
<string name="sync_undo_deletes" msgid="2941317360600338602">"復原刪除"</string>
<string name="sync_do_nothing" msgid="3743764740430821845">"暫不執行"</string>
@@ -1427,7 +1432,7 @@
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"輸入 SIM PIN"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"輸入 PIN"</string>
<string name="kg_password_instructions" msgid="5753646556186936819">"輸入密碼"</string>
- <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM 卡已遭停用,必須輸入 PUK 碼才能繼續使用。詳情請洽您的電信業者。"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM 卡已遭停用,必須輸入 PUK 碼才能繼續使用。詳情請洽你的電信業者。"</string>
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"輸入所需的 PIN 碼"</string>
<string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"確認所需的 PIN 碼"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"正在解除 SIM 卡鎖定..."</string>
@@ -1444,21 +1449,21 @@
<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">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string>
- <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"您的密碼已輸錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string>
- <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"您的解鎖圖案已畫錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string>
- <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"您嘗試解除這個平板電腦的鎖定已失敗 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次機會。如果失敗次數超過限制,平板電腦將恢復原廠設定,所有使用者資料都會遺失。"</string>
- <string name="kg_failed_attempts_almost_at_wipe" product="tv" msgid="5621231220154419413">"您嘗試解鎖電視已失敗 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次機會。如果失敗次數超過限制,電視將恢復原廠設定,所有使用者資料都會遺失。"</string>
- <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"您嘗試解除這支手機的鎖定已失敗 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次機會。如果失敗次數超過限制,手機將恢復原廠設定,所有使用者資料都會遺失。"</string>
- <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"您嘗試解除這個平板電腦的鎖定已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次,平板電腦現在將恢復原廠設定。"</string>
- <string name="kg_failed_attempts_now_wiping" product="tv" msgid="4987878286750741463">"您嘗試解鎖電視已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次,電視現在將恢復原廠設定。"</string>
- <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"您嘗試解除這支手機的鎖定已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次,手機現在將恢復原廠設定。"</string>
- <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"您的解鎖圖案已畫錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,如果再嘗試 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次仍未成功,系統就會要求您透過電子郵件帳戶解除平板電腦的鎖定狀態。\n\n請在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string>
- <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4224651132862313471">"您已畫錯解鎖圖案 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次嘗試機會。如果失敗次數超過限制,您就必須使用電子郵件帳戶才能解鎖電視。\n\n請過 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string>
- <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"您的解鎖圖案已畫錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,如果再嘗試 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次仍未成功,系統就會要求您透過電子郵件帳戶解除手機的鎖定狀態。\n\n請在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"你的 PIN 已輸錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"你的密碼已輸錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"你的解鎖圖案已畫錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"你嘗試解除這個平板電腦的鎖定已失敗 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次機會。如果失敗次數超過限制,平板電腦將恢復原廠設定,所有使用者資料都會遺失。"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tv" msgid="5621231220154419413">"你嘗試解鎖電視已失敗 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次機會。如果失敗次數超過限制,電視將恢復原廠設定,所有使用者資料都會遺失。"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"你嘗試解除這支手機的鎖定已失敗 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次機會。如果失敗次數超過限制,手機將恢復原廠設定,所有使用者資料都會遺失。"</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"你嘗試解除這個平板電腦的鎖定已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次,平板電腦現在將恢復原廠設定。"</string>
+ <string name="kg_failed_attempts_now_wiping" product="tv" msgid="4987878286750741463">"你嘗試解鎖電視已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次,電視現在將恢復原廠設定。"</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"你嘗試解除這支手機的鎖定已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次,手機現在將恢復原廠設定。"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"你的解鎖圖案已畫錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,如果再嘗試 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次仍未成功,系統就會要求你透過電子郵件帳戶解除平板電腦的鎖定狀態。\n\n請在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4224651132862313471">"你已畫錯解鎖圖案 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次嘗試機會。如果失敗次數超過限制,你就必須使用電子郵件帳戶才能解鎖電視。\n\n請過 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"你的解鎖圖案已畫錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,如果再嘗試 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次仍未成功,系統就會要求你透過電子郵件帳戶解除手機的鎖定狀態。\n\n請在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"移除"</string>
- <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"要調高音量,比建議的音量更大聲嗎?\n\n長時間聆聽高分貝音量可能會使您的聽力受損。"</string>
+ <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"要調高音量,比建議的音量更大聲嗎?\n\n長時間聆聽高分貝音量可能會使你的聽力受損。"</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="8404780875025725199">"要使用協助工具捷徑嗎?"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"啟用捷徑功能後,只要同時按下兩個音量鍵 3 秒,就能啟動協助工具功能。\n\n 目前設定的協助工具功能為:\n<xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n 如要變更設定的功能,請依序輕觸 [設定] > [協助工具]。"</string>
<string name="disable_accessibility_shortcut" msgid="627625354248453445">"停用捷徑"</string>
@@ -1603,8 +1608,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"已由你的管理員安裝"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"已由你的管理員更新"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"已由你的管理員刪除"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"節約耗電量模式會透過降低裝置效能、震動限制、定位服務限制和大多數背景資料運作限制等方式,延長電池續航力。此外,如果未開啟電子郵件、簡訊和其他需要使用同步功能的應用程式,系統將不會自動更新這些應用程式。\n\n當您為裝置充電時,節約耗電量模式會自動關閉。"</string>
- <string name="data_saver_description" msgid="6015391409098303235">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。您目前使用的某個應用程式可以存取資料,但存取頻率可能不如平時高。舉例來說,圖片可能不會自動顯示,而必須由您輕觸後才會顯示。"</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"為了延長電池續航力,節約耗電量模式會降低裝置效能,並限制震動、定位服務及大部分背景數據傳輸。此外,如果未開啟電子郵件、簡訊和其他需要使用同步功能的應用程式,系統將不會自動更新這些應用程式。\n\n當你為裝置充電時,節約耗電量模式會自動關閉。"</string>
+ <string name="data_saver_description" msgid="6015391409098303235">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。你目前使用的某個應用程式可以存取資料,但存取頻率可能不如平時高。舉例來說,圖片可能不會自動顯示,而必須由你輕觸後才會顯示。"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"要開啟數據節省模式嗎?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"開啟"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
@@ -1642,7 +1647,7 @@
<string name="zen_mode_until" msgid="7336308492289875088">"結束時間:<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"到<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> 為止 (下一個鬧鐘)"</string>
<string name="zen_mode_forever" msgid="1916263162129197274">"直到你關閉「零打擾」模式"</string>
- <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"直到您關閉「零打擾」模式"</string>
+ <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"直到你關閉「零打擾」模式"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"收合"</string>
<string name="zen_mode_feature_name" msgid="5254089399895895004">"零打擾"</string>
@@ -1651,8 +1656,8 @@
<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>
+ <string name="system_error_wipe_data" msgid="6608165524785354962">"你的裝置發生內部問題,必須將裝置恢復原廠設定才能解除不穩定狀態。"</string>
+ <string name="system_error_manufacturer" msgid="8086872414744210668">"你的裝置發生內部問題,詳情請洽裝置製造商。"</string>
<string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD 要求已改為 DIAL 要求。"</string>
<string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD 要求已改為 SS 要求。"</string>
<string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD 要求已改為新的 USSD 要求。"</string>
@@ -1676,7 +1681,7 @@
<item quantity="one">已選取 <xliff:g id="COUNT_0">%1$d</xliff:g> 個項目</item>
</plurals>
<string name="default_notification_channel_label" msgid="6950908610709016902">"其他"</string>
- <string name="importance_from_user" msgid="7318955817386549931">"這些通知的重要性由您決定。"</string>
+ <string name="importance_from_user" msgid="7318955817386549931">"這些通知的重要性由你決定。"</string>
<string name="importance_from_person" msgid="9160133597262938296">"這則通知涉及特定人士,因此被歸為重要通知。"</string>
<string name="user_creation_account_exists" msgid="1942606193570143289">"要允許 <xliff:g id="APP">%1$s</xliff:g> 為 <xliff:g id="ACCOUNT">%2$s</xliff:g> 建立新使用者嗎?"</string>
<string name="user_creation_adding" msgid="4482658054622099197">"要允許 <xliff:g id="APP">%1$s</xliff:g> 為 <xliff:g id="ACCOUNT">%2$s</xliff:g> 建立新使用者嗎 (這個帳戶目前已有使用者)?"</string>
@@ -1690,7 +1695,7 @@
<string name="work_mode_off_title" msgid="2615362773958585967">"要啟用工作模式嗎?"</string>
<string name="work_mode_off_message" msgid="2961559609199223594">"這樣做會啟用你的 Work 設定檔,包括應用程式、背景同步處理和相關功能"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"開啟"</string>
- <string name="new_sms_notification_title" msgid="8442817549127555977">"您有新訊息"</string>
+ <string name="new_sms_notification_title" msgid="8442817549127555977">"你有新訊息"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"開啟簡訊應用程式來查看內容"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"部分功能可能受到鎖定"</string>
<string name="user_encrypted_message" msgid="4923292604515744267">"輕觸即可解鎖"</string>
@@ -1708,7 +1713,7 @@
<string name="demo_starting_message" msgid="5268556852031489931">"正在啟動示範模式..."</string>
<string name="demo_restarting_message" msgid="952118052531642451">"正在重設裝置..."</string>
<string name="demo_user_inactivity_timeout_title" msgid="6596109959002331334">"要重設裝置嗎?"</string>
- <string name="demo_user_inactivity_timeout_countdown" msgid="5675588824402569506">"系統不會儲存您所做的變更,示範模式將於 <xliff:g id="TIMEOUT">%1$s</xliff:g> 秒後重新開始…"</string>
+ <string name="demo_user_inactivity_timeout_countdown" msgid="5675588824402569506">"系統不會儲存你所做的變更,示範模式將於 <xliff:g id="TIMEOUT">%1$s</xliff:g> 秒後重新開始…"</string>
<string name="demo_user_inactivity_timeout_left_button" msgid="5314271347014802475">"取消"</string>
<string name="demo_user_inactivity_timeout_right_button" msgid="5019306703066964808">"立即重設"</string>
<string name="suspended_widget_accessibility" msgid="6712143096475264190">"已停用的<xliff:g id="LABEL">%1$s</xliff:g>"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"切換至文字輸入模式來輸入時間。"</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"切換至時鐘模式來輸入時間。"</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"自動填入選項"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"儲存以便用於自動填入"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"無法自動填入內容"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"要儲存到「<xliff:g id="LABEL">%1$s</xliff:g>」嗎?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"要將<xliff:g id="TYPE">%1$s</xliff:g>儲存到「<xliff:g id="LABEL">%2$s</xliff:g>」嗎?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"要將<xliff:g id="TYPE_0">%1$s</xliff:g>、<xliff:g id="TYPE_1">%2$s</xliff:g>儲存到「<xliff:g id="LABEL">%3$s</xliff:g>」嗎?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"要將<xliff:g id="TYPE_0">%1$s</xliff:g>、<xliff:g id="TYPE_1">%2$s</xliff:g>、<xliff:g id="TYPE_2">%3$s</xliff:g>儲存到「<xliff:g id="LABEL">%4$s</xliff:g>」嗎?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"要儲存到「<xliff:g id="LABEL">%1$s</xliff:g>」嗎?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"要將<xliff:g id="TYPE">%1$s</xliff:g>儲存到「<xliff:g id="LABEL">%2$s</xliff:g>」嗎?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"要將<xliff:g id="TYPE_0">%1$s</xliff:g>和<xliff:g id="TYPE_1">%2$s</xliff:g>儲存到「<xliff:g id="LABEL">%3$s</xliff:g>」嗎?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"要將<xliff:g id="TYPE_0">%1$s</xliff:g>、<xliff:g id="TYPE_1">%2$s</xliff:g>和<xliff:g id="TYPE_2">%3$s</xliff:g>儲存到「<xliff:g id="LABEL">%4$s</xliff:g>」嗎?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"儲存"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"不用了,謝謝"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"密碼"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 5289834..bcad869e 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -99,6 +99,13 @@
<string name="RestrictedOnAllVoiceContent" msgid="5243580774142557047">"Inkampani yakho yenethiwekhi imise okwesikhashana amakholi ezwi nawezimo eziphuthumayo kule ndawo"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ayikwazi ukufinyelela inethiwekhi"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Ukuze kuthuthukiswe ukwamukelwa, zama ukushintsha uhlobo olukhethiwe kusistimu > Inethiwekhi ne-inthanethi > amanethiwekhi eselula > uhlobo oluncanyelwayo lwenethiwekhi."</string>
+ <string name="notification_channel_network_alert" msgid="4427736684338074967">"Izexwayiso"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Ukudlulisa ikholi"</string>
+ <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Imodi yokushayela yesimo esiphuthumayo"</string>
+ <string name="notification_channel_mobile_data_alert" msgid="6130875231721406231">"Izexwayiso zedatha yeselula"</string>
+ <string name="notification_channel_sms" msgid="3441746047346135073">"Imilayezo ye-SMS"</string>
+ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Imilayezo yevoyisimeyili"</string>
+ <string name="notification_channel_wfc" msgid="2130802501654254801">"Ukushaya kwe-Wi-Fi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Umngani ucele imodi ye-TTY ephelele"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Umngani ucele imodi ye-TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Umngani ucele imodi ye-TTY VCO"</string>
@@ -284,8 +291,6 @@
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Hlola okuqukethwe kwewindi ohlanganyela nalo."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Vula ukuhlola ngokuthinta"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Izinto ezithephiwe zizokhulunywa ngokuzwakalayo futhi isikrini singahlolwa kusetshenziswa ukuthintwa."</string>
- <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Vula ukufinyeleleka kwewebhu okuthuthukisiwe"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Amaskripthi angase afakwe ukwenza okuqukethwe kohlelo lokusebenza kufinyeleleke kakhulu."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Qapha umbhalo owuthayiphayo"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Kufaka phakathi idatha yomuntu siqu efana nezinombolo zekhadi lesikweletu namaphasiwedi."</string>
<string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Lawula ukulungiswa kwesibonisi"</string>
@@ -1732,11 +1737,12 @@
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Shintshela kumodi yokufaka umbhalo ngokufaka isikhathi."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Shintshela kumodi yewashi ngokufakwa kwesikhathi."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Izinketho zokugcwalisa ngokuzenzakalela"</string>
+ <string name="autofill_save_accessibility_title" msgid="7244365268417107822">"Londolozela ukugcwalisa okuzenzakalelayo"</string>
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Okuqukethwe akukwazi ukugcwalisa ngokuzenzakalela"</string>
- <string name="autofill_save_title" msgid="7081244500504163245">"Londoloza ku-<xliff:g id="LABEL">%1$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_type" msgid="4977385733042555659">"Londoloza i-<xliff:g id="TYPE">%1$s</xliff:g> ku-<xliff:g id="LABEL">%2$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_2types" msgid="8875796560521962098">"Londoloza i-<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> ku-<xliff:g id="LABEL">%3$s</xliff:g>?"</string>
- <string name="autofill_save_title_with_3types" msgid="6889899028382843493">"Londoloza i-<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, <xliff:g id="TYPE_2">%3$s</xliff:g> ku-<xliff:g id="LABEL">%4$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="3345527308992082601">"Londoloza ku-<b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Londoloza i-<xliff:g id="TYPE">%1$s</xliff:g> ku-<b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_2types" msgid="5214035651838265325">"Londoloza i-<xliff:g id="TYPE_0">%1$s</xliff:g> ne-<xliff:g id="TYPE_1">%2$s</xliff:g> ku-<b><xliff:g id="LABEL">%3$s</xliff:g></b>?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6943161834231458441">"Londoloza i-<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>, ne-<xliff:g id="TYPE_2">%3$s</xliff:g> ku-<b><xliff:g id="LABEL">%4$s</xliff:g></b>?"</string>
<string name="autofill_save_yes" msgid="6398026094049005921">"Londoloza"</string>
<string name="autofill_save_no" msgid="2625132258725581787">"Cha ngiyabonga"</string>
<string name="autofill_save_type_password" msgid="5288448918465971568">"iphasiwedi"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 6e790a7..c421514 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -60,6 +60,9 @@
mode. -->
<attr name="colorMultiSelectHighlight" format="color" />
+ <!-- Drawable to be drawn over the view to mark it as autofilled-->
+ <attr name="autofilledHighlight" format="reference" />
+
<!-- Default disabled alpha for widgets that set enabled/disabled alpha programmatically. -->
<attr name="disabledAlpha" format="float" />
<!-- The alpha applied to the foreground color to create the primary text color. -->
@@ -2332,10 +2335,18 @@
<attr name="importantForAutofill">
<!-- Let the Android System use its heuristics to determine if the view is important for autofill. -->
<flag name="auto" value="0" />
- <!-- Hint the Android System that this view is important for autofill. -->
+ <!-- Hint the Android System that this view is important for autofill,
+ and its children (if any) will be traversed.. -->
<flag name="yes" value="0x1" />
- <!-- Hint the Android System that this view is *not* important for autofill. -->
+ <!-- Hint the Android System that this view is *not* important for autofill,
+ but its children (if any) will be traversed.. -->
<flag name="no" value="0x2" />
+ <!-- Hint the Android System that this view is important for autofill,
+ but its children (if any) will not be traversed. -->
+ <flag name="yesExcludeDescendants" value="0x4" />
+ <!-- Hint the Android System that this view is *not* important for autofill,
+ and its children (if any) will not be traversed. -->
+ <flag name="noExcludeDescendants" value="0x8" />
</attr>
<!-- Boolean that controls whether a view can take focus while in touch mode.
@@ -3426,7 +3437,9 @@
<flag name="flagIncludeNotImportantViews" value="0x00000002" />
<!-- Has flag {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_REQUEST_TOUCH_EXPLORATION_MODE}. -->
<flag name="flagRequestTouchExplorationMode" value="0x00000004" />
- <!-- Has flag {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY}. -->
+ <!-- Has flag {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY}.
+ Not used by the framework.
+ -->
<flag name="flagRequestEnhancedWebAccessibility" value="0x00000008" />
<!-- Has flag {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_REPORT_VIEW_IDS}. -->
<flag name="flagReportViewIds" value="0x00000010" />
@@ -3438,8 +3451,8 @@
<flag name="flagEnableAccessibilityVolume" value="0x00000080" />
<!-- Has flag {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_REQUEST_ACCESSIBILITY_BUTTON}. -->
<flag name="flagRequestAccessibilityButton" value="0x00000100" />
- <!-- Has flag {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_CAPTURE_FINGERPRINT_GESTURES}. -->
- <flag name="flagCaptureFingerprintGestures" value="0x00000200" />
+ <!-- Has flag {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_REQUEST_FINGERPRINT_GESTURES}. -->
+ <flag name="flagRequestFingerprintGestures" value="0x00000200" />
</attr>
<!-- Component name of an activity that allows the user to modify
the settings for this service. This setting cannot be changed at runtime. -->
@@ -3457,12 +3470,8 @@
-->
<attr name="canRequestTouchExplorationMode" format="boolean" />
<!-- Attribute whether the accessibility service wants to be able to request enhanced
- web accessibility enhancements. For example, installing scripts to make app
- content more accessible.
- <p>
- Required to allow setting the {@link android.accessibilityservice
- #AccessibilityServiceInfo#FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY} flag.
- </p>
+ web accessibility enhancements.
+ {@deprecated Not used by the framework}
-->
<attr name="canRequestEnhancedWebAccessibility" format="boolean" />
<!-- Attribute whether the accessibility service wants to be able to request to
@@ -3483,10 +3492,10 @@
the fingerprint sensor.
<p>
Required to allow setting the {@link android.accessibilityservice
- #AccessibilityServiceInfo#FLAG_CAN_CAPTURE_FINGERPRINT_GESTURES} flag.
+ #AccessibilityServiceInfo#FLAG_REQUEST_FINGERPRINT_GESTURES} flag to have any effect.
</p>
-->
- <attr name="canCaptureFingerprintGestures" format="boolean" />
+ <attr name="canRequestFingerprintGestures" format="boolean" />
<!-- Short description of the accessibility service purpose or behavior.-->
<attr name="description" />
<!-- Brief summary of the accessibility service purpose or behavior. -->
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 95ba942..b7bc7b7 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -324,7 +324,7 @@
<!-- If set, the "persistent" attribute will only be honored if the feature
specified here is present on the device. -->
- <attr name="persistentFeature" format="string" />
+ <attr name="persistentWhenFeatureAvailable" format="string" />
<!-- Flag to specify if this application needs to be present for all users. Only pre-installed
applications can request this feature. Default value is false. -->
@@ -897,7 +897,7 @@
will run against. If not specified, only runs in the main process of the targetPackage.
Can either be a comma-separated list of process names or '*' for any process that
launches to run targetPackage code. -->
- <attr name="targetProcess" format="string" />
+ <attr name="targetProcesses" format="string" />
<!-- Flag indicating that an Instrumentation class wants to take care
of starting/stopping profiling itself, rather than relying on
@@ -1362,7 +1362,7 @@
for normal behavior. -->
<attr name="hasCode" format="boolean" />
<attr name="persistent" />
- <attr name="persistentFeature" />
+ <attr name="persistentWhenFeatureAvailable" />
<attr name="requiredForAllUsers" />
<!-- Specify whether the components in this application are enabled or not (that is, can be
instantiated by the system).
@@ -2355,7 +2355,7 @@
is a period then it is appended to your package name. -->
<attr name="name" />
<attr name="targetPackage" />
- <attr name="targetProcess" />
+ <attr name="targetProcesses" />
<attr name="label" />
<attr name="icon" />
<attr name="roundIcon" />
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index c5316c6..ef6c21f 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -208,8 +208,8 @@
<!-- The minimum height of the content if there are at least two lines or a picture-->
<dimen name="notification_min_content_height">41dp</dimen>
- <!-- The maximum size of the image in the expanded media notification -->
- <dimen name="media_notification_expanded_image_max_size">94dp</dimen>
+ <!-- The small size of the image if the height drawing doesn't work anymore -->
+ <dimen name="media_notification_expanded_image_small_size">72dp</dimen>
<!-- The maximum size of the image in the expanded media notification -->
<dimen name="media_notification_expanded_image_margin_bottom">20dp</dimen>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index e13026b..d8b7850 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2778,7 +2778,7 @@
<public name="paddingVertical" />
<public name="fontStyle" />
<public name="keyboardNavigationCluster" />
- <public name="targetProcess" />
+ <public name="targetProcesses" />
<public name="nextClusterForward" />
<public name="__removed1" />
<public name="colorError" />
@@ -2792,7 +2792,7 @@
<public name="colorMode" />
<public name="isolatedSplits" />
<public name="targetSandboxVersion" />
- <public name="canCaptureFingerprintGestures" />
+ <public name="canRequestFingerprintGestures" />
<public name="alphabeticModifiers" />
<public name="numericModifiers" />
<public name="fontProviderAuthority" />
@@ -2815,13 +2815,14 @@
<public name="maxAspectRatio"/>
<public name="iconSpaceReserved"/>
<public name="defaultFocusHighlightEnabled" />
- <public name="persistentFeature"/>
+ <public name="persistentWhenFeatureAvailable"/>
<public name="windowSplashscreenContent" />
<!-- @hide @SystemApi -->
<public name="requiredSystemPropertyName" />
<!-- @hide @SystemApi -->
<public name="requiredSystemPropertyValue" />
<public name="justificationMode" />
+ <public name="autofilledHighlight" />
</public-group>
<public-group type="style" first-id="0x010302e0">
@@ -2833,11 +2834,6 @@
<public name="autofill" />
</public-group>
- <public-group type="drawable" first-id="0x010800b4">
- <public name="autofilled_highlight" />
- <public name="ic_picture_in_picture" />
- </public-group>
-
<public-group type="string" first-id="0x01040019">
<public name="paste_as_plain_text" />
</public-group>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index a5181fe..e633d66 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -644,6 +644,29 @@
<!-- Text shown when viewing channel settings for notifications related to a usb connection -->
<string name="notification_channel_usb">USB connection</string>
+ <!-- Text shown when viewing channel settings for notifications related to running foreground
+ services [CHAR LIMIT=NONE] -->
+ <string name="notification_channel_foreground_service">Apps running in background</string>
+
+ <!-- Label for foreground service notification when one app is running. [CHAR LIMIT=NONE] -->
+ <string name="foreground_service_app_in_background"><xliff:g id="app_name">%1$s</xliff:g> is
+ running in the background</string>
+
+ <!-- Label for foreground service notification when multiple apps are running.
+ [CHAR LIMIT=NONE] -->
+ <string name="foreground_service_apps_in_background"><xliff:g id="number">%1$d</xliff:g> apps
+ are running in the background</string>
+
+ <!-- Content for foreground service notification when one app is running.
+ [CHAR LIMIT=NONE] -->
+ <string name="foreground_service_tap_for_details">Tap for details on battery and
+ data usage</string>
+
+ <!-- Separator for foreground service notification content listing all apps when there
+ are multiple apps running [CHAR LIMIT=NONE] -->
+ <string name="foreground_service_multiple_separator"><xliff:g id="left_side">%1$s</xliff:g>,
+ <xliff:g id="right_side">%2$s</xliff:g></string>
+
<!-- Displayed to the user to tell them that they have started up the phone in "safe mode" -->
<string name="safeMode">Safe mode</string>
@@ -713,13 +736,6 @@
<string name="capability_desc_canRequestTouchExploration">Tapped items will be spoken aloud
and the screen can be explored using gestures.</string>
- <!-- Title for the capability of an accessibility service to request enhanced web accessibility. -->
- <string name="capability_title_canRequestEnhancedWebAccessibility">Turn on enhanced web
- accessibility</string>
- <!-- Description for the capability of an accessibility service to request enhanced web accessibility. -->
- <string name="capability_desc_canRequestEnhancedWebAccessibility">Scripts may be installed to
- make app content more accessible.</string>
-
<!-- Title for the capability of an accessibility service to request to filter key events. -->
<string name="capability_title_canRequestFilterKeyEvents">Observe text you type</string>
<!-- Description for the capability of an accessibility service to request to filter key events. -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 63a5cfd7..5c17788 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -238,6 +238,7 @@
<java-symbol type="attr" name="windowFixedHeightMinor" />
<java-symbol type="attr" name="accessibilityFocusedDrawable"/>
<java-symbol type="attr" name="isLightTheme"/>
+ <java-symbol type="attr" name="autofilledHighlight"/>
<java-symbol type="bool" name="action_bar_embed_tabs" />
<java-symbol type="bool" name="action_bar_expanded_action_views_exclusive" />
@@ -598,11 +599,9 @@
<java-symbol type="string" name="badPin" />
<java-symbol type="string" name="badPuk" />
<java-symbol type="string" name="byteShort" />
- <java-symbol type="string" name="capability_desc_canRequestEnhancedWebAccessibility" />
<java-symbol type="string" name="capability_title_canRequestFilterKeyEvents" />
<java-symbol type="string" name="capability_desc_canRequestTouchExploration" />
<java-symbol type="string" name="capability_desc_canRetrieveWindowContent" />
- <java-symbol type="string" name="capability_title_canRequestEnhancedWebAccessibility" />
<java-symbol type="string" name="capability_desc_canRequestFilterKeyEvents" />
<java-symbol type="string" name="capability_title_canRequestTouchExploration" />
<java-symbol type="string" name="capability_title_canRetrieveWindowContent" />
@@ -2616,7 +2615,7 @@
<java-symbol type="string" name="new_sms_notification_title" />
<java-symbol type="string" name="new_sms_notification_content" />
- <java-symbol type="dimen" name="media_notification_expanded_image_max_size" />
+ <java-symbol type="dimen" name="media_notification_expanded_image_small_size" />
<java-symbol type="dimen" name="media_notification_expanded_image_margin_bottom" />
<java-symbol type="dimen" name="notification_content_image_margin_end" />
@@ -2970,6 +2969,12 @@
<java-symbol type="string" name="notification_channel_usb" />
<java-symbol type="string" name="config_defaultAutofillService" />
+ <java-symbol type="string" name="notification_channel_foreground_service" />
+ <java-symbol type="string" name="foreground_service_app_in_background" />
+ <java-symbol type="string" name="foreground_service_apps_in_background" />
+ <java-symbol type="string" name="foreground_service_tap_for_details" />
+ <java-symbol type="string" name="foreground_service_multiple_separator" />
+
<!-- ETWS primary messages -->
<java-symbol type="string" name="etws_primary_default_message_earthquake" />
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index a661b07..e8fbf34 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -435,6 +435,9 @@
<!-- Accessibility focused drawable -->
<item name="accessibilityFocusedDrawable">@drawable/view_accessibility_focused</item>
+ <!-- Autofilled highlight drawable -->
+ <item name="autofilledHighlight">@drawable/autofilled_highlight</item>
+
<!-- Lighting and shadow properties -->
<item name="lightY">@dimen/light_y</item>
<item name="lightZ">@dimen/light_z</item>
diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml
index d80ff1d..7517946 100644
--- a/core/res/res/values/themes_device_defaults.xml
+++ b/core/res/res/values/themes_device_defaults.xml
@@ -744,6 +744,7 @@
<item name="colorPrimaryDark">@color/primary_dark_device_default_settings_light</item>
<item name="colorSecondary">@color/secondary_device_default_settings_light</item>
<item name="colorAccent">@color/accent_device_default_light</item>
+ <item name="colorEdgeEffect">@android:color/black</item>
</style>
<!-- @hide DeviceDefault theme for a window that should use Settings theme colors
diff --git a/core/tests/coretests/src/android/graphics/ColorSpaceRendererTest.java b/core/tests/coretests/src/android/graphics/ColorSpaceRendererTest.java
new file mode 100644
index 0000000..6e38fb6
--- /dev/null
+++ b/core/tests/coretests/src/android/graphics/ColorSpaceRendererTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.graphics;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class ColorSpaceRendererTest {
+
+ @Test
+ public void testRendererSize() {
+ Bitmap b = ColorSpace.createRenderer()
+ .size(0)
+ .render();
+ assertEquals(128, b.getWidth());
+ assertEquals(128, b.getHeight());
+
+ b = ColorSpace.createRenderer()
+ .size(768)
+ .render();
+ assertEquals(768, b.getWidth());
+ assertEquals(768, b.getHeight());
+ }
+
+ @Test
+ public void testRenderer() {
+ Bitmap b = ColorSpace.createRenderer()
+ .size(1024)
+ .clip(true)
+ .showWhitePoint(false)
+ .add(ColorSpace.get(ColorSpace.Named.SRGB), 0xffffffff)
+ .add(ColorSpace.get(ColorSpace.Named.DCI_P3), 0xffffffff)
+ .add(ColorSpace.get(ColorSpace.Named.PRO_PHOTO_RGB), 0.1f, 0.5f, 0.1f, 0xff000000)
+ .add(ColorSpace.get(ColorSpace.Named.ADOBE_RGB), 0.1f, 0.5f, 0.1f, 0xff000000)
+ .render();
+ assertNotNull(b);
+ }
+
+ @Test
+ public void testUcsRenderer() {
+ Bitmap b = ColorSpace.createRenderer()
+ .size(1024)
+ .clip(true)
+ .showWhitePoint(false)
+ .uniformChromaticityScale(true)
+ .add(ColorSpace.get(ColorSpace.Named.SRGB), 0xffffffff)
+ .add(ColorSpace.get(ColorSpace.Named.DCI_P3), 0xffffffff)
+ .add(ColorSpace.get(ColorSpace.Named.PRO_PHOTO_RGB), 0.1f, 0.5f, 0.1f, 0xff000000)
+ .add(ColorSpace.get(ColorSpace.Named.ADOBE_RGB), 0.1f, 0.5f, 0.1f, 0xff000000)
+ .render();
+ assertNotNull(b);
+ }
+}
diff --git a/core/tests/coretests/src/android/metrics/LogMakerTest.java b/core/tests/coretests/src/android/metrics/LogMakerTest.java
index 63c1f87..ada59cd 100644
--- a/core/tests/coretests/src/android/metrics/LogMakerTest.java
+++ b/core/tests/coretests/src/android/metrics/LogMakerTest.java
@@ -179,6 +179,14 @@
assertEquals(-1, builder.getProcessId());
}
+ public void testSetAndClearUid() {
+ LogMaker builder = new LogMaker(0);
+ builder.setUid(1);
+ assertEquals(1, builder.getUid());
+ builder.clearUid();
+ assertEquals(-1, builder.getUid());
+ }
+
public void testGiantLogOmitted() {
LogMaker badBuilder = new LogMaker(0);
StringBuilder b = new StringBuilder();
diff --git a/core/tests/coretests/src/android/metrics/MetricsReaderTest.java b/core/tests/coretests/src/android/metrics/MetricsReaderTest.java
index d06f522..d10b351 100644
--- a/core/tests/coretests/src/android/metrics/MetricsReaderTest.java
+++ b/core/tests/coretests/src/android/metrics/MetricsReaderTest.java
@@ -26,6 +26,8 @@
public class MetricsReaderTest extends TestCase {
private static final int FULL_N = 10;
private static final int CHECKPOINTED_N = 4;
+ private static final int PID = 1;
+ private static final int UID = 2;
class FakeLogReader extends MetricsReader.LogReader {
MetricsReader.Event[] mEvents;
@@ -36,7 +38,8 @@
for (int i = 0; i < FULL_N; i++) {
mEvents[i] = new MetricsReader.Event(
1000L + i,
- 1,
+ PID,
+ UID,
new LogMaker(i).serialize());
}
}
@@ -88,6 +91,13 @@
}
}
+ public void testPidUid() {
+ mReader.read(0);
+ LogMaker log = mReader.next();
+ assertEquals(PID, log.getProcessId());
+ assertEquals(UID, log.getUid());
+ }
+
public void testBlockingRead_readResetsHorizon() {
mReader.read(1000);
assertEquals(1000, mLogReader.mHorizonMs);
diff --git a/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java b/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java
index 497bc5c..ff9816a 100644
--- a/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java
+++ b/core/tests/coretests/src/android/net/NetworkRecommendationProviderTest.java
@@ -1,26 +1,19 @@
package android.net;
-import static android.net.NetworkRecommendationProvider.EXTRA_RECOMMENDATION_RESULT;
-import static android.net.NetworkRecommendationProvider.EXTRA_SEQUENCE;
-
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertSame;
import static junit.framework.Assert.fail;
-import static junit.framework.TestCase.assertEquals;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import android.Manifest.permission;
import android.content.Context;
-import android.os.Bundle;
-import android.os.IRemoteCallback;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
@@ -35,11 +28,9 @@
*/
@RunWith(AndroidJUnit4.class)
public class NetworkRecommendationProviderTest {
- @Mock private IRemoteCallback mMockRemoteCallback;
@Mock private Context mContext;
private NetworkRecProvider mRecProvider;
private INetworkRecommendationProvider mStub;
- private CountDownLatch mRecRequestLatch;
private CountDownLatch mScoreRequestLatch;
private NetworkKey[] mTestNetworkKeys;
@@ -48,10 +39,8 @@
MockitoAnnotations.initMocks(this);
Executor executor = Executors.newSingleThreadExecutor();
- mRecRequestLatch = new CountDownLatch(1);
mScoreRequestLatch = new CountDownLatch(1);
- mRecProvider = new NetworkRecProvider(mContext, executor, mRecRequestLatch,
- mScoreRequestLatch);
+ mRecProvider = new NetworkRecProvider(mContext, executor, mScoreRequestLatch);
mStub = INetworkRecommendationProvider.Stub.asInterface(mRecProvider.getBinder());
mTestNetworkKeys = new NetworkKey[2];
mTestNetworkKeys[0] = new NetworkKey(new WifiKey("\"ssid_01\"", "00:00:00:00:00:11"));
@@ -59,69 +48,6 @@
}
@Test
- public void testRecommendationRequestReceived() throws Exception {
- final RecommendationRequest request = new RecommendationRequest.Builder().build();
- final int sequence = 100;
- mStub.requestRecommendation(request, mMockRemoteCallback, sequence);
-
- // wait for onRequestRecommendation() to be called in our impl below.
- mRecRequestLatch.await(200, TimeUnit.MILLISECONDS);
- NetworkRecommendationProvider.ResultCallback expectedResultCallback =
- new NetworkRecommendationProvider.ResultCallback(mMockRemoteCallback, sequence);
- assertEquals(request, mRecProvider.mCapturedRequest);
- assertEquals(expectedResultCallback, mRecProvider.mCapturedCallback);
- }
-
- @Test
- public void testRecommendationRequest_permissionsEnforced() throws Exception {
- final RecommendationRequest request = new RecommendationRequest.Builder().build();
- final int sequence = 100;
- Mockito.doThrow(new SecurityException())
- .when(mContext)
- .enforceCallingOrSelfPermission(eq(permission.REQUEST_NETWORK_SCORES), anyString());
-
- try {
- mStub.requestRecommendation(request, mMockRemoteCallback, sequence);
- fail("SecurityException expected.");
- } catch (SecurityException e) {
- // expected
- }
- }
-
- @Test
- public void testResultCallbackOnResult() throws Exception {
- final int sequence = 100;
- final NetworkRecommendationProvider.ResultCallback callback =
- new NetworkRecommendationProvider.ResultCallback(mMockRemoteCallback, sequence);
-
- final RecommendationResult result = RecommendationResult.createDoNotConnectRecommendation();
- callback.onResult(result);
-
- final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
- Mockito.verify(mMockRemoteCallback).sendResult(bundleCaptor.capture());
- Bundle capturedBundle = bundleCaptor.getValue();
- assertEquals(sequence, capturedBundle.getInt(EXTRA_SEQUENCE));
- assertSame(result, capturedBundle.getParcelable(EXTRA_RECOMMENDATION_RESULT));
- }
-
- @Test
- public void testResultCallbackOnResult_runTwice_throwsException() throws Exception {
- final int sequence = 100;
- final NetworkRecommendationProvider.ResultCallback callback =
- new NetworkRecommendationProvider.ResultCallback(mMockRemoteCallback, sequence);
-
- final RecommendationResult result = RecommendationResult.createDoNotConnectRecommendation();
- callback.onResult(result);
-
- try {
- callback.onResult(result);
- fail("Callback ran more than once.");
- } catch (IllegalStateException e) {
- // expected
- }
- }
-
- @Test
public void testScoreRequestReceived() throws Exception {
mStub.requestScores(mTestNetworkKeys);
@@ -162,28 +88,15 @@
}
private static class NetworkRecProvider extends NetworkRecommendationProvider {
- private final CountDownLatch mRecRequestLatch;
private final CountDownLatch mScoreRequestLatch;
- RecommendationRequest mCapturedRequest;
- ResultCallback mCapturedCallback;
NetworkKey[] mCapturedNetworks;
- NetworkRecProvider(Context context, Executor executor, CountDownLatch recRequestLatch,
- CountDownLatch networkRequestLatch) {
+ NetworkRecProvider(Context context, Executor executor, CountDownLatch networkRequestLatch) {
super(context, executor);
- mRecRequestLatch = recRequestLatch;
mScoreRequestLatch = networkRequestLatch;
}
@Override
- public void onRequestRecommendation(RecommendationRequest request,
- ResultCallback callback) {
- mCapturedRequest = request;
- mCapturedCallback = callback;
- mRecRequestLatch.countDown();
- }
-
- @Override
public void onRequestScores(NetworkKey[] networks) {
mCapturedNetworks = networks;
mScoreRequestLatch.countDown();
diff --git a/core/tests/coretests/src/android/net/RecommendationRequestTest.java b/core/tests/coretests/src/android/net/RecommendationRequestTest.java
deleted file mode 100644
index e2e6883..0000000
--- a/core/tests/coretests/src/android/net/RecommendationRequestTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package android.net;
-
-import android.net.wifi.ScanResult;
-import android.net.wifi.WifiConfiguration;
-import android.os.Parcel;
-import android.os.SystemClock;
-import android.test.AndroidTestCase;
-
-public class RecommendationRequestTest extends AndroidTestCase {
- private ScanResult[] mScanResults;
- private WifiConfiguration mDefaultConfig;
- private WifiConfiguration mConnectedConfig;
- private WifiConfiguration[] mConnectableConfigs;
- private int mLastSelectedNetworkId;
- private long mLastSelectedNetworkTimestamp;
-
- @Override
- public void setUp() throws Exception {
- mScanResults = new ScanResult[2];
- mScanResults[0] = new ScanResult();
- mScanResults[1] = new ScanResult(
- "ssid",
- "bssid",
- 0L /*hessid*/,
- 1 /*anqpDominId*/,
- "caps",
- 2 /*level*/,
- 3 /*frequency*/,
- 4L /*tsf*/,
- 5 /*distCm*/,
- 6 /*distSdCm*/,
- 7 /*channelWidth*/,
- 8 /*centerFreq0*/,
- 9 /*centerFreq1*/,
- false /*is80211McRTTResponder*/);
- mDefaultConfig = new WifiConfiguration();
- mDefaultConfig.SSID = "default_config";
- mConnectedConfig = new WifiConfiguration();
- mConnectedConfig.SSID = "connected_config";
- mConnectableConfigs = new WifiConfiguration[] {mDefaultConfig, mConnectedConfig};
- mLastSelectedNetworkId = 5;
- mLastSelectedNetworkTimestamp = SystemClock.elapsedRealtime();
- }
-
- public void testParceling() throws Exception {
- RecommendationRequest request = new RecommendationRequest.Builder()
- .setDefaultWifiConfig(mDefaultConfig)
- .setScanResults(mScanResults)
- .setConnectedWifiConfig(mConnectedConfig)
- .setConnectableConfigs(mConnectableConfigs)
- .setLastSelectedNetwork(mLastSelectedNetworkId, mLastSelectedNetworkTimestamp)
- .build();
-
- RecommendationRequest parceled = passThroughParcel(request);
- assertEquals(request.getDefaultWifiConfig().SSID,
- parceled.getDefaultWifiConfig().SSID);
- assertEquals(request.getConnectedConfig().SSID,
- parceled.getConnectedConfig().SSID);
- ScanResult[] parceledScanResults = parceled.getScanResults();
- assertNotNull(parceledScanResults);
- assertEquals(mScanResults.length, parceledScanResults.length);
- for (int i = 0; i < mScanResults.length; i++) {
- assertEquals(mScanResults[i].SSID, parceledScanResults[i].SSID);
- }
- WifiConfiguration[] parceledConfigs = parceled.getConnectableConfigs();
- for (int i = 0; i < parceledConfigs.length; i++) {
- assertEquals(mConnectableConfigs[i].SSID, parceledConfigs[i].SSID);
- }
- assertEquals(mLastSelectedNetworkId, parceled.getLastSelectedNetworkId());
- assertEquals(mLastSelectedNetworkTimestamp, parceled.getLastSelectedNetworkTimestamp());
- }
-
- public void testParceling_nullScanResults() throws Exception {
- RecommendationRequest request = new RecommendationRequest.Builder()
- .setDefaultWifiConfig(mDefaultConfig)
- .build();
-
- RecommendationRequest parceled = passThroughParcel(request);
- ScanResult[] parceledScanResults = parceled.getScanResults();
- assertNull(parceledScanResults);
- }
-
- public void testParceling_nullWifiConfigArray() throws Exception {
- RecommendationRequest request = new RecommendationRequest.Builder()
- .setDefaultWifiConfig(mDefaultConfig)
- .build();
-
- RecommendationRequest parceled = passThroughParcel(request);
- WifiConfiguration[] parceledConfigs = parceled.getConnectableConfigs();
- assertNull(parceledConfigs);
- }
-
- public void testParceling_unsetLastSelectedNetwork() throws Exception {
- RecommendationRequest request = new RecommendationRequest.Builder()
- .build();
-
- RecommendationRequest parceled = passThroughParcel(request);
-
- assertEquals(-1, parceled.getLastSelectedNetworkId());
- assertEquals(0, parceled.getLastSelectedNetworkTimestamp());
- }
-
- private RecommendationRequest passThroughParcel(RecommendationRequest request) {
- Parcel p = Parcel.obtain();
- RecommendationRequest output = null;
- try {
- request.writeToParcel(p, 0);
- p.setDataPosition(0);
- output = RecommendationRequest.CREATOR.createFromParcel(p);
- } finally {
- p.recycle();
- }
- assertNotNull(output);
- return output;
- }
-}
diff --git a/core/tests/coretests/src/android/preference/PreferenceIconSpaceTest.java b/core/tests/coretests/src/android/preference/PreferenceIconSpaceTest.java
new file mode 100644
index 0000000..654474c
--- /dev/null
+++ b/core/tests/coretests/src/android/preference/PreferenceIconSpaceTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.preference;
+
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class PreferenceIconSpaceTest {
+
+ private TestPreference mPreference;
+
+ @Mock
+ private ViewGroup mViewGroup;
+ @Mock
+ private ImageView mIconView;
+ @Mock
+ private View mImageFrame;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ when(mViewGroup.findViewById(com.android.internal.R.id.icon_frame))
+ .thenReturn(mImageFrame);
+ when(mViewGroup.findViewById(com.android.internal.R.id.icon))
+ .thenReturn(mIconView);
+
+ mPreference = new TestPreference(InstrumentationRegistry.getTargetContext());
+ }
+
+ @Test
+ public void bindView_iconSpaceReserved_shouldReserveIconSpace() {
+ mPreference.setIconSpaceReserved(true);
+ mPreference.bindView(mViewGroup);
+
+ verify(mIconView).setVisibility(View.INVISIBLE);
+ verify(mImageFrame).setVisibility(View.INVISIBLE);
+ }
+
+ @Test
+ public void bindView_iconSpaceNotReserved_shouldNotReserveIconSpace() {
+ mPreference.setIconSpaceReserved(false);
+ mPreference.bindView(mViewGroup);
+
+ verify(mIconView).setVisibility(View.GONE);
+ verify(mImageFrame).setVisibility(View.GONE);
+ }
+
+ @Test
+ public void bindView_hasIcon_shouldDisplayIcon() {
+ mPreference.setIcon(new ColorDrawable(Color.BLACK));
+ mPreference.bindView(mViewGroup);
+
+ verify(mIconView).setVisibility(View.VISIBLE);
+ verify(mImageFrame).setVisibility(View.VISIBLE);
+ }
+
+ private static class TestPreference extends Preference {
+
+ public TestPreference(Context context) {
+ super(context);
+ }
+
+ public void bindView(View view) {
+ onBindView(view);
+ }
+ }
+}
diff --git a/core/tests/coretests/src/android/provider/FontsContractE2ETest.java b/core/tests/coretests/src/android/provider/FontsContractE2ETest.java
index 479f6dd..2955869 100644
--- a/core/tests/coretests/src/android/provider/FontsContractE2ETest.java
+++ b/core/tests/coretests/src/android/provider/FontsContractE2ETest.java
@@ -18,27 +18,27 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
import android.app.Instrumentation;
-import android.content.pm.Signature;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.PackageInfo;
import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.PackageManager;
+import android.content.pm.Signature;
import android.graphics.Typeface;
-import android.graphics.fonts.FontRequest;
-import android.provider.FontsContract;
+import android.os.Handler;
+import android.provider.FontsContract.Columns;
import android.provider.FontsContract.FontFamilyResult;
import android.provider.FontsContract.FontInfo;
-import android.provider.FontsContract.Columns;
+import android.provider.FontsContract;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
-import android.os.Handler;
-import java.util.List;
import java.util.ArrayList;
+import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -120,7 +120,7 @@
inst.runOnMainSync(() -> {
FontRequest request = new FontRequest(
AUTHORITY, PACKAGE, "singleFontFamily", SIGNATURE);
- FontsContract.requestFont(ctx, request, callback, new Handler());
+ FontsContract.requestFonts(ctx, request, new Handler(), null, callback);
});
inst.waitForIdleSync();
assertEquals(1, callback.getSuccessCallCount());
@@ -131,7 +131,7 @@
inst.runOnMainSync(() -> {
FontRequest request = new FontRequest(
AUTHORITY, PACKAGE, "singleFontFamily", SIGNATURE);
- FontsContract.requestFont(ctx, request, callback2, new Handler());
+ FontsContract.requestFonts(ctx, request, new Handler(), null, callback2);
});
inst.waitForIdleSync();
assertEquals(1, callback2.getSuccessCallCount());
@@ -142,7 +142,7 @@
inst.runOnMainSync(() -> {
FontRequest request = new FontRequest(
AUTHORITY, PACKAGE, "singleFontFamily2", SIGNATURE);
- FontsContract.requestFont(ctx, request, callback3, new Handler());
+ FontsContract.requestFonts(ctx, request, new Handler(), null, callback3);
});
inst.waitForIdleSync();
assertEquals(1, callback3.getSuccessCallCount());
@@ -172,4 +172,31 @@
// Neighter fetchFonts nor buildTypeface should cache the Typeface.
assertNotSame(typeface, typeface2);
}
+
+ @Test
+ public void typefaceNullFdTest() throws NameNotFoundException {
+ Instrumentation inst = InstrumentationRegistry.getInstrumentation();
+ Context ctx = inst.getTargetContext();
+
+ FontRequest request = new FontRequest(
+ AUTHORITY, PACKAGE, MockFontProvider.NULL_FD_QUERY, SIGNATURE);
+ FontFamilyResult result = FontsContract.fetchFonts(
+ ctx, null /* cancellation signal */, request);
+ assertNull(FontsContract.buildTypeface(
+ ctx, null /* cancellation signal */, result.getFonts()));
+ }
+
+ @Test
+ public void getFontSyncTest() {
+ FontRequest request = new FontRequest(AUTHORITY, PACKAGE, "singleFontFamily", SIGNATURE);
+ assertNotNull(FontsContract.getFontSync(request));
+ }
+
+ @Test
+ public void getFontSyncTest_timeout() {
+ FontRequest request = new FontRequest(
+ AUTHORITY, PACKAGE, MockFontProvider.BLOCKING_QUERY, SIGNATURE);
+ assertNull(FontsContract.getFontSync(request));
+ MockFontProvider.unblock();
+ }
}
diff --git a/core/tests/coretests/src/android/provider/FontsContractTest.java b/core/tests/coretests/src/android/provider/FontsContractTest.java
index ccc8c18..d42d79e 100644
--- a/core/tests/coretests/src/android/provider/FontsContractTest.java
+++ b/core/tests/coretests/src/android/provider/FontsContractTest.java
@@ -32,8 +32,6 @@
import android.content.pm.ProviderInfo;
import android.content.pm.Signature;
import android.database.MatrixCursor;
-import android.graphics.fonts.FontRequest;
-import android.graphics.fonts.FontVariationAxis.InvalidFormatException;
import android.graphics.fonts.FontVariationAxis;
import android.provider.FontsContract.FontInfo;
import android.support.test.filters.SmallTest;
@@ -74,7 +72,7 @@
mPackageManager = mock(PackageManager.class);
}
- public void testGetFontFromProvider_resultOK() throws InvalidFormatException {
+ public void testGetFontFromProvider_resultOK() {
FontInfo[] fonts = FontsContract.getFontFromProvider(
getMockContext(), request, TestFontsProvider.AUTHORITY, null);
assertNotNull(fonts);
@@ -91,8 +89,7 @@
assertEquals(RESULT_CODE_OK, font.getResultCode());
}
- public void testGetFontFromProvider_providerDoesntReturnAllFields()
- throws InvalidFormatException {
+ public void testGetFontFromProvider_providerDoesntReturnAllFields() {
mProvider.setReturnAllFields(false);
FontInfo[] fonts = FontsContract.getFontFromProvider(
@@ -108,7 +105,7 @@
assertEquals(RESULT_CODE_OK, font.getResultCode());
}
- public void testGetFontFromProvider_resultFontNotFound() throws InvalidFormatException {
+ public void testGetFontFromProvider_resultFontNotFound() {
// Make the provider return unknown
mProvider.setResultCode(RESULT_CODE_FONT_NOT_FOUND);
FontInfo[] fonts = FontsContract.getFontFromProvider(
@@ -121,7 +118,7 @@
assertEquals(RESULT_CODE_FONT_NOT_FOUND, font.getResultCode());
}
- public void testGetFontFromProvider_resultFontUnavailable() throws InvalidFormatException {
+ public void testGetFontFromProvider_resultFontUnavailable() {
// Make the provider return font unavailable
mProvider.setResultCode(RESULT_CODE_FONT_UNAVAILABLE);
FontInfo[] fonts = FontsContract.getFontFromProvider(
@@ -141,7 +138,7 @@
assertEquals(RESULT_CODE_FONT_UNAVAILABLE, font.getResultCode());
}
- public void testGetFontFromProvider_resultMalformedQuery() throws InvalidFormatException {
+ public void testGetFontFromProvider_resultMalformedQuery() {
// Make the provider return font unavailable
mProvider.setResultCode(RESULT_CODE_MALFORMED_QUERY);
FontInfo[] fonts = FontsContract.getFontFromProvider(
@@ -161,8 +158,7 @@
assertEquals(RESULT_CODE_MALFORMED_QUERY, font.getResultCode());
}
- public void testGetFontFromProvider_resultFontNotFoundSecondRow()
- throws InvalidFormatException {
+ public void testGetFontFromProvider_resultFontNotFoundSecondRow() {
MatrixCursor cursor = new MatrixCursor(new String[] { FontsContract.Columns._ID,
FontsContract.Columns.TTC_INDEX, FontsContract.Columns.VARIATION_SETTINGS,
FontsContract.Columns.WEIGHT, FontsContract.Columns.ITALIC,
@@ -194,7 +190,7 @@
assertEquals(RESULT_CODE_FONT_NOT_FOUND, font.getResultCode());
}
- public void testGetFontFromProvider_resultFontNotFoundOtherRow() throws InvalidFormatException {
+ public void testGetFontFromProvider_resultFontNotFoundOtherRow() {
MatrixCursor cursor = new MatrixCursor(new String[] { FontsContract.Columns._ID,
FontsContract.Columns.TTC_INDEX, FontsContract.Columns.VARIATION_SETTINGS,
FontsContract.Columns.WEIGHT, FontsContract.Columns.ITALIC,
diff --git a/core/tests/coretests/src/android/provider/MockFontProvider.java b/core/tests/coretests/src/android/provider/MockFontProvider.java
index 339d5c3..ad5b130 100644
--- a/core/tests/coretests/src/android/provider/MockFontProvider.java
+++ b/core/tests/coretests/src/android/provider/MockFontProvider.java
@@ -29,26 +29,73 @@
import android.net.Uri;
import android.os.CancellationSignal;
import android.os.ParcelFileDescriptor;
+import android.util.ArraySet;
import android.util.SparseArray;
-import java.util.Collections;
-import java.util.Map;
-import java.util.HashMap;
import java.io.File;
-import java.nio.file.Files;
+import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
-import java.io.FileNotFoundException;
+import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import com.android.internal.annotations.GuardedBy;
public class MockFontProvider extends ContentProvider {
final static String AUTHORITY = "android.provider.fonts.font";
+ private static final long BLOCKING_TIMEOUT_MS = 10000; // 10 sec
+ private static final Lock sLock = new ReentrantLock();
+ private static final Condition sCond = sLock.newCondition();
+ @GuardedBy("sLock")
+ private static boolean sSignaled;
+
+ private static void blockUntilSignal() {
+ long remaining = TimeUnit.MILLISECONDS.toNanos(BLOCKING_TIMEOUT_MS);
+ sLock.lock();
+ try {
+ sSignaled = false;
+ while (!sSignaled) {
+ try {
+ remaining = sCond.awaitNanos(remaining);
+ } catch (InterruptedException e) {
+ // do nothing.
+ }
+ if (sSignaled) {
+ return;
+ }
+ if (remaining <= 0) {
+ // Timed out
+ throw new RuntimeException("Timeout during waiting");
+ }
+ }
+ } finally {
+ sLock.unlock();
+ }
+ }
+
+ public static void unblock() {
+ sLock.lock();
+ try {
+ sSignaled = true;
+ sCond.signal();
+ } finally {
+ sLock.unlock();
+ }
+ }
+
final static String[] FONT_FILES = {
"samplefont1.ttf",
};
+ private static final int NO_FILE_ID = 255;
private static final int SAMPLE_FONT_FILE_0_ID = 0;
- private static final int SAMPLE_FONT_FILE_1_ID = 1;
static class Font {
public Font(int id, int fileId, int ttcIndex, String varSettings, int weight, int italic,
@@ -99,6 +146,9 @@
private int mResultCode;
};
+ public static final String BLOCKING_QUERY = "queryBlockingQuery";
+ public static final String NULL_FD_QUERY = "nullFdQuery";
+
private static Map<String, Font[]> QUERY_MAP;
static {
HashMap<String, Font[]> map = new HashMap<>();
@@ -112,6 +162,14 @@
new Font(id++, SAMPLE_FONT_FILE_0_ID, 0, null, 700, 0, Columns.RESULT_CODE_OK),
});
+ map.put(BLOCKING_QUERY, new Font[] {
+ new Font(id++, SAMPLE_FONT_FILE_0_ID, 0, null, 700, 0, Columns.RESULT_CODE_OK),
+ });
+
+ map.put(NULL_FD_QUERY, new Font[] {
+ new Font(id++, NO_FILE_ID, 0, null, 700, 0, Columns.RESULT_CODE_OK),
+ });
+
QUERY_MAP = Collections.unmodifiableMap(map);
}
@@ -160,12 +218,14 @@
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) {
final int id = (int)ContentUris.parseId(uri);
+ if (id == NO_FILE_ID) {
+ return null;
+ }
final File targetFile = getCopiedFile(getContext(), FONT_FILES[id]);
try {
return ParcelFileDescriptor.open(targetFile, ParcelFileDescriptor.MODE_READ_ONLY);
} catch (FileNotFoundException e) {
- throw new RuntimeException(
- "Failed to found font file. You might forget call prepareFontFiles in setUp");
+ return null;
}
}
@@ -182,7 +242,11 @@
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
- return buildCursor(QUERY_MAP.get(selectionArgs[0]));
+ final String query = selectionArgs[0];
+ if (query.equals(BLOCKING_QUERY)) {
+ blockUntilSignal();
+ }
+ return buildCursor(QUERY_MAP.get(query));
}
@Override
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index d7887d3..99909ac 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -37,7 +37,8 @@
/** Tests that ensure appropriate settings are backed up. */
@RunWith(AndroidJUnit4.class)
-@Presubmit
+// TODO(b/37684646): Can re-enable pre-submit once test is fixed.
+//@Presubmit
@SmallTest
public class SettingsBackupTest {
@@ -72,6 +73,8 @@
Settings.System.USER_ROTATION, // backup candidate?
Settings.System.VIBRATE_IN_SILENT, // deprecated?
Settings.System.VIBRATE_ON, // candidate for backup?
+ Settings.System.VOLUME_ACCESSIBILITY, // used internally, changing value will
+ // not change volume
Settings.System.VOLUME_ALARM, // deprecated since API 2?
Settings.System.VOLUME_BLUETOOTH_SCO, // deprecated since API 2?
Settings.System.VOLUME_MASTER, // candidate for backup?
@@ -121,6 +124,7 @@
Settings.Global.CAPTIVE_PORTAL_HTTPS_URL,
Settings.Global.CAPTIVE_PORTAL_HTTP_URL,
Settings.Global.CAPTIVE_PORTAL_MODE,
+ Settings.Global.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS,
Settings.Global.CAPTIVE_PORTAL_SERVER,
Settings.Global.CAPTIVE_PORTAL_USE_HTTPS,
Settings.Global.CAPTIVE_PORTAL_USER_AGENT,
@@ -207,7 +211,10 @@
Settings.Global.INTENT_FIREWALL_UPDATE_CONTENT_URL,
Settings.Global.INTENT_FIREWALL_UPDATE_METADATA_URL,
Settings.Global.JOB_SCHEDULER_CONSTANTS,
+ Settings.Global.LANG_ID_UPDATE_CONTENT_URL,
+ Settings.Global.LANG_ID_UPDATE_METADATA_URL,
Settings.Global.LOCATION_BACKGROUND_THROTTLE_INTERVAL_MS,
+ Settings.Global.LOCATION_BACKGROUND_THROTTLE_PROXIMITY_ALERT_INTERVAL_MS,
Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST,
Settings.Global.LOCATION_SETTINGS_LINK_TO_PERMISSIONS_ENABLED,
Settings.Global.LOCK_SOUND,
@@ -300,6 +307,8 @@
Settings.Global.SETUP_PREPAID_DETECTION_TARGET_URL,
Settings.Global.SHORTCUT_MANAGER_CONSTANTS,
Settings.Global.SHOW_TEMPERATURE_WARNING,
+ Settings.Global.SMART_SELECTION_UPDATE_CONTENT_URL,
+ Settings.Global.SMART_SELECTION_UPDATE_METADATA_URL,
Settings.Global.SMS_OUTGOING_CHECK_INTERVAL_MS,
Settings.Global.SMS_OUTGOING_CHECK_MAX_COUNT,
Settings.Global.SMS_SHORT_CODE_CONFIRMATION,
@@ -376,7 +385,6 @@
private static final Set<String> BACKUP_BLACKLISTED_SECURE_SETTINGS =
newHashSet(
- Settings.Secure.ACCESSIBILITY_SCREEN_READER_URL,
Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE,
Settings.Secure.ALLOWED_GEOLOCATION_ORIGINS,
Settings.Secure.ALWAYS_ON_VPN_APP,
@@ -387,7 +395,6 @@
Settings.Secure.ASSIST_DISCLOSURE_ENABLED,
Settings.Secure.ASSIST_SCREENSHOT_ENABLED,
Settings.Secure.ASSIST_STRUCTURE_ENABLED,
- Settings.Secure.AUTOFILL_SERVICE,
Settings.Secure.AUTOMATIC_STORAGE_MANAGER_BYTES_CLEARED,
Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
Settings.Secure.AUTOMATIC_STORAGE_MANAGER_LAST_RUN,
diff --git a/core/tests/coretests/src/android/text/VariationParserTest.java b/core/tests/coretests/src/android/text/VariationParserTest.java
index bcc47e1..b0f55d6 100644
--- a/core/tests/coretests/src/android/text/VariationParserTest.java
+++ b/core/tests/coretests/src/android/text/VariationParserTest.java
@@ -33,7 +33,7 @@
try {
FontVariationAxis.fromFontVariationSettings("'wdth' " + invalidStyle);
fail();
- } catch (FontVariationAxis.InvalidFormatException e) {
+ } catch (IllegalArgumentException e) {
// pass
}
}
@@ -41,14 +41,14 @@
try {
FontVariationAxis.fromFontVariationSettings("'wght' 1, 'wdth' " + invalidStyle);
fail();
- } catch (FontVariationAxis.InvalidFormatException e) {
+ } catch (IllegalArgumentException e) {
// pass
}
}
}
@SmallTest
- public void testOpenTypeTagValue() throws FontVariationAxis.InvalidFormatException {
+ public void testOpenTypeTagValue() {
assertEquals(0x77647468, (new FontVariationAxis("wdth", 0).getOpenTypeTagValue()));
assertEquals(0x41582020, (new FontVariationAxis("AX ", 0).getOpenTypeTagValue()));
assertEquals(0x20202020, (new FontVariationAxis(" ", 0).getOpenTypeTagValue()));
diff --git a/core/tests/coretests/src/android/util/ArrayMapTest.java b/core/tests/coretests/src/android/util/ArrayMapTest.java
new file mode 100644
index 0000000..32aa29f
--- /dev/null
+++ b/core/tests/coretests/src/android/util/ArrayMapTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package android.util;
+
+import android.util.ArrayMap;
+
+import junit.framework.TestCase;
+import org.junit.Test;
+
+import java.util.ConcurrentModificationException;
+
+/**
+ * Unit tests for ArrayMap that don't belong in CTS.
+ */
+public class ArrayMapTest extends TestCase {
+ private static final String TAG = "ArrayMapTest";
+ ArrayMap<String, String> map = new ArrayMap<>();
+
+ /**
+ * Attempt to generate a ConcurrentModificationException in ArrayMap.
+ * <p>
+ * ArrayMap is explicitly documented to be non-thread-safe, yet it's easy to accidentally screw
+ * this up; ArrayMap should (in the spirit of the core Java collection types) make an effort to
+ * catch this and throw ConcurrentModificationException instead of crashing somewhere in its
+ * internals.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testConcurrentModificationException() throws Exception {
+ final int TEST_LEN_MS = 5000;
+ System.out.println("Starting ArrayMap concurrency test");
+ new Thread(() -> {
+ int i = 0;
+ while (map != null) {
+ try {
+ map.put(String.format("key %d", i++), "B_DONT_DO_THAT");
+ } catch (ArrayIndexOutOfBoundsException e) {
+ Log.e(TAG, "concurrent modification uncaught, causing indexing failure", e);
+ fail();
+ } catch (ClassCastException e) {
+ Log.e(TAG, "concurrent modification uncaught, causing cache corruption", e);
+ fail();
+ } catch (ConcurrentModificationException e) {
+ System.out.println("[successfully caught CME at put #" + i
+ + " size=" + (map == null ? "??" : String.valueOf(map.size())) + "]");
+ }
+ if (i % 200 == 0) {
+ System.out.print(".");
+ }
+ }
+ }).start();
+ for (int i = 0; i < (TEST_LEN_MS / 100); i++) {
+ try {
+ Thread.sleep(100);
+ map.clear();
+ System.out.print("X");
+ } catch (InterruptedException e) {
+ } catch (ArrayIndexOutOfBoundsException e) {
+ Log.e(TAG, "concurrent modification uncaught, causing indexing failure");
+ fail();
+ } catch (ClassCastException e) {
+ Log.e(TAG, "concurrent modification uncaught, causing cache corruption");
+ fail();
+ } catch (ConcurrentModificationException e) {
+ System.out.println(
+ "[successfully caught CME at clear #"
+ + i + " size=" + map.size() + "]");
+ }
+ }
+ map = null; // will stop other thread
+ System.out.println();
+ }
+
+ /**
+ * Check to make sure the same operations behave as expected in a single thread.
+ */
+ @Test
+ public void testNonConcurrentAccesses() throws Exception {
+ for (int i = 0; i < 100000; i++) {
+ try {
+ map.put(String.format("key %d", i++), "B_DONT_DO_THAT");
+ if (i % 200 == 0) {
+ System.out.print(".");
+ }
+ if (i % 500 == 0) {
+ map.clear();
+ System.out.print("X");
+ }
+ } catch (ConcurrentModificationException e) {
+ Log.e(TAG, "concurrent modification caught on single thread", e);
+ fail();
+ }
+ }
+ }
+}
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
index 39b999d..f59e4fc 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
@@ -102,31 +102,31 @@
}
@Test
- public void testTextClassificationResult() {
+ public void testClassifyText() {
if (isTextClassifierDisabled()) return;
String text = "Contact me at droid@android.com";
String classifiedText = "droid@android.com";
int startIndex = text.indexOf(classifiedText);
int endIndex = startIndex + classifiedText.length();
- assertThat(mClassifier.getTextClassificationResult(text, startIndex, endIndex, LOCALES),
- isTextClassificationResult(classifiedText, TextClassifier.TYPE_EMAIL));
+ assertThat(mClassifier.classifyText(text, startIndex, endIndex, LOCALES),
+ isTextClassification(classifiedText, TextClassifier.TYPE_EMAIL));
}
@Test
- public void testTextClassificationResult_url() {
+ public void testTextClassifyText_url() {
if (isTextClassifierDisabled()) return;
String text = "Visit http://www.android.com for more information";
String classifiedText = "http://www.android.com";
int startIndex = text.indexOf(classifiedText);
int endIndex = startIndex + classifiedText.length();
- assertThat(mClassifier.getTextClassificationResult(text, startIndex, endIndex, LOCALES),
- isTextClassificationResult(classifiedText, TextClassifier.TYPE_URL));
+ assertThat(mClassifier.classifyText(text, startIndex, endIndex, LOCALES),
+ isTextClassification(classifiedText, TextClassifier.TYPE_URL));
}
@Test
- public void testTextClassificationResult_nullLocaleList() {
+ public void testTextClassifyText_nullLocaleList() {
if (isTextClassifierDisabled()) return;
String text = "Contact me at droid@android.com";
@@ -134,8 +134,8 @@
int startIndex = text.indexOf(classifiedText);
int endIndex = startIndex + classifiedText.length();
LocaleList nullLocales = null;
- assertThat(mClassifier.getTextClassificationResult(text, startIndex, endIndex, nullLocales),
- isTextClassificationResult(classifiedText, TextClassifier.TYPE_EMAIL));
+ assertThat(mClassifier.classifyText(text, startIndex, endIndex, nullLocales),
+ isTextClassification(classifiedText, TextClassifier.TYPE_EMAIL));
}
@Test
@@ -186,13 +186,13 @@
};
}
- private static Matcher<TextClassificationResult> isTextClassificationResult(
+ private static Matcher<TextClassification> isTextClassification(
final String text, final String type) {
- return new BaseMatcher<TextClassificationResult>() {
+ return new BaseMatcher<TextClassification>() {
@Override
public boolean matches(Object o) {
- if (o instanceof TextClassificationResult) {
- TextClassificationResult result = (TextClassificationResult) o;
+ if (o instanceof TextClassification) {
+ TextClassification result = (TextClassification) o;
return text.equals(result.getText())
&& result.getEntityCount() > 0
&& type.equals(result.getEntity(0));
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 86ab3dc..344f3c8 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -181,9 +181,6 @@
<allow-in-power-save package="com.android.cellbroadcastreceiver" />
<allow-in-power-save package="com.android.shell" />
- <!-- STOPSHIP(b/36856786): Revert this once it is fixed properly -->
- <allow-in-power-save package="com.google.android.apps.enterprise.dmagent" />
-
<!-- These are the packages that are white-listed to be able to run as system user -->
<system-user-whitelisted-app package="com.android.settings" />
diff --git a/graphics/java/android/graphics/FontListParser.java b/graphics/java/android/graphics/FontListParser.java
index 1a4f225..7c07a30 100644
--- a/graphics/java/android/graphics/FontListParser.java
+++ b/graphics/java/android/graphics/FontListParser.java
@@ -134,12 +134,7 @@
String tagStr = parser.getAttributeValue(null, "tag");
String styleValueStr = parser.getAttributeValue(null, "stylevalue");
skip(parser); // axis tag is empty, ignore any contents and consume end tag
- try {
- return new FontVariationAxis(tagStr, Float.parseFloat(styleValueStr));
- } catch (FontVariationAxis.InvalidFormatException e) {
- // Treat as system failure since system preinstalled font setting has invalid format.
- throw new RuntimeException(e);
- }
+ return new FontVariationAxis(tagStr, Float.parseFloat(styleValueStr));
}
private static FontConfig.Alias readAlias(XmlPullParser parser)
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index 828729a..e62df8f 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -1539,25 +1539,49 @@
}
/**
- * Set font variation settings.
+ * Sets TrueType or OpenType font variation settings. The settings string is constructed from
+ * multiple pairs of axis tag and style values. The axis tag must contain four ASCII characters
+ * and must be wrapped with single quotes (U+0027) or double quotes (U+0022). Axis strings that
+ * are longer or shorter than four characters, or contain characters outside of U+0020..U+007E
+ * are invalid. If a specified axis name is not defined in the font, the settings will be
+ * ignored.
*
- * This function does nothing if none of the settings is applicable to underlying font files.
+ * Examples,
+ * <ul>
+ * <li>Set font width to 150.
+ * <pre>
+ * <code>
+ * Paint paint = new Paint();
+ * paint.setFontVariationSettings("'wdth' 150");
+ * </code>
+ * </pre>
+ * </li>
*
- * @param settings font variation settings, e.g. "'wdth' 300, 'wght' 1.8"
+ * <li>Set the font slant to 20 degrees and ask for italic style.
+ * <pre>
+ * <code>
+ * Paint paint = new Paint();
+ * paint.setFontVariationSettings("'slnt' 20, 'ital' 1");
+ * </code>
+ * </pre>
+ * </li>
+ * </ul>
*
- * @see #getFontVariationSettings()
+ * @param fontVariationSettings font variation settings. You can pass null or empty string as
+ * no variation settings.
*
- * @param settings the font variation settings. You can pass null or empty string as no
- * variation settings.
* @return true if the given settings is effective to at least one font file underlying this
* typeface. This function also returns true for empty settings string. Otherwise
* returns false
- * @throws FontVariationAxis.InvalidFormatException
- * If given string is not a valid font variation settings format.
+ *
+ * @throws IllegalArgumentException If given string is not a valid font variation settings
+ * format
+ *
+ * @see #getFontVariationSettings()
+ * @see FontVariationAxis
*/
- public boolean setFontVariationSettings(String settings)
- throws FontVariationAxis.InvalidFormatException {
- settings = TextUtils.nullIfEmpty(settings);
+ public boolean setFontVariationSettings(String fontVariationSettings) {
+ final String settings = TextUtils.nullIfEmpty(fontVariationSettings);
if (settings == mFontVariationSettings
|| (settings != null && settings.equals(mFontVariationSettings))) {
return true;
diff --git a/graphics/java/android/graphics/Path.java b/graphics/java/android/graphics/Path.java
index 3631373..098cdc6 100644
--- a/graphics/java/android/graphics/Path.java
+++ b/graphics/java/android/graphics/Path.java
@@ -16,8 +16,10 @@
package android.graphics;
+import android.annotation.FloatRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.Size;
import dalvik.annotation.optimization.CriticalNative;
import dalvik.annotation.optimization.FastNative;
@@ -805,7 +807,12 @@
* the error is less than half a pixel.
* @return An array of components for points approximating the Path.
*/
- public float[] approximate(float acceptableError) {
+ @NonNull
+ @Size(min = 6, multiple = 3)
+ public float[] approximate(@FloatRange(from = 0) float acceptableError) {
+ if (acceptableError < 0) {
+ throw new IllegalArgumentException("AcceptableError must be greater than or equal to 0");
+ }
return nApproximate(mNativePath, acceptableError);
}
diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java
index 24fb673..97edf22 100644
--- a/graphics/java/android/graphics/SurfaceTexture.java
+++ b/graphics/java/android/graphics/SurfaceTexture.java
@@ -16,14 +16,14 @@
package android.graphics;
-import java.lang.ref.WeakReference;
-
import android.annotation.Nullable;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.Surface;
+import java.lang.ref.WeakReference;
+
/**
* Captures frames from an image stream as an OpenGL ES texture.
*
@@ -345,14 +345,17 @@
* Always call this method when you are done with SurfaceTexture. Failing
* to do so may delay resource deallocation for a significant amount of
* time.
+ *
+ * @see #isReleased()
*/
public void release() {
nativeRelease();
}
/**
- * Returns true if the SurfaceTexture was released
- * @hide
+ * Returns true if the SurfaceTexture was released.
+ *
+ * @see #release()
*/
public boolean isReleased() {
return nativeIsReleased();
@@ -400,7 +403,6 @@
private native void nativeReleaseTexImage();
private native int nativeDetachFromGLContext();
private native int nativeAttachToGLContext(int texName);
- private native int nativeGetQueuedCount();
private native void nativeRelease();
private native boolean nativeIsReleased();
}
diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java
index 115c77f..ad6ea2b 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -27,18 +27,15 @@
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.FontListParser;
-import android.graphics.fonts.FontRequest;
-import android.graphics.fonts.FontResult;
import android.graphics.fonts.FontVariationAxis;
-import android.graphics.fonts.FontVariationAxis.InvalidFormatException;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.ParcelFileDescriptor;
import android.os.ResultReceiver;
+import android.provider.FontRequest;
import android.provider.FontsContract;
import android.text.FontConfig;
import android.util.Base64;
@@ -100,10 +97,6 @@
static Typeface[] sDefaults;
private static final LongSparseArray<SparseArray<Typeface>> sTypefaceCache =
new LongSparseArray<>(3);
- @GuardedBy("sLock")
- private static FontsContract sFontsContract;
- @GuardedBy("sLock")
- private static Handler sHandler;
/**
* Cache for Typeface objects dynamically loaded from assets. Currently max size is 16.
@@ -205,16 +198,9 @@
public static Typeface createFromResources(
FamilyResourceEntry entry, AssetManager mgr, String path) {
if (sFallbackFonts != null) {
- Typeface typeface = findFromCache(mgr, path);
- if (typeface != null) return typeface;
-
if (entry instanceof ProviderResourceEntry) {
final ProviderResourceEntry providerEntry = (ProviderResourceEntry) entry;
// Downloadable font
- typeface = findFromCache(providerEntry.getAuthority(), providerEntry.getQuery());
- if (typeface != null) {
- return typeface;
- }
List<List<String>> givenCerts = providerEntry.getCerts();
List<List<byte[]>> certs = new ArrayList<>();
if (givenCerts != null) {
@@ -229,11 +215,15 @@
}
// Downloaded font and it wasn't cached, request it again and return a
// default font instead (nothing we can do now).
- create(new FontRequest(providerEntry.getAuthority(), providerEntry.getPackage(),
- providerEntry.getQuery(), certs), NO_OP_REQUEST_CALLBACK);
- return DEFAULT;
+ FontRequest request = new FontRequest(providerEntry.getAuthority(),
+ providerEntry.getPackage(), providerEntry.getQuery(), certs);
+ Typeface typeface = FontsContract.getFontSync(request);
+ return typeface == null ? DEFAULT : typeface;
}
+ Typeface typeface = findFromCache(mgr, path);
+ if (typeface != null) return typeface;
+
// family is FontFamilyFilesResourceEntry
final FontFamilyFilesResourceEntry filesEntry =
(FontFamilyFilesResourceEntry) entry;
@@ -283,223 +273,6 @@
}
/**
- * Set the application context so we can generate font requests from the provider. This should
- * be called from ActivityThread when the application binds, as we preload fonts.
- * @hide
- */
- public static void setApplicationContext(Context context) {
- synchronized (sLock) {
- if (sFontsContract == null) {
- sFontsContract = new FontsContract(context);
- sHandler = new Handler();
- }
- }
- }
-
- /**
- * Create a typeface object given a font request. The font will be asynchronously fetched,
- * therefore the result is delivered to the given callback. See {@link FontRequest}.
- * Only one of the methods in callback will be invoked, depending on whether the request
- * succeeds or fails. These calls will happen on the main thread.
- * @param request A {@link FontRequest} object that identifies the provider and query for the
- * request. May not be null.
- * @param callback A callback that will be triggered when results are obtained. May not be null.
- */
- @Deprecated
- public static void create(@NonNull FontRequest request, @NonNull FontRequestCallback callback) {
- // Check the cache first
- // TODO: would the developer want to avoid a cache hit and always ask for the freshest
- // result?
- Typeface cachedTypeface = findFromCache(
- request.getProviderAuthority(), request.getQuery());
- if (cachedTypeface != null) {
- sHandler.post(() -> callback.onTypefaceRetrieved(cachedTypeface));
- return;
- }
- synchronized (sLock) {
- if (sFontsContract == null) {
- throw new RuntimeException("Context not initialized, can't query provider");
- }
- final ResultReceiver receiver = new ResultReceiver(null) {
- @Override
- public void onReceiveResult(int resultCode, Bundle resultData) {
- sHandler.post(() -> receiveResult(request, callback, resultCode, resultData));
- }
- };
- sFontsContract.getFont(request, receiver);
- }
- }
-
- private static Typeface findFromCache(String providerAuthority, String query) {
- synchronized (sDynamicTypefaceCache) {
- final String key = createProviderUid(providerAuthority, query);
- Typeface typeface = sDynamicTypefaceCache.get(key);
- if (typeface != null) {
- return typeface;
- }
- }
- return null;
- }
-
- private static void receiveResult(FontRequest request, FontRequestCallback callback,
- int resultCode, Bundle resultData) {
- Typeface cachedTypeface = findFromCache(
- request.getProviderAuthority(), request.getQuery());
- if (cachedTypeface != null) {
- // We already know the result.
- // Probably the requester requests the same font again in a short interval.
- callback.onTypefaceRetrieved(cachedTypeface);
- return;
- }
- if (resultCode != FontsContract.Columns.RESULT_CODE_OK) {
- callback.onTypefaceRequestFailed(resultCode);
- return;
- }
- if (resultData == null) {
- callback.onTypefaceRequestFailed(
- FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND);
- return;
- }
- List<FontResult> resultList =
- resultData.getParcelableArrayList(FontsContract.PARCEL_FONT_RESULTS);
- if (resultList == null || resultList.isEmpty()) {
- callback.onTypefaceRequestFailed(
- FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND);
- return;
- }
- FontFamily fontFamily = new FontFamily();
- for (int i = 0; i < resultList.size(); ++i) {
- FontResult result = resultList.get(i);
- ParcelFileDescriptor fd = result.getFileDescriptor();
- if (fd == null) {
- callback.onTypefaceRequestFailed(
- FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR);
- return;
- }
- try (FileInputStream is = new FileInputStream(fd.getFileDescriptor())) {
- FileChannel fileChannel = is.getChannel();
- long fontSize = fileChannel.size();
- ByteBuffer fontBuffer = fileChannel.map(
- FileChannel.MapMode.READ_ONLY, 0, fontSize);
- int weight = result.getWeight();
- int italic = result.getItalic() ? STYLE_ITALIC : STYLE_NORMAL;
- FontVariationAxis[] axes = null;
- try {
- axes = FontVariationAxis.fromFontVariationSettings(
- result.getFontVariationSettings());
- } catch (FontVariationAxis.InvalidFormatException e) {
- // TODO: Nice to pass FontVariationAxis[] directly instead of string.
- }
- if (!fontFamily.addFontFromBuffer(fontBuffer, result.getTtcIndex(),
- axes, weight, italic)) {
- Log.e(TAG, "Error creating font " + request.getQuery());
- callback.onTypefaceRequestFailed(
- FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR);
- return;
- }
- } catch (IOException e) {
- Log.e(TAG, "Error reading font " + request.getQuery(), e);
- callback.onTypefaceRequestFailed(
- FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR);
- return;
- } finally {
- IoUtils.closeQuietly(fd);
- }
- }
- if (!fontFamily.freeze()) {
- callback.onTypefaceRequestFailed(
- FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR);
- return;
- }
- Typeface typeface = Typeface.createFromFamiliesWithDefault(
- new FontFamily[] { fontFamily },
- RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE);
- synchronized (sDynamicTypefaceCache) {
- String key = createProviderUid(request.getProviderAuthority(), request.getQuery());
- sDynamicTypefaceCache.put(key, typeface);
- }
- callback.onTypefaceRetrieved(typeface);
- }
-
- /**
- * Interface used to receive asynchronously fetched typefaces.
- */
- @Deprecated
- public interface FontRequestCallback {
- /**
- * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the given
- * provider was not found on the device.
- */
- int FAIL_REASON_PROVIDER_NOT_FOUND = FontsContract.RESULT_CODE_PROVIDER_NOT_FOUND;
- /**
- * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the given
- * provider must be authenticated and the given certificates do not match its signature.
- */
- int FAIL_REASON_WRONG_CERTIFICATES = FontsContract.RESULT_CODE_WRONG_CERTIFICATES;
- /**
- * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the font
- * returned by the provider was not loaded properly.
- */
- int FAIL_REASON_FONT_LOAD_ERROR = -3;
- /**
- * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the font
- * provider did not return any results for the given query.
- */
- int FAIL_REASON_FONT_NOT_FOUND = FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND;
- /**
- * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the font
- * provider found the queried font, but it is currently unavailable.
- */
- int FAIL_REASON_FONT_UNAVAILABLE = FontsContract.Columns.RESULT_CODE_FONT_UNAVAILABLE;
- /**
- * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the given
- * query was not supported by the provider.
- */
- int FAIL_REASON_MALFORMED_QUERY = FontsContract.Columns.RESULT_CODE_MALFORMED_QUERY;
-
- /** @hide */
- @IntDef({ FAIL_REASON_PROVIDER_NOT_FOUND, FAIL_REASON_FONT_LOAD_ERROR,
- FAIL_REASON_FONT_NOT_FOUND, FAIL_REASON_FONT_UNAVAILABLE,
- FAIL_REASON_MALFORMED_QUERY })
- @Retention(RetentionPolicy.SOURCE)
- @interface FontRequestFailReason {}
-
- /**
- * Called then a Typeface request done via {@link Typeface#create(FontRequest,
- * FontRequestCallback)} is complete. Note that this method will not be called if
- * {@link #onTypefaceRequestFailed(int)} is called instead.
- * @param typeface The Typeface object retrieved.
- */
- void onTypefaceRetrieved(Typeface typeface);
-
- /**
- * Called when a Typeface request done via {@link Typeface#create(FontRequest,
- * FontRequestCallback)} fails.
- * @param reason May be one of {@link #FAIL_REASON_PROVIDER_NOT_FOUND},
- * {@link #FAIL_REASON_FONT_NOT_FOUND},
- * {@link #FAIL_REASON_FONT_LOAD_ERROR},
- * {@link #FAIL_REASON_FONT_UNAVAILABLE} or
- * {@link #FAIL_REASON_MALFORMED_QUERY} if returned by the system. May also be
- * a positive value greater than 0 defined by the font provider as an
- * additional error code. Refer to the provider's documentation for more
- * information on possible returned error codes.
- */
- void onTypefaceRequestFailed(@FontRequestFailReason int reason);
- }
-
- private static final FontRequestCallback NO_OP_REQUEST_CALLBACK = new FontRequestCallback() {
- @Override
- public void onTypefaceRetrieved(Typeface typeface) {
- // Do nothing.
- }
-
- @Override
- public void onTypefaceRequestFailed(@FontRequestFailReason int reason) {
- // Do nothing.
- }
- };
-
- /**
* A builder class for creating new Typeface instance.
*
* <p>
@@ -658,11 +431,10 @@
* Sets a font variation settings.
*
* @param variationSettings See {@link android.widget.TextView#setFontVariationSettings}.
- * @throws InvalidFormatException If given string is not a valid font variation settings
- * format.
+ * @throws IllegalArgumentException If given string is not a valid font variation settings
+ * format.
*/
- public Builder setFontVariationSettings(@Nullable String variationSettings)
- throws InvalidFormatException {
+ public Builder setFontVariationSettings(@Nullable String variationSettings) {
if (mFonts != null) {
throw new IllegalArgumentException(
"Font variation settings can not be specified for FontResult source.");
diff --git a/graphics/java/android/graphics/fonts/FontResult.java b/graphics/java/android/graphics/fonts/FontResult.java
deleted file mode 100644
index 20e736e..0000000
--- a/graphics/java/android/graphics/fonts/FontResult.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.graphics.fonts;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.graphics.Paint;
-import android.os.Parcel;
-import android.os.ParcelFileDescriptor;
-import android.os.Parcelable;
-
-import com.android.internal.util.Preconditions;
-
-import java.io.FileDescriptor;
-import java.io.IOException;
-
-/**
- * Results returned from a Font Provider to the system.
- * @hide
- */
-public final class FontResult implements Parcelable {
- private final ParcelFileDescriptor mFileDescriptor;
- private final int mTtcIndex;
- private final String mFontVariationSettings;
- private final int mWeight;
- private final boolean mItalic;
-
- /**
- * Creates a FontResult with all the information needed about a provided font.
- * @param fileDescriptor A ParcelFileDescriptor pointing to the font file. This shoult point to
- * a real file or shared memory, as the client will mmap the given file
- * descriptor. Pipes, sockets and other non-mmap-able file descriptors
- * will fail to load in the client application.
- * @param ttcIndex If providing a TTC_INDEX file, the index to point to. Otherwise, 0.
- * @param fontVariationSettings If providing a variation font, the settings for it. May be null.
- * @param weight An integer that indicates the font weight.
- * @param italic A boolean that indicates the font is italic style or not.
- */
- public FontResult(@NonNull ParcelFileDescriptor fileDescriptor, int ttcIndex,
- @Nullable String fontVariationSettings, int weight, boolean italic) {
- mFileDescriptor = Preconditions.checkNotNull(fileDescriptor);
- mTtcIndex = ttcIndex;
- mFontVariationSettings = fontVariationSettings;
- mWeight = weight;
- mItalic = italic;
- }
-
- public ParcelFileDescriptor getFileDescriptor() {
- return mFileDescriptor;
- }
-
- public int getTtcIndex() {
- return mTtcIndex;
- }
-
- public String getFontVariationSettings() {
- return mFontVariationSettings;
- }
-
- public int getWeight() {
- return mWeight;
- }
-
- public boolean getItalic() {
- return mItalic;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeParcelable(mFileDescriptor, flags);
- dest.writeInt(mTtcIndex);
- dest.writeString(mFontVariationSettings);
- dest.writeInt(mWeight);
- dest.writeBoolean(mItalic);
- }
-
- private FontResult(Parcel in) {
- mFileDescriptor = in.readParcelable(null);
- mTtcIndex = in.readInt();
- mFontVariationSettings = in.readString();
- mWeight = in.readInt();
- mItalic = in.readBoolean();
- }
-
- public static final Parcelable.Creator<FontResult> CREATOR =
- new Parcelable.Creator<FontResult>() {
- @Override
- public FontResult createFromParcel(Parcel in) {
- return new FontResult(in);
- }
-
- @Override
- public FontResult[] newArray(int size) {
- return new FontResult[size];
- }
- };
-}
diff --git a/graphics/java/android/graphics/fonts/FontSpec.aidl b/graphics/java/android/graphics/fonts/FontSpec.aidl
deleted file mode 100644
index dddea25..0000000
--- a/graphics/java/android/graphics/fonts/FontSpec.aidl
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Copyright 2017, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
-
-package android.graphics.fonts;
-
-parcelable FontSpec;
\ No newline at end of file
diff --git a/graphics/java/android/graphics/fonts/FontVariationAxis.java b/graphics/java/android/graphics/fonts/FontVariationAxis.java
index fb2a3a8..99564fa 100644
--- a/graphics/java/android/graphics/fonts/FontVariationAxis.java
+++ b/graphics/java/android/graphics/fonts/FontVariationAxis.java
@@ -37,12 +37,11 @@
* The axis tag must contain four ASCII characters. Tag string that are longer or shorter than
* four characters, or contains characters outside of U+0020..U+007E are invalid.
*
- * @throws {@link InvalidFormatException} If given tag string is invalid.
+ * @throws IllegalArgumentException If given tag string is invalid.
*/
- public FontVariationAxis(@NonNull String tagString, float styleValue)
- throws InvalidFormatException {
+ public FontVariationAxis(@NonNull String tagString, float styleValue) {
if (!isValidTag(tagString)) {
- throw new InvalidFormatException("Invalid tag pattern: " + tagString);
+ throw new IllegalArgumentException("Illegal tag pattern: " + tagString);
}
mTag = makeTag(tagString);
mTagString = tagString;
@@ -113,15 +112,6 @@
}
/**
- * An exception indicates that the format of font variation settings is invalid.
- */
- public static class InvalidFormatException extends Exception {
- public InvalidFormatException(String message) {
- super(message);
- }
- };
-
- /**
* Construct FontVariationAxis array from font variation settings.
*
* The settings string is constructed from multiple pairs of axis tag and style values. The axis
@@ -138,10 +128,11 @@
* @param settings font variation settings.
* @return FontVariationAxis[] the array of parsed font variation axis. {@code null} if settings
* has no font variation settings.
- * @throws InvalidFormatException If given string is not a valid font variation settings format.
+ * @throws IllegalArgumentException If given string is not a valid font variation settings
+ * format.
*/
- public static @Nullable FontVariationAxis[] fromFontVariationSettings(@Nullable String settings)
- throws InvalidFormatException {
+ public static @Nullable FontVariationAxis[] fromFontVariationSettings(
+ @Nullable String settings) {
if (settings == null || settings.isEmpty()) {
return null;
}
@@ -153,7 +144,7 @@
continue;
}
if (!(c == '\'' || c == '"') || length < i + 6 || settings.charAt(i + 5) != c) {
- throw new InvalidFormatException(
+ throw new IllegalArgumentException(
"Tag should be wrapped with double or single quote: " + settings);
}
final String tagString = settings.substring(i + 1, i + 5);
@@ -168,7 +159,8 @@
// Float.parseFloat ignores leading/trailing whitespaces.
value = Float.parseFloat(settings.substring(i, endOfValueString));
} catch (NumberFormatException e) {
- throw new InvalidFormatException("Failed to parse float string: " + e.getMessage());
+ throw new IllegalArgumentException(
+ "Failed to parse float string: " + e.getMessage());
}
axisList.add(new FontVariationAxis(tagString, value));
i = endOfValueString;
diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java
index 5c64566..ea804d0 100644
--- a/keystore/java/android/security/KeyChain.java
+++ b/keystore/java/android/security/KeyChain.java
@@ -17,7 +17,9 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SdkConstant;
import android.annotation.WorkerThread;
+import android.annotation.SdkConstant.SdkConstantType;
import android.app.Activity;
import android.app.PendingIntent;
import android.app.Service;
@@ -199,12 +201,14 @@
* {@link Build.VERSION_CODES#N_MR1} will only receive this broadcast if they register for it
* at runtime.
*/
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_STORAGE_CHANGED = "android.security.STORAGE_CHANGED";
/**
* Broadcast Action: Indicates the contents of the keychain has changed. Sent when a KeyChain
* entry is added, modified or removed.
*/
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_KEYCHAIN_CHANGED = "android.security.action.KEYCHAIN_CHANGED";
/**
@@ -216,6 +220,7 @@
* <li>A CA is added or removed from the trust store</li>
* </ul>
*/
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_TRUST_STORE_CHANGED =
"android.security.action.TRUST_STORE_CHANGED";
@@ -223,6 +228,7 @@
* Broadcast Action: Indicates that the access permissions for a private key have changed.
*
*/
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_KEY_ACCESS_CHANGED =
"android.security.action.KEY_ACCESS_CHANGED";
diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java
index 00d786a..bfd1422 100644
--- a/keystore/java/android/security/KeyStore.java
+++ b/keystore/java/android/security/KeyStore.java
@@ -93,6 +93,16 @@
*/
public static final int FLAG_ENCRYPTED = 1;
+ /**
+ * A private flag that's only available to system server to indicate that this key is part of
+ * device encryption flow so it receives special treatment from keystore. For example this key
+ * will not be super encrypted, and it will be stored separately under an unique UID instead
+ * of the caller UID i.e. SYSTEM.
+ *
+ * Need to be in sync with KeyStoreFlag in system/security/keystore/include/keystore/keystore.h
+ */
+ public static final int FLAG_CRITICAL_TO_DEVICE_ENCRYPTION = 1 << 3;
+
// States
public enum State { UNLOCKED, LOCKED, UNINITIALIZED };
@@ -626,6 +636,15 @@
}
}
+ public int attestDeviceIds(KeymasterArguments params, KeymasterCertificateChain outChain) {
+ try {
+ return mBinder.attestDeviceIds(params, outChain);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Cannot connect to keystore", e);
+ return SYSTEM_ERROR;
+ }
+ }
+
/**
* Notify keystore that the device went off-body.
*/
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
index 64b10ab..bab4010 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
@@ -351,6 +351,9 @@
}
} else if (param instanceof KeyProtection) {
spec = (KeyProtection) param;
+ if (spec.isCriticalToDeviceEncryption()) {
+ flags |= KeyStore.FLAG_CRITICAL_TO_DEVICE_ENCRYPTION;
+ }
} else {
throw new KeyStoreException(
"Unsupported protection parameter class:" + param.getClass().getName()
@@ -719,6 +722,10 @@
} catch (IllegalArgumentException | IllegalStateException e) {
throw new KeyStoreException(e);
}
+ int flags = 0;
+ if (params.isCriticalToDeviceEncryption()) {
+ flags |= KeyStore.FLAG_CRITICAL_TO_DEVICE_ENCRYPTION;
+ }
Credentials.deleteAllTypesForAlias(mKeyStore, entryAlias, mUid);
String keyAliasInKeystore = Credentials.USER_SECRET_KEY + entryAlias;
@@ -728,7 +735,7 @@
KeymasterDefs.KM_KEY_FORMAT_RAW,
keyMaterial,
mUid,
- 0, // flags
+ flags,
new KeyCharacteristics());
if (errorCode != KeyStore.NO_ERROR) {
throw new KeyStoreException("Failed to import secret key. Keystore error code: "
diff --git a/keystore/java/android/security/keystore/AttestationUtils.java b/keystore/java/android/security/keystore/AttestationUtils.java
index 0f98392..cf4347d 100644
--- a/keystore/java/android/security/keystore/AttestationUtils.java
+++ b/keystore/java/android/security/keystore/AttestationUtils.java
@@ -23,10 +23,8 @@
import android.annotation.TestApi;
import android.content.Context;
import android.os.Build;
-import android.os.Process;
import android.security.KeyStore;
import android.security.KeyStoreException;
-import android.security.keymaster.KeyCharacteristics;
import android.security.keymaster.KeymasterArguments;
import android.security.keymaster.KeymasterCertificateChain;
import android.security.keymaster.KeymasterDefs;
@@ -38,10 +36,8 @@
import java.nio.charset.StandardCharsets;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
-import java.security.spec.RSAKeyGenParameterSpec;
import java.util.Collection;
import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
/**
* Utilities for attesting the device's hardware identifiers.
@@ -51,8 +47,6 @@
@SystemApi
@TestApi
public abstract class AttestationUtils {
- private static AtomicInteger sSequenceNumber = new AtomicInteger(0);
-
private AttestationUtils() {
}
@@ -171,59 +165,30 @@
attestArgs.addBytes(KeymasterDefs.KM_TAG_ATTESTATION_ID_MODEL,
Build.MODEL.getBytes(StandardCharsets.UTF_8));
- final KeyStore keyStore = KeyStore.getInstance();
- final String keyAlias = "android_internal_device_id_attestation-"
- + Process.myPid() + "-" + sSequenceNumber.incrementAndGet();
- // Clear any leftover temporary key.
- if (!keyStore.delete(keyAlias)) {
- throw new DeviceIdAttestationException("Unable to remove temporary key");
+ // Perform attestation.
+ final KeymasterCertificateChain outChain = new KeymasterCertificateChain();
+ final int errorCode = KeyStore.getInstance().attestDeviceIds(attestArgs, outChain);
+ if (errorCode != KeyStore.NO_ERROR) {
+ throw new DeviceIdAttestationException("Unable to perform attestation",
+ KeyStore.getKeyStoreException(errorCode));
}
+
+ // Extract certificate chain.
+ final Collection<byte[]> rawChain = outChain.getCertificates();
+ if (rawChain.size() < 2) {
+ throw new DeviceIdAttestationException("Attestation certificate chain contained "
+ + rawChain.size() + " entries. At least two are required.");
+ }
+ final ByteArrayOutputStream concatenatedRawChain = new ByteArrayOutputStream();
try {
- // Generate a temporary key.
- final KeymasterArguments generateArgs = new KeymasterArguments();
- generateArgs.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_VERIFY);
- generateArgs.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_RSA);
- generateArgs.addEnum(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_NONE);
- generateArgs.addEnum(KeymasterDefs.KM_TAG_DIGEST, KeymasterDefs.KM_DIGEST_NONE);
- generateArgs.addBoolean(KeymasterDefs.KM_TAG_NO_AUTH_REQUIRED);
- generateArgs.addUnsignedInt(KeymasterDefs.KM_TAG_KEY_SIZE, 2048);
- generateArgs.addUnsignedLong(KeymasterDefs.KM_TAG_RSA_PUBLIC_EXPONENT,
- RSAKeyGenParameterSpec.F4);
- int errorCode = keyStore.generateKey(keyAlias, generateArgs, null, 0,
- new KeyCharacteristics());
- if (errorCode != KeyStore.NO_ERROR) {
- throw new DeviceIdAttestationException("Unable to create temporary key",
- KeyStore.getKeyStoreException(errorCode));
+ for (final byte[] cert : rawChain) {
+ concatenatedRawChain.write(cert);
}
-
- // Perform attestation.
- final KeymasterCertificateChain outChain = new KeymasterCertificateChain();
- errorCode = keyStore.attestKey(keyAlias, attestArgs, outChain);
- if (errorCode != KeyStore.NO_ERROR) {
- throw new DeviceIdAttestationException("Unable to perform attestation",
- KeyStore.getKeyStoreException(errorCode));
- }
-
- // Extract certificate chain.
- final Collection<byte[]> rawChain = outChain.getCertificates();
- if (rawChain.size() < 2) {
- throw new DeviceIdAttestationException("Attestation certificate chain contained "
- + rawChain.size() + " entries. At least two are required.");
- }
- final ByteArrayOutputStream concatenatedRawChain = new ByteArrayOutputStream();
- try {
- for (final byte[] cert : rawChain) {
- concatenatedRawChain.write(cert);
- }
- return CertificateFactory.getInstance("X.509").generateCertificates(
- new ByteArrayInputStream(concatenatedRawChain.toByteArray()))
- .toArray(new X509Certificate[0]);
- } catch (Exception e) {
- throw new DeviceIdAttestationException("Unable to construct certificate chain", e);
- }
- } finally {
- // Remove temporary key.
- keyStore.delete(keyAlias);
+ return CertificateFactory.getInstance("X.509").generateCertificates(
+ new ByteArrayInputStream(concatenatedRawChain.toByteArray()))
+ .toArray(new X509Certificate[0]);
+ } catch (Exception e) {
+ throw new DeviceIdAttestationException("Unable to construct certificate chain", e);
}
}
}
diff --git a/keystore/java/android/security/keystore/KeyProtection.java b/keystore/java/android/security/keystore/KeyProtection.java
index 2592a97..2eb0663 100644
--- a/keystore/java/android/security/keystore/KeyProtection.java
+++ b/keystore/java/android/security/keystore/KeyProtection.java
@@ -227,6 +227,7 @@
private final boolean mUserAuthenticationValidWhileOnBody;
private final boolean mInvalidatedByBiometricEnrollment;
private final long mBoundToSecureUserId;
+ private final boolean mCriticalToDeviceEncryption;
private KeyProtection(
Date keyValidityStart,
@@ -242,7 +243,8 @@
int userAuthenticationValidityDurationSeconds,
boolean userAuthenticationValidWhileOnBody,
boolean invalidatedByBiometricEnrollment,
- long boundToSecureUserId) {
+ long boundToSecureUserId,
+ boolean criticalToDeviceEncryption) {
mKeyValidityStart = Utils.cloneIfNotNull(keyValidityStart);
mKeyValidityForOriginationEnd = Utils.cloneIfNotNull(keyValidityForOriginationEnd);
mKeyValidityForConsumptionEnd = Utils.cloneIfNotNull(keyValidityForConsumptionEnd);
@@ -259,6 +261,7 @@
mUserAuthenticationValidWhileOnBody = userAuthenticationValidWhileOnBody;
mInvalidatedByBiometricEnrollment = invalidatedByBiometricEnrollment;
mBoundToSecureUserId = boundToSecureUserId;
+ mCriticalToDeviceEncryption = criticalToDeviceEncryption;
}
/**
@@ -458,6 +461,16 @@
}
/**
+ * Return whether this key is critical to the device encryption flow.
+ *
+ * @see android.security.KeyStore#FLAG_CRITICAL_TO_DEVICE_ENCRYPTION
+ * @hide
+ */
+ public boolean isCriticalToDeviceEncryption() {
+ return mCriticalToDeviceEncryption;
+ }
+
+ /**
* Builder of {@link KeyProtection} instances.
*/
public final static class Builder {
@@ -477,6 +490,7 @@
private boolean mInvalidatedByBiometricEnrollment = true;
private long mBoundToSecureUserId = GateKeeper.INVALID_SECURE_USER_ID;
+ private boolean mCriticalToDeviceEncryption = false;
/**
* Creates a new instance of the {@code Builder}.
*
@@ -817,6 +831,20 @@
}
/**
+ * Set whether this key is critical to the device encryption flow
+ *
+ * This is a special flag only available to system servers to indicate the current key
+ * is part of the device encryption flow.
+ *
+ * @see android.security.KeyStore#FLAG_CRITICAL_TO_DEVICE_ENCRYPTION
+ * @hide
+ */
+ public Builder setCriticalToDeviceEncryption(boolean critical) {
+ mCriticalToDeviceEncryption = critical;
+ return this;
+ }
+
+ /**
* Builds an instance of {@link KeyProtection}.
*
* @throws IllegalArgumentException if a required field is missing
@@ -837,7 +865,8 @@
mUserAuthenticationValidityDurationSeconds,
mUserAuthenticationValidWhileOnBody,
mInvalidatedByBiometricEnrollment,
- mBoundToSecureUserId);
+ mBoundToSecureUserId,
+ mCriticalToDeviceEncryption);
}
}
}
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index 09840a5..f661f29b 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -6664,6 +6664,10 @@
return NO_ERROR;
}
+void DynamicRefTable::addMapping(uint8_t buildPackageId, uint8_t runtimePackageId) {
+ mLookupTable[buildPackageId] = runtimePackageId;
+}
+
status_t DynamicRefTable::lookupResourceId(uint32_t* resId) const {
uint32_t res = *resId;
size_t packageId = Res_GETPACKAGE(res) + 1;
diff --git a/libs/androidfw/include/androidfw/ResourceTypes.h b/libs/androidfw/include/androidfw/ResourceTypes.h
index 306ff9a..7a6e37d 100644
--- a/libs/androidfw/include/androidfw/ResourceTypes.h
+++ b/libs/androidfw/include/androidfw/ResourceTypes.h
@@ -1610,6 +1610,8 @@
// the given package.
status_t addMapping(const String16& packageName, uint8_t packageId);
+ void addMapping(uint8_t buildPackageId, uint8_t runtimePackageId);
+
// Performs the actual conversion of build-time resource ID to run-time
// resource ID.
status_t lookupResourceId(uint32_t* resId) const;
diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk
index fde0e47..5ef49dc 100644
--- a/libs/hwui/Android.mk
+++ b/libs/hwui/Android.mk
@@ -7,7 +7,7 @@
# Enables fine-grained GLES error checking
# If set to true, every GLES call is wrapped & error checked
# Has moderate overhead
-HWUI_ENABLE_OPENGL_VALIDATION := true
+HWUI_ENABLE_OPENGL_VALIDATION := false
hwui_src_files := \
hwui/Bitmap.cpp \
diff --git a/libs/hwui/PathTessellator.cpp b/libs/hwui/PathTessellator.cpp
index 9246237..64b2c45 100644
--- a/libs/hwui/PathTessellator.cpp
+++ b/libs/hwui/PathTessellator.cpp
@@ -1005,6 +1005,14 @@
break;
}
default:
+ static_assert(SkPath::kMove_Verb == 0
+ && SkPath::kLine_Verb == 1
+ && SkPath::kQuad_Verb == 2
+ && SkPath::kConic_Verb == 3
+ && SkPath::kCubic_Verb == 4
+ && SkPath::kClose_Verb == 5
+ && SkPath::kDone_Verb == 6,
+ "Path enum changed, new types may have been added");
break;
}
}
diff --git a/libs/hwui/Texture.h b/libs/hwui/Texture.h
index 052c018..55b74ed 100644
--- a/libs/hwui/Texture.h
+++ b/libs/hwui/Texture.h
@@ -28,6 +28,7 @@
#include <ui/ColorSpace.h>
#include <GLES2/gl2.h>
+#include <GLES3/gl3.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <SkBitmap.h>
diff --git a/libs/hwui/tests/common/TestUtils.h b/libs/hwui/tests/common/TestUtils.h
index 0c7bb60..dd45786 100644
--- a/libs/hwui/tests/common/TestUtils.h
+++ b/libs/hwui/tests/common/TestUtils.h
@@ -88,7 +88,8 @@
}; \
INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, OpenGL); \
INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, SkiaGL); \
- INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, SkiaVulkan); \
+ /* Temporarily disabling Vulkan until we can figure out a way to stub out the driver */ \
+ /* INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, SkiaVulkan); */ \
void test_case_name##_##test_name##_RenderThreadTest::doTheThing(renderthread::RenderThread& renderThread)
/**
@@ -111,7 +112,8 @@
static void doTheThing(renderthread::RenderThread& renderThread); \
}; \
INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, SkiaGL); \
- INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, SkiaVulkan); \
+ /* Temporarily disabling Vulkan until we can figure out a way to stub out the driver */ \
+ /* INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, SkiaVulkan); */ \
void test_case_name##_##test_name##_RenderThreadTest::doTheThing(renderthread::RenderThread& renderThread)
/**
diff --git a/location/java/android/location/GnssStatus.java b/location/java/android/location/GnssStatus.java
index a44bc5b..912551f 100644
--- a/location/java/android/location/GnssStatus.java
+++ b/location/java/android/location/GnssStatus.java
@@ -55,9 +55,9 @@
public static final int GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY = (1 << 3);
/** @hide */
- public static final int SVID_SHIFT_WIDTH = 7;
+ public static final int SVID_SHIFT_WIDTH = 8;
/** @hide */
- public static final int CONSTELLATION_TYPE_SHIFT_WIDTH = 3;
+ public static final int CONSTELLATION_TYPE_SHIFT_WIDTH = 4;
/** @hide */
public static final int CONSTELLATION_TYPE_MASK = 0xf;
diff --git a/media/java/android/media/AudioFocusInfo.java b/media/java/android/media/AudioFocusInfo.java
index 60dbe00..6d9c5e2 100644
--- a/media/java/android/media/AudioFocusInfo.java
+++ b/media/java/android/media/AudioFocusInfo.java
@@ -33,6 +33,7 @@
private final int mClientUid;
private final String mClientId;
private final String mPackageName;
+ private final int mSdkTarget;
private int mGainRequest;
private int mLossReceived;
private int mFlags;
@@ -49,7 +50,7 @@
* @hide
*/
public AudioFocusInfo(AudioAttributes aa, int clientUid, String clientId, String packageName,
- int gainRequest, int lossReceived, int flags) {
+ int gainRequest, int lossReceived, int flags, int sdk) {
mAttributes = aa == null ? new AudioAttributes.Builder().build() : aa;
mClientUid = clientUid;
mClientId = clientId == null ? "" : clientId;
@@ -57,6 +58,7 @@
mGainRequest = gainRequest;
mLossReceived = lossReceived;
mFlags = flags;
+ mSdkTarget = sdk;
}
@@ -97,6 +99,9 @@
public int getLossReceived() { return mLossReceived; }
/** @hide */
+ public int getSdkTarget() { return mSdkTarget; }
+
+ /** @hide */
public void clearLossReceived() { mLossReceived = 0; }
/**
@@ -122,6 +127,7 @@
dest.writeInt(mGainRequest);
dest.writeInt(mLossReceived);
dest.writeInt(mFlags);
+ dest.writeInt(mSdkTarget);
}
@SystemApi
@@ -161,6 +167,9 @@
if (mFlags != other.mFlags) {
return false;
}
+ if (mSdkTarget != other.mSdkTarget) {
+ return false;
+ }
return true;
}
@@ -175,7 +184,8 @@
in.readString(), //String packageName
in.readInt(), //int gainRequest
in.readInt(), //int lossReceived
- in.readInt() //int flags
+ in.readInt(), //int flags
+ in.readInt() //int sdkTarget
);
}
diff --git a/media/java/android/media/AudioFocusRequest.java b/media/java/android/media/AudioFocusRequest.java
index 2e4d199..29d1986 100644
--- a/media/java/android/media/AudioFocusRequest.java
+++ b/media/java/android/media/AudioFocusRequest.java
@@ -29,14 +29,104 @@
* request and abandon audio focus, respectively
* with {@link AudioManager#requestAudioFocus(AudioFocusRequest)} and
* {@link AudioManager#abandonAudioFocusRequest(AudioFocusRequest)}.
- * <p>In the context of describing audio focus, the term "ducking" is used. It describes a temporary
- * lowering of the audio level of an application in response to another application playing audio
- * concurrently. An example is during the playback of driving directions,
- * a user listening to music expects the music to "duck" during the playback of the message
- * announcing directions.
+ *
+ * <h3>What is audio focus?</h3>
+ * <p>Audio focus is a concept introduced in API 8. It is used to convey the fact that a user can
+ * only focus on a single audio stream at a time, e.g. listening to music or a podcast, but not
+ * both at the same time. In some cases, multiple audio streams can be playing at the same time,
+ * but there is only one the user would really listen to (focus on), while the other plays in
+ * the background. An example of this is driving directions being spoken while music plays at
+ * a reduced volume (a.k.a. ducking).
+ * <p>When an application requests audio focus, it expresses its intention to “own” audio focus to
+ * play audio. Let’s review the different types of focus requests, the return value after a request,
+ * and the responses to a loss.
+ * <br><b>Note:<b> applications should not play anything until granted focus.
+ *
+ * <h3>The different types of focus requests</h3>
+ * <p>There are four focus request types. A successful focus request with each will yield different
+ * behaviors by the system and the other application that previously held audio focus.
+ * <ul>
+ * <li>{@link AudioManager#AUDIOFOCUS_GAIN} expresses the fact that your application is now the
+ * sole source of audio that the user is listening to. The duration of the audio playback is
+ * unknown, and is possibly very long: after the user finishes interacting with your application,
+ * (s)he doesn’t expect another audio stream to resume. Examples of uses of this focus gain are
+ * for music playback, for a game or a video player.</li>
+ *
+ * <li>{@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT} is for a situation when you know your
+ * application is temporarily grabbing focus from the current owner, but the user expects playback
+ * to go back to where it was once your application no longer requires audio focus. An example is
+ * for playing an alarm, or during a VoIP call. The playback is known to be finite: the alarm will
+ * time-out or be dismissed, the VoIP call has a beginning and an end. When any of those events
+ * ends, and if the user was listening to music when it started, the user expects music to resume,
+ * but didn’t wish to listen to both at the same time.</li>
+ *
+ * <li>{@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK}: this focus request type is similar
+ * to {@code AUDIOFOCUS_GAIN_TRANSIENT} for the temporary aspect of the focus request, but it also
+ * expresses the fact during the time you own focus, you allow another application to keep playing
+ * at a reduced volume, “ducked”. Examples are when playing driving directions or notifications,
+ * it’s ok for music to keep playing, but not loud enough that it would prevent the directions to
+ * be hard to understand. A typical attenuation by the “ducked” application is a factor of 0.2f
+ * (or -14dB), that can for instance be applied with {@code MediaPlayer.setVolume(0.2f)} when
+ * using this class for playback.</li>
+ *
+ * <li>{@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE} is also for a temporary request,
+ * but also expresses that your application expects the device to not play anything else. This is
+ * typically used if you are doing audio recording or speech recognition, and don’t want for
+ * examples notifications to be played by the system during that time.</li>
+ * </ul>
+ *
+ * <p>An {@code AudioFocusRequest} instance always contains one of the four types of requests
+ * explained above. It is passed when building an {@code AudioFocusRequest} instance with its
+ * builder in the {@link Builder} constructor {@link Builder#Builder(int)}, or with
+ * {@link Builder#setFocusGain(int)} after copying an existing instance with
+ * {@link Builder#Builder(AudioFocusRequest)}.
+ *
+ * <h3>Qualifying your focus request</h3>
+ * <h4>Use case requiring a focus request</h4>
+ * <p>Any focus request is qualified by the {@link AudioAttributes}
+ * (see {@link Builder#setAudioAttributes(AudioAttributes)}) that describe the audio use case that
+ * will follow the request (once it's successful or granted). It is recommended to use the
+ * same {@code AudioAttributes} for the request as the attributes you are using for audio/media
+ * playback.
+ * <br>If no attributes are set, default attributes of {@link AudioAttributes#USAGE_MEDIA} are used.
+ *
+ * <h4>Delayed focus</h4>
+ * <p>Audio focus can be "locked" by the system for a number of reasons: during a phone call, when
+ * the car to which the device is connected plays an emergency message... To support these
+ * situations, the application can request to be notified when its request is fulfilled, by flagging
+ * its request as accepting delayed focus, with {@link Builder#setAcceptsDelayedFocusGain(boolean)}.
+ * <br>If focus is requested while being locked by the system,
+ * {@link AudioManager#requestAudioFocus(AudioFocusRequest)} will return
+ * {@link AudioManager#AUDIOFOCUS_REQUEST_DELAYED}. When focus isn't locked anymore, the focus
+ * listener set with {@link Builder#setOnAudioFocusChangeListener(OnAudioFocusChangeListener)}
+ * or with {@link Builder#setOnAudioFocusChangeListener(OnAudioFocusChangeListener, Handler)} will
+ * be called to notify the application it now owns audio focus.
+ *
+ * <h4>Pausing vs ducking</h4>
+ * <p>When an application requested audio focus with
+ * {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK}, the system will duck the current focus
+ * owner. Note that this behavior is <b>new for Android O<b>, whereas applications targeting SDK
+ * up to API 25, applications had to implement the ducking themselves when they received a focus
+ * loss of {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK}.
+ * <br>But ducking is not always the behavior expected by the user. A typical example is when the
+ * device plays driving directions while the user is listening to an audio book or podcast, and
+ * expects the audio playback to pause, instead of duck, as it is hard to understand a navigation
+ * prompt and spoken content at the same time. Therefore the system will not automatically duck
+ * when it detects it would be ducking spoken content: such content is detected when the
+ * {@code AudioAttributes} of the player are qualified by
+ * {@link AudioAttributes#CONTENT_TYPE_SPEECH}. Refer for instance to
+ * {@link AudioAttributes.Builder#setContentType(int)} and
+ * {@link MediaPlayer#setAudioAttributes(AudioAttributes)} if you are writing a media playback
+ * application for audio book, podcasts... Since the system will not automatically duck applications
+ * that play speech, it calls their focus listener instead to notify them of
+ * {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK}, so they can pause instead. Note that
+ * this behavior is independent of the use of {@code AudioFocusRequest}, but tied to the use
+ * of {@code AudioAttributes}.
+ * <p>If your application requires pausing instead of ducking for any other reason than playing
+ * speech, you can also declare so with {@link Builder#setWillPauseWhenDucked(boolean)}, which will
+ * cause the system to call your focus listener instead of automatically ducking.
+ *
*/
-// TODO use this class to provide more documentation about audio focus and the new behaviors
-// describe up to N, and after.
public final class AudioFocusRequest {
// default attributes for the request when not specified
@@ -250,20 +340,38 @@
* {@link AudioManager#requestAudioFocus(AudioFocusRequest)}, and until being abandoned
* with {@link AudioManager#abandonAudioFocusRequest(AudioFocusRequest)}.
* Note that only focus changes (gains and losses) affecting the focus owner are reported,
+ * not gains and losses of other focus requesters in the system.<br>
+ * Notifications are delivered on the main {@link Looper}.
+ * @param listener the listener receiving the focus change notifications.
+ * @return this {@code Builder} instance.
+ * @throws NullPointerException thrown when a null focus listener is used.
+ */
+ public @NonNull Builder setOnAudioFocusChangeListener(
+ @NonNull OnAudioFocusChangeListener listener) {
+ if (listener == null) {
+ throw new NullPointerException("Illegal null focus listener");
+ }
+ mFocusListener = listener;
+ mListenerHandler = null;
+ return this;
+ }
+
+ /**
+ * Sets the listener called when audio focus changes after being requested with
+ * {@link AudioManager#requestAudioFocus(AudioFocusRequest)}, and until being abandoned
+ * with {@link AudioManager#abandonAudioFocusRequest(AudioFocusRequest)}.
+ * Note that only focus changes (gains and losses) affecting the focus owner are reported,
* not gains and losses of other focus requesters in the system.
* @param listener the listener receiving the focus change notifications.
* @param handler the {@link Handler} for the thread on which to execute
- * the notifications. If {@code null}, the {@code Handler} associated with the main
- * {@link Looper} will be used.
+ * the notifications.
* @return this {@code Builder} instance.
- * @throws IllegalArgumentException thrown when a non-null handler is used with a null
- * listener.
+ * @throws NullPointerException thrown when a null focus listener or handler is used.
*/
public @NonNull Builder setOnAudioFocusChangeListener(
- @Nullable OnAudioFocusChangeListener listener, @Nullable Handler handler) {
- if (listener == null && handler != null) {
- throw new IllegalArgumentException(
- "Illegal non-null handler without a focus listener");
+ @NonNull OnAudioFocusChangeListener listener, @NonNull Handler handler) {
+ if (listener == null || handler == null) {
+ throw new NullPointerException("Illegal null focus listener or handler");
}
mFocusListener = listener;
mListenerHandler = handler;
@@ -272,7 +380,7 @@
/**
* Sets the {@link AudioAttributes} to be associated with the focus request, and which
- * describe the use case describing why focus is requested.
+ * describe the use case for which focus is requested.
* As the focus requests typically precede audio playback, this information is used on
* certain platforms to declare the subsequent playback use case. It is therefore good
* practice to use in this method the same {@code AudioAttributes} as used for
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 4adbf79..ce07c99 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -34,6 +34,7 @@
import android.media.session.MediaSessionLegacyHelper;
import android.media.session.MediaSessionManager;
import android.os.Binder;
+import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@@ -2483,13 +2484,21 @@
registerAudioFocusRequest(afr);
final IAudioService service = getService();
final int status;
+ int sdk;
+ try {
+ sdk = getContext().getApplicationInfo().targetSdkVersion;
+ } catch (NullPointerException e) {
+ // some tests don't have a Context
+ sdk = Build.VERSION.SDK_INT;
+ }
try {
status = service.requestAudioFocus(afr.getAudioAttributes(),
afr.getFocusGain(), mICallBack,
mAudioFocusDispatcher,
getIdForAudioFocusListener(afr.getOnAudioFocusChangeListener()),
getContext().getOpPackageName() /* package name */, afr.getFlags(),
- ap != null ? ap.cb() : null);
+ ap != null ? ap.cb() : null,
+ sdk);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2515,7 +2524,7 @@
AudioSystem.IN_VOICE_COMM_FOCUS_ID,
getContext().getOpPackageName(),
AUDIOFOCUS_FLAG_LOCK,
- null /* policy token */);
+ null /* policy token */, 0 /* sdk n/a here*/);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index 884d41e..9c138e3 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -121,7 +121,7 @@
int requestAudioFocus(in AudioAttributes aa, int durationHint, IBinder cb,
IAudioFocusDispatcher fd, String clientId, String callingPackageName, int flags,
- IAudioPolicyCallback pcb);
+ IAudioPolicyCallback pcb, int sdk);
int abandonAudioFocus(IAudioFocusDispatcher fd, String clientId, in AudioAttributes aa,
in String callingPackageName);
diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java
index 06555c1..ccdf5ae 100644
--- a/media/java/android/media/ImageReader.java
+++ b/media/java/android/media/ImageReader.java
@@ -728,15 +728,15 @@
if (format == ImageFormat.PRIVATE) {
// Usage need to be either USAGE0_GPU_SAMPLED_IMAGE or USAGE0_VIDEO_ENCODE or combined.
- boolean isAllowed = (usage == HardwareBuffer.USAGE0_GPU_SAMPLED_IMAGE);
- isAllowed = isAllowed || (usage == HardwareBuffer.USAGE0_VIDEO_ENCODE);
+ boolean isAllowed = (usage == HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE);
+ isAllowed = isAllowed || (usage == HardwareBuffer.USAGE_VIDEO_ENCODE);
isAllowed = isAllowed || (usage ==
- (HardwareBuffer.USAGE0_VIDEO_ENCODE | HardwareBuffer.USAGE0_GPU_SAMPLED_IMAGE));
+ (HardwareBuffer.USAGE_VIDEO_ENCODE | HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE));
return isAllowed;
} else {
// Usage need to make the buffer CPU readable for explicit format.
- return ((usage == HardwareBuffer.USAGE0_CPU_READ) ||
- (usage == HardwareBuffer.USAGE0_CPU_READ_OFTEN));
+ return ((usage == HardwareBuffer.USAGE_CPU_READ_RARELY) ||
+ (usage == HardwareBuffer.USAGE_CPU_READ_OFTEN));
}
}
diff --git a/media/java/android/media/VolumeShaper.java b/media/java/android/media/VolumeShaper.java
index 1dda6a4..8f4721f 100644
--- a/media/java/android/media/VolumeShaper.java
+++ b/media/java/android/media/VolumeShaper.java
@@ -301,7 +301,7 @@
.setInterpolatorType(INTERPOLATOR_TYPE_LINEAR)
.setCurve(new float[] {0.f, 1.f} /* times */,
new float[] {0.f, 1.f} /* volumes */)
- .setDurationMillis(1000.)
+ .setDuration(1000)
.build();
/**
@@ -314,7 +314,7 @@
.setInterpolatorType(INTERPOLATOR_TYPE_CUBIC)
.setCurve(new float[] {0.f, 1.f} /* times */,
new float[] {0.f, 1.f} /* volumes */)
- .setDurationMillis(1000.)
+ .setDuration(1000)
.build();
/**
@@ -348,12 +348,12 @@
SINE_RAMP = new VolumeShaper.Configuration.Builder()
.setInterpolatorType(INTERPOLATOR_TYPE_CUBIC)
.setCurve(times, sines)
- .setDurationMillis(1000.)
+ .setDuration(1000)
.build();
SCURVE_RAMP = new VolumeShaper.Configuration.Builder()
.setInterpolatorType(INTERPOLATOR_TYPE_CUBIC)
.setCurve(times, scurve)
- .setDurationMillis(1000.)
+ .setDuration(1000)
.build();
}
@@ -569,8 +569,9 @@
/**
* Returns the duration of the volume shape in milliseconds.
*/
- public double getDurationMillis() {
- return mDurationMs;
+ public long getDuration() {
+ // casting is safe here as the duration was set as a long in the Builder
+ return (long) mDurationMs;
}
/**
@@ -700,7 +701,7 @@
* .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
* .setCurve(new float[] { 0.f, 1.f }, // times
* new float[] { 0.f, 1.f }) // volumes
- * .setDurationMillis(1000.)
+ * .setDuration(1000)
* .build();
* </pre>
* <p>
@@ -731,7 +732,7 @@
mId = configuration.getId();
mOptionFlags = configuration.getAllOptionFlags();
mInterpolatorType = configuration.getInterpolatorType();
- mDurationMs = configuration.getDurationMillis();
+ mDurationMs = configuration.getDuration();
mTimes = configuration.getTimes().clone();
mVolumes = configuration.getVolumes().clone();
}
@@ -810,12 +811,12 @@
* @throws IllegalArgumentException if {@code durationMillis}
* is not strictly positive.
*/
- public @NonNull Builder setDurationMillis(double durationMillis) {
- if (durationMillis <= 0.) {
+ public @NonNull Builder setDuration(long durationMillis) {
+ if (durationMillis <= 0) {
throw new IllegalArgumentException(
"duration: " + durationMillis + " not positive");
}
- mDurationMs = durationMillis;
+ mDurationMs = (double) durationMillis;
return this;
}
@@ -833,7 +834,7 @@
* time (x) coordinates should be monotonically increasing, from 0.f to 1.f;
* volume (y) coordinates must be within 0.f to 1.f.
* <p>
- * The time scale is set by {@link #setDurationMillis}.
+ * The time scale is set by {@link #setDuration}.
* <p>
* @param times an array of float values representing
* the time line of the volume curve.
diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java
index 8678860..4496a82 100644
--- a/media/java/android/media/tv/TvContract.java
+++ b/media/java/android/media/tv/TvContract.java
@@ -19,8 +19,10 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SdkConstant;
import android.annotation.StringDef;
import android.annotation.SystemApi;
+import android.annotation.SdkConstant.SdkConstantType;
import android.app.Activity;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -90,6 +92,7 @@
* @hide
*/
@SystemApi
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_CHANNEL_BROWSABLE_REQUESTED =
"android.media.tv.action.CHANNEL_BROWSABLE_REQUESTED";
@@ -105,6 +108,7 @@
* integer.</li>
* </ul>
*/
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_REQUEST_CHANNEL_BROWSABLE =
"android.media.tv.action.REQUEST_CHANNEL_BROWSABLE";
@@ -119,6 +123,7 @@
* <li>{@link #EXTRA_PREVIEW_PROGRAM_ID}: the disabled preview program ID.</li>
* </ul>
*/
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_PREVIEW_PROGRAM_BROWSABLE_DISABLED =
"android.media.tv.action.PREVIEW_PROGRAM_BROWSABLE_DISABLED";
@@ -133,6 +138,7 @@
* <li>{@link #EXTRA_WATCH_NEXT_PROGRAM_ID}: the disabled "watch next" program ID.</li>
* </ul>
*/
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED =
"android.media.tv.action.WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED";
@@ -146,6 +152,7 @@
* <li>{@link #EXTRA_WATCH_NEXT_PROGRAM_ID}: the ID of the new watch next program.</li>
* </ul>
*/
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT =
"android.media.tv.action.PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT";
@@ -163,6 +170,7 @@
* <code>AndroidManifest.xml</code>.</li>
* </ul>
*/
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_INITIALIZE_PROGRAMS =
"android.media.tv.action.INITIALIZE_PROGRAMS";
@@ -1487,8 +1495,7 @@
/**
* The URI for the preview video.
*
- * <p>This is only relevant to {@link Channels#TYPE_PREVIEW}. The data in the column must be
- * a URL, or a URI in one of the following formats:
+ * <p>The data in the column must be a URL, or a URI in one of the following formats:
*
* <ul>
* <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li>
@@ -1504,9 +1511,8 @@
String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
/**
- * The last playback position (in milliseconds) of the preview video.
- *
- * <p>This is only relevant to {@link Channels#TYPE_PREVIEW}.
+ * The last playback position (in milliseconds) of the original content of this preview
+ * program.
*
* <p>Can be empty.
*
@@ -1516,9 +1522,7 @@
"last_playback_position_millis";
/**
- * The duration (in milliseconds) of the preview video.
- *
- * <p>This is only relevant to {@link Channels#TYPE_PREVIEW}.
+ * The duration (in milliseconds) of the original content of this preview program.
*
* <p>Can be empty.
*
@@ -2748,8 +2752,6 @@
*
* <p>This is a part of the channel URI and matches to {@link BaseColumns#_ID}.
*
- * <p>This is a required field.
- *
* <p>Type: INTEGER (long)
*/
public static final String COLUMN_CHANNEL_ID = "channel_id";
@@ -2996,6 +2998,8 @@
*/
public static final String COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS =
"last_engagement_time_utc_millis";
+
+ private WatchNextPrograms() {}
}
/**
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/CodecTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/CodecTest.java
index 48b2878..4361b96 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/CodecTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/CodecTest.java
@@ -25,6 +25,7 @@
import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.media.MediaCodecInfo;
import android.media.MediaCodecList;
import android.media.MediaExtractor;
import android.media.MediaFormat;
@@ -42,7 +43,9 @@
import java.io.OutputStream;
import java.io.Writer;
import java.io.FileOutputStream;
+import java.util.HashSet;
import java.util.Random;
+import java.util.Set;
/**
* Junit / Instrumentation test case for the media player api
@@ -69,6 +72,7 @@
public static int mMediaInfoBadInterleavingCount = 0;
public static int mMediaInfoNotSeekableCount = 0;
public static int mMediaInfoMetdataUpdateCount = 0;
+ private static Set<String> mSupportedTypes = new HashSet<>();
public static String printCpuInfo(){
String cm = "dumpsys cpuinfo";
@@ -792,7 +796,7 @@
return playMediaSamples(filePath, 2000, false /* streamingTest */);
}
- // For each media file, forward twice and backward once, then play to the end
+ // For each media file, just play to the end
public static boolean playMediaSamples(String filePath, int buffertime, boolean streamingTest)
throws Exception {
int duration = 0;
@@ -812,7 +816,14 @@
boolean hasSupportedVideo = false;
if (!streamingTest) {
- final MediaCodecList list = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
+ if (mSupportedTypes.isEmpty()) {
+ final MediaCodecList list = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
+ for (MediaCodecInfo info : list.getCodecInfos()) {
+ for (String type : info.getSupportedTypes()) {
+ mSupportedTypes.add(type);
+ }
+ }
+ }
final MediaExtractor extractor = new MediaExtractor();
try {
@@ -820,12 +831,12 @@
for (int index = 0; index < extractor.getTrackCount(); ++index) {
MediaFormat format = extractor.getTrackFormat(index);
- String mime = format.getString(MediaFormat.KEY_MIME);
- if (!mime.startsWith("video/")) {
+ String type = format.getString(MediaFormat.KEY_MIME);
+ if (!type.startsWith("video/")) {
continue;
}
- if (list.findDecoderForFormat(format) != null) {
+ if (mSupportedTypes.contains(type)) {
hasSupportedVideo = true;
break;
}
diff --git a/packages/BackupRestoreConfirmation/res/values-zh-rTW/strings.xml b/packages/BackupRestoreConfirmation/res/values-zh-rTW/strings.xml
index 3a753a0..ce3208e 100644
--- a/packages/BackupRestoreConfirmation/res/values-zh-rTW/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-zh-rTW/strings.xml
@@ -18,18 +18,18 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="backup_confirm_title" msgid="827563724209303345">"完整備份"</string>
<string name="restore_confirm_title" msgid="5469365809567486602">"完整還原"</string>
- <string name="backup_confirm_text" msgid="1878021282758896593">"系統收到將所有資料完整備份至連線電腦的要求,請問您允許進行備份嗎?\n\n如果您本人並未提出備份要求,請勿允許繼續進行這項作業。"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"系統收到將所有資料完整備份至連線電腦的要求,請問你允許進行備份嗎?\n\n如果你本人並未提出備份要求,請勿允許繼續進行這項作業。"</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"備份我的資料"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"不要備份"</string>
- <string name="restore_confirm_text" msgid="7499866728030461776">"系統收到從連線電腦完整還原所有資料的要求,請問您允許進行還原嗎?\n\n如果您本人並未提出還原要求,請勿允許繼續進行這項作業。這項作業將取代裝置上現有的全部資料!"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"系統收到從連線電腦完整還原所有資料的要求,請問你允許進行還原嗎?\n\n如果你本人並未提出還原要求,請勿允許繼續進行這項作業。這項作業將取代裝置上現有的全部資料!"</string>
<string name="allow_restore_button_label" msgid="3081286752277127827">"還原我的資料"</string>
<string name="deny_restore_button_label" msgid="1724367334453104378">"不要還原"</string>
- <string name="current_password_text" msgid="8268189555578298067">"請在下面輸入您目前的備份密碼:"</string>
- <string name="device_encryption_restore_text" msgid="1570864916855208992">"請在下方輸入您的裝置加密密碼。"</string>
- <string name="device_encryption_backup_text" msgid="5866590762672844664">"請在下方輸入您的裝置加密密碼,這也會用來加密備份封存檔。"</string>
- <string name="backup_enc_password_text" msgid="4981585714795233099">"請輸入完整備份資料加密專用的密碼。如果您沒有輸入密碼,系統會使用您目前的備用密碼:"</string>
- <string name="backup_enc_password_optional" msgid="1350137345907579306">"如果您想要將完整備份資料進行加密,請在下面輸入一組密碼:"</string>
- <string name="backup_enc_password_required" msgid="7889652203371654149">"由於您的裝置已加密,因此您必須為您的備份加密。請在下方輸入密碼:"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"請在下面輸入你目前的備份密碼:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"請在下方輸入你的裝置加密密碼。"</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"請在下方輸入你的裝置加密密碼,這也會用來加密備份封存檔。"</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"請輸入完整備份資料加密專用的密碼。如果你沒有輸入密碼,系統會使用你目前的備用密碼:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"如果你想要將完整備份資料進行加密,請在下面輸入一組密碼:"</string>
+ <string name="backup_enc_password_required" msgid="7889652203371654149">"由於你的裝置已加密,因此你必須為你的備份加密。請在下方輸入密碼:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"如果還原的資料經過加密處理,請在下面輸入密碼:"</string>
<string name="toast_backup_started" msgid="550354281452756121">"正在開始備份..."</string>
<string name="toast_backup_ended" msgid="3818080769548726424">"備份完畢"</string>
diff --git a/packages/CaptivePortalLogin/res/values-bs/strings.xml b/packages/CaptivePortalLogin/res/values-bs/strings.xml
index 3237e5e..0b36cd0 100644
--- a/packages/CaptivePortalLogin/res/values-bs/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-bs/strings.xml
@@ -4,7 +4,7 @@
<string name="app_name" msgid="5934709770924185752">"Prijava na zaštitnom portalu"</string>
<string name="action_use_network" msgid="6076184727448466030">"Koristi ovu mrežu kakva jeste"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Ne koristi ovu mrežu"</string>
- <string name="action_bar_label" msgid="917235635415966620">"Prijavi me na mrežu"</string>
+ <string name="action_bar_label" msgid="917235635415966620">"Prijava na mrežu"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Mreža kojoj pokušavate pristupiti ima sigurnosnih problema."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Naprimjer, stranica za prijavu možda ne pripada prikazanoj organizaciji."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Ipak nastavi preko preglednika"</string>
diff --git a/packages/CaptivePortalLogin/res/values-zh-rTW/strings.xml b/packages/CaptivePortalLogin/res/values-zh-rTW/strings.xml
index 65a1d35..bd0f4b7 100644
--- a/packages/CaptivePortalLogin/res/values-zh-rTW/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-zh-rTW/strings.xml
@@ -5,7 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"依現況使用這個網路"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"不使用這個網路"</string>
<string name="action_bar_label" msgid="917235635415966620">"登入網路"</string>
- <string name="ssl_error_warning" msgid="6653188881418638872">"您嘗試加入的網路有安全問題。"</string>
+ <string name="ssl_error_warning" msgid="6653188881418638872">"你嘗試加入的網路有安全問題。"</string>
<string name="ssl_error_example" msgid="647898534624078900">"例如,登入網頁中顯示的機構可能並非該網頁實際隸屬的機構。"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"透過瀏覽器繼續"</string>
</resources>
diff --git a/packages/CarrierDefaultApp/AndroidManifest.xml b/packages/CarrierDefaultApp/AndroidManifest.xml
index e450283..2ef1cf5 100644
--- a/packages/CarrierDefaultApp/AndroidManifest.xml
+++ b/packages/CarrierDefaultApp/AndroidManifest.xml
@@ -33,6 +33,7 @@
<receiver android:name="com.android.carrierdefaultapp.CarrierDefaultBroadcastReceiver">
<intent-filter>
<action android:name="com.android.internal.telephony.CARRIER_SIGNAL_REDIRECTED" />
+ <action android:name="com.android.internal.telephony.CARRIER_SIGNAL_RESET" />
</intent-filter>
</receiver>
<service android:name="com.android.carrierdefaultapp.ProvisionObserver"
diff --git a/packages/CarrierDefaultApp/res/values-bs/strings.xml b/packages/CarrierDefaultApp/res/values-bs/strings.xml
index ec0a3a5..110924f 100644
--- a/packages/CarrierDefaultApp/res/values-bs/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-bs/strings.xml
@@ -8,7 +8,7 @@
<string name="portal_notification_detail" msgid="2295729385924660881">"Dodirnite da posjetite %s web lokaciju"</string>
<string name="no_data_notification_detail" msgid="3112125343857014825">"Obratite se pružaocu usluga %s"</string>
<string name="mobile_data_status_notification_channel_name" msgid="833999690121305708">"Status mobilnih podataka"</string>
- <string name="action_bar_label" msgid="4290345990334377177">"Prijavite se na mobilnu mrežu"</string>
+ <string name="action_bar_label" msgid="4290345990334377177">"Prijava na mobilnu mrežu"</string>
<string name="ssl_error_warning" msgid="3127935140338254180">"Mreža kojoj pokušavate pristupiti ima sigurnosnih problema."</string>
<string name="ssl_error_example" msgid="6188711843183058764">"Naprimjer, stranica za prijavljivanje možda ne pripada prikazanoj organizaciji."</string>
<string name="ssl_error_continue" msgid="1138548463994095584">"Ipak nastavi preko preglednika"</string>
diff --git a/packages/CarrierDefaultApp/res/values-ky/strings.xml b/packages/CarrierDefaultApp/res/values-ky/strings.xml
index 19ad94e..9e32f21 100644
--- a/packages/CarrierDefaultApp/res/values-ky/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ky/strings.xml
@@ -3,8 +3,8 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"ОператордунДемейкиКолдонмосу"</string>
<string name="android_system_label" msgid="2797790869522345065">"Мобилдик байланыш оператору"</string>
- <string name="portal_notification_id" msgid="5155057562457079297">"Мобилдик дайындар түгөндү"</string>
- <string name="no_data_notification_id" msgid="668400731803969521">"Мобилдик дайындарды колдонуу өчүрүлгөн"</string>
+ <string name="portal_notification_id" msgid="5155057562457079297">"Мобилдик Интернетиңиздин трафиги түгөндү"</string>
+ <string name="no_data_notification_id" msgid="668400731803969521">"Мобилдик Интернет өчүрүлгөн"</string>
<string name="portal_notification_detail" msgid="2295729385924660881">"%s сайтына баш багуу үчүн басыңыз"</string>
<string name="no_data_notification_detail" msgid="3112125343857014825">"%s Интернет провайдери менен байланышыңыз"</string>
<string name="mobile_data_status_notification_channel_name" msgid="833999690121305708">"Мобилдик Интернеттин абалы"</string>
diff --git a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CustomConfigLoader.java b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CustomConfigLoader.java
index e1125d9..d5d0b79 100644
--- a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CustomConfigLoader.java
+++ b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CustomConfigLoader.java
@@ -91,6 +91,10 @@
arg1 = intent.getStringExtra(TelephonyIntents.EXTRA_APN_TYPE_KEY);
arg2 = intent.getStringExtra(TelephonyIntents.EXTRA_ERROR_CODE_KEY);
break;
+ case TelephonyIntents.ACTION_CARRIER_SIGNAL_RESET:
+ configs = b.getStringArray(CarrierConfigManager
+ .KEY_CARRIER_DEFAULT_ACTIONS_ON_RESET);
+ break;
default:
Rlog.e(TAG, "load carrier config failure with un-configured key: " +
intent.getAction());
diff --git a/packages/CompanionDeviceManager/res/values/strings.xml b/packages/CompanionDeviceManager/res/values/strings.xml
index 43a92b6..c4372eb 100644
--- a/packages/CompanionDeviceManager/res/values/strings.xml
+++ b/packages/CompanionDeviceManager/res/values/strings.xml
@@ -20,9 +20,9 @@
<string name="app_label">Companion Device Manager</string>
<!-- Title of the device selection dialog. -->
- <string name="chooser_title">Link with <strong><xliff:g id="app_name" example="Android Wear">%1$s</xliff:g></strong> via Bluetooth?</string>
+ <string name="chooser_title">Link with <strong><xliff:g id="app_name" example="Android Wear">%1$s</xliff:g></strong></string>
<!-- Title of the device pairing confirmation dialog. -->
- <string name="confirmation_title">Link <strong><xliff:g id="app_name" example="Android Wear">%1$s</xliff:g></strong> with <strong><xliff:g id="device_name" example="ASUS ZenWatch 2">%2$s</xliff:g></strong> via Bluetooth?</string>
+ <string name="confirmation_title">Link <strong><xliff:g id="app_name" example="Android Wear">%1$s</xliff:g></strong> with <strong><xliff:g id="device_name" example="ASUS ZenWatch 2">%2$s</xliff:g></strong></string>
</resources>
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java
index 11c858f..2a4ab0f 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java
@@ -35,7 +35,7 @@
import android.bluetooth.le.ScanSettings;
import android.companion.AssociationRequest;
import android.companion.BluetoothDeviceFilter;
-import android.companion.BluetoothLEDeviceFilter;
+import android.companion.BluetoothLeDeviceFilter;
import android.companion.DeviceFilter;
import android.companion.ICompanionDeviceDiscoveryService;
import android.companion.ICompanionDeviceDiscoveryServiceCallback;
@@ -79,7 +79,7 @@
private ScanSettings mDefaultScanSettings = new ScanSettings.Builder().build();
private List<DeviceFilter<?>> mFilters;
- private List<BluetoothLEDeviceFilter> mBLEFilters;
+ private List<BluetoothLeDeviceFilter> mBLEFilters;
private List<BluetoothDeviceFilter> mBluetoothFilters;
private List<WifiDeviceFilter> mWifiFilters;
private List<ScanFilter> mBLEScanFilters;
@@ -144,8 +144,8 @@
mFilters = request.getDeviceFilters();
mWifiFilters = CollectionUtils.filter(mFilters, WifiDeviceFilter.class);
mBluetoothFilters = CollectionUtils.filter(mFilters, BluetoothDeviceFilter.class);
- mBLEFilters = CollectionUtils.filter(mFilters, BluetoothLEDeviceFilter.class);
- mBLEScanFilters = CollectionUtils.map(mBLEFilters, BluetoothLEDeviceFilter::getScanFilter);
+ mBLEFilters = CollectionUtils.filter(mFilters, BluetoothLeDeviceFilter.class);
+ mBLEScanFilters = CollectionUtils.map(mBLEFilters, BluetoothLeDeviceFilter::getScanFilter);
reset();
} else if (DEBUG) Log.i(LOG_TAG, "startDiscovery: duplicate request: " + request);
diff --git a/packages/FusedLocation/res/values-kn/strings.xml b/packages/FusedLocation/res/values-kn/strings.xml
index 757ebd9..490872c 100644
--- a/packages/FusedLocation/res/values-kn/strings.xml
+++ b/packages/FusedLocation/res/values-kn/strings.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_label" msgid="5379477904423203699">"ಸಂಯೋಜಿತ ಸ್ಥಾನ"</string>
+ <string name="app_label" msgid="5379477904423203699">"ಸಂಯೋಜಿತ ಸ್ಥಳ"</string>
</resources>
diff --git a/packages/PrintSpooler/res/values-eu/strings.xml b/packages/PrintSpooler/res/values-eu/strings.xml
index 8fdea1f..459b4d3 100644
--- a/packages/PrintSpooler/res/values-eu/strings.xml
+++ b/packages/PrintSpooler/res/values-eu/strings.xml
@@ -37,7 +37,7 @@
<string name="generating_print_job" msgid="3119608742651698916">"Inprimatze-lana sortzen"</string>
<string name="save_as_pdf" msgid="5718454119847596853">"Gorde PDF gisa"</string>
<string name="all_printers" msgid="5018829726861876202">"Inprimagailu guztiak…"</string>
- <string name="print_dialog" msgid="32628687461331979">"Inprimatzeko elkarrizketa-koadroa"</string>
+ <string name="print_dialog" msgid="32628687461331979">"Inprimatzeko leihoa"</string>
<string name="current_page_template" msgid="5145005201131935302">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g>/<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
<string name="page_description_template" msgid="6831239682256197161">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g>/<xliff:g id="PAGE_COUNT">%2$d</xliff:g> orria"</string>
<string name="summary_template" msgid="8899734908625669193">"Laburpena, <xliff:g id="COPIES">%1$s</xliff:g> kopia, <xliff:g id="PAPER_SIZE">%2$s</xliff:g> paper-tamaina"</string>
diff --git a/packages/PrintSpooler/res/values-ky/strings.xml b/packages/PrintSpooler/res/values-ky/strings.xml
index 655201e..f6948d5 100644
--- a/packages/PrintSpooler/res/values-ky/strings.xml
+++ b/packages/PrintSpooler/res/values-ky/strings.xml
@@ -66,7 +66,7 @@
<string name="could_not_create_file" msgid="3425025039427448443">"Файл түзүлбөй койду"</string>
<string name="print_services_disabled_toast" msgid="9089060734685174685">"Басып чыгаруу кызматтарынын айрымы өчүрүлгөн"</string>
<string name="print_searching_for_printers" msgid="6550424555079932867">"Принтерлер изделүүдө"</string>
- <string name="print_no_print_services" msgid="8561247706423327966">"Принтер-кызматтары иштетилген эмес"</string>
+ <string name="print_no_print_services" msgid="8561247706423327966">"Принтер кызматтары иштетилген эмес"</string>
<string name="print_no_printers" msgid="4869403323900054866">"Принтерлер табылган жок"</string>
<string name="cannot_add_printer" msgid="7840348733668023106">"Принтерлер кошулбай жатат"</string>
<string name="select_to_add_printers" msgid="3800709038689830974">"Принтер кошуу үчүн тандаңыз"</string>
@@ -87,7 +87,7 @@
<string name="restart" msgid="2472034227037808749">"Кайра баштоо"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Принтер менен байланыш жок"</string>
<string name="reason_unknown" msgid="5507940196503246139">"белгисиз"</string>
- <string name="print_service_security_warning_title" msgid="2160752291246775320">"<xliff:g id="SERVICE">%1$s</xliff:g> колдонулсунбу?"</string>
+ <string name="print_service_security_warning_title" msgid="2160752291246775320">"<xliff:g id="SERVICE">%1$s</xliff:g> колдоносузбу?"</string>
<string name="print_service_security_warning_summary" msgid="1427434625361692006">"Принтерге жеткиче документиңиз бир же андан көп серверлерден өтүшү мүмкүн."</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Кара-ак"</item>
diff --git a/packages/PrintSpooler/res/values-zh-rTW/strings.xml b/packages/PrintSpooler/res/values-zh-rTW/strings.xml
index f159605..10932be 100644
--- a/packages/PrintSpooler/res/values-zh-rTW/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rTW/strings.xml
@@ -88,7 +88,7 @@
<string name="no_connection_to_printer" msgid="2159246915977282728">"尚未與印表機建立連線"</string>
<string name="reason_unknown" msgid="5507940196503246139">"不明"</string>
<string name="print_service_security_warning_title" msgid="2160752291246775320">"要使用「<xliff:g id="SERVICE">%1$s</xliff:g>」嗎?"</string>
- <string name="print_service_security_warning_summary" msgid="1427434625361692006">"您的文件可能會透過一或多個伺服器輾轉傳送至印表機。"</string>
+ <string name="print_service_security_warning_summary" msgid="1427434625361692006">"你的文件可能會透過一或多個伺服器輾轉傳送至印表機。"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"黑白"</item>
<item msgid="2762241247228983754">"彩色"</item>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 703a617..e89b21a 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Deling van internetverbinding"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Boodskaptoegang"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-toegang"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Gebruik hoëgehalte-oudio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Gebruik hoëgehalte-oudio"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Gekoppel aan media-oudio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Gekoppel aan foonoudio"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Gekoppel aan lêeroordragbediener"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 7ae1715..d8150d1 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"የበይነ መረብ ተያያዥ ማጋሪያ"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"የመልዕክት መዳረሻ"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"የሲም መዳረሻ"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"ከፍተኛ ጥራት ያለውን ኦዲዮ ተጠቀም፦ <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"ከፍተኛ ጥራት ያለውን ኦዲዮ ተጠቀም"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"ወደ ማህደረ መረጃ አውዲዮ ተያይዟል"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ወደ ስልክ አውዲዮ ተያይዟል"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ወደ ፋይል ዝውውር አገልጋይ ተያይዟል"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index a9959cc..034653f 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"مشاركة اتصال الإنترنت"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"الدخول إلى الرسائل"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"الوصول إلى شريحة SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"استخدام صوت عالي الجودة: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"استخدام صوت عالي الجودة"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"متصل بالإعدادات الصوتية للوسائط"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"متصل بالإعدادات الصوتية للهاتف"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"متصل بخادم نقل الملف"</string>
@@ -325,7 +327,7 @@
<string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> حتى يكتمل الشحن"</string>
<string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"غير معروف"</string>
- <string name="battery_info_status_charging" msgid="1705179948350365604">"شحن"</string>
+ <string name="battery_info_status_charging" msgid="1705179948350365604">"جاري الشحن"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"جارٍ الشحن"</string>
<string name="battery_info_status_discharging" msgid="310932812698268588">"لا يتم الشحن"</string>
<string name="battery_info_status_not_charging" msgid="2820070506621483576">"لا يتم الشحن"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 9fbd7b2..603f6918 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"internet bağlantı paylaşımı"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Mesaj Girişi"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM Girişi"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Yüksək keyfiyyətli audio istifadə edin: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Yüksək keyfiyyətli audio istifadə edin"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Media audioya birləşdirilib"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Telefon audiosuna qoşulu"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Fayl transfer serverinə qoşulu"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 1e06e8b..35473b3 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Deljenje internet veze"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Pristup porukama"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Pristup SIM kartici"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Koristi zvuk visokog kvaliteta: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Koristi zvuk visokog kvaliteta"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Povezano sa zvukom medija"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Povezano sa zvukom telefona"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Povezano sa serverom za prenos datoteka"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index a00cabe..61388c0 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Прадастаўленне доступу да Інтэрнэту"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Доступ да паведамленняў"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Доступ да SIM-карты"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Выбраць аўдыя высокай якасці: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Выбраць аўдыя высокай якасці"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Падключана да аўдыё медыа"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Падключана да аўдыё тэлефона"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Падключаны да серверу перадачы файлаў"</string>
@@ -345,7 +347,7 @@
<string name="screen_zoom_summary_default" msgid="2247006805614056507">"Стандартны"</string>
<string name="screen_zoom_summary_large" msgid="4835294730065424084">"Вялікі"</string>
<string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"Большы"</string>
- <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Найвялікшы"</string>
+ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Самы вялікі"</string>
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Карыстальніцкі (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Даведка і водгукі"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index e10b4ea..aeea676 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Споделяне на връзката с интернет"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Достъп до съобщенията"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Достъп до SIM картата"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Използване на висококачествен звук: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Използване на висококачествен звук"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Установена е връзка с медийно аудио"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Връзка със звука на телефона"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Установена е връзка със сървър за трансфер на файлове"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 588e2fe..21b4fbc 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -26,7 +26,7 @@
<string name="wifi_disabled_generic" msgid="4259794910584943386">"অক্ষম হয়েছে"</string>
<string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP কনফিগারেশনের ব্যর্থতা"</string>
<string name="wifi_disabled_by_recommendation_provider" msgid="5168315140978066096">"খারাপ নেটওয়ার্কের কারণে সংযুক্ত নয়"</string>
- <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"WiFi সংযোগের ব্যর্থতা"</string>
+ <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"ওয়াই ফাই সংযোগের ব্যর্থতা"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"প্রমাণীকরণ সমস্যা"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"পরিসরের মধ্যে নয়"</string>
<string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"স্বয়ংক্রিয়ভাবে সংযোগ করবে না"</string>
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"ইন্টারনেট সংযোগ শেয়ার করা হচ্ছে"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"বার্তা অ্যাক্সেস"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"সিম -এর অ্যাক্সেস"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"উচ্চ মানের অডিও ব্যবহার করুন: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"উচ্চ মানের অডিও ব্যবহার করুন"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"মিডিয়া অডিওতে সংযুক্ত রয়েছে"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ফোন অডিওতে সংযুক্ত"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ফাইল স্থানান্তর সার্ভারের সঙ্গে সংযুক্ত"</string>
@@ -102,7 +104,7 @@
<string name="launch_defaults_none" msgid="4241129108140034876">"কোনো ডিফল্ট সেট করা নেই"</string>
<string name="tts_settings" msgid="8186971894801348327">"পাঠ্য থেকে ভাষ্য আউটপুট সেটিংস"</string>
<string name="tts_settings_title" msgid="1237820681016639683">"লেখিত-থেকে-ভাষ্য"</string>
- <string name="tts_default_rate_title" msgid="6030550998379310088">"ভাষ্য হার"</string>
+ <string name="tts_default_rate_title" msgid="6030550998379310088">"কথা বলার হার"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"যে গতিতে পাঠ্য উচ্চারিত হয়"</string>
<string name="tts_default_pitch_title" msgid="6135942113172488671">"পিচ"</string>
<string name="tts_default_pitch_summary" msgid="1944885882882650009">"সিন্থেসাইজ করা ভাষ্যের স্বরকে প্রভাবিত করে"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index ee0813f..886d635 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Dijeljenje internet veze"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Pristup poruci"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Pristup SIM-u"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Koristi visokokvalitetan zvuk: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Koristi visokokvalitetan zvuk"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Povezano sa zvukom medija"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Povezano na zvuk telefona"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Povezan na server za prijenos podataka"</string>
@@ -93,7 +95,7 @@
<string name="tether_settings_title_wifi" msgid="3277144155960302049">"Prijenosna pristupna tačka"</string>
<string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Dijeljenje Bluetooth veze"</string>
<string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Dijeljenje veze"</string>
- <string name="tether_settings_title_all" msgid="8356136101061143841">"Dijeljenje internetske veze i prijenosna pristupna tačka"</string>
+ <string name="tether_settings_title_all" msgid="8356136101061143841">"Povezivanje putem mobitela i prijenosna pristupna tačka"</string>
<string name="managed_user_title" msgid="8109605045406748842">"Sve radne aplikacije"</string>
<string name="user_guest" msgid="8475274842845401871">"Gost"</string>
<string name="unknown" msgid="1592123443519355854">"Nepoznato"</string>
@@ -125,7 +127,7 @@
<string name="tts_engine_settings_title" msgid="3499112142425680334">"Postavke za <xliff:g id="TTS_ENGINE_NAME">%s</xliff:g>"</string>
<string name="tts_engine_settings_button" msgid="1030512042040722285">"Pokreni postavke programa"</string>
<string name="tts_engine_preference_section_title" msgid="448294500990971413">"Željeni program"</string>
- <string name="tts_general_section_title" msgid="4402572014604490502">"Opće"</string>
+ <string name="tts_general_section_title" msgid="4402572014604490502">"Opće postavke"</string>
<string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"Postavite visinu glasa"</string>
<string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"Visinu glasa koji izgovara tekst postavite na podrazumjevanu."</string>
<string-array name="tts_rate_entries">
@@ -314,7 +316,7 @@
<string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"Protanomalija (crveno-zeleno)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"Tritanomalija (plavo-žuta)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Ispravka boje"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ova funkcija je eksperimentalna te može utjecati na performanse."</string>
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ova funkcija je eksperimentalna i može uticati na performanse."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Zamjenjuje <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="845431008899029842">"Preostalo je otprilike još <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Do potpune napunjenosti preostalo je <xliff:g id="TIME">%1$s</xliff:g>"</string>
@@ -344,8 +346,8 @@
<string name="screen_zoom_summary_small" msgid="5867245310241621570">"Malo"</string>
<string name="screen_zoom_summary_default" msgid="2247006805614056507">"Zadano"</string>
<string name="screen_zoom_summary_large" msgid="4835294730065424084">"Veliko"</string>
- <string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"Veće"</string>
- <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Najveće"</string>
+ <string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"Vrlo veliko"</string>
+ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Najveći"</string>
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Prilagodi (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Pomoć i povratne informacije"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Meni"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index b7ed9aa..1c7ce0c 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Connexió compartida a Internet"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Accés al missatge"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Accés a la SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Utilitza àudio d\'alta qualitat: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Utilitza àudio d\'alta qualitat"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Connectat a l\'àudio del mitjà"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Connectat a àudio del telèfon"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Connectat al servidor de transferència de fitxers"</string>
@@ -345,7 +347,7 @@
<string name="screen_zoom_summary_default" msgid="2247006805614056507">"Predeterminat"</string>
<string name="screen_zoom_summary_large" msgid="4835294730065424084">"Gran"</string>
<string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"Més gran"</string>
- <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Màxim"</string>
+ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Més grans possible"</string>
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalitzat (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ajuda i suggeriments"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menú"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 7f06170..673d51b 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Sdílení internetového připojení"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Přístup ke zprávám"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Přístup k SIM kartě"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Použít vysokou kvalitu zvuku: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Použít vysokou kvalitu zvuku"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Připojeno ke zvukovému médiu"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Připojeno k náhlavní soupravě"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Připojeno k serveru pro přenos dat"</string>
diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml
index 3c5da32..0647b4f 100644
--- a/packages/SettingsLib/res/values-da/arrays.xml
+++ b/packages/SettingsLib/res/values-da/arrays.xml
@@ -159,13 +159,13 @@
<item msgid="5431354956856655120">"16 MB pr. logbuffer"</item>
</string-array>
<string-array name="select_logpersist_titles">
- <item msgid="1744840221860799971">"Slået fra"</item>
+ <item msgid="1744840221860799971">"Fra"</item>
<item msgid="3054662377365844197">"Alle"</item>
<item msgid="688870735111627832">"Radio undtaget"</item>
<item msgid="2850427388488887328">"kun kerne"</item>
</string-array>
<string-array name="select_logpersist_summaries">
- <item msgid="2216470072500521830">"Slået fra"</item>
+ <item msgid="2216470072500521830">"Fra"</item>
<item msgid="172978079776521897">"Alle logbuffere"</item>
<item msgid="3873873912383879240">"Alle undtagen radiologbuffere"</item>
<item msgid="8489661142527693381">"kun logbuffer for kerne"</item>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 8296099..0447c52 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Deling af internetforbindelse"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Adgang til meddelelse"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-adgang"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Brug lyd i høj kvalitet: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Brug lyd i høj kvalitet"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Forbundet til medielyd"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Forbundet til telefonlyd"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Forbundet til filoverførselsserver"</string>
@@ -172,7 +174,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Tillad altid scanning af Wi-Fi-roaming"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobildata er altid aktiveret"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Deaktiver absolut lydstyrke"</string>
- <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Aktivér integreret opringning"</string>
+ <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Afspil ringetone via Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"AVRCP-version for Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Vælg AVRCP-version for Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth-lydcodec"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 0e9933d..0a2cf33 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Freigabe der Internetverbindung"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Nachrichtenzugriff"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Zugriff auf SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Hohe Audioqualität verwenden: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Hohe Audioqualität verwenden"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Verbunden mit Audiosystem von Medien"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Verbunden mit Audiosystem des Telefons"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Mit Dateiübertragungsserver verbunden"</string>
@@ -314,7 +316,7 @@
<string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"Protanomalie (Rot-Grün-Sehschwäche)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"Tritanomalie (Blau-Gelb-Sehschwäche)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Farbkorrektur"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Hierbei handelt es sich um eine experimentelle Funktion. Dies kann sich auf die Leistung auswirken."</string>
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Hierbei handelt es sich um eine experimentelle Funktion, die sich auf die Leistung auswirken kann."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Außer Kraft gesetzt von \"<xliff:g id="TITLE">%1$s</xliff:g>\""</string>
<string name="power_remaining_duration_only" msgid="845431008899029842">"Ca. <xliff:g id="TIME">%1$s</xliff:g> übrig"</string>
<string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> bis zur vollständigen Aufladung"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index a12516f..24d3bf4 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Κοινή χρήση σύνδεσης στο Διαδίκτυο"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Πρόσβαση στο μήνυμα"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Πρόσβαση SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Χρήση ήχου υψηλής ποιότητας: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Χρήση ήχου υψηλής ποιότητας"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Συνδέθηκε σε ήχο πολυμέσων"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Συνδεδεμένο στον ήχο τηλεφώνου"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Συνδεδεμένο σε διακομιστή μεταφοράς αρχείων"</string>
@@ -101,7 +103,7 @@
<string name="launch_defaults_some" msgid="313159469856372621">"Έχουν οριστεί κάποιες προεπιλογές"</string>
<string name="launch_defaults_none" msgid="4241129108140034876">"Δεν έχουν οριστεί προεπιλογές"</string>
<string name="tts_settings" msgid="8186971894801348327">"Ρυθμίσεις μετατροπής κειμένου σε ομιλία"</string>
- <string name="tts_settings_title" msgid="1237820681016639683">"Έξοδος μετατροπής κειμένου σε ομιλία"</string>
+ <string name="tts_settings_title" msgid="1237820681016639683">"Μετατρ. κειμ. σε ομιλία"</string>
<string name="tts_default_rate_title" msgid="6030550998379310088">"Ταχύτητα λόγου"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"Ταχύτητα με την οποία εκφωνείται το κείμενο"</string>
<string name="tts_default_pitch_title" msgid="6135942113172488671">"Τόνος"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index a42a8e1..6b9daf7 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Internet connection sharing"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Message Access"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM Access"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Use high-quality audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Use high-quality audio"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Connected to media audio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Connected to phone audio"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Connected to file-transfer server"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index a42a8e1..6b9daf7 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Internet connection sharing"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Message Access"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM Access"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Use high-quality audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Use high-quality audio"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Connected to media audio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Connected to phone audio"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Connected to file-transfer server"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index a42a8e1..6b9daf7 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Internet connection sharing"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Message Access"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM Access"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Use high-quality audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Use high-quality audio"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Connected to media audio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Connected to phone audio"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Connected to file-transfer server"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 3d914e7..1464d44 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Compartir conexión a Internet"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Acceso a mensajes"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Acceso SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Usar audio de alta calidad: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Usar audio de alta calidad"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Conectado al audio multimedia"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Conectado al audio del dispositivo"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Conectado al servidor de transferencia de archivo"</string>
diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml
index d527a85..53c547d 100644
--- a/packages/SettingsLib/res/values-es/arrays.xml
+++ b/packages/SettingsLib/res/values-es/arrays.xml
@@ -137,7 +137,7 @@
<item msgid="364670732877872677">"Mejor esfuerzo (tasa de bits flexible)"</item>
</string-array>
<string-array name="select_logd_size_titles">
- <item msgid="8665206199209698501">"No"</item>
+ <item msgid="8665206199209698501">"Desactivado"</item>
<item msgid="1593289376502312923">"64 K"</item>
<item msgid="487545340236145324">"256 K"</item>
<item msgid="2423528675294333831">"1 M"</item>
@@ -145,13 +145,13 @@
<item msgid="2803199102589126938">"16 M"</item>
</string-array>
<string-array name="select_logd_size_lowram_titles">
- <item msgid="6089470720451068364">"No"</item>
+ <item msgid="6089470720451068364">"Desactivado"</item>
<item msgid="4622460333038586791">"64 K"</item>
<item msgid="2212125625169582330">"256 K"</item>
<item msgid="1704946766699242653">"1 M"</item>
</string-array>
<string-array name="select_logd_size_summaries">
- <item msgid="6921048829791179331">"No"</item>
+ <item msgid="6921048829791179331">"Desactivado"</item>
<item msgid="2969458029344750262">"64 K/búfer registro"</item>
<item msgid="1342285115665698168">"256 K/búfer registro"</item>
<item msgid="1314234299552254621">"1 M/búfer registro"</item>
@@ -159,13 +159,13 @@
<item msgid="5431354956856655120">"16 M/búfer registro"</item>
</string-array>
<string-array name="select_logpersist_titles">
- <item msgid="1744840221860799971">"No"</item>
+ <item msgid="1744840221860799971">"Desactivado"</item>
<item msgid="3054662377365844197">"Todo"</item>
<item msgid="688870735111627832">"Todo menos señal móvil"</item>
<item msgid="2850427388488887328">"solo kernel"</item>
</string-array>
<string-array name="select_logpersist_summaries">
- <item msgid="2216470072500521830">"No"</item>
+ <item msgid="2216470072500521830">"Desactivado"</item>
<item msgid="172978079776521897">"Todos los búferes de registro"</item>
<item msgid="3873873912383879240">"Todo excepto búferes de registro de señal móvil"</item>
<item msgid="8489661142527693381">"solo búfer de registro del kernel"</item>
@@ -218,17 +218,17 @@
<item msgid="1340692776955662664">"Pila de llamadas en glGetError"</item>
</string-array>
<string-array name="show_non_rect_clip_entries">
- <item msgid="993742912147090253">"No"</item>
+ <item msgid="993742912147090253">"Desactivado"</item>
<item msgid="675719912558941285">"Dibujar región de recorte no rectangular en azul"</item>
<item msgid="1064373276095698656">"Resaltar comandos de dibujo probados en verde"</item>
</string-array>
<string-array name="track_frame_time_entries">
- <item msgid="2193584639058893150">"No"</item>
+ <item msgid="2193584639058893150">"Desactivado"</item>
<item msgid="2751513398307949636">"En pantalla como barras"</item>
<item msgid="2355151170975410323">"En <xliff:g id="AS_TYPED_COMMAND">adb shell dumpsys gfxinfo</xliff:g>"</item>
</string-array>
<string-array name="debug_hw_overdraw_entries">
- <item msgid="8190572633763871652">"No"</item>
+ <item msgid="8190572633763871652">"Desactivado"</item>
<item msgid="7688197031296835369">"Mostrar áreas sobredibujadas"</item>
<item msgid="2290859360633824369">"Mostrar áreas para deuteranomalía"</item>
</string-array>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 57d433c..13dde32f 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Compartir conexión a Internet"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Acceso a mensajes"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Acceso a tarjeta SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Usar audio de alta calidad: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Usar audio de alta calidad"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Conectado al audio del medio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Conectado al audio del teléfono"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Conectado con el servidor de transferencia de archivos"</string>
@@ -172,7 +174,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permitir siempre búsquedas de Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Datos móviles siempre activos"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Inhabilitar volumen absoluto"</string>
- <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Habilitar sonido dentro de la banda"</string>
+ <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Habilitar tono de llamada por Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versión AVRCP del Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Selecciona la versión AVRCP del Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Códec de audio por Bluetooth"</string>
@@ -231,7 +233,7 @@
<string name="media_category" msgid="4388305075496848353">"Multimedia"</string>
<string name="debug_monitoring_category" msgid="7640508148375798343">"Supervisión"</string>
<string name="strict_mode" msgid="1938795874357830695">"Modo estricto"</string>
- <string name="strict_mode_summary" msgid="142834318897332338">"Parpadear si las aplicaciones tardan mucho en el thread principal"</string>
+ <string name="strict_mode_summary" msgid="142834318897332338">"Parpadear si las aplicaciones tardan mucho en el subproceso principal"</string>
<string name="pointer_location" msgid="6084434787496938001">"Ubicación del puntero"</string>
<string name="pointer_location_summary" msgid="840819275172753713">"Superponer los datos de las pulsaciones en la pantalla"</string>
<string name="show_touches" msgid="2642976305235070316">"Mostrar toques"</string>
@@ -295,8 +297,8 @@
<string name="inactive_apps_title" msgid="1317817863508274533">"Aplicaciones inactivas"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inactiva. Toca para alternar."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Activa. Toca para alternar."</string>
- <string name="runningservices_settings_title" msgid="8097287939865165213">"Servicios en ejecución"</string>
- <string name="runningservices_settings_summary" msgid="854608995821032748">"Ver y controlar los servicios en ejecución"</string>
+ <string name="runningservices_settings_title" msgid="8097287939865165213">"Servicios en uso"</string>
+ <string name="runningservices_settings_summary" msgid="854608995821032748">"Ver y controlar los servicios en uso"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Implementación de WebView"</string>
<string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Establecer implementación de WebView"</string>
<string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Esta opción ya no está disponible. Vuelve a intentarlo."</string>
@@ -304,7 +306,7 @@
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"Convertir…"</string>
<string name="convert_to_file_encryption_done" msgid="7859766358000523953">"Ya está cifrado"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"Convirtiendo a un cifrado basado en archivos"</string>
- <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Convierte la partición de datos en un cifrado basado en archivos.\n Advertencia: Este proceso borrará todos los datos.\n Esta función es alpha y es posible que no funcione correctamente.\n Pulsa la opción Borrar y convertir… para continuar."</string>
+ <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Convierte la partición de datos en un cifrado basado en archivos.\n Advertencia: Este proceso borrará todos los datos.\n Esta función es alfa y es posible que no funcione correctamente.\n Pulsa la opción Borrar y convertir… para continuar."</string>
<string name="button_convert_fbe" msgid="5152671181309826405">"Borrar y convertir…"</string>
<string name="picture_color_mode" msgid="4560755008730283695">"Modo de color de imagen"</string>
<string name="picture_color_mode_desc" msgid="1141891467675548590">"Utiliza sRGB"</string>
@@ -339,7 +341,7 @@
<item msgid="8934126114226089439">"50%"</item>
<item msgid="1286113608943010849">"100%"</item>
</string-array>
- <string name="charge_length_format" msgid="8978516217024434156">"Hace <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+ <string name="charge_length_format" msgid="8978516217024434156">"hace <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="remaining_length_format" msgid="7886337596669190587">"Tiempo restante: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="screen_zoom_summary_small" msgid="5867245310241621570">"Pequeño"</string>
<string name="screen_zoom_summary_default" msgid="2247006805614056507">"Predeterminado"</string>
diff --git a/packages/SettingsLib/res/values-et/arrays.xml b/packages/SettingsLib/res/values-et/arrays.xml
index 904e28e..7766890 100644
--- a/packages/SettingsLib/res/values-et/arrays.xml
+++ b/packages/SettingsLib/res/values-et/arrays.xml
@@ -51,7 +51,7 @@
<string-array name="hdcp_checking_titles">
<item msgid="441827799230089869">"Ära kunagi kontrolli"</item>
<item msgid="6042769699089883931">"Kontrolli ainult DRM-sisu"</item>
- <item msgid="9174900380056846820">"Pidev kontrollimine"</item>
+ <item msgid="9174900380056846820">"Kontrolli alati"</item>
</string-array>
<string-array name="hdcp_checking_summaries">
<item msgid="505558545611516707">"Ära kunagi kasuta HDCP-kontrollimist"</item>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index e8f4f02..cc52862 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Interneti-ühenduse jagamine"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Juurdepääs sõnumile"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-kaardi juurdepääs"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Kasuta kvaliteetset heli: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Kasuta kvaliteetset heli"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Ühendatud meediumiheliga"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Ühendatud telefoniheliga"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Ühendatud failiedastuse serveriga"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 80631cd..aa6b3c2 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Interneteko konexioa partekatzea"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Mezuetarako sarbidea"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM txartelerako sarbidea"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Erabili kalitate handiko audioa: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Erabili kalitate handiko audioa"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Euskarriaren audiora konektatuta"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Telefonoaren audiora konektatuta"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Fitxategi-transferentziako zerbitzarira konektatuta"</string>
@@ -172,7 +174,7 @@
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Onartu beti ibiltaritzan Wi-Fi sareak bilatzea"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Datu mugikorrak beti aktibo"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desgaitu bolumen absolutua"</string>
- <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Gaitu banda barneko tonuak"</string>
+ <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Gaitu tonuak audio-kanal berean erreproduzitzeko aukera"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP bertsioa"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Hautatu Bluetooth AVRCP bertsioa"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth bidezko audioaren kodeka"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 893e708..65fe22c 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"اشتراکگذاری اتصال اینترنت"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"دسترسی به پیام"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"دسترسی سیمکارت"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"استفاده از صوت با کیفیت بالا: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"استفاده از صوت با کیفیت بالا"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"به رسانه صوتی متصل شد"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"به تلفن صوتی متصل شد"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"به سرور انتقال فایل متصل شد"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 8530ddf..d306e23 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Internetyhteyden jakaminen"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"MAP"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-kortin käyttö"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Käytä korkealaatuista ääntä: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Käytä korkealaatuista ääntä"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Yhdistetty median ääneen"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Yhdistetty puhelimen ääneen"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Yhdistetty tiedostonsiirtopalvelimeen"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index 49914ec..5891473 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Partage de connexion Internet"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Accès aux messages"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Accès à la carte SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Utiliser l\'audio de haute qualité : <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Utiliser l\'audio de haute qualité"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Connecté aux paramètres audio du média"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Connecté à l\'audio du téléphone"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Connexion au serveur de transfert de fichiers"</string>
@@ -109,7 +111,7 @@
<string name="tts_default_lang_title" msgid="8018087612299820556">"Langue"</string>
<string name="tts_lang_use_system" msgid="2679252467416513208">"Utiliser la langue du système"</string>
<string name="tts_lang_not_selected" msgid="7395787019276734765">"Langue non sélectionnée"</string>
- <string name="tts_default_lang_summary" msgid="5219362163902707785">"Définit la langue utilisée par la syntèse vocale"</string>
+ <string name="tts_default_lang_summary" msgid="5219362163902707785">"Définir la langue utilisée par la syntèse vocale"</string>
<string name="tts_play_example_title" msgid="7094780383253097230">"Écouter un échantillon"</string>
<string name="tts_play_example_summary" msgid="8029071615047894486">"Lire une courte démonstration de la synthèse vocale"</string>
<string name="tts_install_data_title" msgid="4264378440508149986">"Installer les données vocales"</string>
@@ -142,10 +144,10 @@
<string name="choose_profile" msgid="6921016979430278661">"Sélectionnez un profil"</string>
<string name="category_personal" msgid="1299663247844969448">"Personnel"</string>
<string name="category_work" msgid="8699184680584175622">"Travail"</string>
- <string name="development_settings_title" msgid="215179176067683667">"Options pour les développeurs"</string>
- <string name="development_settings_enable" msgid="542530994778109538">"Activer les options pour les développeurs"</string>
+ <string name="development_settings_title" msgid="215179176067683667">"Options pour les concepteurs"</string>
+ <string name="development_settings_enable" msgid="542530994778109538">"Activer les options pour les concepteurs"</string>
<string name="development_settings_summary" msgid="1815795401632854041">"Définir les options pour le développement de l\'application"</string>
- <string name="development_settings_not_available" msgid="4308569041701535607">"Les options proposées aux développeurs ne sont pas disponibles pour cet utilisateur."</string>
+ <string name="development_settings_not_available" msgid="4308569041701535607">"Les options proposées aux concepteurs ne sont pas disponibles pour cet utilisateur."</string>
<string name="vpn_settings_not_available" msgid="956841430176985598">"Les paramètres de RPV ne sont pas disponibles pour cet utilisateur"</string>
<string name="tethering_settings_not_available" msgid="6765770438438291012">"Les paramètres de partage de connexion ne sont pas disponibles pour cet utilisateur"</string>
<string name="apn_settings_not_available" msgid="7873729032165324000">"Les paramètres de point d\'accès ne sont pas disponibles pour cet utilisateur"</string>
@@ -214,7 +216,7 @@
<string name="enable_terminal_title" msgid="95572094356054120">"Terminal local"</string>
<string name="enable_terminal_summary" msgid="67667852659359206">"Activer l\'application Terminal permettant l\'accès au shell local"</string>
<string name="hdcp_checking_title" msgid="8605478913544273282">"Vérification HDCP"</string>
- <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"Config. vérification HDCP"</string>
+ <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"Configurer vérification HDCP"</string>
<string name="debug_debugging_category" msgid="6781250159513471316">"Débogage"</string>
<string name="debug_app" msgid="8349591734751384446">"Sélectionner une application à déboguer"</string>
<string name="debug_app_not_set" msgid="718752499586403499">"Aucune application à déboguer définie"</string>
@@ -300,11 +302,11 @@
<string name="select_webview_provider_title" msgid="4628592979751918907">"Mise en œuvre WebView"</string>
<string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Définir la mise en œuvre WebView"</string>
<string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Ce choix n\'est plus valide. Réessayez."</string>
- <string name="convert_to_file_encryption" msgid="3060156730651061223">"Convertir en chiffrement basé sur un fichier"</string>
+ <string name="convert_to_file_encryption" msgid="3060156730651061223">"Convertir en chiffrement"</string>
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"Convertir..."</string>
<string name="convert_to_file_encryption_done" msgid="7859766358000523953">"Déjà chiffré par un fichier"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"Conversion en chiffrement basé sur un fichier en cours"</string>
- <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Convertir la partition de données en chiffrement basé sur un fichier.\n Avertissement! Cette opération supprimera toutes vos données. \nCette fonctionnalité est en version alpha et peut ne pas fonctionner correctement. \nTouchez « Effacer et convertir » pour continuer."</string>
+ <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Convertir la partition de données en chiffrement basé sur un fichier.\nAvertissement! Cette opération supprimera toutes vos données.\nCette fonctionnalité est en version alpha et peut ne pas fonctionner correctement.\nTouchez « Effacer et convertir… » pour continuer."</string>
<string name="button_convert_fbe" msgid="5152671181309826405">"Effacer et convertir..."</string>
<string name="picture_color_mode" msgid="4560755008730283695">"Mode couleur des images"</string>
<string name="picture_color_mode_desc" msgid="1141891467675548590">"Utiliser sRGB"</string>
@@ -325,7 +327,7 @@
<string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> : <xliff:g id="TIME">%2$s</xliff:g> jusqu\'à la charge complète"</string>
<string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Inconnu"</string>
- <string name="battery_info_status_charging" msgid="1705179948350365604">"Batterie en charge"</string>
+ <string name="battery_info_status_charging" msgid="1705179948350365604">"Charge en cours…"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"en cours de charge"</string>
<string name="battery_info_status_discharging" msgid="310932812698268588">"N\'est pas en charge"</string>
<string name="battery_info_status_not_charging" msgid="2820070506621483576">"N\'est pas en charge"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 4cadd0e..831515a 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Partage de connexion Internet"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Accès aux messages"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Accès à la carte SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Utiliser le codec audio haute qualité : <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Utiliser un codec audio haute qualité"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Connecté aux paramètres audio du média"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Connecté aux paramètres audio du téléphone"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Connexion au serveur de transfert de fichiers"</string>
@@ -278,7 +280,7 @@
<string name="enable_freeform_support_summary" msgid="8247310463288834487">"Activer la compatibilité avec les fenêtres de forme libre expérimentales."</string>
<string name="local_backup_password_title" msgid="3860471654439418822">"Mot de passe sauvegarde PC"</string>
<string name="local_backup_password_summary_none" msgid="6951095485537767956">"Les sauvegardes complètes sur PC ne sont pas protégées actuellement."</string>
- <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Appuyez pour modifier ou supprimer le mot de passe utilisé pour les sauvegardes complètes sur PC."</string>
+ <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Appuyez pour modifier ou supprimer le mot de passe de sauvegarde complète sur PC."</string>
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Le nouveau mot de passe de secours a bien été défini."</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Le nouveau mot de passe et sa confirmation ne correspondent pas."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Échec de la définition du mot de passe de secours."</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 9140cd4..c433c0f 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Uso compartido da conexión a Internet"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Acceso ás mensaxes"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Acceso á SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Usar audio de alta calidade: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Usar audio de alta calidade"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Conectado ao audio multimedia"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Conectado ao audio do teléfono"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Conectado ao servidor de transferencia de ficheiros"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 5d5dca4..df9eda9 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"ઇન્ટરનેટ કનેક્શન શેરિંગ"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"સંદેશ ઍક્સેસ"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM ઍક્સેસ"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"ઉચ્ચ ગુણવત્તાવાળા ઑડિયોનો ઉપયોગ કરો: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"ઉચ્ચ ગુણવત્તાવાળા ઑડિયોનો ઉપયોગ કરો"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"મીડિયા ઑડિઓ સાથે કનેક્ટ કર્યુ"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ફોન ઑડિઓ સાથે કનેક્ટ થયાં"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ફાઇલ સ્થાનાંતરણ સેવાથી કનેક્ટ થયાં"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 5d9b816..c729027 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"इंटरनेट कनेक्शन साझाकरण"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"संदेश एक्सेस"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"सिम ऐक्सेस"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"अच्छी गुणवत्ता वाले ऑडियो का उपयोग करें: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"अच्छी गुणवत्ता वाले ऑडियो का उपयोग करें"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"मीडिया ऑडियो से कनेक्ट किया गया"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"फ़ोन ऑडियो से कनेक्ट किया गया"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"फ़ाइल स्थानांतरण सर्वर से कनेक्ट किया गया"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 65e4be7..e94b6df 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Dijeljenje internetske veze"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Pristup porukama"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Pristup SIM-u"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Upotrebljavaj visokokvalitetan audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Upotrebljavaj visokokvalitetan audio"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Povezano s medijskim zvukom"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Povezano sa telefonskim zvukom"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Povezano s poslužiteljem za prijenos datoteka"</string>
@@ -214,7 +216,7 @@
<string name="enable_terminal_title" msgid="95572094356054120">"Lokalni terminal"</string>
<string name="enable_terminal_summary" msgid="67667852659359206">"Omogući aplikaciju terminala koja nudi pristup lokalnoj ovojnici"</string>
<string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP provjera"</string>
- <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"Postav. ponaš. HDCP prov."</string>
+ <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"Postavke HDCP provjere"</string>
<string name="debug_debugging_category" msgid="6781250159513471316">"Otklanjanje pogrešaka"</string>
<string name="debug_app" msgid="8349591734751384446">"Aplikacija za otklanjanje pogrešaka"</string>
<string name="debug_app_not_set" msgid="718752499586403499">"Nema aplikacije za otklanjanje pogrešaka"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 1a95d73..d06417f 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Internetkapcsolat megosztása"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Üzenet-hozzáférés"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-elérés"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Jó audiominőség használata: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Jó audiominőség használata"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Csatlakoztatva az eszköz hangjához"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Csatlakoztatva a telefon hangjához"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Csatlakozva a fájlküldő szerverhez"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 6a41b95..0ec7637 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -42,7 +42,7 @@
<string name="bluetooth_connecting" msgid="8555009514614320497">"Միանում է..."</string>
<string name="bluetooth_connected" msgid="6038755206916626419">"Միացված է"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Զուգակցում..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Միացված (առանց հեռախոսի)"</string>
+ <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Միացված է (առանց հեռախոսի)"</string>
<string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Միացված է (առանց մեդիա)"</string>
<string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Միացված է (հաղորդագրությանը մուտք չկա)"</string>
<string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Միացված է (առանց հեռախոսի և մեդիայի)"</string>
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Ինտերնետ կապի տարածում"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Մուտք հաղորդագրություն"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM քարտի հասանելիություն"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Օգտագործել բարձրորակ ձայն՝ <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Օգտագործել բարձրորակ ձայն"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Միացված է մեդիա աուդիոյին"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Միացված է հեռախոսի ձայնային տվյալներին"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Միացված է ֆայլերի փոխանցման սերվերին"</string>
@@ -100,21 +102,21 @@
<string name="running_process_item_user_label" msgid="3129887865552025943">"Օտատեր՝ <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="launch_defaults_some" msgid="313159469856372621">"Որոշ կանխադրված կարգավորումներ կան"</string>
<string name="launch_defaults_none" msgid="4241129108140034876">"Կանխադրված կարգավորումներ չկան"</string>
- <string name="tts_settings" msgid="8186971894801348327">"Տեքստից-խոսք կարգավորումներ"</string>
+ <string name="tts_settings" msgid="8186971894801348327">"Տեքստի հնչեցման կարգավորումներ"</string>
<string name="tts_settings_title" msgid="1237820681016639683">"Տեքստի հնչեցում"</string>
- <string name="tts_default_rate_title" msgid="6030550998379310088">"Խոսքի գնահատական"</string>
+ <string name="tts_default_rate_title" msgid="6030550998379310088">"Խոսքի արագությունը"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"Տեքստի արտասանման արագությունը"</string>
- <string name="tts_default_pitch_title" msgid="6135942113172488671">"Բարձրություն"</string>
+ <string name="tts_default_pitch_title" msgid="6135942113172488671">"Ձայնի բարձրությունը"</string>
<string name="tts_default_pitch_summary" msgid="1944885882882650009">"Ազդում է սինթեզած խոսքի ձայներանգի վրա"</string>
<string name="tts_default_lang_title" msgid="8018087612299820556">"Լեզու"</string>
<string name="tts_lang_use_system" msgid="2679252467416513208">"Օգտագործել համակարգի լեզուն"</string>
<string name="tts_lang_not_selected" msgid="7395787019276734765">"Լեզուն ընտրված չէ"</string>
- <string name="tts_default_lang_summary" msgid="5219362163902707785">"Կարգավորում է լեզվին բնորոշ ձայնը արտասանվող տեքստի համար"</string>
+ <string name="tts_default_lang_summary" msgid="5219362163902707785">"Ընտրում է լեզուն՝ տեքստն ընթերցելու համար"</string>
<string name="tts_play_example_title" msgid="7094780383253097230">"Լսել օրինակը"</string>
<string name="tts_play_example_summary" msgid="8029071615047894486">"Կարճ հնչեցնել խոսքի սինթեզը"</string>
<string name="tts_install_data_title" msgid="4264378440508149986">"Տեղադրել ձայնային տվյալները"</string>
<string name="tts_install_data_summary" msgid="5742135732511822589">"Տեղադրել անհրաժեշտ ձայնային տվյալները` խոսքը սինթեզելու համար"</string>
- <string name="tts_engine_security_warning" msgid="8786238102020223650">"Այս խոսքային սինթեզի գործիքը կարող է հավաքագրել այն ամենը, ինչ արտասանված է, այդ թվում` անձնական տվյալներ, ինչպիսիք են գաղտնաբառն ու բանկային քարտի համարները: Սկզբնաբյուրը <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> շարժիչն է: Միացնե՞լ խոսքի սինթեզի շարժիչի օգտագործումը:"</string>
+ <string name="tts_engine_security_warning" msgid="8786238102020223650">"Այս խոսքային սինթեզի գործիքը կարող է հավաքել այն ամենը, ինչ արտասանված է, այդ թվում` անձնական տվյալներ, ինչպիսիք են գաղտնաբառն ու բանկային քարտի համարները: Սկզբնաբյուրը <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> շարժիչն է: Միացնե՞լ խոսքի սինթեզի շարժիչի օգտագործումը:"</string>
<string name="tts_engine_network_required" msgid="1190837151485314743">"Այս լեզուն պահանջում է աշխատող ցանցային կապ գրվածքից խոսք ելքի համար:"</string>
<string name="tts_default_sample_string" msgid="4040835213373086322">"Սա խոսքային սինթեզի մի նմուշ է:"</string>
<string name="tts_status_title" msgid="7268566550242584413">"Լռելյայն լեզվի կարգավիճակը"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 035eacb..733e2cb 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Berbagi sambungan internet"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Akses Pesan"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Akses SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Gunakan audio berkualitas tinggi: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Gunakan audio berkualitas tinggi"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Tersambung ke media audio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Tersambung ke audio ponsel"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Sambungkan ke server transfer file"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 539eeee..d4fde8a 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Deiling nettengingar"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Skilaboðaaðgangur"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Aðgangur að SIM-korti"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Nota hágæðahljóð: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Nota hágæðahljóð"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Tengt við hljóðspilun efnis"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Tengt við hljóð símans"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Tengt við skráaflutningsþjón"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index a8b9b2c..14b8e37 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Condivisione connessione Internet"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Accesso ai messaggi"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Accesso alla SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Utilizza audio di alta qualità: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Utilizza audio di alta qualità"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Collegato ad audio media"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Collegato ad audio telefono"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Collegato al server di trasferimento file"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 19b061b..213aaf3 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"שיתוף חיבור לאינטרנט"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"גישה להודעות"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"גישה ל-SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"השתמש באודיו באיכות גבוהה: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"השתמש באודיו באיכות גבוהה"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"מחובר לאודיו של מדיה"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"מחובר לאודיו של הטלפון"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"מחובר לשרת העברת קבצים"</string>
@@ -77,7 +79,7 @@
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ביטול"</string>
<string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"לאחר החיבור, התאמה מספקת גישה לאנשי הקשר ולהיסטוריית השיחות שלך."</string>
<string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"לא ניתן לבצע התאמה עם <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
- <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"לא ניתן להתאים את <xliff:g id="DEVICE_NAME">%1$s</xliff:g> בשל קוד PIN או סיסמה שגויים."</string>
+ <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"לא ניתן להתאים את <xliff:g id="DEVICE_NAME">%1$s</xliff:g> בשל קוד גישה או סיסמה שגויים."</string>
<string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"לא ניתן לתקשר עם <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
<string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"ההתאמה נדחתה על ידי <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi כבוי."</string>
@@ -270,7 +272,7 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"מגבלה של תהליכים ברקע"</string>
<string name="show_all_anrs" msgid="28462979638729082">"הצג את כל פריטי ה-ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"הצג תיבת דו-שיח של \'אפליקציה לא מגיבה\' עבור אפליקציות שפועלות ברקע"</string>
- <string name="force_allow_on_external" msgid="3215759785081916381">"אילוץ הרשאה של אפליקציות באחסון חיצוני"</string>
+ <string name="force_allow_on_external" msgid="3215759785081916381">"אילוץ הרשאת אפליקציות באחסון חיצוני"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"מאפשר כתיבה של כל אפליקציה באחסון חיצוני, ללא התחשבות בערכי המניפסט"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"אלץ יכולת קביעת גודל של הפעילויות"</string>
<string name="force_resizable_activities_summary" msgid="6667493494706124459">"אפשר יכולת קביעת גודל של כל הפעילויות לריבוי חלונות, ללא קשר לערך המניפסט."</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index c7f0c31..440b04d 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"インターネット接続の共有"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"メッセージへのアクセス"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIMアクセス"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"高品質音声を使用: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"高品質音声を使用"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"メディアの音声に接続"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"携帯電話の音声に接続"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ファイル転送サーバーに接続"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 8b3cd2f..088d295 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"ინტერნეტ კავშირის გაზიარება"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"შეტყობინებებზე წვდომა"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM წვდომა"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"მაღალხარისხიანი აუდიოს გამოყენება: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"მაღალხარისხიანი აუდიოს გამოყენება"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"დაკავშირებულია აუდიო მულტიმედიურ სისტემასთან"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"დაკავშირებულია ტელეფონის აუდიო მოწყობილობასთან"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"დაკავშირებულია ფაილების გადაცემის სერვერთან"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 098e31b..cc8b662 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Интернет байланысын ортақ қолдану"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Хабарға кіру"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM картасына кіру"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Жоғары сапалы аудио дыбысын пайдалану: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Жоғары сапалы аудио дыбысын пайдалану"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Медиа аудиосына жалғанған"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Телефон аудиосына қосылған"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Файл жіберу серверіне жалғанған"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 77296a1..d299ec6 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"ចែករំលែកការតភ្ជាប់អ៊ីនធឺណិត"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"ចូលដំណើរការសារ"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"ការចូលដំណើរការស៊ីម"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"ប្រើសំឡេងគុណភាពខ្ពស់៖ <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"ប្រើសំឡេងគុណភាពខ្ពស់"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"បានភ្ជាប់ទៅអូឌីយ៉ូមេឌៀ"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"តភ្ជាប់ទៅអូឌីយ៉ូទូរស័ព្ទ"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"បានតភ្ជាប់ទៅម៉ាស៊ីនមេផ្ទេរឯកសារ"</string>
@@ -142,7 +144,7 @@
<string name="choose_profile" msgid="6921016979430278661">"ជ្រើសរើសកម្រងព័ត៌មាន"</string>
<string name="category_personal" msgid="1299663247844969448">"ផ្ទាល់ខ្លួន"</string>
<string name="category_work" msgid="8699184680584175622">"កន្លែងធ្វើការ"</string>
- <string name="development_settings_title" msgid="215179176067683667">"ជម្រើសអ្នកអភិវឌ្ឍ"</string>
+ <string name="development_settings_title" msgid="215179176067683667">"ជម្រើសអ្នកអភិវឌ្ឍន៍"</string>
<string name="development_settings_enable" msgid="542530994778109538">"បើកដំណើរការជម្រើសអ្នកអភិវឌ្ឍន៍"</string>
<string name="development_settings_summary" msgid="1815795401632854041">"កំណត់ជម្រើសសម្រាប់ការអភិវឌ្ឍកម្មវិធី"</string>
<string name="development_settings_not_available" msgid="4308569041701535607">"ជម្រើសអ្នកអភិវឌ្ឍមិនអាចប្រើបានសម្រាប់អ្នកប្រើនេះ"</string>
@@ -297,15 +299,15 @@
<string name="inactive_app_active_summary" msgid="4174921824958516106">"សកម្ម។ ប៉ះដើម្បីបិទ/បើក។"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"សេវាកម្មកំពុងដំណើរការ"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"មើល និងគ្រប់គ្រងសេវាកម្មកំពុងដំណើរការបច្ចុប្បន្ន"</string>
- <string name="select_webview_provider_title" msgid="4628592979751918907">"ការប្រតិបត្តិ WebView"</string>
+ <string name="select_webview_provider_title" msgid="4628592979751918907">"ការអនុវត្ត WebView"</string>
<string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"កំណត់ការប្រតិបត្តិ WebView"</string>
<string name="select_webview_provider_toast_text" msgid="5466970498308266359">"ជម្រើសនេះលែងមានសុពលភាពទៀតហើយ ព្យាយាមម្តងទៀត"</string>
- <string name="convert_to_file_encryption" msgid="3060156730651061223">"បម្លែងទៅជាការអ៊ីនគ្រីបឯកសារ"</string>
+ <string name="convert_to_file_encryption" msgid="3060156730651061223">"បំប្លែងទៅជាការអ៊ិនគ្រីបឯកសារ"</string>
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"បម្លែង…"</string>
<string name="convert_to_file_encryption_done" msgid="7859766358000523953">"បានអ៊ីនគ្រីបឯកសាររួចហើយ"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"កំពុងបម្លែងទៅការអ៊ីនគ្រីបដែលផ្អែកលើឯកសារ"</string>
- <string name="convert_to_fbe_warning" msgid="6139067817148865527">"បម្លែងការបែងចែកទិន្នន័យទៅជាការអ៊ីនគ្រីបដែលផ្អែកលើឯកសារ។\n !!ព្រមាន!! សកម្មភាពនេះនឹងលុបទិន្នន័យរបស់អ្នកទាំងអស់។\n លក្ខណៈពិសេសនេះជាការសាកល្បងដំបូង ហើយអាចនឹងដំណើរការមិនប្រក្រតី។\n សូមចុច \'សម្អាត និងបម្លែង...\' ដើម្បីបន្ត។"</string>
- <string name="button_convert_fbe" msgid="5152671181309826405">"សម្អាត និងបម្លែង…"</string>
+ <string name="convert_to_fbe_warning" msgid="6139067817148865527">"បំប្លែងការបែងចែកទិន្នន័យទៅជាការអ៊ិនគ្រីបដែលផ្អែកលើឯកសារ។\n !!ព្រមាន!! សកម្មភាពនេះនឹងលុបទិន្នន័យរបស់អ្នកទាំងអស់។\n មុខងារនេះសំខាន់ណាស់ ហើយអាចនឹងដំណើរការមិនប្រក្រតី។\n សូមចុច \'សម្អាត និងបំប្លែង...\' ដើម្បីបន្ត។"</string>
+ <string name="button_convert_fbe" msgid="5152671181309826405">"សម្អាត និងបំប្លែង…"</string>
<string name="picture_color_mode" msgid="4560755008730283695">"របៀបនៃពណ៌រូបភាព"</string>
<string name="picture_color_mode_desc" msgid="1141891467675548590">"ប្រើ sRGB"</string>
<string name="daltonizer_mode_disabled" msgid="7482661936053801862">"បានបិទ"</string>
@@ -314,7 +316,7 @@
<string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"Protanomaly (ក្រហមពណ៌បៃតង)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"Tritanomaly (ពណ៌ខៀវ-លឿង)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"ការកែពណ៌"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"លក្ខណៈនេះគឺជាការពិសោធន៍ ហើយអាចប៉ះពាល់ការអនុវត្ត។"</string>
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"មុខងារនេះគឺជាការពិសោធន៍ ហើយអាចប៉ះពាល់ដំណើរការ។"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"បដិសេធដោយ <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="845431008899029842">"សល់ប្រហែល <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"សល់ <xliff:g id="TIME">%1$s</xliff:g> ទើបសាកថ្មពេញ"</string>
diff --git a/packages/SettingsLib/res/values-kn/arrays.xml b/packages/SettingsLib/res/values-kn/arrays.xml
index d275f37..810aefe 100644
--- a/packages/SettingsLib/res/values-kn/arrays.xml
+++ b/packages/SettingsLib/res/values-kn/arrays.xml
@@ -50,8 +50,8 @@
</string-array>
<string-array name="hdcp_checking_titles">
<item msgid="441827799230089869">"ಎಂದಿಗೂ ಪರಿಶೀಲಿಸದಿರು"</item>
- <item msgid="6042769699089883931">"DRM ವಿಷಯಗಳಿಗಾಗಿ ಮಾತ್ರ ಪರಿಶೀಲಿಸಿ"</item>
- <item msgid="9174900380056846820">"ಯಾವಾಗಲೂ ಪರಿಶೀಲಿಸಿ"</item>
+ <item msgid="6042769699089883931">"DRM ವಿಷಯಗಳನ್ನು ಮಾತ್ರ ಪರಿಶೀಲಿಸು"</item>
+ <item msgid="9174900380056846820">"ಯಾವಾಗಲೂ ಪರಿಶೀಲಿಸು"</item>
</string-array>
<string-array name="hdcp_checking_summaries">
<item msgid="505558545611516707">"HDCP ಪರಿಶೀಲನೆಯನ್ನು ಎಂದಿಗೂ ಬಳಸದಿರು"</item>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index cbe4f3b..0120658 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ ಹಂಚಿಕೊಳ್ಳುವಿಕೆ"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"ಸಂದೇಶ ಪ್ರವೇಶಿಸುವಿಕೆ"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"ಸಿಮ್ ಪ್ರವೇಶ"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"ಉನ್ನತ ಗುಣಮಟ್ಟದ ಆಡಿಯೋ ಬಳಸಿ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"ಉನ್ನತ ಗುಣಮಟ್ಟದ ಆಡಿಯೋ ಬಳಸಿ"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"ಮಾಧ್ಯಮ ಆಡಿಯೋಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ಫೋನ್ ಆಡಿಯೋಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ಫೈಲ್ ವರ್ಗಾವಣೆ ಸರ್ವರ್ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
@@ -102,7 +104,7 @@
<string name="launch_defaults_none" msgid="4241129108140034876">"ಡೀಫಾಲ್ಟ್ಗಳನ್ನು ಹೊಂದಿಸಲಾಗಿಲ್ಲ"</string>
<string name="tts_settings" msgid="8186971894801348327">"ಪಠ್ಯದಿಂದ ಧ್ವನಿಗೆ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="tts_settings_title" msgid="1237820681016639683">"ಧ್ವನಿಗೆ-ಪಠ್ಯದ ಔಟ್ಪುಟ್"</string>
- <string name="tts_default_rate_title" msgid="6030550998379310088">"ಧ್ವನಿಯ ದರ"</string>
+ <string name="tts_default_rate_title" msgid="6030550998379310088">"ಧ್ವನಿಯ ಪ್ರಮಾಣ"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"ಪಠ್ಯವನ್ನು ಹೇಳಿದ ವೇಗ"</string>
<string name="tts_default_pitch_title" msgid="6135942113172488671">"ಪಿಚ್"</string>
<string name="tts_default_pitch_summary" msgid="1944885882882650009">"ಸಂಯೋಜಿತ ಧ್ವನಿಯ ಟೋನ್ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುತ್ತದೆ"</string>
@@ -198,8 +200,8 @@
<string name="select_logpersist_dialog_title" msgid="4003400579973269060">"ಸಾಧನದಲ್ಲಿ ನಿರಂತರವಾಗಿ ಸಂಗ್ರಹಿಸಲು ಲಾಗ್ ಬಫರ್ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="select_usb_configuration_title" msgid="2649938511506971843">"USB ಕಾನ್ಫಿಗರೇಶನ್ ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="select_usb_configuration_dialog_title" msgid="6385564442851599963">"USB ಕಾನ್ಫಿಗರೇಶನ್ ಆಯ್ಕೆಮಾಡಿ"</string>
- <string name="allow_mock_location" msgid="2787962564578664888">"ಅಣಕು ಸ್ಥಾನಗಳನ್ನು ಅನುಮತಿಸು"</string>
- <string name="allow_mock_location_summary" msgid="317615105156345626">"ಅಣಕು ಸ್ಥಾನಗಳನ್ನು ಅನುಮತಿಸು"</string>
+ <string name="allow_mock_location" msgid="2787962564578664888">"ಅಣಕು ಸ್ಥಾನಗಳನ್ನು ಅನುಮತಿಸಿ"</string>
+ <string name="allow_mock_location_summary" msgid="317615105156345626">"ಅಣಕು ಸ್ಥಾನಗಳನ್ನು ಅನುಮತಿಸಿ"</string>
<string name="debug_view_attributes" msgid="6485448367803310384">"ವೀಕ್ಷಣೆ ಆಟ್ರಿಬ್ಯೂಟ್ ಪರಿಶೀಲನೆ"</string>
<string name="mobile_data_always_on_summary" msgid="8149773901431697910">"ವೈ-ಫೈ ಸಕ್ರಿಯವಾಗಿರುವಾಗಲೂ, ಯಾವಾಗಲೂ ಮೊಬೈಲ್ ಡೇಟಾ ಸಕ್ರಿಯವಾಗಿರಿಸಿ (ವೇಗವಾಗಿ ನೆಟ್ವರ್ಕ್ ಬದಲಾಯಿಸಲು)."</string>
<string name="adb_warning_title" msgid="6234463310896563253">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದೇ?"</string>
@@ -232,7 +234,7 @@
<string name="debug_monitoring_category" msgid="7640508148375798343">"ಪರಿವೀಕ್ಷಣೆ ಮಾಡುವಿಕೆ"</string>
<string name="strict_mode" msgid="1938795874357830695">"ಸ್ಟ್ರಿಕ್ಟ್ ಮೋಡ್ ಸಕ್ರಿಯ"</string>
<string name="strict_mode_summary" msgid="142834318897332338">"ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮುಖ್ಯ ಥ್ರೆಡ್ನಲ್ಲಿ ದೀರ್ಘ ಕಾರ್ಯಾಚರಣೆ ನಿರ್ವಹಿಸಿದಾಗ ಪರದೆಯನ್ನು ಫ್ಲ್ಯಾಶ್ ಮಾಡು"</string>
- <string name="pointer_location" msgid="6084434787496938001">"ಪಾಯಿಂಟರ್ ಸ್ಥಾನ"</string>
+ <string name="pointer_location" msgid="6084434787496938001">"ಪಾಯಿಂಟರ್ ಸ್ಥಳ"</string>
<string name="pointer_location_summary" msgid="840819275172753713">"ಪ್ರಸ್ತುತ ಸ್ಪರ್ಶ ಡೇಟಾ ತೋರಿಸುವ ಪರದೆಯ ಓವರ್ಲೇ"</string>
<string name="show_touches" msgid="2642976305235070316">"ಟ್ಯಾಪ್ಗಳನ್ನು ತೋರಿಸು"</string>
<string name="show_touches_summary" msgid="6101183132903926324">"ಟ್ಯಾಪ್ಗಳಿಗೆ ದೃಶ್ಯ ಪ್ರತಿಕ್ರಿಯೆ ತೋರಿಸು"</string>
@@ -297,15 +299,15 @@
<string name="inactive_app_active_summary" msgid="4174921824958516106">"ಸಕ್ರಿಯ. ಟಾಗಲ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"ರನ್ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳು"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"ಈಗ ರನ್ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ ಮತ್ತು ನಿಯಂತ್ರಿಸಿ"</string>
- <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView ಅನುಷ್ಠಾನಗೊಳಿಸುವಿಕೆ"</string>
+ <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView ಹೊಂದಿಸಿ"</string>
<string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView ಅನುಷ್ಠಾನಗೊಳಿಸುವಿಕೆಯನ್ನು ಹೊಂದಿಸಿ"</string>
<string name="select_webview_provider_toast_text" msgid="5466970498308266359">"ಈ ಆಯ್ಕೆಯು ಇನ್ನು ಮುಂದೆ ಮಾನ್ಯವಾಗಿರುವುದಿಲ್ಲ. ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="convert_to_file_encryption" msgid="3060156730651061223">"ಫೈಲ್ ಎನ್ಕ್ರಿಪ್ಶನ್ಗೆ ಪರಿವರ್ತಿಸು"</string>
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"ಪರಿವರ್ತಿಸು…"</string>
<string name="convert_to_file_encryption_done" msgid="7859766358000523953">"ಫೈಲ್ ಈಗಾಗಲೇ ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"ಫೈಲ್ ಆಧಾರಿತ ಎನ್ಕ್ರಿಪ್ಶನ್ಗೆ ಪರಿವರ್ತಿಸಲಾಗುತ್ತಿದೆ"</string>
- <string name="convert_to_fbe_warning" msgid="6139067817148865527">"ಡೇಟಾ ವಿಭಜನೆಯನ್ನು ಫೈಲ್ ಆಧಾರಿತ ಎನ್ಕ್ರಿಪ್ಶನ್ ಆಗಿ ಪರಿವರ್ತಿಸಿ.\n !!ಎಚ್ಚರಿಕೆ!! ಇದು ನಿಮ್ಮ ಎಲ್ಲ ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ.\n ಈ ವೈಶಿಷ್ಟ್ಯವು ಆಲ್ಫಾ ಆಗಿರುತ್ತದೆ ಮತ್ತು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದೆ ಇರಬಹುದು.\n ಮುಂದುವರಿಸಲು \'ಅಳಿಸು ಮತ್ತು ಪರಿವರ್ತಿಸು…\' ಒತ್ತಿರಿ."</string>
- <string name="button_convert_fbe" msgid="5152671181309826405">"ಅಳಿಸು ಮತ್ತು ಪರಿವರ್ತಿಸು…"</string>
+ <string name="convert_to_fbe_warning" msgid="6139067817148865527">"ಡೇಟಾ ವಿಭಜನೆಯನ್ನು ಫೈಲ್ ಆಧಾರಿತ ಎನ್ಕ್ರಿಪ್ಶನ್ ಆಗಿ ಪರಿವರ್ತಿಸಿ.\n !!ಎಚ್ಚರಿಕೆ!! ಇದು ನಿಮ್ಮ ಎಲ್ಲ ಡೇಟಾವನ್ನು ಅಳಿಸಿತ್ತದೆ.\n ಈ ವೈಶಿಷ್ಟ್ಯವು ಆಲ್ಫಾ ಆಗಿರುತ್ತದೆ ಮತ್ತು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದೆ ಇರಬಹುದು.\n ಮುಂದುವರಿಸಲು \'ಅಳಿಸಿ ಮತ್ತು ಪರಿವರ್ತಿಸು…\' ಒತ್ತಿರಿ."</string>
+ <string name="button_convert_fbe" msgid="5152671181309826405">"ಅಳಿಸಿ ಮತ್ತು ಪರಿವರ್ತಿಸು…"</string>
<string name="picture_color_mode" msgid="4560755008730283695">"ಚಿತ್ರ ಬಣ್ಣದ ಮೋಡ್"</string>
<string name="picture_color_mode_desc" msgid="1141891467675548590">"sRGB ಬಳಸಿ"</string>
<string name="daltonizer_mode_disabled" msgid="7482661936053801862">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 9a4dbf3..c5f842e 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"인터넷 연결 공유"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"메시지 액세스"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM 액세스"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"고품질 오디오 사용: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"고품질 오디오 사용"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"미디어 오디오에 연결됨"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"휴대전화 오디오에 연결됨"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"파일 전송 서버에 연결됨"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 76644a6..410f80b 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Интернет байланышын бөлүшүү"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Билдирүү алмашуу"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM картаны пайдалануу мүмкүнчүлүгү"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Жогорку сапаттагы аудио кодекти колдонуу: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Жогорку сапаттагы аудио кодекти колдонуу"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Медиа аудиого туташты"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Телефон аудиосуна туташты"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Файл өткөрүү серверине туташты"</string>
@@ -74,7 +76,7 @@
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Киргизүү үчүн колдонулсун"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Жупташтыруу"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ЖУПТАШТЫРУУ"</string>
- <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Баш тартуу"</string>
+ <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Жок"</string>
<string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"Жупташканда байланыштарыңыз менен чалуу таржымалыңызды пайдалана аласыз."</string>
<string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> менен жупташуу мүмкүн эмес."</string>
<string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"PIN же код туура эмес болгондуктан <xliff:g id="DEVICE_NAME">%1$s</xliff:g> туташуу мүмкүн эмес."</string>
@@ -89,9 +91,9 @@
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Алынып салынган колдонмолор"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Өчүрүлгөн колдонмолор жана колдонуучулар"</string>
- <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB жалгаштыруу"</string>
+ <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB модем"</string>
<string name="tether_settings_title_wifi" msgid="3277144155960302049">"Ташыма кошулуу чекити"</string>
- <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Bluetooth жалгаштыруу"</string>
+ <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Bluetooth модем"</string>
<string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Жалгаштыруу"</string>
<string name="tether_settings_title_all" msgid="8356136101061143841">"Жалгаштыруу жана ташыма чекит"</string>
<string name="managed_user_title" msgid="8109605045406748842">"Жумуш профилинин колднмлр"</string>
@@ -109,7 +111,7 @@
<string name="tts_default_lang_title" msgid="8018087612299820556">"Тил"</string>
<string name="tts_lang_use_system" msgid="2679252467416513208">"Тутум тилин колдонуу"</string>
<string name="tts_lang_not_selected" msgid="7395787019276734765">"Тил тандалган жок"</string>
- <string name="tts_default_lang_summary" msgid="5219362163902707785">"Айтылган текст боюнча тилге тиешелүү үндү коёт"</string>
+ <string name="tts_default_lang_summary" msgid="5219362163902707785">"Текстти окуй турган тилди тандоо"</string>
<string name="tts_play_example_title" msgid="7094780383253097230">"Үлгүнү угуу"</string>
<string name="tts_play_example_summary" msgid="8029071615047894486">"Кепти синтездөөнүн кыскача көргөзмөсүн ойнотуу"</string>
<string name="tts_install_data_title" msgid="4264378440508149986">"Үн дайындарын орнотуу"</string>
@@ -170,9 +172,9 @@
<string name="wifi_verbose_logging" msgid="4203729756047242344">"Wi‑Fi дайын-даректүү протоколун иштетүү"</string>
<string name="wifi_aggressive_handover" msgid="5309131983693661320">"Wi‑Fi начар болсо, мобилдик Инт-ке өтсүн"</string>
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Wi-Fi Роуминг Скандоо мүмкүнчүлүгүнө ар дайым уруксат берилсин"</string>
- <string name="mobile_data_always_on" msgid="8774857027458200434">"Мобилдик дайындар ар дайым иштетилсин"</string>
+ <string name="mobile_data_always_on" msgid="8774857027458200434">"Мобилдик Интернет иштей берсин"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Үндүн абсолюттук деңгээли өчүрүлсүн"</string>
- <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Bluetooth аркылуу чалууну иштетүү"</string>
+ <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Канал аралык чалууну иштетүү"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP версиясы"</string>
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Bluetooth AVRCP версиясын тандоо"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth аудио кодек"</string>
@@ -347,7 +349,7 @@
<string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"Чоңураак"</string>
<string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Эң чоң"</string>
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Ыңгайлаштырылган (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
- <string name="help_feedback_label" msgid="6815040660801785649">"Жардам жана жооп пикир"</string>
+ <string name="help_feedback_label" msgid="6815040660801785649">"Жардам жана пикир билдирүү"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string>
<string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Демо режиминде демейки жөндөөлөргө кайтаруу үчүн сырсөздү киргизиңиз"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index c555f66..5abd2a6 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"ການແບ່ງປັນການເຊື່ອມຕໍ່ອິນເຕີເນັດ"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"ການເຂົ້າເຖິງຂໍ້ຄວາມ"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"ການເຂົ້າເຖິງ SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"ໃຊ້ສຽງຄຸນນະພາບສູງ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"ໃຊ້ສຽງຄຸນນະພາບສູງ"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"ເຊື່ອມຕໍ່ກັບສື່ດ້ານສຽງແລ້ວ"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ເຊື່ອມຕໍ່ກັບສຽງໂທລະສັບແລ້ວ"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ເຊື່ອມຕໍ່ກັບເຊີບເວີໂອນຍ້າຍໄຟລ໌ແລ້ວ"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 19a1cb7..830abf0 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Interneto ryšio bendrinimas"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Prieiga prie pranešimų"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM prieiga"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Naudoti aukštos kokybės garsą: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Naudoti aukštos kokybės garsą"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Prijungta prie medijos garso įrašo"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Prijungta prie telefono garso"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Prijungta prie failų perkėlimo serverio"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index b3af55e..5749954 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Interneta savienojuma koplietošana"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Piekļuve ziņojumam"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Piekļuve SIM kartei"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Izmantot augstas kvalitātes audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Izmantot augstas kvalitātes audio"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Savienots ar multivides audio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Savienots ar tālruņa audio"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Savienots ar failu pārsūtīšanas serveri"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index dd9f7c9..f38ef5d 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Споделување конекција на интернет"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Порака за пристап"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Пристап до СИМ"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Користи висококвалитетно аудио: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Користи висококвалитетно аудио"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Поврзан со аудио на медиуми"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Поврзан со аудио на телефон"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Поврзан со сервер за пренос на датотеки"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index f2c2f96..7194505 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"ഇന്റർനെറ്റ് കണക്ഷൻ പങ്കിടൽ"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"ആക്സസ്സ് നിയന്ത്രിക്കുക"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM ആക്സസ്"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"ഉയർന്ന നിലവാരമുള്ള ഓഡിയോ ഉപയോഗിക്കുക: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"ഉയർന്ന നിലവാരമുള്ള ഓഡിയോ ഉപയോഗിക്കുക"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"മീഡിയ ഓഡിയോയിലേക്ക് കണക്റ്റുചെയ്തു"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ഫോൺ ഓഡിയോയിൽ കണക്റ്റുചെയ്തു"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ഫയൽ കൈമാറ്റ സെർവറിലേക്ക് കണക്റ്റുചെയ്തു"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index dd2240c6..c11fa9f 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Интернэт холболтыг хуваалцах"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Зурвас хандалт"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM Хандалт"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Өндөр чанарын аудио ашиглах: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Өндөр чанарын аудио ашиглах"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Медиа аудиод холбогдсон"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Утасны аудид холбогдсон"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Файл дамжуулах серверт холбогдсон"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 549019c..a45648e 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"इंटरनेट कनेक्शन सामायिकरण"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"संदेशात प्रवेश"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"सिम प्रवेश"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"उच्च दर्जाचा ऑडिओ वापरा: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"उच्च दर्जाचा ऑडिओ वापरा"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"मीडिया ऑडिओवर कनेक्ट केले"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"फोन ऑडिओ वर कनेक्ट केले"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"फाईल स्थानांतर सर्व्हरवर कनेक्ट केले"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 19fb767..6ca514b 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Perkongsian sambungan Internet"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Akses Mesej"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Akses SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Gunakan audio berkualiti tinggi: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Gunakan audio berkualiti tinggi"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Disambungkan ke audio media"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Disambungkan ke audio telefon"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Bersambung ke pelayan pemindahan fail"</string>
diff --git a/packages/SettingsLib/res/values-my/arrays.xml b/packages/SettingsLib/res/values-my/arrays.xml
index 484c95a..85d6002 100644
--- a/packages/SettingsLib/res/values-my/arrays.xml
+++ b/packages/SettingsLib/res/values-my/arrays.xml
@@ -50,7 +50,7 @@
</string-array>
<string-array name="hdcp_checking_titles">
<item msgid="441827799230089869">"ဘယ်တော့မှ မစစ်ဆေးပါနှင့်"</item>
- <item msgid="6042769699089883931">"DRMအကြောင်းအရာကိုသာ စစ်ဆေးမည်"</item>
+ <item msgid="6042769699089883931">"DRM အကြောင်းအရာကိုသာ စစ်ဆေးရန်"</item>
<item msgid="9174900380056846820">"အမြဲစစ်ဆေးရန်"</item>
</string-array>
<string-array name="hdcp_checking_summaries">
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 431bb05..21bc2dc 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"အင်တာနက်ဆက်သွယ်မှု မျှဝေခြင်း"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"သတင်းရယူမှု"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM အသုံးပြုခြင်း"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"အရည်အသွေးမြင့် အသံအမျိုးအစားကို သုံးရန်− <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"အရည်အသွေးမြင့် အသံအမျိုးအစားကိုသုံးရန်"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"မီဒီယာအသံအား ချိတ်ဆက်ရန်"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ဖုန်းအသံအား ချိတ်ဆက်ရန်"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ဖိုင်လွှဲပြောင်းမည့်ဆာဗာနှင့် ချိတ်ဆက်ထားပြီး"</string>
@@ -141,7 +143,7 @@
</string-array>
<string name="choose_profile" msgid="6921016979430278661">"ပရိုဖိုင်ကို ရွေးရန်"</string>
<string name="category_personal" msgid="1299663247844969448">"ကိုယ်ရေး"</string>
- <string name="category_work" msgid="8699184680584175622">"အလုပ်အကိုင်"</string>
+ <string name="category_work" msgid="8699184680584175622">"အလုပ်"</string>
<string name="development_settings_title" msgid="215179176067683667">"ဆော့ဝဲလ်ရေးသူ၏ ရွေးချယ်မှုများ"</string>
<string name="development_settings_enable" msgid="542530994778109538">"တီထွင်သူများ ရွေးစရာကို ဖွင့်ပါ"</string>
<string name="development_settings_summary" msgid="1815795401632854041">"အပလီကေးရှင်းတိုးတက်မှုအတွက် ရွေးချယ်မှုကိုသတ်မှတ်သည်"</string>
@@ -165,7 +167,7 @@
<string name="mock_location_app" msgid="7966220972812881854">"တည်နေရာအတုပြု အက်ပ်ရွေးရန်"</string>
<string name="mock_location_app_not_set" msgid="809543285495344223">"တည်နေရာအတုပြ အက်ပ်သတ်မှတ်ထားခြင်းမရှိပါ"</string>
<string name="mock_location_app_set" msgid="8966420655295102685">"တည်နေရာအတုပြ အက်ပ်- <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="debug_networking_category" msgid="7044075693643009662">"ကွန်ရက်လုပ်ငန်း"</string>
+ <string name="debug_networking_category" msgid="7044075693643009662">"ချိတ်ဆက်ဆောင်ရွက်ခြင်း"</string>
<string name="wifi_display_certification" msgid="8611569543791307533">"ကြိုးမဲ့ပြသမှု အသိအမှတ်ပြုလက်မှတ်"</string>
<string name="wifi_verbose_logging" msgid="4203729756047242344">"Wi‑Fi Verbose မှတ်တမ်းတင်ခြင်းအား ဖွင့်မည်"</string>
<string name="wifi_aggressive_handover" msgid="5309131983693661320">"Wi‑Fi မှ မိုဘိုင်းသို့ လွှဲပြောင်းရန်"</string>
@@ -214,7 +216,7 @@
<string name="enable_terminal_title" msgid="95572094356054120">"လိုကယ်တာမီနယ်"</string>
<string name="enable_terminal_summary" msgid="67667852659359206">"local shell အသုံးပြုခွင့်ကမ်းလှမ်းသော တာမင်နယ်အပလီကေးရှင်းဖွင့်ပါ"</string>
<string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP စစ်ဆေးမှု"</string>
- <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"HDCPစစ်ဆေးခြင်းလုပ်ဆောင်မှုကို သတ်မှတ်မည်"</string>
+ <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"HDCP စစ်ဆေးပုံကို သတ်မှတ်မည်"</string>
<string name="debug_debugging_category" msgid="6781250159513471316">"အမှားရှာဖွေဖယ်ရှားခြင်း"</string>
<string name="debug_app" msgid="8349591734751384446">"အမှားရှာသည့်အပလီကေးရှင်းရွေးချယ်ရန်"</string>
<string name="debug_app_not_set" msgid="718752499586403499">"အမှားရှာသည့်အပလီကေးရှင်းတခုမှ မသတ်မှတ်ထားပါ"</string>
@@ -314,7 +316,7 @@
<string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"Protanomaly (အနီ-အစိမ်း)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"Tritanomaly (အပြာ-အဝါ)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"အရောင်ပြင်ဆင်မှု"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"ဒီအင်္ဂါရပ်မှာ စမ်းသပ်မှု ဖြစ်၍ လုပ်ကိုင်မှုကို အကျိုးသက်ရောက်နိုင်သည်။"</string>
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"ဤဝန်ဆောင်မှုမှာ စမ်းသပ်အဆင့်သာဖြစ်၍ လုပ်ဆောင်မှုအားနည်းနိုင်သည်။"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> မှ ကျော်၍ လုပ်ထားသည်။"</string>
<string name="power_remaining_duration_only" msgid="845431008899029842">"<xliff:g id="TIME">%1$s</xliff:g> ခန့်လိုပါသည်"</string>
<string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"အားပြည့်ရန် <xliff:g id="TIME">%1$s</xliff:g> လိုပါသည်"</string>
@@ -354,7 +356,7 @@
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ရှေ့သို့"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"စကားဝှက် လိုအပ်သည်"</string>
<string name="active_input_method_subtypes" msgid="3596398805424733238">"ရနိုင်သောထည့်သွင်းရန်နည်းလမ်းများ"</string>
- <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"စနစ်ဘာသာစကားများကို အသုံးပြုပါ"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"သတ်မှတ် ဘာသာစကားများကို သုံးပါ"</string>
<string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>အတွက် ဆက်တင်းများဖွင့်ရန် မအောင်မြင်ပါ။"</string>
<string name="ime_security_warning" msgid="4135828934735934248">"ဤထည့်သွင်းမှုနည်းလမ်းမှာ သင့်ကိုယ်ရေးအချက်အလက်များဖြစ်သော စကားဝှက်များနှင့် ကရက်ဒစ်ကဒ်နံပါတ်စသည်တို့ကို ရယူသွားမည်ဖြစ်သည်။ <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>အပလီကေးရှင်းမှလာပါသည်။ ဤထည့်သွင်းမှုနည်းလမ်းကို အသုံးပြုမည်လား?"</string>
<string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"မှတ်ချက် − ပြန်လည်စတင်ပြီးနောက် သင့်ဖုန်းကိုလော့ခ်မဖွင့်မချင်း ဤအက်ပ်ကို အသုံးပြု၍မရပါ"</string>
diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml
index e0f7663..287c386 100644
--- a/packages/SettingsLib/res/values-nb/arrays.xml
+++ b/packages/SettingsLib/res/values-nb/arrays.xml
@@ -49,9 +49,9 @@
<item msgid="1805837518286731242">"Unngår dårlig tilkobling midlertidig"</item>
</string-array>
<string-array name="hdcp_checking_titles">
- <item msgid="441827799230089869">"Aldri kontrollér"</item>
+ <item msgid="441827799230089869">"Kontrollér aldri"</item>
<item msgid="6042769699089883931">"Kontrollér kun DRM-innhold"</item>
- <item msgid="9174900380056846820">"Alltid kontrollér"</item>
+ <item msgid="9174900380056846820">"Kontrollér alltid"</item>
</string-array>
<string-array name="hdcp_checking_summaries">
<item msgid="505558545611516707">"Bruk aldri HDCP-kontroll"</item>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 1293106..409ccab 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Deling av Internett-tilkobling"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Meldingstilgang"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Tilgang til SIM-kortet"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Bruk lyd av høy kvalitet: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Bruk lyd av høy kvalitet"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Koblet til medielyd"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Koblet til telefonlyd"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Koblet til tjener for filoverføring"</string>
@@ -304,7 +306,7 @@
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"Konvertér …"</string>
<string name="convert_to_file_encryption_done" msgid="7859766358000523953">"Allerede kryptert og lagret som fil"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"Konvertér til filbasert kryptering"</string>
- <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Konvertér datapartisjonen til filbasert kryptering.\n !!Advarsel!! Dette sletter alle dataene dine.\n Dette er en alfafunksjon og kommer kanskje ikke til å fungere skikkelig.\n Trykk på «Slett og konvertér …» for å fortsette."</string>
+ <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Konvertér datapartisjonen til filbasert kryptering.\n !!Advarsel!! Dette gjør at alle dataene dine slettes.\n Dette er en alfafunksjon, som kanskje ikke fungerer som forventet.\n Trykk på «Slett og konvertér …» for å fortsette."</string>
<string name="button_convert_fbe" msgid="5152671181309826405">"Slett og konvertér …"</string>
<string name="picture_color_mode" msgid="4560755008730283695">"Fargemodus for bilder"</string>
<string name="picture_color_mode_desc" msgid="1141891467675548590">"Bruk sRGB"</string>
@@ -314,7 +316,7 @@
<string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"Protanomali (rød-grønn)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"Tritanomali (blå-gul)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Fargekorrigering"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Denne funksjonen er eksperimentell og kan påvirke ytelsen."</string>
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Dette er en eksperimentell funksjon som kan gjøre at telefonen ikke fungerer optimalt."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Overstyres av <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="845431008899029842">"Omtrent <xliff:g id="TIME">%1$s</xliff:g> gjenstår"</string>
<string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> til det er fulladet"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 8fb8a1c..8738e04 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"इन्टरनेट जडान साझेदारी गर्दै"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"सन्देश पहुँच"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM पहुँच"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"उच्च गुणस्तरको अडियो प्रयोग गर्नुहोस्: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"उच्च गुणस्तरको अडियो प्रयोग गर्नुहोस्"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"मिडिया अडियोसँग जडित"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"फोन अडियोमा जडान गरियो"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"फाइल ट्रान्सफर सर्भरमा जडान गरियो"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 5c83657..30cd8db 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Internetverbinding delen"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Toegang tot berichten"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Sim-toegang"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Audio van hoge kwaliteit gebruiken: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Audio van hoge kwaliteit gebruiken"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Verbonden met audio van medium"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Verbonden met audio van telefoon"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Verbonden met server voor bestandsoverdracht"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 9e7669e..ac7d7de 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਸ਼ੇਅਰਿੰਗ"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"ਸੁਨੇਹਾ ਪਹੁੰਚ"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM ਪਹੁੰਚ"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"ਉੱਚ ਗੁਣਵੱਤਾ ਔਡੀਓ ਵਰਤੋ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"ਉੱਚ ਗੁਣਵੱਤਾ ਔਡੀਓ ਵਰਤੋ"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"ਮੀਡੀਆ ਔਡੀਓ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ਫੋਨ ਔਡੀਓ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ ਸਰਵਰ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 8d53f37..7624042 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Udostępnianie połączenia internetowego"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Dostęp do wiadomości"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Dostęp do karty SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Korzystaj z dźwięku wysokiej jakości: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Korzystaj z dźwięku wysokiej jakości"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Połączono z funkcją audio multimediów"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Połączono z funkcją audio telefonu"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Połączono z serwerem transferu plików"</string>
@@ -300,7 +302,7 @@
<string name="select_webview_provider_title" msgid="4628592979751918907">"Implementacja WebView"</string>
<string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Ustaw implementację WebView"</string>
<string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Ta opcja nie jest już obsługiwana. Spróbuj ponownie."</string>
- <string name="convert_to_file_encryption" msgid="3060156730651061223">"Przekształć na szyfrowanie plików"</string>
+ <string name="convert_to_file_encryption" msgid="3060156730651061223">"Szyfrowanie plików"</string>
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"Przekształć…"</string>
<string name="convert_to_file_encryption_done" msgid="7859766358000523953">"Pliki są już zaszyfrowane"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"Przekształcanie na szyfrowanie plików"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 2556f8e..fead9f0 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -47,7 +47,7 @@
<string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Conectado (sem acesso a mensagens)"</string>
<string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Conectado (sem telefone ou mídia)"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Áudio da mídia"</string>
- <string name="bluetooth_profile_headset" msgid="8658779596261212609">"Áudio do telefone"</string>
+ <string name="bluetooth_profile_headset" msgid="8658779596261212609">"Áudio do smartphone"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferência de arquivo"</string>
<string name="bluetooth_profile_hid" msgid="3680729023366986480">"Dispositivo de entrada"</string>
<string name="bluetooth_profile_pan" msgid="3391606497945147673">"Acesso à Internet"</string>
@@ -56,8 +56,10 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Compartilhamento de conexão à Internet"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Acesso a mensagens"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Acesso SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Usar áudio de alta qualidade: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Usar áudio de alta qualidade"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Conectado ao áudio da mídia"</string>
- <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Conectado ao áudio do telefone"</string>
+ <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Conectado ao áudio do smartphone"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Conectado ao servidor de transferência de arquivo"</string>
<string name="bluetooth_map_profile_summary_connected" msgid="8191407438851351713">"Conectado ao mapa"</string>
<string name="bluetooth_sap_profile_summary_connected" msgid="8561765057453083838">"Conectado a SAP"</string>
@@ -69,7 +71,7 @@
<string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"Usar para mapa"</string>
<string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"Use para acesso SIM"</string>
<string name="bluetooth_a2dp_profile_summary_use_for" msgid="4630849022250168427">"Usar para áudio de mídia"</string>
- <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Usar para áudio do telefone"</string>
+ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Usar para áudio do smartphone"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Usado para transferência de arquivo"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Usar para entrada"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Parear"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 68a9827..0059cdd 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Partilha da ligação à internet"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Acesso a mensagens"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Acesso ao SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Utilizar áudio de alta qualidade: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Utilizar áudio de alta qualidade"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Ligado ao áudio de multimédia"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Ligado ao áudio do telefone"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Ligado ao servidor de transferência de ficheiros"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 2556f8e..fead9f0 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -47,7 +47,7 @@
<string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Conectado (sem acesso a mensagens)"</string>
<string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Conectado (sem telefone ou mídia)"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Áudio da mídia"</string>
- <string name="bluetooth_profile_headset" msgid="8658779596261212609">"Áudio do telefone"</string>
+ <string name="bluetooth_profile_headset" msgid="8658779596261212609">"Áudio do smartphone"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferência de arquivo"</string>
<string name="bluetooth_profile_hid" msgid="3680729023366986480">"Dispositivo de entrada"</string>
<string name="bluetooth_profile_pan" msgid="3391606497945147673">"Acesso à Internet"</string>
@@ -56,8 +56,10 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Compartilhamento de conexão à Internet"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Acesso a mensagens"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Acesso SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Usar áudio de alta qualidade: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Usar áudio de alta qualidade"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Conectado ao áudio da mídia"</string>
- <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Conectado ao áudio do telefone"</string>
+ <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Conectado ao áudio do smartphone"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Conectado ao servidor de transferência de arquivo"</string>
<string name="bluetooth_map_profile_summary_connected" msgid="8191407438851351713">"Conectado ao mapa"</string>
<string name="bluetooth_sap_profile_summary_connected" msgid="8561765057453083838">"Conectado a SAP"</string>
@@ -69,7 +71,7 @@
<string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"Usar para mapa"</string>
<string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"Use para acesso SIM"</string>
<string name="bluetooth_a2dp_profile_summary_use_for" msgid="4630849022250168427">"Usar para áudio de mídia"</string>
- <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Usar para áudio do telefone"</string>
+ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Usar para áudio do smartphone"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Usado para transferência de arquivo"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Usar para entrada"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Parear"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 6db4dbe..9504a73 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Distribuirea conexiunii la internet"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Acces la mesaje"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Acces la SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Utilizați conținut audio de înaltă calitate: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Utilizați conținut audio de înaltă calitate"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Conectat la profilul pentru conținut media audio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Conectat la componenta audio a telefonului"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Conectat la serverul de transfer de fișiere"</string>
@@ -277,7 +279,7 @@
<string name="enable_freeform_support" msgid="1461893351278940416">"Activați ferestrele cu formă liberă"</string>
<string name="enable_freeform_support_summary" msgid="8247310463288834487">"Activați compatibilitatea pentru ferestrele experimentale cu formă liberă."</string>
<string name="local_backup_password_title" msgid="3860471654439418822">"Parolă copie rez. desktop"</string>
- <string name="local_backup_password_summary_none" msgid="6951095485537767956">"În prezent, copiile de rezervă complete pe desktop nu sunt protejate"</string>
+ <string name="local_backup_password_summary_none" msgid="6951095485537767956">"În prezent, backupurile complete pe desktop nu sunt protejate"</string>
<string name="local_backup_password_summary_change" msgid="5376206246809190364">"Atingeți ca să modificați sau să eliminați parola pentru backupurile complete pe desktop"</string>
<string name="local_backup_password_toast_success" msgid="582016086228434290">"A fost setată o parolă de rezervă nouă"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Parola nouă și confirmarea acesteia nu se potrivesc."</string>
@@ -304,7 +306,7 @@
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"Convertiți…"</string>
<string name="convert_to_file_encryption_done" msgid="7859766358000523953">"Criptarea bazată pe sistemul de fișiere este finalizată"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"Se face conversia la criptarea bazată pe sistemul de fișiere"</string>
- <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Faceți conversia partiției de date la criptarea bazată pe sistemul de fișiere. \n !!Avertisment!! Astfel, toate datele dvs. vor fi șterse.\n Aceasta este o funcție în versiune alpha și este posibil să nu funcționeze corect.\n Apăsați pe „Ștergeți și convertiți…” pentru a continua."</string>
+ <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Faceți conversia partiției de date la criptarea bazată pe sistemul de fișiere. \n AVERTISMENT! Astfel, toate datele dvs. vor fi șterse.\n Aceasta este o funcție în versiune alpha și este posibil să nu funcționeze corect.\n Apăsați pe „Ștergeți și convertiți…” pentru a continua."</string>
<string name="button_convert_fbe" msgid="5152671181309826405">"Ștergeți și convertiți…"</string>
<string name="picture_color_mode" msgid="4560755008730283695">"Modul de culori pentru imagini"</string>
<string name="picture_color_mode_desc" msgid="1141891467675548590">"Folosiți sRGB"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 797a9e3..cc82236 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Профиль PAN"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Доступ к сообщениям"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Доступ к SIM-карте"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Использовать аудио высокого качества: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Использовать аудио высокого качества"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Подключено к мультимедийному аудиоустройству"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Подключено к аудиоустройству телефона"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Установлено подключение к серверу передачи файлов"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 263ae27..1623308 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"අන්තර්ජාල සම්බන්ධතා බෙදාගැනීම"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"පණිවිඩ ප්රවේශය"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM ප්රවේශය"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"ඉහළ ගුණත්වයේ ශ්රව්ය භාවිත කරන්න: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"ඉහළ ගුණත්වයේ ශ්රව්ය භාවිත කරන්න"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"මාධ්ය ශ්රව්යට සම්බන්ධ විය"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"දුරකතනයේ ශ්රව්යට සම්බන්ධ විය"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ගොනු හුවමාරු සේවාදායකය සමග සම්බන්ධ විය"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 759f8ea..a8f5566 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Zdieľanie pripojenia na Internet"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Prístup ku správam"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Prístup k SIM karte"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Použiť zvuk s vysokou kvalitou: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Použiť zvuk s vysokou kvalitou"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Pripojené ku zvukovému médiu"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Pripojené ku zvuku telefónu"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Pripojené na server pre prenos údajov"</string>
@@ -92,7 +94,7 @@
<string name="tether_settings_title_usb" msgid="6688416425801386511">"Zdieľané pripojenie cez USB"</string>
<string name="tether_settings_title_wifi" msgid="3277144155960302049">"Prenosný prístupový bod"</string>
<string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Pripojenie cez Bluetooth"</string>
- <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Zdieľanie dát. pripojenia"</string>
+ <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Zdieľané pripojenie"</string>
<string name="tether_settings_title_all" msgid="8356136101061143841">"Zdieľané pripojenie a prenosný hotspot"</string>
<string name="managed_user_title" msgid="8109605045406748842">"Všetky pracovné aplikácie"</string>
<string name="user_guest" msgid="8475274842845401871">"Hosť"</string>
@@ -101,7 +103,7 @@
<string name="launch_defaults_some" msgid="313159469856372621">"Predvolená pre niektoré akcie"</string>
<string name="launch_defaults_none" msgid="4241129108140034876">"Nie je predvolená pre žiadne akcie"</string>
<string name="tts_settings" msgid="8186971894801348327">"Nastavenia prevodu textu na reč"</string>
- <string name="tts_settings_title" msgid="1237820681016639683">"Výstup prevodu textu na reč"</string>
+ <string name="tts_settings_title" msgid="1237820681016639683">"Prevod textu na reč"</string>
<string name="tts_default_rate_title" msgid="6030550998379310088">"Rýchlosť reči"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"Rýchlosť hovoreného textu"</string>
<string name="tts_default_pitch_title" msgid="6135942113172488671">"Výška"</string>
@@ -165,7 +167,7 @@
<string name="mock_location_app" msgid="7966220972812881854">"Vybrať aplikáciu so simulovanou polohou"</string>
<string name="mock_location_app_not_set" msgid="809543285495344223">"Nemáte žiadnu aplikáciu so simulovanou polohou"</string>
<string name="mock_location_app_set" msgid="8966420655295102685">"Aplikácia so simulovanou polohou: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="debug_networking_category" msgid="7044075693643009662">"Možnosti siete"</string>
+ <string name="debug_networking_category" msgid="7044075693643009662">"Siete"</string>
<string name="wifi_display_certification" msgid="8611569543791307533">"Certifikácia bezdrôtového zobrazenia"</string>
<string name="wifi_verbose_logging" msgid="4203729756047242344">"Podrobné denníky Wi-Fi"</string>
<string name="wifi_aggressive_handover" msgid="5309131983693661320">"Agres. odovzdávať Wi-Fi na mobilnú sieť"</string>
@@ -232,7 +234,7 @@
<string name="debug_monitoring_category" msgid="7640508148375798343">"Monitorovanie"</string>
<string name="strict_mode" msgid="1938795874357830695">"Povoliť prísny režim"</string>
<string name="strict_mode_summary" msgid="142834318897332338">"Blikať pri dlhých operáciách hlavného vlákna"</string>
- <string name="pointer_location" msgid="6084434787496938001">"Umiestnenie ukazovateľa"</string>
+ <string name="pointer_location" msgid="6084434787496938001">"Umiestnenie kurzora"</string>
<string name="pointer_location_summary" msgid="840819275172753713">"Zobraziť prekryvnú vrstvu s aktuálnymi údajmi o klepnutiach"</string>
<string name="show_touches" msgid="2642976305235070316">"Zobrazovať klepnutia"</string>
<string name="show_touches_summary" msgid="6101183132903926324">"Vizuálne znázorňovať klepnutia"</string>
@@ -297,14 +299,14 @@
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktívne. Prepnite klepnutím."</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Spustené služby"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Zobrazenie a ovládanie aktuálne spustených služieb"</string>
- <string name="select_webview_provider_title" msgid="4628592979751918907">"Implementácia komponenta WebView"</string>
- <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Nastavenie implementácie komponenta WebView"</string>
+ <string name="select_webview_provider_title" msgid="4628592979751918907">"Implementácia WebView"</string>
+ <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Nastaviť implementáciu WebView"</string>
<string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Táto voľba už nie je platná. Skúste to znova."</string>
- <string name="convert_to_file_encryption" msgid="3060156730651061223">"Konvertovať na šifrovanie súborov"</string>
+ <string name="convert_to_file_encryption" msgid="3060156730651061223">"Prejsť na šifrovanie súborov"</string>
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"Konvertovať…"</string>
<string name="convert_to_file_encryption_done" msgid="7859766358000523953">"Súbory sú už šifrované"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"Konvertovanie na šifrovanie založené na súboroch"</string>
- <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Chystáte sa konvertovať dátový oddiel na šifrovanie založené na súboroch.\n !!Upozornenie!! Týmto procesom vymažete všetky dáta.\n Táto funkcia je v alfa verzii a nemusí fungovať správne.\n Ak chcete pokračovať, stlačte tlačidlo „Vymazať a konvertovať…“."</string>
+ <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Chystáte sa previesť dátový oddiel na šifrovanie založené na súboroch.\nPozor!!! Všetky vaše dáta budú vymazané.\nTáto funkcia je v alfa verzii a nemusí fungovať správne.\nAk chcete pokračovať, stlačte tlačidlo Vymazať a konvertovať…"</string>
<string name="button_convert_fbe" msgid="5152671181309826405">"Vymazať a konvertovať…"</string>
<string name="picture_color_mode" msgid="4560755008730283695">"Farebný režim obrázka"</string>
<string name="picture_color_mode_desc" msgid="1141891467675548590">"Použije sa sRGB"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 5a11a01..085621a 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Skupna raba internetne povezave"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Dostop do sporočil"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Dostop do kartice SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Uporabi zvok visoke kakovosti: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Uporabi zvok visoke kakovosti"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Povezan s profilom za predstavnostni zvok"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Povezava s profilom za zvok telefona vzpostavljena"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Povezava s strežnikom za prenos datotek je vzpostavljena"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 40c1362..c9398a5 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Ndarja e lidhjes së internetit"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Qasja në mesazhe"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Qasje në kartën SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Përdor audion me cilësi të lartë: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Përdor audion me cilësi të lartë"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"U lidh me audion e medias"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"U lidh me audion e telefonit"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"U lidh me serverin e transferimit të skedarëve"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index a9a9bd4..9c08f97 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Дељење интернет везе"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Приступ порукама"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Приступ SIM картици"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Користи звук високог квалитета: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Користи звук високог квалитета"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Повезано са звуком медија"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Повезано са звуком телефона"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Повезано са сервером за пренос датотека"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index bbee66c..cfae5ae 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Delning av Internetanslutning"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Meddelandeåtkomst"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-åtkomst"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Använd högkvalitativt ljud: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Använd högkvalitativt ljud"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Ansluten till medialjud"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Ansluten till telefonens ljud"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Ansluten till filöverföringsserver"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index b44dc04..8b24ef7 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Kushiriki muunganisho wa tovuti"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Ufikiaji wa Ujumbe"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Ufikiaji wa SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Tumia sauti ya ubora wa juu: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Tumia sauti ya ubora wa juu"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Imeunganishwa kwenye sikika ya njia ya mawasiliano"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Imeunganishwa kwenye sauti ya simu"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Imeunganishwa kwenye seva ya kuhamisha faili"</string>
@@ -102,7 +104,7 @@
<string name="launch_defaults_none" msgid="4241129108140034876">"Hakuna chaguo-misingi zilizowekwa"</string>
<string name="tts_settings" msgid="8186971894801348327">"Mipangilio ya maandishi kwa hotuba"</string>
<string name="tts_settings_title" msgid="1237820681016639683">"Kubadilisha maandishi hadi usemi"</string>
- <string name="tts_default_rate_title" msgid="6030550998379310088">"Kiwango cha usemaji"</string>
+ <string name="tts_default_rate_title" msgid="6030550998379310088">"Kasi ya kutamka"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"Kasi ya kutamkwa kwa maneno"</string>
<string name="tts_default_pitch_title" msgid="6135942113172488671">"Giza"</string>
<string name="tts_default_pitch_summary" msgid="1944885882882650009">"Huathiri sauti ya matamshi yaliyounganishwa"</string>
@@ -304,7 +306,7 @@
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"Badilisha..."</string>
<string name="convert_to_file_encryption_done" msgid="7859766358000523953">"Tayari faili imesimbwa kwa njia fiche"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"Inabadilisha kuwa usimbaji fiche unaotegemea faili"</string>
- <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Badilisha sehemu za data kuwa usimbaji unaotegemea faili.\n!!Onyo!! Hatua hii itafuta data yako yote.\nKipengele hiki ni cha alpha, na huenda kisifanye kazi vizuri.\nBonyeza \'Futa na ubadilishe...\' ili uendelee."</string>
+ <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Badilisha sehemu za data kuwa usimbaji unaotegemea faili.\n!!Onyo!! Hatua hii itafuta data yako yote.\nKipengele hiki ni cha alpha na huenda kisifanye kazi vizuri.\nBonyeza \'Futa na ubadilishe...\' ili uendelee."</string>
<string name="button_convert_fbe" msgid="5152671181309826405">"Futa na uibadilishe..."</string>
<string name="picture_color_mode" msgid="4560755008730283695">"Hali ya rangi ya picha"</string>
<string name="picture_color_mode_desc" msgid="1141891467675548590">"Tumia sRGB"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 3b5c9b4..e09db51 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"இணைய இணைப்பு பகிர்தல்"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"செய்திக்கான அணுகல்"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"சிம் அணுகல்"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"உயர்தர ஆடியோவைப் பயன்படுத்து: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"உயர்தர ஆடியோவைப் பயன்படுத்து"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"மீடியா ஆடியோவுடன் இணைக்கப்பட்டது"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"மொபைல் ஆடியோவுடன் இணைக்கப்பட்டது"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"கோப்பைப் பரிமாற்றும் சேவையகத்துடன் இணைக்கப்பட்டது"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 5be8efe..dabf7ed 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"ఇంటర్నెట్ కనెక్షన్ భాగస్వామ్యం"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"సందేశ ప్రాప్యత"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM ప్రాప్యత"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"అధిక నాణ్యత ఆడియోను ఉపయోగించండి: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"అధిక నాణ్యత ఆడియోను ఉపయోగించండి"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"మీడియా ఆడియోకు కనెక్ట్ చేయబడింది"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ఫోన్ ఆడియోకు కనెక్ట్ చేయబడింది"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ఫైల్ బదిలీ సర్వర్కు కనెక్ట్ చేయబడింది"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 1de7f9e..9a265f5 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"การแชร์การเชื่อมต่ออินเทอร์เน็ต"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"การเข้าถึงข้อความ"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"การเข้าถึงซิม"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"ใช้เสียงคุณภาพสูง: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"ใช้เสียงคุณภาพสูง"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"เชื่อมต่อกับระบบเสียงของสื่อแล้ว"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"เชื่อมต่อกับระบบเสียงของโทรศัพท์แล้ว"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"เชื่อมต่อกับเซิร์ฟเวอร์สำหรับโอนไฟล์แล้ว"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 2fed288..c46ac78 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Pagbabahagi ng koneksyon sa internet"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Access sa Mensahe"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Access sa SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Gumamit ng mataas na kalidad na audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Gumamit ng mataas na kalidad na audio"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Konektado sa media audio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Nakakonekta sa audio ng telepono"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Nakakonekta sa server sa paglilipat ng file"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 79d3609..696b209 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"İnternet bağlantısı paylaşımı"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Mesaj Erişimi"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM Erişimi"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Yüksek kalite ses kullan: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Yüksek kalite ses kullan"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Medya sesine bağlanıldı"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Telefon sesine bağlandı"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Dosya aktarım sunucusuna bağlandı"</string>
@@ -234,8 +236,8 @@
<string name="strict_mode_summary" msgid="142834318897332338">"Uyg. ana işlem parçasında uzun işlem yap. ekr. yakıp söndür"</string>
<string name="pointer_location" msgid="6084434787496938001">"İşaretçi konumu"</string>
<string name="pointer_location_summary" msgid="840819275172753713">"Mevcut dokunmatik verilerini gösteren yer paylaşımı"</string>
- <string name="show_touches" msgid="2642976305235070316">"Hafifçe dokunmayı göster"</string>
- <string name="show_touches_summary" msgid="6101183132903926324">"Hafifçe dokunmalarda görsel geri bildirim göster"</string>
+ <string name="show_touches" msgid="2642976305235070316">"Dokunmayı göster"</string>
+ <string name="show_touches_summary" msgid="6101183132903926324">"Dokunmalarda görsel geri bildirim göster"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Yüzey güncellemelerini göster"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Güncelleme sırasında tüm pencere yüzeylerini çiz"</string>
<string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU görünüm güncellemelerini göster"</string>
@@ -278,7 +280,7 @@
<string name="enable_freeform_support_summary" msgid="8247310463288834487">"Deneysel serbest biçimli pencere desteğini etkinleştir."</string>
<string name="local_backup_password_title" msgid="3860471654439418822">"Masaüstü yedekleme şifresi"</string>
<string name="local_backup_password_summary_none" msgid="6951095485537767956">"Masaüstü tam yedeklemeleri şu an korunmuyor"</string>
- <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Masaüstü tam yedeklemelerinin şifresini değiştirmek veya kaldırmak için hafifçe dokunun"</string>
+ <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Masaüstü tam yedeklemelerinin şifresini değiştirmek veya kaldırmak için dokunun"</string>
<string name="local_backup_password_toast_success" msgid="582016086228434290">"Yeni yedekleme şifresi ayarlandı"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Yeni şifre ve onayı eşleşmiyor."</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Yedekleme şifresi ayarlanamadı"</string>
@@ -293,8 +295,8 @@
<item msgid="5363960654009010371">"Dijital içerik için optimize edilmiş renkler"</item>
</string-array>
<string name="inactive_apps_title" msgid="1317817863508274533">"Devre dışı uygulamalar"</string>
- <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Etkin değil. Geçiş yapmak için hafifçe dokunun."</string>
- <string name="inactive_app_active_summary" msgid="4174921824958516106">"Etkin. Geçiş yapmak için hafifçe dokunun."</string>
+ <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Etkin değil. Geçiş yapmak için dokunun."</string>
+ <string name="inactive_app_active_summary" msgid="4174921824958516106">"Etkin. Geçiş yapmak için dokunun."</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Çalışan hizmetler"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Şu anda çalışan hizmetleri görüntüle ve denetle"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView kullanımı"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 136887a..a217708 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Надання доступу до Інтернету"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Доступ до повідомлень"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Доступ до SIM-карти"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Використовувати аудіо високої якості: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Використовувати аудіо високої якості"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Підключено до аудіоджерела"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Підключено до звуку телеф."</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Підключ. до сервера передачі файлів"</string>
@@ -325,7 +327,7 @@
<string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> до повного заряду"</string>
<string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Невідомо"</string>
- <string name="battery_info_status_charging" msgid="1705179948350365604">"Зарядж-ся"</string>
+ <string name="battery_info_status_charging" msgid="1705179948350365604">"Заряджається"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"заряджається"</string>
<string name="battery_info_status_discharging" msgid="310932812698268588">"Не заряджається"</string>
<string name="battery_info_status_not_charging" msgid="2820070506621483576">"Не заряджається"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 2d77087..3fceb98 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"انٹرنیٹ کنکشن کا اشتراک کرنا"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"پیغام تک رسائی"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM رسائی"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"اعلی معیار کی آڈیو استعمال کریں: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"اعلی معیار کی آڈیو استعمال کریں"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"میڈیا آڈیو سے مربوط"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"فون آڈیو سے مربوط"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"فائل منتقلی سرور سے مربوط ہو گیا ہے"</string>
@@ -89,11 +91,11 @@
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"ہٹائی گئی ایپس"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"ہٹائی گئی ایپس اور صارفین"</string>
- <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB مربوط کرنا"</string>
+ <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB ٹیتھرنگ"</string>
<string name="tether_settings_title_wifi" msgid="3277144155960302049">"پورٹیبل ہاٹ اسپاٹ"</string>
- <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"بلوٹوتھ مربوط کرنا"</string>
- <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"مربوط کرنا"</string>
- <string name="tether_settings_title_all" msgid="8356136101061143841">"مربوط کرنا اور پورٹیبل ہاٹ اسپاٹ"</string>
+ <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"بلوٹوتھ ٹیتھرنگ"</string>
+ <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"ٹیتھرنگ"</string>
+ <string name="tether_settings_title_all" msgid="8356136101061143841">"ٹیتھرنگ و پورٹیبل ہاٹ اسپاٹ"</string>
<string name="managed_user_title" msgid="8109605045406748842">"تمام کام کی ایپس"</string>
<string name="user_guest" msgid="8475274842845401871">"مہمان"</string>
<string name="unknown" msgid="1592123443519355854">"نامعلوم"</string>
@@ -147,7 +149,7 @@
<string name="development_settings_summary" msgid="1815795401632854041">"ایپ ڈویلپمنٹ کیلئے اختیارات سیٹ کریں"</string>
<string name="development_settings_not_available" msgid="4308569041701535607">"اس صارف کیلئے ڈیولپر کے اختیارات دستیاب نہیں ہیں"</string>
<string name="vpn_settings_not_available" msgid="956841430176985598">"VPN ترتیبات اس صارف کیلئے دستیاب نہیں ہیں"</string>
- <string name="tethering_settings_not_available" msgid="6765770438438291012">"ربط کی ترتیبات اس صارف کیلئے دستیاب نہیں ہیں"</string>
+ <string name="tethering_settings_not_available" msgid="6765770438438291012">"ٹیتھرنگ ترتیبات اس صارف کیلئے دستیاب نہیں ہیں"</string>
<string name="apn_settings_not_available" msgid="7873729032165324000">"رسائی کی جگہ کے نام کی ترتیبات اس صارف کیلئے دستیاب نہیں ہیں"</string>
<string name="enable_adb" msgid="7982306934419797485">"USB ڈیبگ کرنا"</string>
<string name="enable_adb_summary" msgid="4881186971746056635">"USB مربوط ہونے پر ڈيبگ کرنے کی وضع"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 7c01320..4e92c46 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Internet aloqasi ulashmasi"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Xabarga kirish"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-kartaga kirish"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Yuqori sifatli audiodan foydalanish: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Yuqori sifatli audiodan foydalanish"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Audio qurilmasiga ulangan"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Telefon karnayiga ulanildi"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Fayl almashinish serveriga ulanildi"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 913f926..34dd863 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Chia sẻ kết nối internet"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Truy cập tin nhắn"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Quyền truy cập SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Sử dụng âm thanh chất lượng cao: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Sử dụng âm thanh chất lượng cao"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Đã kết nối với âm thanh phương tiện"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Đã kết nối với âm thanh điện thoại"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Đã kết nối với máy chủ chuyển tệp"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index bbcc428..43d75b3 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"共享互联网连接"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"消息权限"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM 卡存取权限"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"使用高品质音频:<xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"使用高品质音频"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"已连接到媒体音频"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"已连接到手机音频"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"已连接到文件传输服务器"</string>
@@ -310,11 +312,11 @@
<string name="picture_color_mode_desc" msgid="1141891467675548590">"使用 sRGB"</string>
<string name="daltonizer_mode_disabled" msgid="7482661936053801862">"已停用"</string>
<string name="daltonizer_mode_monochromacy" msgid="8485709880666106721">"全色盲"</string>
- <string name="daltonizer_mode_deuteranomaly" msgid="5475532989673586329">"绿色弱视(红绿色)"</string>
+ <string name="daltonizer_mode_deuteranomaly" msgid="5475532989673586329">"绿色弱视(红绿不分)"</string>
<string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"红色弱视(红绿色)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"蓝色弱视(蓝黄色)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"色彩校正"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"此功能为实验性功能,可能会影响性能。"</string>
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"这是实验性功能,性能可能不稳定。"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"已被“<xliff:g id="TITLE">%1$s</xliff:g>”覆盖"</string>
<string name="power_remaining_duration_only" msgid="845431008899029842">"还剩大约 <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"还需 <xliff:g id="TIME">%1$s</xliff:g>充满电"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 8ec396e..484f1d3 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"互聯網連線分享"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"訊息存取權"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM 卡存取"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"使用優質音訊編解碼器:<xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"使用優質音訊編解碼器"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"已連接媒體音頻裝置"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"已連接手機耳機"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"已連線至檔案傳輸伺服器"</string>
@@ -317,12 +319,12 @@
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"這是一項實驗性功能,可能會影響效能。"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"已由「<xliff:g id="TITLE">%1$s</xliff:g>」覆寫"</string>
<string name="power_remaining_duration_only" msgid="845431008899029842">"剩餘約 <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g>後就能完全充電"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g>後就能充滿電"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"尚餘 <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - 剩餘約 <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">%1$s</xliff:g> - 尚餘 <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - 還需 <xliff:g id="TIME">%2$s</xliff:g>才能完全充電"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - 還需 <xliff:g id="TIME">%2$s</xliff:g>才能充滿電"</string>
<string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"未知"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"充電中"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 7bad517..050c556 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"網際網路連線分享"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"訊息存取權"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM 卡存取權"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"使用高品質音訊:<xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"使用高品質音訊"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"連接至媒體音訊"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"連接至電話音訊"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"已連線到檔案傳輸伺服器"</string>
@@ -75,7 +77,7 @@
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"配對"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"配對"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"取消"</string>
- <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"配對完成後,所配對的裝置即可在連線後存取您的聯絡人和通話紀錄。"</string>
+ <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"配對完成後,所配對的裝置即可在連線後存取你的聯絡人和通話紀錄。"</string>
<string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"無法與 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 配對。"</string>
<string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"無法與 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 配對,因為 PIN 或密碼金鑰不正確。"</string>
<string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"無法與 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 通訊。"</string>
@@ -114,9 +116,9 @@
<string name="tts_play_example_summary" msgid="8029071615047894486">"播放簡短的語音合成範例"</string>
<string name="tts_install_data_title" msgid="4264378440508149986">"安裝語音資料"</string>
<string name="tts_install_data_summary" msgid="5742135732511822589">"安裝語音合成所需的語音資料"</string>
- <string name="tts_engine_security_warning" msgid="8786238102020223650">"此語音合成引擎可能會收集您輸入的所有語音,包括密碼和信用卡號等個人資料。此引擎來自「<xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g>」引擎,是否要使用此語音合成引擎?"</string>
- <string name="tts_engine_network_required" msgid="1190837151485314743">"您必須連上網路才能使用文字轉語音輸出功能。"</string>
- <string name="tts_default_sample_string" msgid="4040835213373086322">"您目前聽到的是我們的語音合成範例"</string>
+ <string name="tts_engine_security_warning" msgid="8786238102020223650">"此語音合成引擎可能會收集你輸入的所有語音,包括密碼和信用卡號等個人資料。此引擎來自「<xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g>」引擎,是否要使用此語音合成引擎?"</string>
+ <string name="tts_engine_network_required" msgid="1190837151485314743">"你必須連上網路才能使用文字轉語音輸出功能。"</string>
+ <string name="tts_default_sample_string" msgid="4040835213373086322">"你目前聽到的是我們的語音合成範例"</string>
<string name="tts_status_title" msgid="7268566550242584413">"預設語言狀態"</string>
<string name="tts_status_ok" msgid="1309762510278029765">"完整支援<xliff:g id="LOCALE">%1$s</xliff:g>"</string>
<string name="tts_status_requires_network" msgid="6042500821503226892">"需要網路連線才支援<xliff:g id="LOCALE">%1$s</xliff:g>"</string>
@@ -161,7 +163,7 @@
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM 解鎖"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"允許解除鎖定開機載入器"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"要允許 OEM 解鎖嗎?"</string>
- <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"警告:開啟這項設定時,您將無法使用這個裝置的防盜功能。"</string>
+ <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"警告:開啟這項設定時,你將無法使用這個裝置的防盜功能。"</string>
<string name="mock_location_app" msgid="7966220972812881854">"選取模擬位置應用程式"</string>
<string name="mock_location_app_not_set" msgid="809543285495344223">"未設定模擬位置應用程式"</string>
<string name="mock_location_app_set" msgid="8966420655295102685">"模擬位置應用程式:<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -193,7 +195,7 @@
<string name="select_logd_size_title" msgid="7433137108348553508">"紀錄器緩衝區空間"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"選取每個紀錄緩衝區的紀錄器空間"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"要清除永久儲存的記錄器資料嗎?"</string>
- <string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"如果您選擇不再透過永久記錄器進行監控,系統就必須清除裝置中的記錄器資料。"</string>
+ <string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"如果你選擇不再透過永久記錄器進行監控,系統就必須清除裝置中的記錄器資料。"</string>
<string name="select_logpersist_title" msgid="7530031344550073166">"在裝置上永久儲存記錄器資料"</string>
<string name="select_logpersist_dialog_title" msgid="4003400579973269060">"選取要在裝置上永久儲存的紀錄緩衝區"</string>
<string name="select_usb_configuration_title" msgid="2649938511506971843">"選取 USB 設定"</string>
@@ -203,10 +205,10 @@
<string name="debug_view_attributes" msgid="6485448367803310384">"啟用檢視屬性檢查"</string>
<string name="mobile_data_always_on_summary" msgid="8149773901431697910">"即使 Wi‑Fi 連線已啟用,一律將行動數據連線保持啟用狀態 (以便快速切換網路)。"</string>
<string name="adb_warning_title" msgid="6234463310896563253">"允許 USB 偵錯嗎?"</string>
- <string name="adb_warning_message" msgid="7316799925425402244">"USB 偵錯是針對應用程式開發而設計的功能,可讓您複製電腦和裝置中的資料、不需經由通知即可在裝置上安裝應用程式,以及讀取記錄資料。"</string>
+ <string name="adb_warning_message" msgid="7316799925425402244">"USB 偵錯是針對應用程式開發而設計的功能,可讓你複製電腦和裝置中的資料、不需經由通知即可在裝置上安裝應用程式,以及讀取記錄資料。"</string>
<string name="adb_keys_warning_message" msgid="5659849457135841625">"要針對先前授權的所有電腦撤銷 USB 偵錯權限嗎?"</string>
<string name="dev_settings_warning_title" msgid="7244607768088540165">"允許開發設定?"</string>
- <string name="dev_settings_warning_message" msgid="2298337781139097964">"這些設定僅供開發之用,可能導致您的裝置及裝置中的應用程式毀損或運作異常。"</string>
+ <string name="dev_settings_warning_message" msgid="2298337781139097964">"這些設定僅供開發之用,可能導致你的裝置及裝置中的應用程式毀損或運作異常。"</string>
<string name="verify_apps_over_usb_title" msgid="4177086489869041953">"透過 USB 驗證應用程式"</string>
<string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"檢查透過 ADB/ADT 安裝的應用程式是否具有有害行為。"</string>
<string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"只要停用藍牙絕對音量功能,即可避免在連線到遠端裝置時,發生音量過大或無法控制音量等問題。"</string>
@@ -304,7 +306,7 @@
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"轉換..."</string>
<string name="convert_to_file_encryption_done" msgid="7859766358000523953">"已將檔案加密"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"正在轉換成個別加密檔案"</string>
- <string name="convert_to_fbe_warning" msgid="6139067817148865527">"將資料分割區轉換成個別加密檔案。\n警告!這項操作會清除您的所有資料。\n這是 Alpha 版功能,可能無法正確運作。\n按下 [清除並轉換...] 即可繼續。"</string>
+ <string name="convert_to_fbe_warning" msgid="6139067817148865527">"將資料分割區轉換成個別加密檔案。\n警告!這項操作會清除你的所有資料。\n這是 Alpha 版功能,可能無法正確運作。\n按下 [清除並轉換...] 即可繼續。"</string>
<string name="button_convert_fbe" msgid="5152671181309826405">"清除並轉換..."</string>
<string name="picture_color_mode" msgid="4560755008730283695">"螢幕色彩模式"</string>
<string name="picture_color_mode_desc" msgid="1141891467675548590">"使用 sRGB"</string>
@@ -356,6 +358,6 @@
<string name="active_input_method_subtypes" msgid="3596398805424733238">"啟用的輸入法"</string>
<string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"使用系統語言"</string>
<string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"無法開啟「<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>」的設定"</string>
- <string name="ime_security_warning" msgid="4135828934735934248">"這個輸入法是由「<xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>」應用程式所提供,它可能會收集您輸入的所有文字,包括密碼和信用卡號等個人資料。要啟用這個輸入法嗎?"</string>
- <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"注意:重新啟動後,您必須將手機解鎖,才能執行這個應用程式"</string>
+ <string name="ime_security_warning" msgid="4135828934735934248">"這個輸入法是由「<xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>」應用程式所提供,它可能會收集你輸入的所有文字,包括密碼和信用卡號等個人資料。要啟用這個輸入法嗎?"</string>
+ <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"注意:重新啟動後,你必須將手機解鎖,才能執行這個應用程式"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index dd55955..d2a5743 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -56,6 +56,8 @@
<string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Ukwabelana ngoxhumano lwe-Inthanethi"</string>
<string name="bluetooth_profile_map" msgid="5465271250454324383">"Ukufinyelela umlayezo"</string>
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Ukufinyelela kwe-SIM"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="2221025895896419505">"Sebenzisa umsindo wekhwalithi ephezulu: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="5860996587596508755">"Sebenzisa umsindo wekhwalithi ephezulu"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Ixhume emsindweni wemidiya"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Ixhunywe kumsindo wefoni"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Ixhunywe kwiseva yokudlulisa ifayela"</string>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index e15df14..044392c 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -130,6 +130,12 @@
<!-- Bluetooth settings. The user-visible string that is used whenever referring to the SAP profile (sharing SIM card). -->
<string name="bluetooth_profile_sap">SIM Access</string>
+ <!-- Bluetooth settings. The user-visible string for the setting controlling whether to use a high-quality codec if the device supports it, along with the name of the codec (eg AAC, LDAC, aptX) -->
+ <string name="bluetooth_profile_a2dp_high_quality">Use high quality audio: <xliff:g id="codec_name">%1$s</xliff:g></string>
+
+ <!-- Bluetooth settings. Similar to bluetooth_profile_a2dp_high_quality, but used when the device supports high quality audio but we don't know which codec that will be used. -->
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec">Use high quality audio</string>
+
<!-- Bluetooth settings. Connection options screen. The summary for the A2DP checkbox preference when A2DP is connected. -->
<string name="bluetooth_a2dp_profile_summary_connected">Connected to media audio</string>
<!-- Bluetooth settings. Connection options screen. The summary for the headset checkbox preference when headset is connected. -->
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java
index 49fc2ea..32e6389 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java
@@ -35,8 +35,8 @@
import android.os.UserManager;
import android.provider.Settings;
import android.support.annotation.VisibleForTesting;
-import android.text.Spanned;
import android.text.SpannableStringBuilder;
+import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.view.MenuItem;
@@ -75,41 +75,52 @@
*/
public static EnforcedAdmin checkIfRestrictionEnforced(Context context,
String userRestriction, int userId) {
- DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(
+ final DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(
Context.DEVICE_POLICY_SERVICE);
if (dpm == null) {
return null;
}
- UserManager um = UserManager.get(context);
- int restrictionSource = um.getUserRestrictionSource(userRestriction,
- UserHandle.of(userId));
- // If the restriction is not enforced or enforced only by system then return null
- if (restrictionSource == UserManager.RESTRICTION_NOT_SET
- || restrictionSource == UserManager.RESTRICTION_SOURCE_SYSTEM) {
+ final UserManager um = UserManager.get(context);
+ final List<UserManager.EnforcingUser> enforcingUsers =
+ um.getUserRestrictionSources(userRestriction, UserHandle.of(userId));
+
+ if (enforcingUsers.isEmpty()) {
+ // Restriction is not enforced.
return null;
+ } else if (enforcingUsers.size() > 1) {
+ return EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN;
}
- final boolean enforcedByProfileOwner =
- (restrictionSource & UserManager.RESTRICTION_SOURCE_PROFILE_OWNER) != 0;
- final boolean enforcedByDeviceOwner =
- (restrictionSource & UserManager.RESTRICTION_SOURCE_DEVICE_OWNER) != 0;
- if (enforcedByProfileOwner) {
- return getProfileOwner(context, userId);
- } else if (enforcedByDeviceOwner) {
+ final int restrictionSource = enforcingUsers.get(0).getUserRestrictionSource();
+ final int adminUserId = enforcingUsers.get(0).getUserHandle().getIdentifier();
+
+ if (restrictionSource == UserManager.RESTRICTION_SOURCE_PROFILE_OWNER) {
+ // Check if it is a profile owner of the user under consideration.
+ if (adminUserId == userId) {
+ return getProfileOwner(context, adminUserId);
+ } else {
+ // Check if it is a profile owner of a managed profile of the current user.
+ // Otherwise it is in a separate user and we return a default EnforcedAdmin.
+ final UserInfo parentUser = um.getProfileParent(adminUserId);
+ return (parentUser != null && parentUser.id == userId)
+ ? getProfileOwner(context, adminUserId)
+ : EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN;
+ }
+ } else if (restrictionSource == UserManager.RESTRICTION_SOURCE_DEVICE_OWNER) {
// When the restriction is enforced by device owner, return the device owner admin only
// if the admin is for the {@param userId} otherwise return a default EnforcedAdmin.
- final EnforcedAdmin deviceOwner = getDeviceOwner(context);
- return deviceOwner.userId == userId
- ? deviceOwner
- : EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN;
+ return adminUserId == userId
+ ? getDeviceOwner(context) : EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN;
}
+
+ // If the restriction is enforced by system then return null.
return null;
}
public static boolean hasBaseUserRestriction(Context context,
String userRestriction, int userId) {
- UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
+ final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
return um.hasBaseUserRestriction(userRestriction, UserHandle.of(userId));
}
@@ -424,7 +435,6 @@
if (dpm == null) {
return null;
}
- LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
EnforcedAdmin enforcedAdmin = null;
final int userId = UserHandle.myUserId();
final UserManager um = UserManager.get(context);
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
index af247bd..a0eadd0 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
@@ -17,6 +17,7 @@
import android.annotation.LayoutRes;
import android.annotation.Nullable;
+import android.app.ActionBar;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -27,7 +28,6 @@
import android.content.res.TypedArray;
import android.os.AsyncTask;
import android.os.Bundle;
-import android.provider.Settings;
import android.util.ArraySet;
import android.util.Log;
import android.view.LayoutInflater;
@@ -117,14 +117,6 @@
super.onPause();
}
- /**
- * Gets the name of the intent action of the default setting app. Used to launch setting app
- * when Settings Home is clicked.
- */
- public String getSettingAction() {
- return Settings.ACTION_SETTINGS;
- }
-
public void addCategoryListener(CategoryListener listener) {
mCategoryListeners.add(listener);
}
@@ -142,7 +134,7 @@
@Override
public void setContentView(@LayoutRes int layoutResID) {
- final ViewGroup parent = (ViewGroup) findViewById(R.id.content_frame);
+ final ViewGroup parent = findViewById(R.id.content_frame);
if (parent != null) {
parent.removeAllViews();
}
@@ -159,11 +151,14 @@
((ViewGroup) findViewById(R.id.content_frame)).addView(view, params);
}
- public void showMenuIcon() {
- getActionBar().setDisplayHomeAsUpEnabled(true);
+ private void showMenuIcon() {
+ final ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
}
- protected void onCategoriesChanged() {
+ private void onCategoriesChanged() {
final int N = mCategoryListeners.size();
for (int i = 0; i < N; i++) {
mCategoryListeners.get(i).onCategoriesChanged();
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index 9e9bc93..24d8187 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -336,8 +336,12 @@
builder.append(',').append(securityToString(security, pskType));
}
builder.append(",level=").append(getLevel());
- builder.append(",rankingScore=").append(mRankingScore);
- builder.append(",badge=").append(mBadge);
+ if (mRankingScore != Integer.MIN_VALUE) {
+ builder.append(",rankingScore=").append(mRankingScore);
+ }
+ if (mBadge != NetworkBadging.BADGING_NONE) {
+ builder.append(",badge=").append(mBadge);
+ }
builder.append(",metered=").append(isMetered());
return builder.append(')').toString();
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index 314791e..646b6ba 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -15,8 +15,8 @@
*/
package com.android.settingslib.wifi;
+import android.annotation.MainThread;
import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -41,6 +41,7 @@
import android.os.Looper;
import android.os.Message;
import android.provider.Settings;
+import android.support.annotation.GuardedBy;
import android.util.ArraySet;
import android.util.Log;
import android.util.SparseArray;
@@ -65,8 +66,6 @@
* Tracks saved or available wifi networks and their state.
*/
public class WifiTracker {
- // TODO(sghuman): Document remaining methods with @UiThread and @WorkerThread where possible.
- // TODO(sghuman): Refactor to avoid calling certain methods on the UiThread.
// TODO(b/36733768): Remove flag includeSaved and includePasspoints.
private static final String TAG = "WifiTracker";
@@ -91,40 +90,40 @@
private final boolean mIncludeSaved;
private final boolean mIncludeScans;
private final boolean mIncludePasspoints;
- private final MainHandler mMainHandler;
+ @VisibleForTesting final MainHandler mMainHandler;
private final WorkHandler mWorkHandler;
private WifiTrackerNetworkCallback mNetworkCallback;
private int mNumSavedNetworks;
+
+ @GuardedBy("mLock")
private boolean mRegistered;
- /** Updated using main handler. Clone of this collection is returned
- * from {@link #getAccessPoints()}
+ /**
+ * The externally visible access point list.
+ *
+ * Updated using main handler. Clone of this collection is returned from
+ * {@link #getAccessPoints()}
*/
private final List<AccessPoint> mAccessPoints = new ArrayList<>();
/**
- * Protects APs contained in {@link #mInternalAccessPoints} from being modified concurrently
- * while its being read. Usage contract:
+ * The internal list of access points, synchronized on itself.
*
- * 1. MainHandler opens the condition after copying the states thereby
- * allowing WorkerHandler to mutate the contents.
- * 2. WorkerHandler after mutating the contents, sends a message to MainHandler to copy the
- * states and closes the condition.
- *
- * This is better than synchronizing on a variable because it prevents MainHandler from
- * unnecessarily blocking/waiting to acquire lock for copying states. When MainHandler is about
- * to access {@link #mInternalAccessPoints}, it is assumed that it has exclusively lock on the
- * contents.
- */
- private final ConditionVariable mInternalAccessPointsWriteLock = new ConditionVariable(true);
-
- /** Guarded by mInternalAccessPointsWriteLock, updated using worker handler.
* Never exposed outside this class.
*/
+ @GuardedBy("mLock")
private final List<AccessPoint> mInternalAccessPoints = new ArrayList<>();
+ /**
+ * Synchronization lock for managing concurrency between main and worker threads.
+ *
+ * <p>This lock should be held for all background work.
+ * TODO(b/37674366): Remove the worker thread so synchronization is no longer necessary.
+ */
+ private final Object mLock = new Object();
+
//visible to both worker and main thread. Guarded by #mInternalAccessPoints
private final AccessPointListenerAdapter mAccessPointListenerAdapter
= new AccessPointListenerAdapter();
@@ -138,10 +137,12 @@
private final NetworkScoreManager mNetworkScoreManager;
private final WifiNetworkScoreCache mScoreCache;
- private final Set<NetworkKey> mRequestedScores = new ArraySet<>();
private boolean mNetworkScoringUiEnabled;
private final ContentObserver mObserver;
+ @GuardedBy("mLock")
+ private final Set<NetworkKey> mRequestedScores = new ArraySet<>();
+
@VisibleForTesting
Scanner mScanner;
@@ -212,13 +213,17 @@
mNetworkScoreManager = networkScoreManager;
- mScoreCache = new WifiNetworkScoreCache(context, new CacheListener(mMainHandler) {
+ mScoreCache = new WifiNetworkScoreCache(context, new CacheListener(mWorkHandler) {
@Override
public void networkCacheUpdated(List<ScoredNetwork> networks) {
+ synchronized (mLock) {
+ if (!mRegistered) return;
+ }
+
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "Score cache was updated with networks: " + networks);
}
- Message.obtain(mWorkHandler, WorkHandler.MSG_UPDATE_NETWORK_SCORES).sendToTarget();
+ updateNetworkScores();
}
});
@@ -236,17 +241,19 @@
/**
* Synchronously update the list of access points with the latest information.
*/
+ @MainThread
public void forceUpdate() {
- mWorkHandler.removeMessages(WorkHandler.MSG_UPDATE_ACCESS_POINTS);
+ synchronized (mLock) {
+ mWorkHandler.removeMessages(WorkHandler.MSG_UPDATE_ACCESS_POINTS);
+ mLastInfo = mWifiManager.getConnectionInfo();
+ mLastNetworkInfo = mConnectivityManager.getNetworkInfo(mWifiManager.getCurrentNetwork());
+ updateAccessPointsLocked();
- mLastInfo = mWifiManager.getConnectionInfo();
- mLastNetworkInfo = mConnectivityManager.getNetworkInfo(mWifiManager.getCurrentNetwork());
- updateAccessPoints();
-
- // Synchronously copy access points
- mMainHandler.removeMessages(MainHandler.MSG_ACCESS_POINT_CHANGED);
- mMainHandler.handleMessage(
- Message.obtain(mMainHandler, MainHandler.MSG_ACCESS_POINT_CHANGED));
+ // Synchronously copy access points
+ mMainHandler.removeMessages(MainHandler.MSG_ACCESS_POINT_CHANGED);
+ mMainHandler.handleMessage(
+ Message.obtain(mMainHandler, MainHandler.MSG_ACCESS_POINT_CHANGED));
+ }
}
/**
@@ -290,22 +297,25 @@
* <p>Registers listeners and starts scanning for wifi networks. If this is not called
* then forceUpdate() must be called to populate getAccessPoints().
*/
+ @MainThread
public void startTracking() {
- registerScoreCache();
+ synchronized (mLock) {
+ registerScoreCache();
- mContext.getContentResolver().registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.NETWORK_SCORING_UI_ENABLED),
- false /* notifyForDescendants */,
- mObserver);
- mObserver.onChange(false /* selfChange */); // Set the initial value for mScoringUiEnabled
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.NETWORK_SCORING_UI_ENABLED),
+ false /* notifyForDescendants */,
+ mObserver);
+ mObserver.onChange(false /* selfChange */); // Set mScoringUiEnabled
- resumeScanning();
- if (!mRegistered) {
- mContext.registerReceiver(mReceiver, mFilter);
- // NetworkCallback objects cannot be reused. http://b/20701525 .
- mNetworkCallback = new WifiTrackerNetworkCallback();
- mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback);
- mRegistered = true;
+ resumeScanning();
+ if (!mRegistered) {
+ mContext.registerReceiver(mReceiver, mFilter);
+ // NetworkCallback objects cannot be reused. http://b/20701525 .
+ mNetworkCallback = new WifiTrackerNetworkCallback();
+ mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback);
+ mRegistered = true;
+ }
}
}
@@ -323,44 +333,49 @@
Log.d(TAG, "Requesting scores for Network Keys: " + keys);
}
mNetworkScoreManager.requestScores(keys.toArray(new NetworkKey[keys.size()]));
- mRequestedScores.addAll(keys);
+ synchronized (mLock) {
+ mRequestedScores.addAll(keys);
+ }
}
/**
* Stop tracking wifi networks and scores.
*
- * <p>Unregisters all listeners and stops scanning for wifi networks. This should always
- * be called when done with a WifiTracker (if startTracking was called) to ensure
- * proper cleanup.
+ * <p>This should always be called when done with a WifiTracker (if startTracking was called) to
+ * ensure proper cleanup and prevent any further callbacks from occuring.
*/
+ @MainThread
public void stopTracking() {
- if (mRegistered) {
- mWorkHandler.removeMessages(WorkHandler.MSG_UPDATE_ACCESS_POINTS);
- mWorkHandler.removeMessages(WorkHandler.MSG_UPDATE_NETWORK_INFO);
- mWorkHandler.removeMessages(WorkHandler.MSG_UPDATE_NETWORK_SCORES);
- mContext.unregisterReceiver(mReceiver);
- mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
- mRegistered = false;
+ synchronized (mLock) {
+ if (mRegistered) {
+ mContext.unregisterReceiver(mReceiver);
+ mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
+ mRegistered = false;
+ }
+ unregisterAndClearScoreCache();
+ pauseScanning();
+ mContext.getContentResolver().unregisterContentObserver(mObserver);
+
+ mWorkHandler.removePendingMessages();
+ mMainHandler.removePendingMessages();
}
- pauseScanning();
-
- unregisterAndClearScoreCache();
-
- mContext.getContentResolver().unregisterContentObserver(mObserver);
}
private void unregisterAndClearScoreCache() {
mNetworkScoreManager.unregisterNetworkScoreCache(NetworkKey.TYPE_WIFI, mScoreCache);
mScoreCache.clearScores();
- // Clear the scores on the work handler to avoid concurrent modification exceptions
- mWorkHandler.post(() -> mRequestedScores.clear());
+ // Synchronize on mLock to avoid concurrent modification during updateAccessPointsLocked
+ synchronized (mLock) {
+ mRequestedScores.clear();
+ }
}
/**
* Gets the current list of access points. Should be called from main thread, otherwise
* expect inconsistencies
*/
+ @MainThread
public List<AccessPoint> getAccessPoints() {
return new ArrayList<>(mAccessPoints);
}
@@ -441,16 +456,20 @@
return null;
}
- private void updateAccessPoints() {
- // Wait until main worker is done copying the states. This is done to prevent propagation
- // of accesspoint states while the update is in progress.
- long before = System.currentTimeMillis();
- mInternalAccessPointsWriteLock.block();
- if (DBG) {
- Log.d(TAG, "Acquired AP lock on WorkerHandler. Time to wait = "
- + (System.currentTimeMillis() - before) + " ms.");
+ /** Safely modify {@link #mInternalAccessPoints} by acquiring {@link #mLock} first. */
+ private void updateAccessPointsLocked() {
+ synchronized (mLock) {
+ updateAccessPoints();
}
+ }
+ /**
+ * Update the internal list of access points.
+ *
+ * <p>Should never be called directly, use {@link #updateAccessPointsLocked()} instead.
+ */
+ @GuardedBy("mLock")
+ private void updateAccessPoints() {
// Swap the current access points into a cached list.
List<AccessPoint> cachedAccessPoints = new ArrayList<>(mInternalAccessPoints);
ArrayList<AccessPoint> accessPoints = new ArrayList<>();
@@ -460,8 +479,8 @@
accessPoint.clearConfig();
}
- /* Lookup table to more quickly update AccessPoints by only considering objects with the
- * correct SSID. Maps SSID -> List of AccessPoints with the given SSID. */
+ /* 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>();
WifiConfiguration connectionConfig = null;
if (mLastInfo != null) {
@@ -584,7 +603,8 @@
mInternalAccessPoints.clear();
mInternalAccessPoints.addAll(accessPoints);
- mMainHandler.scheduleAPCopyingAndCloseWriteLock();
+
+ mMainHandler.sendEmptyMessage(MainHandler.MSG_ACCESS_POINT_CHANGED);
}
@VisibleForTesting
@@ -641,59 +661,48 @@
connectionConfig = getWifiConfigurationForNetworkId(mLastInfo.getNetworkId());
}
- // Lock required to prevent accidental copying of AccessPoint states while the modification
- // is in progress. see #copyAndNotifyListeners
- long before = System.currentTimeMillis();
- mInternalAccessPointsWriteLock.block();
- if (DBG) {
- Log.d(TAG, "Acquired AP lock on WorkerHandler for updating NetworkInfo. Wait time = " +
- (System.currentTimeMillis() - before) + "ms.");
- }
-
boolean updated = false;
boolean reorder = false; // Only reorder if connected AP was changed
- for (int i = mInternalAccessPoints.size() - 1; i >= 0; --i) {
- AccessPoint ap = mInternalAccessPoints.get(i);
- boolean previouslyConnected = ap.isActive();
- if (ap.update(connectionConfig, mLastInfo, mLastNetworkInfo)) {
- updated = true;
- if (previouslyConnected != ap.isActive()) reorder = true;
+
+ synchronized (mLock) {
+ for (int i = mInternalAccessPoints.size() - 1; i >= 0; --i) {
+ AccessPoint ap = mInternalAccessPoints.get(i);
+ boolean previouslyConnected = ap.isActive();
+ if (ap.update(connectionConfig, mLastInfo, mLastNetworkInfo)) {
+ updated = true;
+ if (previouslyConnected != ap.isActive()) reorder = true;
+ }
+ if (ap.update(mScoreCache, mNetworkScoringUiEnabled)) {
+ reorder = true;
+ updated = true;
+ }
}
- if (ap.update(mScoreCache, mNetworkScoringUiEnabled)) {
- reorder = true;
- updated = true;
- }
+
+ if (reorder) Collections.sort(mInternalAccessPoints);
+
+ if (updated) mMainHandler.sendEmptyMessage(MainHandler.MSG_ACCESS_POINT_CHANGED);
}
-
- if (reorder) Collections.sort(mInternalAccessPoints);
-
- if (updated) mMainHandler.scheduleAPCopyingAndCloseWriteLock();
}
/**
* Update all the internal access points rankingScores, badge and metering.
*
* <p>Will trigger a resort and notify listeners of changes if applicable.
+ *
+ * <p>Synchronized on {@link #mLock}.
*/
private void updateNetworkScores() {
- // Lock required to prevent accidental copying of AccessPoint states while the modification
- // is in progress. see #copyAndNotifyListeners
- long before = System.currentTimeMillis();
- mInternalAccessPointsWriteLock.block();
- if (DBG) {
- Log.d(TAG, "Acquired AP lock on WorkerHandler for inserting NetworkScores. Wait time = " +
- (System.currentTimeMillis() - before) + "ms.");
- }
-
- boolean reorder = false;
- for (int i = 0; i < mInternalAccessPoints.size(); i++) {
- if (mInternalAccessPoints.get(i).update(mScoreCache, mNetworkScoringUiEnabled)) {
- reorder = true;
+ synchronized (mLock) {
+ boolean updated = false;
+ for (int i = 0; i < mInternalAccessPoints.size(); i++) {
+ if (mInternalAccessPoints.get(i).update(mScoreCache, mNetworkScoringUiEnabled)) {
+ updated = true;
+ }
}
- }
- if (reorder) {
- Collections.sort(mInternalAccessPoints);
- mMainHandler.scheduleAPCopyingAndCloseWriteLock();
+ if (updated) {
+ Collections.sort(mInternalAccessPoints);
+ mMainHandler.sendEmptyMessage(MainHandler.MSG_ACCESS_POINT_CHANGED);
+ }
}
}
@@ -733,7 +742,10 @@
.sendToTarget();
mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_ACCESS_POINTS);
} else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
- mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_NETWORK_INFO);
+ NetworkInfo info =
+ mConnectivityManager.getNetworkInfo(mWifiManager.getCurrentNetwork());
+ mWorkHandler.obtainMessage(WorkHandler.MSG_UPDATE_NETWORK_INFO, info)
+ .sendToTarget();
}
}
};
@@ -749,10 +761,11 @@
}
}
- 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;
+ @VisibleForTesting
+ final class MainHandler extends Handler {
+ @VisibleForTesting static final int MSG_CONNECTED_CHANGED = 0;
+ @VisibleForTesting static final int MSG_WIFI_STATE_CHANGED = 1;
+ @VisibleForTesting static final int MSG_ACCESS_POINT_CHANGED = 2;
private static final int MSG_RESUME_SCANNING = 3;
private static final int MSG_PAUSE_SCANNING = 4;
@@ -789,10 +802,12 @@
}
}
- void scheduleAPCopyingAndCloseWriteLock() {
- //prevent worker thread from modifying mInternalAccessPoints
- mInternalAccessPointsWriteLock.close();
- sendEmptyMessage(MSG_ACCESS_POINT_CHANGED);
+ void removePendingMessages() {
+ removeMessages(MSG_ACCESS_POINT_CHANGED);
+ removeMessages(MSG_CONNECTED_CHANGED);
+ removeMessages(MSG_WIFI_STATE_CHANGED);
+ removeMessages(MSG_PAUSE_SCANNING);
+ removeMessages(MSG_RESUME_SCANNING);
}
}
@@ -801,7 +816,6 @@
private static final int MSG_UPDATE_NETWORK_INFO = 1;
private static final int MSG_RESUME = 2;
private static final int MSG_UPDATE_WIFI_STATE = 3;
- private static final int MSG_UPDATE_NETWORK_SCORES = 4;
public WorkHandler(Looper looper) {
super(looper);
@@ -809,9 +823,18 @@
@Override
public void handleMessage(Message msg) {
+ synchronized (mLock) {
+ processMessage(msg);
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void processMessage(Message msg) {
+ if (!mRegistered) return;
+
switch (msg.what) {
case MSG_UPDATE_ACCESS_POINTS:
- updateAccessPoints();
+ updateAccessPointsLocked();
break;
case MSG_UPDATE_NETWORK_INFO:
updateNetworkInfo((NetworkInfo) msg.obj);
@@ -836,11 +859,15 @@
mMainHandler.obtainMessage(MainHandler.MSG_WIFI_STATE_CHANGED, msg.arg1, 0)
.sendToTarget();
break;
- case MSG_UPDATE_NETWORK_SCORES:
- updateNetworkScores();
- break;
}
}
+
+ private void removePendingMessages() {
+ removeMessages(MSG_UPDATE_ACCESS_POINTS);
+ removeMessages(MSG_UPDATE_NETWORK_INFO);
+ removeMessages(MSG_RESUME);
+ removeMessages(MSG_UPDATE_WIFI_STATE);
+ }
}
@VisibleForTesting
@@ -959,11 +986,12 @@
/**
* Responsible for copying access points from {@link #mInternalAccessPoints} and notifying
- * accesspoint listeners. Mutation of the accesspoints returned is done on the main thread.
+ * accesspoint listeners.
*
* @param notifyListeners if true, accesspoint listeners are notified, otherwise notifications
* dropped.
*/
+ @MainThread
private void copyAndNotifyListeners(boolean notifyListeners) {
// Need to watch out for memory allocations on main thread.
SparseArray<AccessPoint> oldAccessPoints = new SparseArray<>();
@@ -974,17 +1002,15 @@
oldAccessPoints.put(accessPoint.mId, accessPoint);
}
- //synchronize to prevent modification of "mInternalAccessPoints" by worker thread.
- long before = System.currentTimeMillis();
- try {
- if (DBG) {
- Log.d(TAG, "Starting to copy AP items on the MainHandler");
- }
- if (notifyListeners) {
- notificationMap = mAccessPointListenerAdapter.mPendingNotifications.clone();
- }
+ if (DBG) {
+ Log.d(TAG, "Starting to copy AP items on the MainHandler");
+ }
+ if (notifyListeners) {
+ notificationMap = mAccessPointListenerAdapter.mPendingNotifications.clone();
+ }
- mAccessPointListenerAdapter.mPendingNotifications.clear();
+ mAccessPointListenerAdapter.mPendingNotifications.clear();
+ synchronized (mLock) {
for (AccessPoint internalAccessPoint : mInternalAccessPoints) {
AccessPoint accessPoint = oldAccessPoints.get(internalAccessPoint.mId);
if (accessPoint == null) {
@@ -994,12 +1020,6 @@
}
updatedAccessPoints.add(accessPoint);
}
- } finally {
- mInternalAccessPointsWriteLock.open();
- if (DBG) {
- Log.d(TAG, "Opened AP Write lock on the MainHandler. Time to copy = " +
- (System.currentTimeMillis() - before) + " ms.");
- }
}
mAccessPoints.clear();
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTrackerFactory.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTrackerFactory.java
index a2becf7..79cee04 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTrackerFactory.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTrackerFactory.java
@@ -23,8 +23,6 @@
* Factory method used to inject WifiTracker instances.
*/
public class WifiTrackerFactory {
- private static boolean sTestingMode = false;
-
private static WifiTracker sTestingWifiTracker;
@Keep // Keep proguard from stripping this method since it is only used in tests
@@ -35,7 +33,7 @@
public static WifiTracker create(
Context context, WifiTracker.WifiListener wifiListener, Looper workerLooper,
boolean includeSaved, boolean includeScans, boolean includePasspoints) {
- if(sTestingMode) {
+ if(sTestingWifiTracker != null) {
return sTestingWifiTracker;
}
return new WifiTracker(
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawer/SettingsDrawerActivityTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawer/SettingsDrawerActivityTest.java
index 752b5b0..003f905 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawer/SettingsDrawerActivityTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawer/SettingsDrawerActivityTest.java
@@ -16,7 +16,12 @@
package com.android.settingslib.drawer;
-import android.app.Activity;
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription;
+
import android.app.Instrumentation;
import android.content.Intent;
import android.support.test.InstrumentationRegistry;
@@ -24,23 +29,12 @@
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
-import com.android.settingslib.R;
-
-import com.google.common.truth.Truth;
-
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription;
-import static com.google.common.truth.Truth.assertThat;
-
@RunWith(AndroidJUnit4.class)
@SmallTest
public class SettingsDrawerActivityTest {
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
index 3e01b34..154fde2 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
@@ -17,6 +17,7 @@
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
+
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.when;
@@ -24,7 +25,6 @@
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
-import android.net.NetworkKey;
import android.net.ScoredNetwork;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
@@ -40,6 +40,7 @@
import android.support.test.runner.AndroidJUnit4;
import android.text.SpannableString;
import android.text.style.TtsSpan;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
index b938fe2..f519a90 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
@@ -20,13 +20,17 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
-import static org.mockito.Mockito.atLeast;
+import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import android.content.Context;
@@ -60,7 +64,6 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Matchers;
@@ -129,7 +132,7 @@
private Handler mScannerHandler;
private HandlerThread mMainThread;
private HandlerThread mWorkerThread;
- private Looper mLooper;
+ private Looper mWorkerLooper;
private Looper mMainLooper;
private int mOriginalScoringUiSettingValue;
@@ -141,7 +144,7 @@
mWorkerThread = new HandlerThread("TestHandlerWorkerThread");
mWorkerThread.start();
- mLooper = mWorkerThread.getLooper();
+ mWorkerLooper = mWorkerThread.getLooper();
mMainThread = new HandlerThread("TestHandlerThread");
mMainThread.start();
mMainLooper = mMainThread.getLooper();
@@ -252,9 +255,7 @@
tracker.mReceiver.onReceive(mContext, intent);
}
- mAccessPointsChangedLatch = new CountDownLatch(1);
sendScanResultsAndProcess(tracker);
- assertTrue(mAccessPointsChangedLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
return tracker;
}
@@ -264,7 +265,7 @@
new WifiTracker(
mContext,
mockWifiListener,
- mLooper,
+ mWorkerLooper,
true,
true,
true,
@@ -349,7 +350,7 @@
scanResult.capabilities = "";
WifiTracker tracker = new WifiTracker(
- InstrumentationRegistry.getTargetContext(), null, mLooper, true, true);
+ InstrumentationRegistry.getTargetContext(), null, mWorkerLooper, true, true);
AccessPoint result = tracker.getCachedOrCreate(scanResult, new ArrayList<AccessPoint>());
assertTrue(result.mAccessPointListener != null);
@@ -365,7 +366,7 @@
configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
WifiTracker tracker = new WifiTracker(
- InstrumentationRegistry.getTargetContext(), null, mLooper, true, true);
+ InstrumentationRegistry.getTargetContext(), null, mWorkerLooper, true, true);
AccessPoint result = tracker.getCachedOrCreate(configuration, new ArrayList<AccessPoint>());
assertTrue(result.mAccessPointListener != null);
@@ -433,7 +434,8 @@
}
@Test
- public void startTrackingShouldRequestScoresForCurrentAccessPoints() throws InterruptedException {
+ public void startTrackingAfterStopTracking_shouldRequestNewScores()
+ throws InterruptedException {
// Start the tracker and inject the initial scan results and then stop tracking
WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults();
@@ -442,6 +444,7 @@
mRequestScoresLatch = new CountDownLatch(1);
startTracking(tracker);
+ tracker.forceUpdate();
assertTrue("Latch timed out",
mRequestScoresLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
@@ -462,9 +465,10 @@
private void updateScoresAndWaitForAccessPointsChangedCallback() throws InterruptedException {
// Updating scores can happen together or one after the other, so the latch countdown is set
// to 2.
- mAccessPointsChangedLatch = new CountDownLatch(2);
+ mAccessPointsChangedLatch = new CountDownLatch(3);
updateScores();
- mAccessPointsChangedLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS);
+ assertTrue("onAccessPointChanged was not called three times",
+ mAccessPointsChangedLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
}
@Test
@@ -648,27 +652,33 @@
WifiTracker tracker = createTrackerWithScanResultsAndAccessPoint1Connected();
assertThat(tracker.getAccessPoints().get(0).isActive()).isTrue();
- WifiConfiguration configuration = new WifiConfiguration();
- configuration.SSID = SSID_1;
- configuration.BSSID = BSSID_1;
- configuration.networkId = CONNECTED_NETWORK_ID;
- when(mockWifiManager.getConfiguredNetworks()).thenReturn(Arrays.asList(configuration));
-
int newRssi = CONNECTED_RSSI + 10;
WifiInfo info = new WifiInfo(CONNECTED_AP_1_INFO);
info.setRssi(newRssi);
- when(mockWifiManager.getConnectionInfo()).thenReturn(info);
- mAccessPointsChangedLatch = new CountDownLatch(1);
+ CountDownLatch latch = new CountDownLatch(1);
+
+ // Once the new info has been fetched, we need to wait for the access points to be copied
+ doAnswer(invocation -> {
+ latch.countDown();
+ mAccessPointsChangedLatch = new CountDownLatch(1);
+ return info;
+ }).when(mockWifiManager).getConnectionInfo();
+
tracker.mReceiver.onReceive(mContext, new Intent(WifiManager.RSSI_CHANGED_ACTION));
- assertTrue(mAccessPointsChangedLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
+ assertTrue("New connection info never retrieved",
+ latch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
+ assertTrue("onAccessPointsChanged never called",
+ mAccessPointsChangedLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
- verify(mockWifiManager, atLeast(2)).getConnectionInfo();
assertThat(tracker.getAccessPoints().get(0).getRssi()).isEqualTo(newRssi);
}
@Test
public void forceUpdateShouldSynchronouslyFetchLatestInformation() throws Exception {
+ Network mockNetwork = mock(Network.class);
+ when(mockWifiManager.getCurrentNetwork()).thenReturn(mockNetwork);
+
when(mockWifiManager.getConnectionInfo()).thenReturn(CONNECTED_AP_1_INFO);
WifiConfiguration configuration = new WifiConfiguration();
@@ -682,13 +692,58 @@
networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, "connected", "test");
when(mockConnectivityManager.getNetworkInfo(any(Network.class))).thenReturn(networkInfo);
-
WifiTracker tracker = createMockedWifiTracker();
- startTracking(tracker);
tracker.forceUpdate();
+ verify(mockWifiManager).getConnectionInfo();
+ verify(mockWifiManager, times(2)).getConfiguredNetworks();
+ verify(mockConnectivityManager).getNetworkInfo(any(Network.class));
+
verify(mockWifiListener).onAccessPointsChanged();
assertThat(tracker.getAccessPoints().size()).isEqualTo(2);
assertThat(tracker.getAccessPoints().get(0).isActive()).isTrue();
}
+
+ @Test
+ public void stopTrackingShouldRemoveWifiListenerCallbacks() throws Exception {
+ WifiTracker tracker = createMockedWifiTracker();
+ startTracking(tracker);
+
+ CountDownLatch latch = new CountDownLatch(1);
+ CountDownLatch lock = new CountDownLatch(1);
+ tracker.mMainHandler.post(() -> {
+ try {
+ lock.await();
+ latch.countDown();
+ } catch (InterruptedException e) {
+ fail("Interrupted Exception while awaiting lock release: " + e);
+ }
+ });
+
+ // Enqueue messages
+ tracker.mMainHandler.sendEmptyMessage(
+ WifiTracker.MainHandler.MSG_ACCESS_POINT_CHANGED);
+ tracker.mMainHandler.sendEmptyMessage(
+ WifiTracker.MainHandler.MSG_CONNECTED_CHANGED);
+ tracker.mMainHandler.sendEmptyMessage(
+ WifiTracker.MainHandler.MSG_WIFI_STATE_CHANGED);
+
+ tracker.stopTracking();
+
+ verify(mockWifiListener, atMost(1)).onAccessPointsChanged();
+ verify(mockWifiListener, atMost(1)).onConnectedChanged();
+ verify(mockWifiListener, atMost(1)).onWifiStateChanged(anyInt());
+
+ lock.countDown();
+ assertTrue("Latch timed out", latch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
+
+ assertThat(tracker.mMainHandler.hasMessages(
+ WifiTracker.MainHandler.MSG_ACCESS_POINT_CHANGED)).isFalse();
+ assertThat(tracker.mMainHandler.hasMessages(
+ WifiTracker.MainHandler.MSG_CONNECTED_CHANGED)).isFalse();
+ assertThat(tracker.mMainHandler.hasMessages(
+ WifiTracker.MainHandler.MSG_WIFI_STATE_CHANGED)).isFalse();
+
+ verifyNoMoreInteractions(mockWifiListener);
+ }
}
\ No newline at end of file
diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index a8629f8..e9dadc5 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -94,49 +94,9 @@
<!-- Default for Settings.Secure.SYNC_PARENT_SOUNDS -->
<bool name="def_sync_parent_sounds">true</bool>
- <!-- Default for Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION -->
- <bool name="def_accessibility_script_injection">false</bool>
-
<!-- Default for Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD -->
<bool name="def_accessibility_speak_password">true</bool>
- <!-- Default for Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS -->
- <string name="def_accessibility_web_content_key_bindings" translatable="false">
- <!-- DPAD/Trackball UP - traverse previous on current axis and send an event. -->
- 0x13=0x01000100;
- <!-- DPAD/Trackball DOWN - traverse next on current axis and send an event. -->
- 0x14=0x01010100;
- <!-- DPAD/Trackball LEFT - traverse previous on the character navigation axis and send event. -->
- 0x15=0x02000001;
- <!-- DPAD/Trackball RIGHT - traverse next on the character navigation axis end send event. -->
- 0x16=0x02010001;
- <!-- Alt+DPAD/Trackball UP - go to the top of the document. -->
- 0x200000013=0x02000601;
- <!-- Alt+DPAD/Trackball DOWN - go to the bottom of the document. -->
- 0x200000014=0x02010601;
- <!-- Alt+DPAD/Trackball LEFT - transition from an axis to another and sends an event.-->
- <!-- Axis transitions: 2 -> 1; -->
- 0x200000015=0x03020101;
- <!-- Alt+DPAD/Trackball RIGHT - transition from an axis to another and sends an event. -->
- <!-- Axis transitions: 1 -> 2; -->
- 0x200000016=0x03010201;
- <!-- Alt+g - go to the previous heading and send an event. -->
- 0x200000023=0x02000301;
- <!-- Alt+h - go to the next heading and send an event. -->
- 0x200000024=0x02010301;
- <!-- Alt+COMMA - transition to sentence navigation axis and send an event. -->
- <!-- Axis transitions: 7 -> 2; -->
- 0x200000037=0x03070201;
- <!-- Alt+PERIOD - transition to default web view behavior axis and send an event. -->
- <!-- Axis transitions: 0 -> 7; 1 - > 7; 2 -> 7; -->
- 0x200000038=0x03000701:0x03010701:0x03020701;
- </string>
-
- <!-- Default for Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION_URL -->
- <string name="def_accessibility_screen_reader_url" translatable="false">
- https://ssl.gstatic.com/accessibility/javascript/android/AndroidVox_v1.js
- </string>
-
<!-- Default for Settings.Secure.TOUCH_EXPLORATION_ENABLED -->
<bool name="def_touch_exploration_enabled">false</bool>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index a645a56..b777d41 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -820,27 +820,8 @@
if (upgradeVersion == 57) {
/*
- * New settings to:
- * 1. Enable injection of accessibility scripts in WebViews.
- * 2. Define the key bindings for traversing web content in WebViews.
+ * No longer initializing deleted setting ACCESSIBILITY_SCRIPT_INJECTION.
*/
- db.beginTransaction();
- SQLiteStatement stmt = null;
- try {
- stmt = db.compileStatement("INSERT INTO secure(name,value)"
- + " VALUES(?,?);");
- loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION,
- R.bool.def_accessibility_script_injection);
- stmt.close();
- stmt = db.compileStatement("INSERT INTO secure(name,value)"
- + " VALUES(?,?);");
- loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS,
- R.string.def_accessibility_web_content_key_bindings);
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- if (stmt != null) stmt.close();
- }
upgradeVersion = 58;
}
@@ -1085,18 +1066,7 @@
}
if (upgradeVersion == 74) {
- // URL from which WebView loads a JavaScript based screen-reader.
- db.beginTransaction();
- SQLiteStatement stmt = null;
- try {
- stmt = db.compileStatement("INSERT INTO secure(name,value) VALUES(?,?);");
- loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_SCREEN_READER_URL,
- R.string.def_accessibility_screen_reader_url);
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- if (stmt != null) stmt.close();
- }
+ // No longer using URL from which WebView loads a JavaScript based screen-reader.
upgradeVersion = 75;
}
if (upgradeVersion == 75) {
@@ -1147,19 +1117,7 @@
}
if (upgradeVersion == 78) {
- // The JavaScript based screen-reader URL changes in JellyBean.
- db.beginTransaction();
- SQLiteStatement stmt = null;
- try {
- stmt = db.compileStatement("INSERT OR REPLACE INTO secure(name,value)"
- + " VALUES(?,?);");
- loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_SCREEN_READER_URL,
- R.string.def_accessibility_screen_reader_url);
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- if (stmt != null) stmt.close();
- }
+ // ACCESSIBILITY_SCREEN_READER_URL has been removed
upgradeVersion = 79;
}
@@ -2443,12 +2401,6 @@
loadBooleanSetting(stmt, Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED,
R.bool.def_mount_ums_notify_enabled);
- loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION,
- R.bool.def_accessibility_script_injection);
-
- loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS,
- R.string.def_accessibility_web_content_key_bindings);
-
loadIntegerSetting(stmt, Settings.Secure.LONG_PRESS_TIMEOUT,
R.integer.def_long_press_timeout_millis);
@@ -2458,9 +2410,6 @@
loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD,
R.bool.def_accessibility_speak_password);
- loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_SCREEN_READER_URL,
- R.string.def_accessibility_screen_reader_url);
-
if (SystemProperties.getBoolean("ro.lockscreen.disable.default", false) == true) {
loadSetting(stmt, Settings.System.LOCKSCREEN_DISABLED, "1");
} else {
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
index 1c51773..d1d59b2 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
@@ -238,7 +238,6 @@
// these features working after the restore.
switch (name) {
case Settings.Secure.ACCESSIBILITY_ENABLED:
- case Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION:
case Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD:
case Settings.Secure.TOUCH_EXPLORATION_ENABLED:
case Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED:
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index bac694f..885573e 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -1057,15 +1057,6 @@
Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED,
SecureSettingsProto.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED);
dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION,
- SecureSettingsProto.ACCESSIBILITY_SCRIPT_INJECTION);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_SCREEN_READER_URL,
- SecureSettingsProto.ACCESSIBILITY_SCREEN_READER_URL);
- dumpSetting(s, p,
- Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS,
- SecureSettingsProto.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS);
- dumpSetting(s, p,
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
SecureSettingsProto.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED);
dumpSetting(s, p,
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 48429e8..a6347c6 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -898,13 +898,14 @@
Slog.v(LOG_TAG, "getGlobalSetting(" + name + ")");
}
- // Ensure the caller can access the setting.
- enforceSettingReadable(name, SETTINGS_TYPE_GLOBAL, UserHandle.getCallingUserId());
-
// Get the value.
synchronized (mLock) {
- return mSettingsRegistry.getSettingLocked(SETTINGS_TYPE_GLOBAL,
+ Setting setting = mSettingsRegistry.getSettingLocked(SETTINGS_TYPE_GLOBAL,
UserHandle.USER_SYSTEM, name);
+ // Ensure the caller can access the setting before we return it.
+ enforceSettingReadable(setting, name, SETTINGS_TYPE_GLOBAL,
+ UserHandle.getCallingUserId());
+ return setting;
}
}
@@ -1062,9 +1063,6 @@
// Resolve the userId on whose behalf the call is made.
final int callingUserId = resolveCallingUserIdEnforcingPermissionsLocked(requestingUserId);
- // Ensure the caller can access the setting.
- enforceSettingReadable(name, SETTINGS_TYPE_SECURE, UserHandle.getCallingUserId());
-
// Determine the owning user as some profile settings are cloned from the parent.
final int owningUserId = resolveOwningUserIdForSecureSettingLocked(callingUserId, name);
@@ -1078,6 +1076,7 @@
// As of Android O, the SSAID is read from an app-specific entry in table
// SETTINGS_FILE_SSAID, unless accessed by a system process.
+ // All apps are allowed to access their SSAID, so we skip the permission check.
if (isNewSsaidSetting(name)) {
PackageInfo callingPkg = getCallingPackageInfo(owningUserId);
synchronized (mLock) {
@@ -1087,8 +1086,12 @@
// Not the SSAID; do a straight lookup
synchronized (mLock) {
- return mSettingsRegistry.getSettingLocked(SETTINGS_TYPE_SECURE,
+ Setting setting = mSettingsRegistry.getSettingLocked(SETTINGS_TYPE_SECURE,
owningUserId, name);
+ // Ensure the caller can access the setting before we return it.
+ enforceSettingReadable(setting, name, SETTINGS_TYPE_SECURE,
+ UserHandle.getCallingUserId());
+ return setting;
}
}
@@ -1289,15 +1292,18 @@
// Resolve the userId on whose behalf the call is made.
final int callingUserId = resolveCallingUserIdEnforcingPermissionsLocked(requestingUserId);
- // Ensure the caller can access the setting.
- enforceSettingReadable(name, SETTINGS_TYPE_SYSTEM, UserHandle.getCallingUserId());
// Determine the owning user as some profile settings are cloned from the parent.
final int owningUserId = resolveOwningUserIdForSystemSettingLocked(callingUserId, name);
// Get the value.
synchronized (mLock) {
- return mSettingsRegistry.getSettingLocked(SETTINGS_TYPE_SYSTEM, owningUserId, name);
+ Setting setting = mSettingsRegistry.getSettingLocked(SETTINGS_TYPE_SYSTEM,
+ owningUserId, name);
+ // Ensure the caller can access the setting before we return it.
+ enforceSettingReadable(setting, name, SETTINGS_TYPE_SYSTEM,
+ UserHandle.getCallingUserId());
+ return setting;
}
}
@@ -1644,14 +1650,22 @@
}
}
- private void enforceSettingReadable(String settingName, int settingsType, int userId) {
+ private void enforceSettingReadable(Setting setting, String settingName, int settingsType,
+ int userId) {
if (UserHandle.getAppId(Binder.getCallingUid()) < Process.FIRST_APPLICATION_UID) {
return;
}
ApplicationInfo ai = getCallingApplicationInfoOrThrow();
+ // Installed apps are allowed to read all settings.
if (!ai.isInstantApp()) {
return;
}
+ // Instant Apps are allowed to read settings defined by applications.
+ // TODO: Replace this with an API that allows the setting application to say if a setting
+ // shoud/shouldn't be accessible.
+ if (!setting.isDefaultFromSystem()) {
+ return;
+ }
if (!getInstantAppAccessibleSettings(settingsType).contains(settingName)) {
throw new SecurityException("Setting " + settingName + " is not accessible from"
+ " ephemeral package " + getCallingPackage());
diff --git a/packages/Shell/res/values-zh-rTW/strings.xml b/packages/Shell/res/values-zh-rTW/strings.xml
index fc800b3..a3b5f92 100644
--- a/packages/Shell/res/values-zh-rTW/strings.xml
+++ b/packages/Shell/res/values-zh-rTW/strings.xml
@@ -26,9 +26,9 @@
<string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"選取即可分享錯誤報告"</string>
<string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"輕觸即可分享錯誤報告"</string>
<string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"選取即可分享不包含螢幕擷取畫面的錯誤報告;你也可以等候螢幕畫面擷取完畢"</string>
- <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"輕觸即可分享無螢幕擷圖的錯誤報告;您也可以等候螢幕畫面擷取完畢"</string>
- <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"輕觸即可分享無螢幕擷圖的錯誤報告;您也可以等候螢幕畫面擷取完畢"</string>
- <string name="bugreport_confirm" msgid="5917407234515812495">"錯誤報告的資料來自系統的各種紀錄檔,當中可能包含敏感資料 (例如應用程式使用情形和位置資料)。請務必只與您信任的使用者和應用程式分享錯誤報告。"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"輕觸即可分享無螢幕擷圖的錯誤報告;你也可以等候螢幕畫面擷取完畢"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"輕觸即可分享無螢幕擷圖的錯誤報告;你也可以等候螢幕畫面擷取完畢"</string>
+ <string name="bugreport_confirm" msgid="5917407234515812495">"錯誤報告的資料來自系統的各種紀錄檔,當中可能包含敏感資料 (例如應用程式使用情形和位置資料)。請務必只與你信任的使用者和應用程式分享錯誤報告。"</string>
<string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"不要再顯示"</string>
<string name="bugreport_storage_title" msgid="5332488144740527109">"錯誤報告"</string>
<string name="bugreport_unreadable_text" msgid="586517851044535486">"無法讀取錯誤報告檔案"</string>
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index d37e6a0..415bf9a 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -172,6 +172,9 @@
private static final int CAPPED_PROGRESS = 9900;
private static final int CAPPED_MAX = 10000;
+ /** Show the progress log every this percent. */
+ private static final int LOG_PROGRESS_STEP = 10;
+
/**
* Delay before a screenshot is taken.
* <p>
@@ -226,6 +229,8 @@
private boolean mIsWatch;
+ private int mLastProgressPercent;
+
@Override
public void onCreate() {
mContext = getApplicationContext();
@@ -512,8 +517,15 @@
builder.setContentIntent(infoPendingIntent)
.setActions(infoAction, screenshotAction, cancelAction);
}
+ // Show a debug log, every LOG_PROGRESS_STEP percent.
+ final int progress = (info.progress * 100) / info.max;
- Log.d(TAG, "Sending 'Progress' notification for id " + info.id + ": " + percentageText);
+ if ((info.progress == 0) || (info.progress >= 100) ||
+ ((progress / LOG_PROGRESS_STEP) != (mLastProgressPercent / LOG_PROGRESS_STEP))) {
+ Log.d(TAG, "Progress #" + info.id + ": " + percentageText);
+ }
+ mLastProgressPercent = progress;
+
sendForegroundabledNotification(info.id, builder.build());
}
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 55f32d7..490bee4 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -22,9 +22,6 @@
android:sharedUserId="android.uid.systemui"
coreApp="true">
- <protected-broadcast android:name="com.android.systemui.action.PLUGIN_CHANGED" />
-
-
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
@@ -542,6 +539,17 @@
</intent-filter>
</activity>
+ <activity android:name=".ForegroundServicesDialog"
+ android:process=":fgservices"
+ android:excludeFromRecents="true"
+ android:launchMode="singleTop"
+ android:theme="@*android:style/Theme.DeviceDefault.Settings.Dialog">
+ <intent-filter android:priority="1">
+ <action android:name="android.settings.FOREGROUND_SERVICES_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
<!-- Doze with notifications, run in main sysui process for every user -->
<service
android:name=".doze.DozeService"
diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml
index 89caf90..25ebbfe 100644
--- a/packages/SystemUI/res-keyguard/values-be/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-be/strings.xml
@@ -108,7 +108,7 @@
<string name="kg_pin_accepted" msgid="7637293533973802143">"Код прыняты!"</string>
<string name="keyguard_carrier_default" msgid="4274828292998453695">"Не абслугоўваецца."</string>
<string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Пераключэнне рэжыму ўводу"</string>
- <string name="airplane_mode" msgid="3807209033737676010">"Рэжым самалёта"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Рэжым палёту"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Пасля перазапуску прылады патрабуецца ўзор"</string>
<string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Пасля перазапуску прылады патрабуецца PIN-код"</string>
<string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Пасля перазапуску прылады патрабуецца пароль"</string>
diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
index 68d086f..761e3a1 100644
--- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
@@ -61,7 +61,7 @@
<string name="kg_sim_pin_instructions" msgid="1795013002231184046">"Ingresa el PIN de la tarjeta SIM"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"Ingresa el PIN de la tarjeta SIM para \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Ingresa el PIN"</string>
- <string name="kg_password_instructions" msgid="136952397352976538">"Ingresa tu contraseña"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"Escribe la contraseña"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La tarjeta SIM está inhabilitada. Para continuar, ingresa el código PUK. Si quieres obtener más información, comunícate con el proveedor."</string>
<string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"La tarjeta SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\" está inhabilitada. Para continuar, ingresa el código PUK. Para obtener más información, comunícate con el proveedor."</string>
<string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"Ingresa el código PIN deseado"</string>
diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml
index fce69a4..1892ef6 100644
--- a/packages/SystemUI/res-keyguard/values-et/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-et/strings.xml
@@ -104,7 +104,7 @@
<string name="kg_pin_accepted" msgid="7637293533973802143">"Kood on õige."</string>
<string name="keyguard_carrier_default" msgid="4274828292998453695">"Teenus puudub."</string>
<string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Vaheta sisestusmeetodit"</string>
- <string name="airplane_mode" msgid="3807209033737676010">"Lennukirežiim"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"Lennurežiim"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Pärast seadme taaskäivitamist tuleb sisestada muster"</string>
<string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Pärast seadme taaskäivitamist tuleb sisestada PIN-kood"</string>
<string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"Pärast seadme taaskäivitamist tuleb sisestada parool"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml
index fc635e4..9433ae3 100644
--- a/packages/SystemUI/res-keyguard/values-hy/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml
@@ -103,7 +103,7 @@
<string name="kg_password_puk_failed" msgid="1331621440873439974">"SIM PUK կոդի գործողությունը ձախողվեց:"</string>
<string name="kg_pin_accepted" msgid="7637293533973802143">"Կոդն ընդունվեց:"</string>
<string name="keyguard_carrier_default" msgid="4274828292998453695">"Ծառայությունն անհասանելի է։"</string>
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Փոխարկել մուտքագրման եղանակը"</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Փոխել ներածման եղանակը"</string>
<string name="airplane_mode" msgid="3807209033737676010">"Ինքնաթիռի ռեժիմ"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Սարքը վերագործարկելուց հետո անհրաժեշտ է մուտքագրել նախշը"</string>
<string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Սարքը վերագործարկելուց հետո անհրաժեշտ է մուտքագրել PIN կոդը"</string>
diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml
index b2f4cc6..150d6cc 100644
--- a/packages/SystemUI/res-keyguard/values-iw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml
@@ -60,14 +60,14 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"שרטט את קו ביטול הנעילה"</string>
<string name="kg_sim_pin_instructions" msgid="1795013002231184046">"הזן את קוד הגישה של כרטיס ה-SIM"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1586316574649150223">"הזן את קוד הגישה של כרטיס ה-SIM של \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
- <string name="kg_pin_instructions" msgid="4069609316644030034">"הזן קוד PIN"</string>
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"הזן קוד גישה"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"הזן את הסיסמה"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"כרטיס ה-SIM מושבת כעת. הזן קוד PUK כדי להמשיך. פנה אל הספק לפרטים."</string>
<string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"ה-SIM של \"<xliff:g id="CARRIER">%1$s</xliff:g>\" מושבת כעת. הזן קוד PUK כדי להמשיך. לפרטים, פנה אל הספק."</string>
<string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"הזן את קוד הגישה הרצוי"</string>
<string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"אשר את קוד הגישה הרצוי"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"מבטל את הנעילה של כרטיס ה-SIM…"</string>
- <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"הקלד PIN שאורכו 4 עד 8 ספרות."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"הקלד קוד גישה שאורכו 4 עד 8 ספרות."</string>
<string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"קוד PUK צריך להיות בן 8 ספרות או יותר."</string>
<string name="kg_invalid_puk" msgid="5399287873762592502">"הזן את קוד ה-PUK הנכון. ניסיונות חוזרים ישביתו את כרטיס ה-SIM לצמיתות."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"קודי הגישה אינם תואמים"</string>
diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml
index 768e29d..b2dd79e 100644
--- a/packages/SystemUI/res-keyguard/values-kn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml
@@ -36,7 +36,7 @@
<string name="keyguard_low_battery" msgid="9218432555787624490">"ನಿಮ್ಮ ಚಾರ್ಜರ್ ಸಂಪರ್ಕಗೊಳಿಸಿ."</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಮೆನು ಒತ್ತಿರಿ."</string>
<string name="keyguard_network_locked_message" msgid="6743537524631420759">"ನೆಟ್ವರ್ಕ್ ಲಾಕ್ ಆಗಿದೆ"</string>
- <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"ಯಾವುದೇ ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ"</string>
<string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿ ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ."</string>
<string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"ಪೋನ್ನಲ್ಲಿ ಯಾವುದೇ ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ."</string>
<string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"ಸಿಮ್ ಕಾರ್ಡ್ ಸೇರಿಸಿ."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml
index 80068fc..8cbd4f5 100644
--- a/packages/SystemUI/res-keyguard/values-ky/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml
@@ -36,7 +36,7 @@
<string name="keyguard_low_battery" msgid="9218432555787624490">"Кубаттагычка туташтырыңыз."</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Кулпуну ачуу үчүн Менюну басыңыз."</string>
<string name="keyguard_network_locked_message" msgid="6743537524631420759">"Тармак кулпуланган"</string>
- <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"SIM-карта жок"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"SIM карта жок"</string>
<string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Планшетте SIM-карта жок."</string>
<string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Телефондо SIM-карта жок."</string>
<string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"SIM-карта салыңыз."</string>
diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml
index d3420df..2ba38ec 100644
--- a/packages/SystemUI/res-keyguard/values-nb/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml
@@ -36,7 +36,7 @@
<string name="keyguard_low_battery" msgid="9218432555787624490">"Koble til en batterilader."</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Trykk på menyknappen for å låse opp."</string>
<string name="keyguard_network_locked_message" msgid="6743537524631420759">"Nettverket er låst"</string>
- <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"SIM-kortet mangler"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"SIM-kort mangler"</string>
<string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Nettbrettet mangler SIM-kort."</string>
<string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Telefonen mangler SIM-kort."</string>
<string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Sett inn et SIM-kort."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml
index c3e0b71..f88055d 100644
--- a/packages/SystemUI/res-keyguard/values-sk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml
@@ -36,7 +36,7 @@
<string name="keyguard_low_battery" msgid="9218432555787624490">"Pripojte nabíjačku."</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Odomknete stlačením tlačidla ponuky."</string>
<string name="keyguard_network_locked_message" msgid="6743537524631420759">"Sieť je zablokovaná"</string>
- <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Nie je vložená SIM karta"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Žiadna SIM karta"</string>
<string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"V tablete nie je žiadna SIM karta."</string>
<string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"V telefóne nie je žiadna SIM karta."</string>
<string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Vložte SIM kartu."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml
index bcbca74..b2991d2 100644
--- a/packages/SystemUI/res-keyguard/values-sw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml
@@ -103,7 +103,7 @@
<string name="kg_password_puk_failed" msgid="1331621440873439974">"Utendakazi wa PUK ya SIM haujafanikiwa!"</string>
<string name="kg_pin_accepted" msgid="7637293533973802143">"Nambari Imekubaliwa!"</string>
<string name="keyguard_carrier_default" msgid="4274828292998453695">"Hakuna mtandao."</string>
- <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Badilisha mbinu ya kuingiza data"</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"Kubadili mbinu ya kuingiza data"</string>
<string name="airplane_mode" msgid="3807209033737676010">"Hali ya ndegeni"</string>
<string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"Unafaa kuchora mchoro baada ya kuwasha kifaa upya"</string>
<string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"Unafaa kuweka PIN baada ya kuwasha kifaa upya"</string>
diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml
index 2f52227..1efa3a8 100644
--- a/packages/SystemUI/res-keyguard/values/strings.xml
+++ b/packages/SystemUI/res-keyguard/values/strings.xml
@@ -102,6 +102,9 @@
<string name="keyguard_widget_12_hours_format" translatable="false">h\uee01mm</string>
<!-- Time format strings for fall-back clock widget -->
<string name="keyguard_widget_24_hours_format" translatable="false">kk\uee01mm</string>
+ <!-- The character used in keyguard_widget_12_hours_format and keyguard_widget_24_hours_format
+ to represent a ":". -->
+ <string name="keyguard_fancy_colon" translatable="false">\uee01</string>
<!-- Accessibility description of the PIN password view. [CHAR_LIMIT=none] -->
<string name="keyguard_accessibility_pin_area">PIN area</string>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_1x.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_1x.xml
index be9a7e2..d7463a4 100644
--- a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_1x.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_1x.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="17dp"
- android:height="17dp"
- android:viewportWidth="12.0"
- android:viewportHeight="12.0">
+ android:width="8.5dp"
+ android:height="17dp"
+ android:viewportWidth="12.0"
+ android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M3.500000,11.000000L1.800000,11.000000L1.800000,4.400000L0.200000,5.100000L0.200000,3.700000l3.100000,-1.300000l0.200000,0.000000L3.500000,11.000000z"/>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_3g.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_3g.xml
index fd7a658..6309b6d 100644
--- a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_3g.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_3g.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="17dp"
+ android:width="9.208dp"
android:height="17dp"
android:viewportWidth="13.0"
- android:viewportHeight="13.0">
+ android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M2.000000,6.000000l0.800000,0.000000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000s0.200000,-0.500000 0.200000,-0.900000c0.000000,-0.300000 -0.100000,-0.600000 -0.200000,-0.800000S3.200000,3.700000 2.900000,3.700000C2.700000,3.700000 2.500000,3.800000 2.300000,4.000000S2.100000,4.400000 2.100000,4.700000L0.500000,4.700000C0.500000,4.000000 0.700000,3.400000 1.100000,3.000000s1.000000,-0.600000 1.700000,-0.600000c0.800000,0.000000 1.400000,0.200000 1.900000,0.600000s0.700000,1.000000 0.700000,1.800000c0.000000,0.400000 -0.100000,0.700000 -0.300000,1.100000S4.600000,6.500000 4.300000,6.600000C4.700000,6.800000 5.000000,7.100000 5.200000,7.400000s0.300000,0.700000 0.300000,1.200000c0.000000,0.800000 -0.200000,1.400000 -0.700000,1.800000s-1.100000,0.700000 -1.900000,0.700000c-0.700000,0.000000 -1.300000,-0.200000 -1.800000,-0.600000s-0.700000,-1.000000 -0.700000,-1.800000L2.000000,8.700000C2.000000,9.000000 2.100000,9.300000 2.300000,9.500000s0.400000,0.300000 0.600000,0.300000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000S3.900000,9.000000 3.900000,8.600000c0.000000,-0.500000 -0.100000,-0.800000 -0.300000,-1.000000S3.200000,7.300000 2.800000,7.300000L2.000000,7.300000L2.000000,6.000000z"/>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g.xml
index 02c4ab6..4067ae5 100644
--- a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="17dp"
+ android:width="8.5dp"
android:height="17dp"
android:viewportWidth="12.0"
- android:viewportHeight="12.0">
+ android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M4.600000,7.800000l0.700000,0.000000l0.000000,1.300000L4.600000,9.100000L4.600000,11.000000L3.000000,11.000000L3.000000,9.200000L0.100000,9.200000L0.000000,8.100000L3.000000,2.500000l1.700000,0.000000L4.700000,7.800000zM1.600000,7.800000L3.000000,7.800000l0.000000,-3.000000L2.900000,5.000000L1.600000,7.800000z"/>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g_plus.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g_plus.xml
index daf4061..3cdd3e1 100644
--- a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g_plus.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g_plus.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="25.5dp"
+ android:width="17.0dp"
android:height="17.0dp"
- android:viewportWidth="18.0"
- android:viewportHeight="12.0">
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M4.6,7.8l0.7,0.0l0.0,1.3L4.6,9.1L4.6,11.0L3.0,11.0L3.0,9.2L0.1,9.2L0.0,8.2l3.0,-5.7l1.7,0.0L4.6,7.8L4.6,7.8zM1.7,7.8L3.0,7.8l0.0,-3.0L2.9,5.0L1.7,7.8z"/>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_e.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_e.xml
index cd0cc65..acaa9b1 100644
--- a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_e.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_e.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="7.083dp"
+ android:width="3.541dp"
android:height="17dp"
android:viewportWidth="5.0"
- android:viewportHeight="12.0">
+ android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M4.400000,7.300000L1.700000,7.300000l0.000000,2.400000l3.300000,0.000000L5.000000,11.000000L0.000000,11.000000L0.000000,2.500000l4.900000,0.000000l0.000000,1.300000L1.700000,3.800000l0.000000,2.100000l2.800000,0.000000L4.500000,7.300000z"/>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_g.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_g.xml
index 92ed49c..7985237 100644
--- a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_g.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_g.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="9.154dp"
+ android:width="4.958dp"
android:height="17dp"
android:viewportWidth="7.0"
- android:viewportHeight="13">
+ android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M6.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S0.700000,9.000000 0.700000,7.900000L0.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000L4.700000,5.200000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S4.000000,3.700000 3.600000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S2.300000,5.000000 2.300000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L4.700000,7.800000L3.500000,7.800000L3.500000,6.600000l2.900000,0.000000L6.400000,9.900000z"/>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_h.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_h.xml
index ca61b6f..fda8761 100644
--- a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_h.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_h.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="9.5dp"
+ android:width="4.25dp"
android:height="17dp"
android:viewportWidth="6.0"
- android:viewportHeight="12.0">
+ android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M6.000000,11.000000L4.400000,11.000000L4.400000,7.500000L1.700000,7.500000L1.700000,11.000000L0.000000,11.000000L0.000000,2.500000l1.700000,0.000000l0.000000,3.700000l2.700000,0.000000L4.400000,2.500000L6.000000,2.500000L6.000000,11.000000z"/>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte.xml
index add96b4..c08ff20 100644
--- a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="18.417dp"
+ android:width="9.208dp"
android:height="17dp"
- android:viewportWidth="13"
- android:viewportHeight="12.0">
+ android:viewportWidth="13.0"
+ android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M2.000000,9.700000l2.000000,0.000000L4.000000,11.000000L0.300000,11.000000L0.300000,2.500000L2.000000,2.500000L2.000000,9.700000z"/>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte_plus.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte_plus.xml
index 8811d2f..db18fad 100644
--- a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte_plus.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte_plus.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="25.0dp"
+ android:width="17.0dp"
android:height="17.0dp"
- android:viewportWidth="18.0"
- android:viewportHeight="12.0">
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M2.0,9.7l2.0,0.0L4.0,11.0L0.4,11.0L0.4,2.5L2.0,2.5L2.0,9.7z"/>
diff --git a/packages/SystemUI/res/drawable/stat_sys_roaming.xml b/packages/SystemUI/res/drawable/stat_sys_roaming.xml
index 363e231..4baa472 100644
--- a/packages/SystemUI/res/drawable/stat_sys_roaming.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_roaming.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="4.25dp"
+ android:width="8.5dp"
android:height="17dp"
android:viewportWidth="6.0"
- android:viewportHeight="24.0">
+ android:viewportHeight="12.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M2.800000,7.900000l-1.000000,0.000000L1.800000,11.000000L0.200000,11.000000L0.200000,2.500000l2.700000,0.000000c0.900000,0.000000 1.500000,0.200000 2.000000,0.700000s0.700000,1.100000 0.700000,1.900000c0.000000,0.600000 -0.100000,1.100000 -0.300000,1.500000S4.800000,7.200000 4.400000,7.400000l1.500000,3.500000L5.900000,11.000000L4.100000,11.000000L2.800000,7.900000zM1.800000,6.500000l1.100000,0.000000c0.400000,0.000000 0.600000,-0.100000 0.800000,-0.400000S4.000000,5.600000 4.000000,5.200000c0.000000,-0.400000 -0.100000,-0.800000 -0.300000,-1.000000S3.300000,3.800000 2.900000,3.800000L1.800000,3.800000L1.800000,6.500000z"/>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_disconnected.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_disconnected.xml
deleted file mode 100644
index 8e626e9..0000000
--- a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_disconnected.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<!--
- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="18.41dp"
- android:height="17dp"
- android:viewportWidth="26.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="?attr/backgroundColor"
- android:pathData="M21.0,8.5
- c0.85,0.0 1.6,0.23 2.3,0.62l2.24,-2.79
- C25.1,5.96 20.26,2.0 13.0,2.0
- S0.9,5.9 0.42,6.32
- l12.57,15.6 4.21,-5.17
- c-0.76,-0.87 -1.22,-2.0 -1.22,-3.25
- c0.0,-2.76 2.24,-5.0 5.0,-5.0z"/>
- <path
- android:fillColor="?attr/backgroundColor"
- android:pathData="M21.0,10.0
- c-1.93,0.0 -3.5,1.57 -3.5,3.5l1.75,0.0
- c0.0,-0.9 0.78,-1.75 1.75,-1.75s1.7,0.78 1.75,1.75
- c0.0,0.48 -0.2,0.92 -0.51,1.24l-1.09,1.1
- c-0.6,0.63 -1.02,1.51 -1.02,2.47l0.0,0.44l1.75,0.0
- c0.0,-1.3 0.39,-1.84 1.03,-2.47l0.78,-0.8
- c0.5,-0.5 0.82,-1.2 0.82,-1.97
- C24.5,11.57 22.93,10.0 21.0,10.0z
- m-0.95,11.95l1.9,0.0l0.0,-1.9l-1.9,0.0l0.0,1.9z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml
index c1856fa..5169de4 100644
--- a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml
@@ -20,8 +20,5 @@
android:viewportHeight="24.0">
<path
android:fillColor="?attr/backgroundColor"
- android:pathData="M17.500000,16.500000L5.800000,3.400000c0.000000,0.000000 0.000000,0.000000 0.000000,0.000000l-2.700000,-3.000000L1.600000,1.800000l2.200000,2.500000c-2.000000,1.000000 -3.200000,2.000000 -3.400000,2.200000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l3.200000,-3.900000l2.400000,2.700000l1.500000,-1.400000L17.500000,16.500000L17.500000,16.500000z"/>
- <path
- android:fillColor="?attr/backgroundColor"
- android:pathData="M25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000c-1.900000,0.000000 -3.600000,0.300000 -5.200000,0.700000L18.700001,15.000000L25.600000,6.500000z"/>
+ android:pathData="M13.000000,2.000000C7.700000,2.000000 3.700000,3.900000 0.400000,6.400000L13.000000,22.000000L25.600000,6.500000C22.299999,4.000000 18.299999,2.000000 13.000000,2.000000zM13.000000,18.600000L3.300000,7.000000l0.000000,0.000000l0.000000,0.000000C6.000000,5.300000 8.700000,4.000000 13.000000,4.000000s7.000000,1.400000 9.700000,3.000000l0.000000,0.000000l0.000000,0.000000L13.000000,18.600000z"/>
</vector>
diff --git a/packages/SystemUI/res/layout/foreground_service_item.xml b/packages/SystemUI/res/layout/foreground_service_item.xml
new file mode 100644
index 0000000..0a1dea0
--- /dev/null
+++ b/packages/SystemUI/res/layout/foreground_service_item.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2017, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:orientation="horizontal">
+
+ <ImageView
+ android:id="@+id/app_icon"
+ android:layout_width="@android:dimen/app_icon_size"
+ android:layout_height="@android:dimen/app_icon_size"
+ android:layout_marginEnd="8dp"
+ android:scaleType="centerInside"
+ android:contentDescription="@null" />
+
+ <TextView
+ android:id="@+id/app_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="fill_horizontal|center_vertical"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textAlignment="viewStart" />
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/foreground_service_title.xml b/packages/SystemUI/res/layout/foreground_service_title.xml
new file mode 100644
index 0000000..b5434b2
--- /dev/null
+++ b/packages/SystemUI/res/layout/foreground_service_title.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2017, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:gravity="center_vertical"
+ android:paddingTop="?android:attr/listPreferredItemPaddingStart"
+ android:paddingBottom="16dp"
+ android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+ <com.android.internal.widget.DialogTitle style="?android:attr/textAppearanceLarge"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAlignment="viewStart"
+ android:text="@string/running_foreground_services_title" />
+ <TextView style="?android:attr/textAppearanceSmall"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:textAlignment="viewStart"
+ android:text="@string/running_foreground_services_msg" />
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/mobile_signal_group.xml b/packages/SystemUI/res/layout/mobile_signal_group.xml
index 6d4365c..33effba 100644
--- a/packages/SystemUI/res/layout/mobile_signal_group.xml
+++ b/packages/SystemUI/res/layout/mobile_signal_group.xml
@@ -63,21 +63,20 @@
systemui:hasOverlappingRendering="false"
/>
<ImageView
- android:id="@+id/mobile_roaming"
+ android:id="@+id/mobile_type"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:src="@drawable/stat_sys_roaming"
- android:contentDescription="@string/accessibility_data_connection_roaming"
- android:visibility="gone"
/>
<ImageView
- android:id="@+id/mobile_type"
+ android:id="@+id/mobile_roaming"
android:layout_width="wrap_content"
android:layout_height="17dp"
- android:paddingStart="19dp"
+ android:paddingStart="22dp"
android:paddingTop="1.5dp"
android:paddingBottom="3dp"
android:scaleType="fitCenter"
+ android:src="@drawable/stat_sys_roaming"
+ android:contentDescription="@string/accessibility_data_connection_roaming"
android:visibility="gone" />
</FrameLayout>
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml
index 0c9858d..6fe00c0 100644
--- a/packages/SystemUI/res/layout/notification_info.xml
+++ b/packages/SystemUI/res/layout/notification_info.xml
@@ -74,8 +74,9 @@
android:orientation="horizontal">
<!-- Channel Text -->
<LinearLayout
- android:layout_width="wrap_content"
+ android:layout_width="0dp"
android:layout_height="wrap_content"
+ android:layout_weight="1"
android:orientation="vertical">
<!-- Channel Name -->
<TextView
@@ -113,7 +114,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
- android:layout_weight="1"
android:contentDescription="@string/notification_channel_switch_accessibility"
android:background="@null" />
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml
index 5df50cd..9a97d60 100644
--- a/packages/SystemUI/res/layout/signal_cluster_view.xml
+++ b/packages/SystemUI/res/layout/signal_cluster_view.xml
@@ -53,54 +53,9 @@
android:alpha="0.0"
/>
</FrameLayout>
- <ViewStub
- android:id="@+id/connected_device_signals_stub"
- android:layout="@layout/connected_device_signal"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <LinearLayout
- android:id="@+id/mobile_signal_group"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- >
- </LinearLayout>
- <View
- android:id="@+id/wifi_signal_spacer"
- android:layout_width="@dimen/status_bar_wifi_signal_spacer_width"
- android:layout_height="4dp"
- android:visibility="gone"
- />
- <FrameLayout
- android:id="@+id/no_sims_combo"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:contentDescription="@string/accessibility_no_sims">
- <com.android.systemui.statusbar.AlphaOptimizedImageView
- android:theme="@style/DualToneLightTheme"
- android:id="@+id/no_sims"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:src="@drawable/stat_sys_no_sims"
- />
- <com.android.systemui.statusbar.AlphaOptimizedImageView
- android:theme="@style/DualToneDarkTheme"
- android:id="@+id/no_sims_dark"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:src="@drawable/stat_sys_no_sims"
- android:alpha="0.0"
- />
- </FrameLayout>
- <View
- android:id="@+id/wifi_airplane_spacer"
- android:layout_width="@dimen/status_bar_airplane_spacer_width"
- android:layout_height="4dp"
- android:visibility="gone"
- />
<FrameLayout
android:layout_height="17dp"
- android:layout_width="wrap_content"
- android:paddingStart="2dp">
+ android:layout_width="wrap_content">
<ImageView
android:id="@+id/wifi_in"
android:layout_height="wrap_content"
@@ -142,6 +97,50 @@
android:layout_width="wrap_content"
/>
</FrameLayout>
+ <View
+ android:id="@+id/wifi_signal_spacer"
+ android:layout_width="@dimen/status_bar_wifi_signal_spacer_width"
+ android:layout_height="4dp"
+ android:visibility="gone"
+ />
+ <ViewStub
+ android:id="@+id/connected_device_signals_stub"
+ android:layout="@layout/connected_device_signal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ <LinearLayout
+ android:id="@+id/mobile_signal_group"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ >
+ </LinearLayout>
+ <FrameLayout
+ android:id="@+id/no_sims_combo"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:contentDescription="@string/accessibility_no_sims">
+ <com.android.systemui.statusbar.AlphaOptimizedImageView
+ android:theme="@style/DualToneLightTheme"
+ android:id="@+id/no_sims"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:src="@drawable/stat_sys_no_sims"
+ />
+ <com.android.systemui.statusbar.AlphaOptimizedImageView
+ android:theme="@style/DualToneDarkTheme"
+ android:id="@+id/no_sims_dark"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:src="@drawable/stat_sys_no_sims"
+ android:alpha="0.0"
+ />
+ </FrameLayout>
+ <View
+ android:id="@+id/wifi_airplane_spacer"
+ android:layout_width="@dimen/status_bar_airplane_spacer_width"
+ android:layout_height="4dp"
+ android:visibility="gone"
+ />
<ImageView
android:id="@+id/airplane"
android:layout_height="wrap_content"
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 578f898..a07feae 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobiele data is af"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-verbinding."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Vliegtuigmodus."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN aan."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Geen SIM-kaart nie."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Diensverskaffernetwerk verander tans."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Maak batterybesonderhede oop"</string>
@@ -401,7 +402,7 @@
<string name="user_remove_user_title" msgid="4681256956076895559">"Verwyder gebruiker?"</string>
<string name="user_remove_user_message" msgid="1453218013959498039">"Alle programme en data van hierdie gebruiker sal uitgevee word."</string>
<string name="user_remove_user_remove" msgid="7479275741742178297">"Verwyder"</string>
- <string name="battery_saver_notification_title" msgid="237918726750955859">"Batteryspaarder is aan"</string>
+ <string name="battery_saver_notification_title" msgid="237918726750955859">"Batterybespaarder is aan"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Verminder werkverrigting en agtergronddata"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Skakel batterybespaarder af"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sal alles begin vasvang wat op jou skerm gewys word."</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Werkprofiel is gekoppel aan <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Persoonlike profiel is aan <xliff:g id="VPN_APP">%1$s</xliff:g> gekoppel"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Toestel is aan <xliff:g id="VPN_APP">%1$s</xliff:g> gekoppel"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Toestelbestuur"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profielmonitering"</string>
<string name="monitoring_title" msgid="169206259253048106">"Netwerkmonitering"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Deaktiveer VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Ontkoppel VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Bekyk beleide"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Jou toestel word deur <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> bestuur.\n\nJou administrateur kan instellings, korporatiewe toegang, programme, data wat met jou toestel geassosieer word en jou toestel se ligginginligting monitor en bestuur.\n\nVir meer inligting, kontak jou administrateur."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Jou toestel word deur jou organisasie bestuur.\n\nJou administrateur kan instellings, korporatiewe toegang, programme, data wat met jou toestel geassosieer word en jou toestel se ligginginligting monitor en bestuur.\n\nVir meer inligting, kontak jou administrateur."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Jou organisasie het \'n sertifikaatoutoriteit op hierdie toestel geïnstalleer. Jou veilige netwerkverkeer kan gemonitor of gewysig word."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Jou organisasie het \'n sertifikaatoutoriteit in jou werkprofiel geïnstalleer. Jou veilige netwerkverkeer kan gemonitor of gewysig word."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"\'n Sertifikaatoutoriteit is op hierdie toestel geïnstalleer. Jou veilige netwerkverkeer kan gemonitor of gewysig word."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Jou administrateur het netwerkloginskrywing aangeskakel, wat verkeer op jou toestel monitor."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Jy is gekoppel aan <xliff:g id="VPN_APP">%1$s</xliff:g>, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Jy is gekoppel aan <xliff:g id="VPN_APP_0">%1$s</xliff:g> en <xliff:g id="VPN_APP_1">%2$s</xliff:g>, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Jou werkprofiel is gekoppel aan <xliff:g id="VPN_APP">%1$s</xliff:g>, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Jy persoonlike profiel is gekoppel aan <xliff:g id="VPN_APP">%1$s</xliff:g>, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Jou toestel word bestuur deur <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g>-kennisgewing: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Program sal dalk nie met verdeelde skerm werk nie."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Program steun nie verdeelde skerm nie."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Program sal dalk nie op \'n sekondêre skerm werk nie."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Program steun nie begin op sekondêre skerms nie."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Maak instellings oop."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Maak kitsinstellings oop."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Maak kitsinstellings toe."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Kitsprogramme"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Kitsprogramme hoef nie geïnstalleer te word nie."</string>
<string name="app_info" msgid="6856026610594615344">"Programinligting"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Gaan na web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobiele data"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi is af"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth is af"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 9084868..d6f4f74 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"የተንቀሳቃሽ ስልክ ውሂብ ጠፍቷል"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ብሉቱዝ ማያያዝ።"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"የአውሮፕላን ሁነታ።"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"ቪፒኤን በርቷል።"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"ምንም SIM ካርድ የለም።"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"የአገልግሎት አቅራቢ አውታረ መረብን በመቀየር ላይ።"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"የባትሪ ዝርዝሮችን ክፈት"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"የሥራ መገለጫ ወደ <xliff:g id="VPN_APP">%1$s</xliff:g> ተገናኝቷል"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"የግል መገለጫ ወደ <xliff:g id="VPN_APP">%1$s</xliff:g> ተገናኝቷል"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"ይህ መሣሪያ ወደ <xliff:g id="VPN_APP">%1$s</xliff:g> ተገናኝቷል"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"የመሣሪያ አስተዳደር"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"መገለጫን መከታተል"</string>
<string name="monitoring_title" msgid="169206259253048106">"የአውታረ መረብ ክትትል"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN አሰናክል"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"የVPN ግንኙነት አቋርጥ"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"መመሪያዎችን ይመልከቱ"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"የእርስዎ መሣሪያ በ<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> የሚተዳደር ነው።\n\nየእርስዎ አስተዳዳሪ ከመሣሪያዎ ጋር የተጎዳኙ ቅንብሮችን፣ የኮርፖሬት መዳረሻን፣ መተግበሪያዎችን እና የመሣሪያዎን የአካባቢ መረጃ መከታተል እና ማቀናበር ይችላሉ።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።"</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"የእርስዎ መሣሪያ በድርጅትዎ የሚተዳደር ነው።\n\nየእርስዎ አስተዳዳሪ ከመሣሪያዎ ጋር የተጎዳኙ ቅንብሮችን፣ የኮርፖሬት መዳረሻንና ውሂብን እና የመሣሪያዎን የአካባቢ መረጃ መከታተል እና ማቀናበር ይችላሉ።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።"</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"የእርስዎ ድርጅት የእውቅና ማረጋገጫ ሰጪ ባለሥልጣን በዚህ መሣሪያ ላይ ጭኗል። የእርስዎ ደኅንነቱ የተጠበቀ አውታረ መረብ ትራፊክ ክትትል ሊደረግበት እና ሊሻሻል ይችላል።"</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"የእርስዎ ድርጅት የእውቅና ማረጋገጫ ሰጪ ባለሥልጣን በእርስዎ የሥራ መገለጫ ላይ ጭኗል። የእርስዎ ደኅንነቱ የተጠበቀ አውታረ መረብ ትራፊክ ክትትል ሊደረግበት እና ሊሻሻል ይችላል።"</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"የእውቅና ማረጋገጫ ሰጪ ባለሥልጣን በዚህ መሣሪያ ላይ ተጭኗል። የእርስዎ ደኅንነቱ የተጠበቀ አውታረ መረብ ትራፊክ ክትትል ሊደረግበት እና ሊሻሻል ይችላል።"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"የእርስዎ አስተዳዳሪ የአውታረ መረብ ምዝግብ ማስታወሻ መያዝን አብርተዋል፣ ይህም በመሣሪያዎ ላይ ያለውን ትራፊክ ይከታተላል።"</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"እርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው <xliff:g id="VPN_APP">%1$s</xliff:g> ጋር ተገናኝተዋል።"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችሉት <xliff:g id="VPN_APP_0">%1$s</xliff:g> እና <xliff:g id="VPN_APP_1">%2$s</xliff:g> ጋር ተገናኝተዋል።"</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"የእርስዎ የሥራ መገለጫ የእርስዎን ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው <xliff:g id="VPN_APP">%1$s</xliff:g> ጋር ተገናኝቷል።"</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"የእርስዎ የግል መገለጫ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው <xliff:g id="VPN_APP">%1$s</xliff:g> ጋር ተገናኝቷል።"</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"የእርስዎ መሣሪያ በ<xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> ነው የሚቀናበረው።"</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"የ<xliff:g id="ID_1">%1$s</xliff:g> ማሳወቂያ፦ <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"መተግበሪያ ከተከፈለ ማያ ገጽ ጋር ላይሠራ ይችላል"</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"መተግበሪያው የተከፈለ ማያ ገጽን አይደግፍም።"</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"መተግበሪያ በሁለተኛ ማሳያ ላይ ላይሠራ ይችላል።"</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"መተግበሪያ በሁለተኛ ማሳያዎች ላይ ማስጀመርን አይደግፍም።"</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"ቅንብሮችን ክፈት።"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"ፈጣን ቅንብሮችን ክፈት።"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"ፈጣን ቅንብሮችን ዝጋ።"</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"የቅጽበት መተግበሪያዎች"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ቅጽበታዊ መተግበሪያዎች መጫን አያስፈልጋቸውም።"</string>
<string name="app_info" msgid="6856026610594615344">"የመተግበሪያ መረጃ"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"ወደ ድር ሂድ"</string>
<string name="mobile_data" msgid="7094582042819250762">"የተንቀሳቃሽ ስልክ ውሂብ"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ጠፍቷል"</string>
<string name="bt_is_off" msgid="2640685272289706392">"ብሉቱዝ ጠፍቷል"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 096b1cb..e1b7015 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -161,6 +161,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"إيقاف بيانات الجوال"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ربط البلوتوث."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"وضع الطائرة."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"الشبكة الظاهرية الخاصة (VPN) قيد التشغيل."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"ليس هناك شريحة SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"جارٍ تغيير شبكة مشغِّل شبكة الجوّال."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"فتح تفاصيل البطارية"</string>
@@ -435,8 +436,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"تم ربط الملف الشخصي للعمل بـ <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"تم ربط الملف الشخصي بـ <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"تم ربط الجهاز بـ <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"إدارة الأجهزة"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"مراقبة الملف الشخصي"</string>
<string name="monitoring_title" msgid="169206259253048106">"مراقبة الشبكات"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"شبكة ظاهرية خاصة (VPN)"</string>
@@ -445,18 +445,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"تعطيل الشبكة الظاهرية الخاصة"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"قطع الاتصال بشبكة VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"عرض السياسات"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"تتم إدارة جهازك بواسطة <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nيمكن للمشرف مراقبة وإدارة الإعدادات والدخول إلى المؤسسة والتطبيقات والبيانات المرتبطة بجهازك ومعلومات الموقع الجغرافي للجهاز.\n\nللحصول على المزيد من المعلومات، اتصل بالمشرف."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"تتم إدارة جهازك بواسطة المؤسسة.\n\nيمكن للمشرف مراقبة وإدارة الإعدادات والدخول إلى المؤسسة والتطبيقات والبيانات المرتبطة بجهازك ومعلومات الموقع الجغرافي للجهاز.\n\nللحصول على المزيد من المعلومات، اتصل بالمشرف."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"ثبّتت مؤسستك مرجعًا مصدّقًا على هذا الجهاز. قد تتم مراقبة حركة بيانات شبكتك الآمنة أو تعديلها."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"ثبّتت مؤسستك مرجعًا مصدّقًا في ملفك الشخصي للعمل. قد تتم مراقبة حركة بيانات شبكتك الآمنة أو تعديلها."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"تم تثبيت مرجع مصدّق على هذا الجهاز. قد تتم مراقبة حركة بيانات شبكتك الآمنة أو تعديلها."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"شغَّل المشرف ميزة تسجيل بيانات الشبكة، والتي يتم من خلالها مراقبة حركة البيانات على جهازك."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"لقد اتصلت بتطبيق <xliff:g id="VPN_APP">%1$s</xliff:g>، الذي يمكن أن يراقب نشاط شبكتك، بما في ذلك رسائل البريد الإلكتروني والتطبيقات والمواقع الإلكترونية."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"لقد اتصلت بتطبيق <xliff:g id="VPN_APP_0">%1$s</xliff:g> و<xliff:g id="VPN_APP_1">%2$s</xliff:g> اللذين يمكنهما مراقبة نشاط شبكتك، بما في ذلك رسائل البريد الإلكتروني والتطبيقات والمواقع الإلكترونية."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"تم ربط الملف الشخصي للعمل بـ <xliff:g id="VPN_APP">%1$s</xliff:g>، الذي يمكنه مراقبة أنشطتك الشخصية على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"تم ربط ملفك الشخصي بـ <xliff:g id="VPN_APP">%1$s</xliff:g>، الذي يمكنه مراقبة أنشطة شبكتك، بما في ذلك رسائل البريد الإلكتروني والتطبيقات والمواقع الإلكترونية."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"تتم إدارة جهازك بواسطة <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -719,6 +715,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"إشعار <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"يمكن ألا يعمل التطبيق مع وضع تقسيم الشاشة."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"التطبيق لا يتيح تقسيم الشاشة."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"قد لا يعمل التطبيق على شاشة عرض ثانوية."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"التطبيق لا يسمح بتشغيله على شاشات عرض ثانوية."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"فتح الإعدادات."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"فتح الإعدادات السريعة."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"إغلاق الإعدادات السريعة."</string>
@@ -768,8 +766,7 @@
<string name="instant_apps" msgid="6647570248119804907">"التطبيقات الفورية"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"لا تتطلب التطبيقات الفورية إجراء التثبيت."</string>
<string name="app_info" msgid="6856026610594615344">"معلومات عن التطبيق"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"الانتقال إلى الويب"</string>
<string name="mobile_data" msgid="7094582042819250762">"بيانات الجوّال"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"تم إيقاف شبكة Wi-Fi"</string>
<string name="bt_is_off" msgid="2640685272289706392">"تم إيقاف البلوتوث."</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 940b009..015f4cf 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobil Data Deaktivdir"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth tezering."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Uçuş rejimi"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN aktivdir."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM kart yoxdur."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Carrier şəbəkə dəyişir."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Batareya detallarını açın"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"İş profili <xliff:g id="VPN_APP">%1$s</xliff:g> tətbiqinə qoşuludur"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Şəxsi profil <xliff:g id="VPN_APP">%1$s</xliff:g> tətbiqinə qoşuludur"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Cihaz <xliff:g id="VPN_APP">%1$s</xliff:g> tətbiqinə qoşuludur"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Cihaz idarəetməsi"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profil izlənməsi"</string>
<string name="monitoring_title" msgid="169206259253048106">"Şəbəkə monitorinqi"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN (Virtual Şəxsi Şəbəkələr)"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN-i deaktiv edin"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN-i bağlantıdan ayırın"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Siyasətlərə Baxın"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Cihaz <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> tərəfindən idarə edilir.\n\nAdmin cihaz və cihaz məkan məlumatı ilə əlaqəli ayarlara, korporativ girişə, tətbiqə və dataya nəzarət edə və idarə edə bilər.\n\nƏtraflı məlumat üçün admin ilə əlaqə saxlayın."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Cihaz təşkilatınız tərəfindən idarə edilir.\n\nAdmin cihaz və cihaz məkan məlumatı ilə əlaqəli ayarlara, korporativ girişə, tətbiqə və dataya nəzarət edə və idarə edə bilər.\n\nƏtraflı məlumat üçün admin ilə əlaqə saxlayın."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Təşkilat bu cihazda sertifikat səlahiyyəti quraşdırdı. Təhlükəsiz şəbəkə ötürülməsinə nəzarət edilə və ya dəyişdirilə bilər."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Təşkilat iş profilində sertifikat səlahiyyəti quraşdırdı. Təhlükəsiz şəbəkə ötürülməsinə nəzarət edilə və ya dəyişdirilə bilər."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Bu cihazda sertifikat səlahiyyəti quraşdırıldı. Təhlükəsiz şəbəkə ötürülməsinə nəzarət edilə və ya dəyişdirilə bilər."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Admin cihazda şəbəkə ötürülməsinə nəzarət edən şəbəkə qeydlərini aktiv etdi."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"E-poçt, tətbiq və veb saytlar daxil olmaqla şəbəkə fəaliyyətinə nəzarət edən <xliff:g id="VPN_APP">%1$s</xliff:g> tətbiqinə qoşulusunuz."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"E-poçt, tətbiq və veb saytlar daxil olmaqla şəbəkə fəaliyyətinə nəzarət edən <xliff:g id="VPN_APP_0">%1$s</xliff:g> və <xliff:g id="VPN_APP_1">%2$s</xliff:g> tətbiqlərinə qoşulusunuz."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"İş profili e-poçt, tətbiq və veb saytlar da daxil olmaqla şəbəkə fəaliyyətinə nəzarət edən <xliff:g id="VPN_APP">%1$s</xliff:g> tətbiqinə qoşuludur."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Şəxsi profil e-poçt, tətbiq və veb saytlar daxil olmaqla şəbəkə fəaliyyətinə nəzarət edən <xliff:g id="VPN_APP">%1$s</xliff:g> tətbiqinə qoşuludur."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Cihaz <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> tərəfindən idarə olunur."</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> bildiriş: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Tətbiq bölünmüş ekran ilə işləməyə bilər."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Tətbiq ekran bölünməsini dəstəkləmir."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Tətbiq ikinci ekranda işləməyə bilər."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Tətbiq ikinci ekranda başlamağı dəstəkləmir."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Ayarları açın."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Cəld ayarları açın."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Cəld ayarları bağlayın."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Ani Tətbiqlər"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Ani tətbiqlər quraşdırma tələb etmir."</string>
<string name="app_info" msgid="6856026610594615344">"Tətbiq məlumatı"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Vebə keçin"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobil data"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi deaktivdir"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth deaktivdir"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index f1e7e63..6da1eda 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -158,6 +158,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobilni podaci su isključeni"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth privezivanje."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Režim rada u avionu."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN je uključen."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Nema SIM kartice."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Promena mreže mobilnog operatera."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Otvori detalje o bateriji"</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Profil za Work je povezan sa aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Lični profil je povezan sa aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Uređaj je povezan sa aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Upravljanje uređajima"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Nadgledanje profila"</string>
<string name="monitoring_title" msgid="169206259253048106">"Nadgledanje mreže"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -439,18 +439,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Onemogući VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Prekini vezu sa VPN-om"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Prikaži smernice"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Uređajem upravlja <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nAdministrator može da nadgleda podešavanja, korporativni pristup, aplikacije, podatke povezane sa uređajem i informacije o lokaciji uređaja, kao i da upravlja njima.\n\nViše informacija potražite od administratora."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Uređajem upravlja organizacija.\n\nAdministrator može da nadgleda podešavanja, korporativni pristup, aplikacije, podatke povezane sa uređajem i informacije o lokaciji uređaja, kao i da upravlja njima.\n\nViše informacija potražite od administratora."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Organizacija je na ovom uređaju instalirala autoritet za izdavanje sertifikata. Bezbedni mrežni saobraćaj može da se prati ili menja."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Organizacija je na profilu za Work instalirala autoritet za izdavanje sertifikata. Bezbedni mrežni saobraćaj može da se prati ili menja."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Na ovom uređaju je instaliran autoritet za izdavanje sertifikata. Bezbedni mrežni saobraćaj može da se prati ili menja."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Administrator je uključio evidentiranje mreže, koje prati saobraćaj na uređaju."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Povezani ste sa aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Povezani ste sa aplikacijama <xliff:g id="VPN_APP_0">%1$s</xliff:g> i <xliff:g id="VPN_APP_1">%2$s</xliff:g>, koje mogu da nadgledaju aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Profil za Work je povezan sa aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Lični profil je povezan sa aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Uređajem upravlja <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -707,6 +703,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Obaveštenja za <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Aplikacija možda neće funkcionisati sa podeljenim ekranom."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Aplikacija ne podržava podeljeni ekran."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Aplikacija možda neće funkcionisati na sekundarnom ekranu."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Aplikacija ne podržava pokretanje na sekundarnim ekranima."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Otvori Podešavanja."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Otvori Brza podešavanja."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Zatvori Brza podešavanja."</string>
@@ -756,8 +754,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant aplikacije"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant aplikacije ne zahtevaju instalaciju."</string>
<string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Idi na veb"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobilni podaci"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi je isključen"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth je isključen"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 51c8ea6..f9216eb 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -159,6 +159,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Мабільная перадача даных выключана"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Сувязь па Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Рэжым палёту."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN уключана."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Няма SIM-карты."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Змяненне аператара сеткі."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Паказаць падрабязную інфармацыю пра акумулятар"</string>
@@ -433,8 +434,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Працоўны профіль падключаны да праграмы <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Асабісты профіль падключаны да праграмы <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Прылада падключана да праграмы <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Кіраванне прыладай"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Маніторынг профіляў"</string>
<string name="monitoring_title" msgid="169206259253048106">"Маніторынг сеткі"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +443,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Адключыць VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Адлучыць VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Праглядзець палітыку"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Ваша прылада знаходзіцца пад кіраваннем <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nВаш адміністратар можа сачыць і кіраваць наладамі, карпаратыўным доступам, праграмамі, данымі, звязанымі з вашай прыладай, і звесткамі пра месцазнаходжанне вашай прылады.\n\nДля атрымання дадатковай інфармацыі звярніцеся да адміністратара."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Ваша прылада знаходзіцца пад кіраваннем вашай арганізацыі.\n\nУ вашага адміністратара ёсць магчымасць маніторынгу і адміністравання налад, карпаратыўнага доступу, праграм, даных, звязаных з гэтай прыладай, і адпаведных геаданых.\n\nДля атрымання дадатковай інфармацыі звярніцеся да адміністратара."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Ваша арганізацыя ўсталявала на гэтай прыладзе цэнтр сертыфікацыі. Ваш абаронены сеткавы трафік могуць праглядваць ці змяняць."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Ваша арганізацыя ўсталявала ў вашым працоўным профілі цэнтр сертыфікацыі. Ваш абаронены сеткавы трафік могуць праглядваць ці змяняць."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"На гэтай прыладзе ўсталяваны цэнтр сертыфікацыі. Ваш абаронены сеткавы трафік могуць праглядваць ці змяняць."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Ваш адміністратар уключыў вядзенне журнала сеткі, з дапамогай якога адсочваецца трафік на вашай прыладзе."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Вы падключаны да праграмы <xliff:g id="VPN_APP">%1$s</xliff:g>, якая можа сачыць за вашай сеткавай дзейнасцю, уключаючы электронную пошту, праграмы і вэб-сайты."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Вы падключаны да праграм <xliff:g id="VPN_APP_0">%1$s</xliff:g> і <xliff:g id="VPN_APP_1">%2$s</xliff:g>, якія могуць сачыць за вашай сеткавай дзейнасцю, уключаючы электронную пошту, праграмы і вэб-сайты."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Ваш працоўны профіль падключаны да праграмы <xliff:g id="VPN_APP">%1$s</xliff:g>, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Ваш асабісты профіль падключаны да праграмы <xliff:g id="VPN_APP">%1$s</xliff:g>, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Ваша прылада знаходзіцца пад кіраваннем <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -713,6 +709,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Апавяшчэнне <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Праграма можа не працаваць у рэжыме дзялення экрана."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Праграма не падтрымлівае функцыю дзялення экрана."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Праграма можа не працаваць на дадатковых дысплэях."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Праграма не падтрымлівае запуск на дадатковых дысплэях."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Адкрыць налады."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Адкрыць хуткія налады."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Закрыць хуткія налады."</string>
@@ -762,8 +760,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Імгненныя праграмы"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Імгненныя праграмы не патрабуюць усталёўкі."</string>
<string name="app_info" msgid="6856026610594615344">"Інфармацыя пра праграму"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Перайсці ў інтэрнэт"</string>
<string name="mobile_data" msgid="7094582042819250762">"Маб. перадача даных"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi выключаны"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth выключаны"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index f3c5651..12c3381 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -152,14 +152,12 @@
<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>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"Мобилни данни"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Мобилните данни са включени"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"Мобилните данни са изключени"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Тетъринг през Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Самолетен режим."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"Функцията за виртуална частна мрежа (VPN) е включена."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Няма SIM карта."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Промяна на мрежата на оператора."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Отваряне на подробностите за батерията"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Зарежда се"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Данните от 2G – 3G са поставени на пауза"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Данните от 4G са поставени на пауза"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Мобилните данни са поставени на пауза"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Данните са поставени на пауза"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Достигнахте зададеното от вас ограничение за данните. Вече не използвате мобилната мрежа.\n\nАко възобновите връзката с нея, може да бъдете таксувани за пренос на данни."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Възобновяване"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Няма връзка с интернет"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi: Има връзка"</string>
@@ -309,7 +305,7 @@
<string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"Няма налични устройства"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Яркост"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"АВТ."</string>
- <string name="quick_settings_inversion_label" msgid="8790919884718619648">"Обръщане на цветовете"</string>
+ <string name="quick_settings_inversion_label" msgid="8790919884718619648">"Инвертиране на цветовете"</string>
<string name="quick_settings_color_space_label" msgid="853443689745584770">"Режим на коригиране на цветовете"</string>
<string name="quick_settings_more_settings" msgid="326112621462813682">"Още настройки"</string>
<string name="quick_settings_done" msgid="3402999958839153376">"Готово"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Точка за достъп"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Известия"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Фенерче"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобилни данни"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Пренос на данни"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Оставащи данни"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Над ограничението"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Служебният потребителски профил е свързан с приложението <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Личният потребителски профил е свързан с приложението <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Устройството е свързано с приложението <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Управление на устройствата"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Наблюдаване на потр. профил"</string>
<string name="monitoring_title" msgid="169206259253048106">"Наблюдение на мрежата"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Деактивиране на VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Прекратяване на връзката с VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Преглед на правилата"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Устройството ви се управлява от <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nАдминистраторът ви може да наблюдава и управлява настройките, корпоративния достъп, приложенията, свързаните с устройството данни и информацията за местоположението му.\n\nЗа повече информация се свържете с администратора си."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Устройството ви се управлява от организацията ви.\n\nАдминистраторът ви може да наблюдава и управлява настройките, корпоративния достъп, приложенията, свързаните с устройството данни и информацията за местоположението му.\n\nЗа повече информация се свържете с администратора си."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Организацията ви е инсталирала сертифициращ орган на това устройство. Трафикът в защитената ви мрежа може да бъде наблюдаван или променян."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Организацията ви е инсталирала сертифициращ орган в служебния ви потребителски профил. Трафикът в защитената ви мрежа може да бъде наблюдаван или променян."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"На това устройство е инсталиран сертифициращ орган. Трафикът в защитената ви мрежа може да бъде наблюдаван или променян."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Администраторът ви е включил функцията за регистриране на мрежовата активност, която следи трафика на устройството ви."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Установена е връзка с приложението <xliff:g id="VPN_APP">%1$s</xliff:g>, което може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Установена е връзка с приложенията <xliff:g id="VPN_APP_0">%1$s</xliff:g> и <xliff:g id="VPN_APP_1">%2$s</xliff:g>, които могат да наблюдават активността ви в мрежата, включително имейли, приложения и уебсайтове."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Служебният ви потребителски профил е свързан с приложението <xliff:g id="VPN_APP">%1$s</xliff:g>, което може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Личният ви потребителски профил е свързан с приложението <xliff:g id="VPN_APP">%1$s</xliff:g>, което може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Устройството ви се управлява от <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -569,12 +559,9 @@
<item quantity="other">„<xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>“, „<xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>“ и още <xliff:g id="NUMBER_5">%3$d</xliff:g></item>
<item quantity="one">„<xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>“, „<xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g>“ и още <xliff:g id="NUMBER_2">%3$d</xliff:g></item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Контролите за известията за <xliff:g id="APP_NAME">%1$s</xliff:g> са оттворени"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"Контролите за известията за <xliff:g id="APP_NAME">%1$s</xliff:g> са затворени"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Разрешаване на известия от този канал"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"Всички категории"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Още настройки"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"Персонализиране: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Известие от <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Приложението може да не работи в режим на разделен екран."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Приложението не поддържа разделен екран."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Възможно е приложението да не работи на алтернативни дисплеи."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Приложението не поддържа използването на алтернативни дисплеи."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Отваряне на настройките."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Отваряне на бързите настройки."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Затваряне на бързите настройки."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"Меню за режима „Картина в картина“"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> е в режима „Картина в картина“"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Ако не искате <xliff:g id="NAME">%s</xliff:g> да използва тази функция, докоснете, за да отворите настройките, и я изключете."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"Пускане"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"Поставяне на пауза"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"Към следващия елемент"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"Към предишния елемент"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"Тел. се изкл. поради загряване"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"Телефонът ви вече работи нормално"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"Телефонът ви бе твърде горещ, затова се изключи с цел охлаждане. Вече работи нормално.\n\nТелефонът ви може да стане твърде горещ, ако:\n • използвате приложения, които ползват голям обем ресурси (като например игри, видеосъдържание или приложения за навигация);\n • изтегляте или качвате големи файлове;\n • използвате устройството си при високи температури."</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Мигновени приложения"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"За мигновените приложения не се изисква инсталиране."</string>
<string name="app_info" msgid="6856026610594615344">"Информация за приложението"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Към мрежата"</string>
<string name="mobile_data" msgid="7094582042819250762">"Мобилни данни"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Функцията за Wi‑Fi е изключена"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Функцията за Bluetooth е изключена"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 853196f..0d19b91 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -152,14 +152,12 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"ওয়াই-ফাই"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"কোনো সিম নেই৷"</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"মোবাইল ডেটা"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"মোবাইল ডেটা চালু আছে"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"মোবাইল ডেটা বন্ধ আছে"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ব্লুটুথ টিথারিং৷"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"বিমান মোড৷"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN চালু আছে।"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"কোনো সিম কার্ড নেই।"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"পরিষেবা প্রদানকারীর নেটওয়ার্ক পরিবর্তিত হচ্ছে।"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"ব্যাটারির বিশদ বিবরণ খুলুন"</string>
@@ -192,8 +190,8 @@
<string name="accessibility_desc_work_lock" msgid="4288774420752813383">"কর্মস্থলের স্ক্রীন লক"</string>
<string name="accessibility_desc_close" msgid="7479755364962766729">"বন্ধ করুন"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>।"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WiFi বন্ধ হয়েছে।"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"WiFi চালু হয়েছে।"</string>
+ <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ওয়াই ফাই বন্ধ হয়েছে।"</string>
+ <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"ওয়াই ফাই চালু হয়েছে।"</string>
<string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"মোবাইল <xliff:g id="SIGNAL">%1$s</xliff:g>৷ <xliff:g id="TYPE">%2$s</xliff:g>৷ <xliff:g id="NETWORK">%3$s</xliff:g>৷"</string>
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"ব্যাটারি <xliff:g id="STATE">%s</xliff:g>৷"</string>
<string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"বিমান মোড বন্ধ আছে।"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"চার্জ হচ্ছে"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ডেটা বিরতি দেওয়া হয়েছে"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ডেটা বিরতি দেওয়া হয়েছে"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"মোবাইল ডেটা সাময়িক ভাবে বন্ধ করা হয়েছে"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"ডেট বিরতি দেওয়া হয়েছে"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"আপনার সেট করা ডেটার সীমা ফুরিয়ে গেছে। আপনি এখন আর মোবাইল ডেটা ব্যবহার করতে পারবেন না।\n\nযদি আপনি আবার শুরু করেন, ডেটা ব্যবহারের জন্য মূল্য প্রযোজ্য হতে পারে।"</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"পুনঃসূচনা করুন"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"কোনো ইন্টারনেট সংযোগ নেই"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"ওয়াই-ফাই সংযুক্ত হয়েছে"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"হটস্পট"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"বিজ্ঞপ্তিগুলি"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ফ্ল্যাশলাইট"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"মোবাইল ডেটা"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ডেটার ব্যবহার"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"অবশিষ্ট ডেটা"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"সীমার উর্ধ্বে"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"কর্মস্থলের প্রোফাইল <xliff:g id="VPN_APP">%1$s</xliff:g> এর সাথে সংযুক্ত রয়েছে"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"ব্যক্তিগত প্রোফাইল <xliff:g id="VPN_APP">%1$s</xliff:g> এর সাথে সংযুক্ত রয়েছে"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"ডিভাইসটি <xliff:g id="VPN_APP">%1$s</xliff:g> এর সাথে সংযুক্ত রয়েছে"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"ডিভাইসের পরিচালনা"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"প্রোফাইল দেখরেখ করা"</string>
<string name="monitoring_title" msgid="169206259253048106">"নেটওয়ার্ক নিরীক্ষণ"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN অক্ষম করুন"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN এর সংযোগ বিচ্ছিন্ন করুন"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"নীতিগুলি দেখুন"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"আপনার ডিভাইসটি <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> এর দ্বারা পরিচালিত হয়।\n\nআপনার প্রশাসক এই ডিভাইসের সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ, ডিভাইসের সাথে সম্পর্কিত ডেটা এবং ডিভাইসের অবস্থান তথ্য নিরীক্ষণ ও পরিচালনা করতে পারেন।\n\nআরও তথ্যের জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন।"</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"আপনার ডিভাইসটি আপনার প্রতিষ্ঠানের দ্বারা পরিচালিত হয়।\n\nআপনার প্রশাসক এই ডিভাইসের সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ, ডিভাইসের সাথে সম্পর্কিত ডেটা এবং ডিভাইসের অবস্থান তথ্য নিরীক্ষণ ও পরিচালনা করতে পারেন।\n\nআরও তথ্যের জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন।"</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"আপনার প্রতিষ্ঠান আপনার কর্মস্থলের প্রোফাইলে একটি শংসাপত্র কর্তৃপক্ষ ইনস্টল করেছে।আপনার সুরক্ষিত নেটওয়ার্ক ট্রাফিক নিরীক্ষণ বা পরিবর্তন করা হতে পারে।"</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"আপনার প্রতিষ্ঠান আপনার কর্মস্থলের প্রোফাইলে একটি শংসাপত্র কর্তৃপক্ষ ইনস্টল করেছে। আপনার নিরাপদ নেটওয়ার্ক ট্রাফিকে নজর রাখা হতে পারে বা তাতে পরিবর্তন করা হতে পারে।"</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"এই ডিভাইসে একটি শংসাপত্র কর্তৃপক্ষ ইনস্টল করা আছে। আপনার নিরাপদ নেটওয়ার্ক ট্রাফিকে নজর রাখা হতে পারে বা তাতে পরিবর্তন করা হতে পারে।"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"আপনার প্রশাসক নেটওয়ার্ক লগিং চালু করেছেন, যা আপনার ডিভাইসের ট্রাফিকের উপরে নজর রাখে।"</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"আপনি <xliff:g id="VPN_APP">%1$s</xliff:g> এ সংযুক্ত রয়েছেন, যা আপনার ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপের উপর নজর রাখতে পারে।"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"আপনি <xliff:g id="VPN_APP_0">%1$s</xliff:g> এবং <xliff:g id="VPN_APP_1">%2$s</xliff:g> এর সাথে সংযুক্ত রয়েছেন, যেগুলি আপনার ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপের উপর নজর রাখতে পারে।"</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"আপনার কর্মস্থলের প্রোফাইল <xliff:g id="VPN_APP">%1$s</xliff:g> এর সাথে সংযুক্ত রয়েছে, যেটি ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপে নজর রাখতে পারে।"</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"আপনার ব্যক্তিগত প্রোফাইল <xliff:g id="VPN_APP">%1$s</xliff:g> এর সাথে সংযুক্ত রয়েছে, যেটি ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপে নজর রাখতে পারে৷"</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"আপনার ডিভাইসটি <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> এর দ্বারা পরিচালিত৷"</string>
@@ -569,12 +559,9 @@
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, এবং আরো <xliff:g id="NUMBER_5">%3$d</xliff:g>টি</item>
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, এবং আরো <xliff:g id="NUMBER_5">%3$d</xliff:g>টি</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> খোলা থাকলে বিজ্ঞপ্তি নিয়ন্ত্রণ"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> বন্ধ থাকলে বিজ্ঞপ্তি নিয়ন্ত্রণ"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"এই চ্যানেল থেকে বিজ্ঞপ্তি আসতে দেয়"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"সকল বিভাগ"</string>
<string name="notification_more_settings" msgid="816306283396553571">"আরো সেটিংস"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"কাস্টমাইজ করুন: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> বিজ্ঞপ্তি: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"অ্যাপ্লিকেশানটি বিভক্ত স্ক্রীনে কাজ নাও করতে পারে৷"</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"অ্যাপ্লিকেশান বিভক্ত-স্ক্রীন সমর্থন করে না৷"</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"সেকেন্ডারি ডিসপ্লেতে অ্যাপটি কাজ নাও করতে পারে।"</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"সেকেন্ডারি ডিসপ্লেতে অ্যাপ লঞ্চ করা যাবে না।"</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"সেটিংস খুলুন।"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"দ্রুত সেটিংস খুলুন৷"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"দ্রুত সেটিংস বন্ধ করুন৷"</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"পিকচার ইন পিকচার মেনু"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"ছবির-মধ্যে-ছবি তে <xliff:g id="NAME">%s</xliff:g> আছেন"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> কে এই বৈশিষ্ট্যটি ব্যবহার করতে দিতে না চাইলে ট্যাপ করে সেটিংসে গিয়ে সেটি বন্ধ করে দিন।"</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"চালান"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"বিরাম দিন"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"এগিয়ে যাওয়ার জন্য এড়িয়ে যান"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"পিছনে যাওয়ার জন্য এড়িয়ে যান"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"আপনার ফোন গরম হওয়ার জন্য বন্ধ হয়ে গেছে"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"আপনার ফোন এখন ঠিক-ঠাক চলছে"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"আপনার ফোন খুব বেশি গরম হয়েছিল বলে ঠান্ডা হওয়ার জন্য বন্ধ হয়ে গেছে। আপনার ফোন ঠিক-ঠাক ভাবে চলছে না।\n\nআপনার ফোন খুব বেশি গরম হয়ে যাবে যদি আপনি:\n •এমন অ্যাপ ব্যবহার করলে যেটি আপনার ডিভাইসের রিসোর্স বেশি ব্যবহার করে (যেমন গেমিং, ভিডিও বা নেভিগেশন অ্যাপ)\n • বড় ফাইল ডাউনলোড বা আপলোড করলে\n • বেশি তাপমাত্রায় আপনার ফোন ব্যবহার করলে"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"ঝটপট অ্যাপ"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ঝটপট অ্যাপ ইনস্টল করার প্রয়োজন হয় না।"</string>
<string name="app_info" msgid="6856026610594615344">"অ্যাপ্লিকেশানের তথ্য"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"ওয়েবে যান"</string>
<string name="mobile_data" msgid="7094582042819250762">"মোবাইল ডেটা"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"ওয়াই ফাই বন্ধ আছে"</string>
<string name="bt_is_off" msgid="2640685272289706392">"ব্লুটুথ বন্ধ আছে"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 01e2006..58328a6 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -158,6 +158,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobilni podaci su isključeni"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Dijeljenje Bluetooth veze."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Način rada u avionu."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN uključen"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Nema SIM kartice."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Promjena mreže operatera."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Otvori detalje o potrošnji baterije"</string>
@@ -350,7 +351,7 @@
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Do kraja punjenja preostalo <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
<string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"Ne puni se"</string>
<string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Mreža može \n biti nadzirana"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Traži"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"Pretraživanje"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Povucite gore za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Povucite lijevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_priority_introduction" msgid="3070506961866919502">"Zvukovi i vibracije vas neće uznemiravati, osim alarma, podsjetnika, događaja i pozivalaca koje odredite."</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Radni profil je povezan s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Lični profil je povezan s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Uređaj je povezan s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Upravljanje uređajem"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Praćenje profila"</string>
<string name="monitoring_title" msgid="169206259253048106">"Praćenje mreže"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN mreža"</string>
@@ -439,18 +439,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Isključi VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Prekini VPN vezu"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Prikaži pravila"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Vašim uređajem upravlja organizacija <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nVaš administrator može nadgledati i upravljati vašim postavkama, korporativnom pristupu, aplikacijama, podacima koji su povezani s vašim uređajem i informacijama o lokaciji vašeg uređaja.\n\nZa više informacija, obratite se svom administratoru."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Vašim uređajem upravlja vaša organizacija.\n\nVaš administrator može nadgledati i upravljati vašim postavkama, korporativnom pristupu, aplikacijama, podacima koji su povezani s vašim uređajem i informacijama o lokaciji vašeg uređaja.\n\nZa više informacija, obratite se svom administratoru."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Vaša organizacija je instalirala CA certifikat na ovom uređaju. Vaš promet preko sigurne mreže može se pratiti."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Vaša organizacija je instalirala CA certifikat na vašem radnom profilu. Vaš promet preko sigurne mreže može se pratiti."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"CA certifikat je instaliran na ovom uređaju. Vaš promet preko sigurne mreže može se pratiti."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Vaš administrator je uključio zapisivanje na mreži, čime se prati promet na vašem uređaju."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Povezani ste s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g> koja može pratiti vašu aktivnost na mreži, uključujući e-poštu i web lokacije."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Povezani ste s aplikacijama <xliff:g id="VPN_APP_0">%1$s</xliff:g> i <xliff:g id="VPN_APP_1">%2$s</xliff:g> koje mogu pratiti vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web lokacije."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Vaš radni profil je povezan s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>, koja može pratiti vašu aktivnost na mreži, uključujući e-poruke i web lokacije."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Vaš lični profil je povezan s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>, koja može pratiti vašu aktivnost na mreži, uključujući e-poruke, aplikacije i web lokacije."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Vašim uređajem upravlja aplikacija <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -484,7 +480,7 @@
<string name="screen_pinning_title" msgid="3273740381976175811">"Ekran je prikačen"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Ekran ostaje prikazan ovako dok ga ne otkačite. Da ga otkačite, dodirnite i držite dugme Nazad."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ekran ostaje prikazan ovako dok ga ne otkačite. Da ga otkačite, dodirnite i držite dugme Pregled."</string>
- <string name="screen_pinning_positive" msgid="3783985798366751226">"Jasno mi je"</string>
+ <string name="screen_pinning_positive" msgid="3783985798366751226">"Razumijem"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Ne, hvala"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Želite li sakriti <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Pojavit će se sljedeći put kada opciju uključite u postavkama."</string>
@@ -533,7 +529,7 @@
<string name="tuner_warning_title" msgid="7094689930793031682">"Zabava za neke, ali ne za sve"</string>
<string name="tuner_warning" msgid="8730648121973575701">"Podešavač za korisničko sučelje sistema vam omogućava dodatne načine da podesite i prilagodite Androidovo sučelje. Ove eksperimentalne funkcije se u budućim verzijama mogu mijenjati, kvariti ili nestati. Budite oprezni."</string>
<string name="tuner_persistent_warning" msgid="8597333795565621795">"Ove eksperimentalne funkcije se u budućim verzijama mogu mijenjati, kvariti ili nestati. Budite oprezni."</string>
- <string name="got_it" msgid="2239653834387972602">"Jasno mi je"</string>
+ <string name="got_it" msgid="2239653834387972602">"Razumijem"</string>
<string name="tuner_toast" msgid="603429811084428439">"Čestitamo! Podešavač za korisničko sučelje sistema je dodan u Postavke"</string>
<string name="remove_from_settings" msgid="8389591916603406378">"Ukloni iz Postavki"</string>
<string name="remove_from_settings_prompt" msgid="6069085993355887748">"Želite li ukloniti Podešavač za korisničko sučelje sistema iz Postavki i prestati koristiti sve njegove funkcije?"</string>
@@ -619,7 +615,7 @@
<string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"Nedavni ekrani"</string>
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Nazad"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Obavještenja"</string>
- <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Skracenice tastature"</string>
+ <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Prečice tastature"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Promijeni način unosa"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplikacije"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Pomoć"</string>
@@ -643,7 +639,7 @@
<string name="accessibility_data_saver_on" msgid="8454111686783887148">"Ušteda podataka je uključena"</string>
<string name="accessibility_data_saver_off" msgid="8841582529453005337">"Ušteda podataka je isključena"</string>
<string name="switch_bar_on" msgid="1142437840752794229">"Uključeno"</string>
- <string name="switch_bar_off" msgid="8803270596930432874">"Isključi"</string>
+ <string name="switch_bar_off" msgid="8803270596930432874">"Isključeno"</string>
<string name="nav_bar" msgid="1993221402773877607">"Navigaciona traka"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Raspored"</string>
<string name="left_nav_bar_button_type" msgid="8555981238887546528">"Dodatni tip dugmeta lijevo"</string>
@@ -663,7 +659,7 @@
</string-array>
<string name="menu_ime" msgid="4998010205321292416">"Prebacivač tastatura"</string>
<string name="save" msgid="2311877285724540644">"Sačuvaj"</string>
- <string name="reset" msgid="2448168080964209908">"Ponovno pokretanje"</string>
+ <string name="reset" msgid="2448168080964209908">"Vrati na zadano"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Podesite širinu dugmeta"</string>
<string name="clipboard" msgid="1313879395099896312">"Međumemorija"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Prilagođeno dugme za navigaciju"</string>
@@ -709,6 +705,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> obavještenje: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Aplikacija možda neće raditi na podijeljenom ekranu"</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Aplikacija ne podržava dijeljenje ekrana."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Aplikacija možda neće raditi na sekundarnom ekranu."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Aplikacija ne podržava pokretanje na sekundarnim ekranima."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Otvori postavke."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Otvoriti brze postavke."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Zatvoriti brze postavke."</string>
@@ -753,13 +751,12 @@
<string name="tuner_app" msgid="3507057938640108777">"Aplikacija <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Upozorenja"</string>
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Snimci ekrana"</string>
- <string name="notification_channel_general" msgid="4525309436693914482">"Općenite poruke"</string>
+ <string name="notification_channel_general" msgid="4525309436693914482">"Opće poruke"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Pohrana"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant-aplikacije"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Za instant aplikacije nije potrebna instalacija"</string>
<string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Idite na internet"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobilni podaci"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi veza je isključena"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth je isključen"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 1b89d25..ba729c1 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Dades mòbils desactivades"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Compartició de xarxa per Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Mode d\'avió."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN activada"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"No hi ha cap targeta SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"S\'està canviant la xarxa de l\'operador de telefonia mòbil."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Obre la informació detallada de la bateria"</string>
@@ -197,7 +198,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"El Mode d\'avió està activat."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"S\'ha desactivat el Mode d\'avió."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"S\'ha activat el Mode d\'avió."</string>
- <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"El mode No molestis està activat (només amb prioritat)."</string>
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Mode No molestis activat (només amb prioritat)."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"El mode No molestis està activat; silenci total."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"El mode No molestis està activat (només alarmes)."</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Mode No molestis."</string>
@@ -272,7 +273,7 @@
<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> dispositius)"</string>
<string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth desactivat"</string>
- <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"No hi ha dispositius vinculats disponibles."</string>
+ <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"No hi ha dispositius vinculats disponibles"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brillantor"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Gira automàticament"</string>
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Gira la pantalla automàticament"</string>
@@ -351,9 +352,9 @@
<string name="description_target_search" msgid="3091587249776033139">"Cerca"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Llisca cap amunt per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Llisca cap a l\'esquerra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="3070506961866919502">"No t\'interromprà cap so ni cap vibració, tret dels que produeixin les alarmes, els recordatoris, els esdeveniments i les trucades de les persones que especifiquis."</string>
+ <string name="zen_priority_introduction" msgid="3070506961866919502">"No t\'interromprà cap so ni cap vibració, tret dels sons de les alarmes, recordatoris, esdeveniments i trucades de les persones que especifiquis."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalitza"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Es bloquejaran TOTS els sons i totes les vibracions, inclosos els de vídeos, jocs, alarmes i música. Tot i això, encara podràs fer trucades."</string>
+ <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Es bloquejaran TOTS els sons i totes les vibracions, inclosos els de vídeos, jocs, alarmes i música. Encara podràs fer trucades."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Es bloquejaran TOTS els sons i totes les vibracions, inclosos els de vídeos, jocs, alarmes i música."</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">"Notificacions menys urgents a continuació"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"El perfil professional està connectat a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"El perfil professional està connectat a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"El dispositiu està connectat a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Gestió del dispositiu"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Supervisió del perfil"</string>
<string name="monitoring_title" msgid="169206259253048106">"Supervisió de la xarxa"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Desactiva la VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Desconnecta la VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Consulta les polítiques"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> gestiona el dispositiu.\n\nL\'administrador pot supervisar i gestionar la configuració, l\'accés corporatiu, les aplicacions, les dades associades al dispositiu, inclosa la informació d\'ubicació.\n\nPer obtenir més informació, contacta amb l\'administrador."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"La teva organització gestiona el dispositiu.\n\nL\'administrador pot supervisar i gestionar la configuració, l\'accés corporatiu, les aplicacions, les dades associades al dispositiu, inclosa la informació d\'ubicació.\n\nPer obtenir més informació, contacta amb l\'administrador."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"La teva organització ha instal·lat una autoritat de certificació en aquest dispositiu. És possible que el trànsit a la xarxa segura se supervisi o es modifiqui."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"La teva organització ha instal·lat una autoritat de certificació al teu perfil professional. És possible que el trànsit de xarxa segura se supervisi o es modifiqui."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"S\'ha instal·lat una autoritat de certificació en aquest dispositiu. És possible que el trànsit de xarxa segura se supervisi o es modifiqui."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"L\'administrador ha activat el registre de xarxa, que supervisa el trànsit del teu dispositiu."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Estàs connectat a <xliff:g id="VPN_APP">%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_two_named_vpns" msgid="4198511413729213802">"Estàs connectat a <xliff:g id="VPN_APP_0">%1$s</xliff:g> i <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que poden supervisar la teva activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"El teu perfil professional està connectat a <xliff:g id="VPN_APP">%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_personal_profile_named_vpn" msgid="3133980926929069283">"El teu perfil personal està connectat a <xliff:g id="VPN_APP">%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_do_header_generic" msgid="96588491028288691">"<xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> gestiona el teu dispositiu."</string>
@@ -563,8 +559,8 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> i <xliff:g id="NUMBER_5">%3$d</xliff:g> més</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> i <xliff:g id="NUMBER_2">%3$d</xliff:g> més</item>
</plurals>
- <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"S\'han obert els controls de notificació de: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"S\'han tancat els controls de notificació de: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"S\'han obert els controls de notificació per a <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"S\'han tancat els controls de notificació per a <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Permet les notificacions d\'aquest canal"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"Totes les categories"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Més opcions"</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Notificació de <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"És possible que l\'aplicació no funcioni amb la pantalla dividida."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"L\'aplicació no admet la pantalla dividida."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Pot ser que l\'aplicació no funcioni en una pantalla secundària."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"L\'aplicació no es pot obrir en pantalles secundàries."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Obre la configuració."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Obre la configuració ràpida."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Tanca la configuració ràpida."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Aplicacions instantànies"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"No cal instal·lar les aplicacions instantànies."</string>
<string name="app_info" msgid="6856026610594615344">"Informació de l\'aplicació"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Vés al web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Dades mòbils"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"La Wi-Fi està desactivada"</string>
<string name="bt_is_off" msgid="2640685272289706392">"El Bluetooth està desactivat"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index d87dedc..acb51b3 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -159,6 +159,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobilní data jsou vypnuta"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Sdílené připojení přes Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Režim Letadlo."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN je zapnuto."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Není vložena SIM karta"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Probíhá změna sítě operátora."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Otevřít podrobnosti o baterii"</string>
@@ -433,8 +434,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Pracovní profil je připojen k aplikaci <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Osobní profil je připojen k aplikaci <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Zařízení je připojeno k aplikaci <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Správa zařízení"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitoring profilu"</string>
<string name="monitoring_title" msgid="169206259253048106">"Sledování sítě"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +443,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Deaktivovat VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Odpojit VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Zobrazit zásady"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Toto zařízení spravuje organizace <xliff:g id="ORGANIZATION_NAME">%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\nDalší informace vám poskytne administrátor."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Zařízení spravuje vaše organizace.\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\nDalší informace vám poskytne administrátor."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Organizace do tohoto zařízení nainstalovala certifikační autoritu. Zabezpečený síťový provoz může být sledován nebo upravován."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Organizace do vašeho pracovního profilu nainstalovala certifikační autoritu. Zabezpečený síťový provoz může být sledován nebo upravován."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"V zařízení je nainstalována certifikační autorita. Zabezpečený síťový provoz může být sledován nebo upravován."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Administrátor zapnul protokolování sítě, které monitoruje síťový provoz v zařízení."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Jste připojeni k aplikaci <xliff:g id="VPN_APP">%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_two_named_vpns" msgid="4198511413729213802">"Jste připojeni k aplikacím <xliff:g id="VPN_APP_0">%1$s</xliff:g> a <xliff:g id="VPN_APP_1">%2$s</xliff:g>, které mohou sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Váš pracovní profil je připojen k aplikaci <xliff:g id="VPN_APP">%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_personal_profile_named_vpn" msgid="3133980926929069283">"Váš osobní profil je připojen k aplikaci <xliff:g id="VPN_APP">%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_do_header_generic" msgid="96588491028288691">"Vaše zařízení je spravováno aplikací <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -713,6 +709,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Oznámení aplikace <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Aplikace v režimu rozdělené obrazovky nemusí fungovat."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Aplikace nepodporuje režim rozdělené obrazovky."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Aplikace na sekundárním displeji nemusí fungovat."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Aplikace nepodporuje spuštění na sekundárních displejích."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Otevřít nastavení."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Otevřít rychlé nastavení."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Zavřít rychlé nastavení."</string>
@@ -762,8 +760,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Okamžité aplikace"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Okamžité aplikace není třeba instalovat."</string>
<string name="app_info" msgid="6856026610594615344">"Informace o aplikaci"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Přejít na web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobilní data"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi je vypnuta"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth je vypnuto"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 774a25d..49d930f 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -152,14 +152,12 @@
<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">"Intet SIM-kort."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"Mobildata"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Mobildata er aktiveret"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobildata er deaktiveret"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-netdeling."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Flytilstand."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN er slået til."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Der er ikke noget SIM-kort."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Mobilnetværket skiftes."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Åbn oplysninger om batteri"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Oplader"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G-data er sat på pause"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-data er sat på pause"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Mobildata er sat på pause"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Data er sat på pause"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Din angivne datagrænse er nået, og du bruger ikke længere mobildata.\n\nHvis du fortsætter, bliver du muligvis opkrævet betaling for dit dataforbrug."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Genoptag"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Ingen internetforb."</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi er forbundet"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Underretninger"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lommelygte"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobildata"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Dataforbrug"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Resterende data"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Over grænsen"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Arbejdsprofilen er forbundet til <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Den personlige profil er forbundet til <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Enheden er forbundet til <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Administration af enheder"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profilovervågning"</string>
<string name="monitoring_title" msgid="169206259253048106">"Overvågning af netværk"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Deaktiver VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Afbryd VPN-forbindelse"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Se politikker"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Din enhed administreres af <xliff:g id="ORGANIZATION_NAME">%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 stedoplysninger.\n\nKontakt din administrator, hvis du vil have flere oplysninger."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Din enhed administreres af din organisation.\n\nDin administrator kan overvåge og administrere indstillinger, virksomhedsadgang, apps, data, der er knyttet til din enhed, og din enheds stedoplysninger.\n\nKontakt din administrator, hvis du vil have flere oplysninger."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Din organisation har installeret et nøglecenter på denne enhed. Din sikre netværkstrafik kan overvåges eller ændres."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Din organisation har installeret et nøglecenter på din arbejdsprofil. Din sikre netværkstrafik kan overvåges eller ændres."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Der er installeret et nøglecenter på denne enhed. Din sikre netværkstrafik kan overvåges eller ændres."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Din administrator har aktiveret netværksregistrering, som overvåger trafik på din enhed."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Du har forbindelse til <xliff:g id="VPN_APP">%1$s</xliff:g>, som kan overvåge din netværksaktivitet, bl.a. mails, apps og websites."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Du har forbindelse til <xliff:g id="VPN_APP_0">%1$s</xliff:g> og <xliff:g id="VPN_APP_1">%2$s</xliff:g>, som kan overvåge din netværksaktivitet, bl.a. mails, apps og websites."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Din arbejdsprofil har forbindelse til <xliff:g id="VPN_APP">%1$s</xliff:g>, som kan overvåge din netværksaktivitet, bl.a. mails, apps og websites."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Din personlige profil har forbindelse til <xliff:g id="VPN_APP">%1$s</xliff:g>, som kan overvåge din netværksaktivitet, bl.a. mails, apps og websites."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Din enhed administreres af <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -569,12 +559,9 @@
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> og <xliff:g id="NUMBER_5">%3$d</xliff:g> anden</item>
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> og <xliff:g id="NUMBER_5">%3$d</xliff:g> andre</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Styring af underretninger for <xliff:g id="APP_NAME">%1$s</xliff:g> blev åbnet"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"Styring af underretninger for <xliff:g id="APP_NAME">%1$s</xliff:g> blev lukket"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Tillad underretninger fra denne kanal"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"Alle kategorier"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Flere indstillinger"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"Tilpas: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g>-underretning: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Appen fungerer muligvis ikke i delt skærm."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Appen understøtter ikke delt skærm."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Appen fungerer muligvis ikke på en sekundær skærm."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Appen kan ikke åbnes på en sekundær skærm."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Åbn Indstillinger."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Åbn Hurtige indstillinger."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Luk Hurtige indstillinger."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"Billede i billede-menu"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> vises i billede i billede"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Hvis du ikke ønsker, at <xliff:g id="NAME">%s</xliff:g> skal benytte denne funktion, kan du åbne indstillingerne og deaktivere den."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"Afspil"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"Sæt på pause"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"Gå videre til næste"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"Gå til forrige"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"Telefonen slukkede pga. varme"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"Din telefon kører nu normalt"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"Din telefon var blevet for varm, så den slukkede for at køle ned. Din telefon kører nu igen normalt. \n\nDin telefon kan blive for varm, hvis du:\n • Bruger ressourcekrævende apps (f.eks. spil, video eller navigation)\n • Downloader eller uploader store filer\n • Bruger din telefon i varme omgivelser"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant apps kræver ingen installation."</string>
<string name="app_info" msgid="6856026610594615344">"Oplysninger om appen"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Gå til website"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobildata"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi er slået fra"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth er slået fra"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 8b9b407..614a818 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobile Datennutzung deaktiviert"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-Tethering"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Flugmodus"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN an."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Keine SIM-Karte"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Netzwerk des Mobilfunkanbieters wird gewechselt"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Akkudetails öffnen"</string>
@@ -299,7 +300,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"WLAN aus"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"WLAN an"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Keine WLAN-Netzwerke verfügbar"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Übertragen"</string>
+ <string name="quick_settings_cast_title" msgid="7709016546426454729">"Streamen"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Wird übertragen"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unbenanntes Gerät"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Startklar"</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Arbeitsprofil verbunden mit <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Das persönliche Profil ist mit <xliff:g id="VPN_APP">%1$s</xliff:g> verbunden"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Das Gerät ist mit <xliff:g id="VPN_APP">%1$s</xliff:g> verbunden"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Geräteverwaltung"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profilüberwachung"</string>
<string name="monitoring_title" msgid="169206259253048106">"Netzwerküberwachung"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -439,18 +439,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN deaktivieren"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN-Verbindung trennen"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Richtlinien ansehen"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Dein Gerät wird von <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> verwaltet.\n\nDein Administrator kann Einstellungen, Zugriffsrechte auf Unternehmensinhalte, Apps und Daten deines Geräts sowie dessen Standortinformationen überwachen und verwalten.\n\nWeitere Informationen erhältst du von deinem Administrator."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Dein Gerät wird von deiner Organisation verwaltet.\n\nDein Administrator kann Einstellungen, Zugriffsrechte auf Unternehmensinhalte, Apps und Daten deines Geräts sowie dessen Standortinformationen überwachen und verwalten.\n\nWeitere Informationen erhältst du von deinem Administrator."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Deine Organisation hat ein Zertifikat einer Zertifizierungsstelle auf deinem Gerät installiert. Eventuell wird dein sicherer Netzwerkverkehr überwacht oder bearbeitet."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Deine Organisation hat ein Zertifikat einer Zertifizierungsstelle in deinem Arbeitsprofil installiert. Eventuell wird dein sicherer Netzwerkverkehr überwacht oder bearbeitet."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Auf dem Gerät ist das Zertifikat einer Zertifizierungsstelle installiert. Eventuell wird dein sicherer Netzwerkverkehr überwacht oder bearbeitet."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Dein Administrator hat die Netzwerkprotokollierung aktiviert. Damit wird der Netzwerkverkehr auf deinem Gerät überwacht."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Du bist mit <xliff:g id="VPN_APP">%1$s</xliff:g> verbunden. Die App kann deine Netzwerkaktivitäten (E-Mails, Apps und Websites) erfassen."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Du bist mit <xliff:g id="VPN_APP_0">%1$s</xliff:g> und <xliff:g id="VPN_APP_1">%2$s</xliff:g> verbunden. Die Apps können deine Netzwerkaktivitäten (E-Mails, Apps und Websites) erfassen."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Dein Arbeitsprofil ist mit <xliff:g id="VPN_APP">%1$s</xliff:g> verbunden, die deine Netzwerkaktivitäten wie E-Mails, Apps und Websites überwachen kann."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Dein persönliches Profil ist mit <xliff:g id="VPN_APP">%1$s</xliff:g> verbunden, die deine Netzwerkaktivitäten wie E-Mails, Apps und Websites überwachen kann."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Dein Gerät wird von <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> verwaltet."</string>
@@ -627,9 +623,9 @@
<string name="keyboard_shortcut_group_applications_youtube" msgid="6555453761294723317">"YouTube"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="9043614299194991263">"Kalender"</string>
<string name="tuner_full_zen_title" msgid="4540823317772234308">"Einschließlich Lautstärkeregler anzeigen"</string>
- <string name="volume_and_do_not_disturb" msgid="3373784330208603030">"Bitte nicht stören"</string>
+ <string name="volume_and_do_not_disturb" msgid="3373784330208603030">"Nicht stören"</string>
<string name="volume_dnd_silent" msgid="4363882330723050727">"Tastenkombination für Lautstärketasten"</string>
- <string name="volume_up_silent" msgid="7141255269783588286">"\"Bitte nicht stören\" bei \"Lauter\" deaktivieren"</string>
+ <string name="volume_up_silent" msgid="7141255269783588286">"\"Nicht stören\" bei \"Lauter\" deaktivieren"</string>
<string name="battery" msgid="7498329822413202973">"Akku"</string>
<string name="clock" msgid="7416090374234785905">"Uhr"</string>
<string name="headset" msgid="4534219457597457353">"Headset"</string>
@@ -705,6 +701,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Benachrichtigung von <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Die App funktioniert unter Umständen bei geteiltem Bildschirm nicht."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Das Teilen des Bildschirms wird in dieser App nicht unterstützt."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Die App funktioniert auf einem sekundären Display möglicherweise nicht."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Die App unterstützt den Start auf sekundären Displays nicht."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Einstellungen öffnen."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Schnelleinstellungen öffnen."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Schnelleinstellungen schließen."</string>
@@ -754,8 +752,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant-Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Bei Instant-Apps ist keine vorherige Installation erforderlich."</string>
<string name="app_info" msgid="6856026610594615344">"App-Informationen"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Web aufrufen"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobile Daten"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"WLAN ist deaktiviert"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth ist deaktiviert"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index dcabbc2..717feb2 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Τα δεδομένα κινητής τηλεφωνίας απενεργοποιήθηκαν"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Πρόσδεση Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Λειτουργία πτήσης."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN ενεργό."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Δεν υπάρχει κάρτα SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Αλλαγή δικτύου εταιρείας κινητής τηλεφωνίας."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Άνοιγμα λεπτομερειών μπαταρίας"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Το προφίλ εργασίας είναι συνδεδεμένο με το <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Το προσωπικό προφίλ έχει συνδεθεί στην εφαρμογή <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Η συσκευή έχει συνδεθεί στην εφαρμογή <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Διαχείριση συσκευών"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Παρακολούθηση προφίλ"</string>
<string name="monitoring_title" msgid="169206259253048106">"Παρακολούθηση δικτύου"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Απενεργοποίηση VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Αποσύνδεση VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Προβολή πολιτικών"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Η διαχείριση της συσκευής σας γίνεται από <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nΟ διαχειριστής μπορεί να παρακολουθεί και να διαχειρίζεται ρυθμίσεις, εταιρική πρόσβαση, εφαρμογές και δεδομένα που σχετίζονται με τη συσκευή, καθώς και τις πληροφορίες τοποθεσίας.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή σας."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Η διαχείριση της συσκευής σας γίνεται από τον οργανισμό σας.\n\nΟ διαχειριστής μπορεί να παρακολουθεί και να διαχειρίζεται ρυθμίσεις, εταιρική πρόσβαση, εφαρμογές και δεδομένα που σχετίζονται με τη συσκευή, καθώς και τις πληροφορίες τοποθεσίας.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή σας."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Ο οργανισμός σας εγκατέστησε μια αρχή έκδοσης πιστοποιητικών σε αυτήν τη συσκευή. Η ασφαλής επισκεψιμότητα δικτύου σας μπορεί να παρακολουθείται ή να τροποποιείται."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Ο οργανισμός σας εγκατέστησε μια αρχή έκδοσης πιστοποιητικών στο προφίλ εργασίας σας. Η ασφαλής επισκεψιμότητα δικτύου σας μπορεί να παρακολουθείται ή να τροποποιείται."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Μια αρχή έκδοσης πιστοποιητικών έχει εγκατασταθεί σε αυτήν τη συσκευή. Η ασφαλής επισκεψιμότητα δικτύου σας μπορεί να παρακολουθείται ή να τροποποιείται."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Ο διαχειριστής σας ενεργοποίησε την καταγραφή δικτύου, η οποία παρακολουθεί την επισκεψιμότητα στη συσκευή σας."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Έχετε συνδεθεί στην εφαρμογή <xliff:g id="VPN_APP">%1$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Έχετε συνδεθεί στις εφαρμογές <xliff:g id="VPN_APP_0">%1$s</xliff:g> και <xliff:g id="VPN_APP_1">%2$s</xliff:g>, οι οποίες μπορούν να παρακολουθούν τη δραστηριότητα του δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Το προφίλ εργασίας σας είναι συνδεδεμένο στο <xliff:g id="VPN_APP">%1$s</xliff:g>, το οποίο μπορεί να παρακολουθεί τη δραστηριότητα δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Το προσωπικό προφίλ σας είναι συνδεμένο στην εφαρμογή <xliff:g id="VPN_APP">%1$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Η διαχείριση της συσκευής σας γίνεται από <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -470,7 +466,7 @@
<string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Έχετε συνδεθεί στην εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του προσωπικού σας δικτύου, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων."</string>
<string name="monitoring_description_app_work" msgid="4612997849787922906">"Ο οργανισμός <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="5664165460056859391">"Ο οργανισμός <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="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Η συσκευή θα παραμείνει κλειδωμένη έως ότου την ξεκλειδώσετε μη αυτόματα"</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>
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Όχι"</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Ειδοποίηση <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Δεν είναι δυνατή η λειτουργία της εφαρμογής με διαχωρισμό οθόνης."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Η εφαρμογή δεν υποστηρίζει διαχωρισμό οθόνης."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Η εφαρμογή μπορεί να λειτουργεί σε μια δευτερεύουσα οθόνη."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Η εφαρμογή δεν υποστηρίζει την εκκίνηση σε δευτερεύουσες οθόνες."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Άνοιγμα ρυθμίσεων."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Άνοιγμα γρήγορων ρυθμίσεων."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Κλείσιμο γρήγορων ρυθμίσεων."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant Εφαρμογές"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Οι Instant Εφαρμογές δεν απαιτούν εγκατάσταση."</string>
<string name="app_info" msgid="6856026610594615344">"Πληροφορίες εφαρμογής"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Μετάβαση στον ιστό"</string>
<string name="mobile_data" msgid="7094582042819250762">"Δεδομένα κινητής τηλεφωνίας"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Το Wi-Fi είναι ανενεργό"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Το Bluetooth είναι ανενεργό"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index d8216bf..8b5e60f 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobile data off"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth tethering"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Aeroplane mode"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN on."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"No SIM card."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Carrier network changing."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Open battery details"</string>
@@ -329,7 +330,7 @@
<string name="recents_empty_message" msgid="808480104164008572">"No recent items"</string>
<string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"You\'ve cleared everything"</string>
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Application Info"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"screen-pinning"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"screen pinning"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"search"</string>
<string name="recents_launch_error_message" msgid="2969287838120550506">"Could not start <xliff:g id="APP">%s</xliff:g>."</string>
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Work profile connected to <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Personal profile connected to <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Device connected to <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Device management"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profile monitoring"</string>
<string name="monitoring_title" msgid="169206259253048106">"Network monitoring"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Disable VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Disconnect VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"View Policies"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Your device is managed by <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nFor more information, contact your admin."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Your device is managed by your organisation.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nFor more information, contact your admin."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Your organisation installed a certificate authority on this device. Your secure network traffic may be monitored or modified."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Your organisation installed a certificate authority in your work profile. Your secure network traffic may be monitored or modified."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"A certificate authority is installed on this device. Your secure network traffic may be monitored or modified."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Your admin has turned on network logging, which monitors traffic on your device."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"You\'re connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"You\'re connected to <xliff:g id="VPN_APP_0">%1$s</xliff:g> and <xliff:g id="VPN_APP_1">%2$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Your work profile is connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Your personal profile is connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Your device is managed by <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -529,7 +525,7 @@
<string name="tuner_warning_title" msgid="7094689930793031682">"Fun for some but not for all"</string>
<string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner gives you extra ways to tweak and customise the Android user interface. These experimental features may change, break or disappear in future releases. Proceed with caution."</string>
<string name="tuner_persistent_warning" msgid="8597333795565621795">"These experimental features may change, break or disappear in future releases. Proceed with caution."</string>
- <string name="got_it" msgid="2239653834387972602">"Understood"</string>
+ <string name="got_it" msgid="2239653834387972602">"Got it"</string>
<string name="tuner_toast" msgid="603429811084428439">"Congrats! System UI Tuner has been added to Settings"</string>
<string name="remove_from_settings" msgid="8389591916603406378">"Remove from settings"</string>
<string name="remove_from_settings_prompt" msgid="6069085993355887748">"Remove System UI Tuner from Settings and stop using all of its features?"</string>
@@ -613,7 +609,7 @@
<string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"Recent"</string>
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Back"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notifications"</string>
- <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Keyboard Shortcuts"</string>
+ <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Keyboard shortcuts"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Switch input method"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Applications"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assist"</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> notification: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"App may not work with split-screen."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"App does not support split-screen."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"App may not work on a secondary display."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"App does not support launch on secondary displays."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Open settings."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Open quick settings."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Close quick settings."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant apps don\'t require installation."</string>
<string name="app_info" msgid="6856026610594615344">"App info"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Go to web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobile data"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi is off"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth is off"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index d8216bf..8b5e60f 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobile data off"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth tethering"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Aeroplane mode"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN on."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"No SIM card."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Carrier network changing."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Open battery details"</string>
@@ -329,7 +330,7 @@
<string name="recents_empty_message" msgid="808480104164008572">"No recent items"</string>
<string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"You\'ve cleared everything"</string>
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Application Info"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"screen-pinning"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"screen pinning"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"search"</string>
<string name="recents_launch_error_message" msgid="2969287838120550506">"Could not start <xliff:g id="APP">%s</xliff:g>."</string>
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Work profile connected to <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Personal profile connected to <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Device connected to <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Device management"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profile monitoring"</string>
<string name="monitoring_title" msgid="169206259253048106">"Network monitoring"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Disable VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Disconnect VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"View Policies"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Your device is managed by <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nFor more information, contact your admin."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Your device is managed by your organisation.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nFor more information, contact your admin."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Your organisation installed a certificate authority on this device. Your secure network traffic may be monitored or modified."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Your organisation installed a certificate authority in your work profile. Your secure network traffic may be monitored or modified."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"A certificate authority is installed on this device. Your secure network traffic may be monitored or modified."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Your admin has turned on network logging, which monitors traffic on your device."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"You\'re connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"You\'re connected to <xliff:g id="VPN_APP_0">%1$s</xliff:g> and <xliff:g id="VPN_APP_1">%2$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Your work profile is connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Your personal profile is connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Your device is managed by <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -529,7 +525,7 @@
<string name="tuner_warning_title" msgid="7094689930793031682">"Fun for some but not for all"</string>
<string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner gives you extra ways to tweak and customise the Android user interface. These experimental features may change, break or disappear in future releases. Proceed with caution."</string>
<string name="tuner_persistent_warning" msgid="8597333795565621795">"These experimental features may change, break or disappear in future releases. Proceed with caution."</string>
- <string name="got_it" msgid="2239653834387972602">"Understood"</string>
+ <string name="got_it" msgid="2239653834387972602">"Got it"</string>
<string name="tuner_toast" msgid="603429811084428439">"Congrats! System UI Tuner has been added to Settings"</string>
<string name="remove_from_settings" msgid="8389591916603406378">"Remove from settings"</string>
<string name="remove_from_settings_prompt" msgid="6069085993355887748">"Remove System UI Tuner from Settings and stop using all of its features?"</string>
@@ -613,7 +609,7 @@
<string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"Recent"</string>
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Back"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notifications"</string>
- <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Keyboard Shortcuts"</string>
+ <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Keyboard shortcuts"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Switch input method"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Applications"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assist"</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> notification: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"App may not work with split-screen."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"App does not support split-screen."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"App may not work on a secondary display."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"App does not support launch on secondary displays."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Open settings."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Open quick settings."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Close quick settings."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant apps don\'t require installation."</string>
<string name="app_info" msgid="6856026610594615344">"App info"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Go to web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobile data"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi is off"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth is off"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index d8216bf..8b5e60f 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobile data off"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth tethering"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Aeroplane mode"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN on."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"No SIM card."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Carrier network changing."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Open battery details"</string>
@@ -329,7 +330,7 @@
<string name="recents_empty_message" msgid="808480104164008572">"No recent items"</string>
<string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"You\'ve cleared everything"</string>
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Application Info"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"screen-pinning"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"screen pinning"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"search"</string>
<string name="recents_launch_error_message" msgid="2969287838120550506">"Could not start <xliff:g id="APP">%s</xliff:g>."</string>
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Work profile connected to <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Personal profile connected to <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Device connected to <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Device management"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profile monitoring"</string>
<string name="monitoring_title" msgid="169206259253048106">"Network monitoring"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Disable VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Disconnect VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"View Policies"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Your device is managed by <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nFor more information, contact your admin."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Your device is managed by your organisation.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nFor more information, contact your admin."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Your organisation installed a certificate authority on this device. Your secure network traffic may be monitored or modified."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Your organisation installed a certificate authority in your work profile. Your secure network traffic may be monitored or modified."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"A certificate authority is installed on this device. Your secure network traffic may be monitored or modified."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Your admin has turned on network logging, which monitors traffic on your device."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"You\'re connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"You\'re connected to <xliff:g id="VPN_APP_0">%1$s</xliff:g> and <xliff:g id="VPN_APP_1">%2$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Your work profile is connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Your personal profile is connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Your device is managed by <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -529,7 +525,7 @@
<string name="tuner_warning_title" msgid="7094689930793031682">"Fun for some but not for all"</string>
<string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner gives you extra ways to tweak and customise the Android user interface. These experimental features may change, break or disappear in future releases. Proceed with caution."</string>
<string name="tuner_persistent_warning" msgid="8597333795565621795">"These experimental features may change, break or disappear in future releases. Proceed with caution."</string>
- <string name="got_it" msgid="2239653834387972602">"Understood"</string>
+ <string name="got_it" msgid="2239653834387972602">"Got it"</string>
<string name="tuner_toast" msgid="603429811084428439">"Congrats! System UI Tuner has been added to Settings"</string>
<string name="remove_from_settings" msgid="8389591916603406378">"Remove from settings"</string>
<string name="remove_from_settings_prompt" msgid="6069085993355887748">"Remove System UI Tuner from Settings and stop using all of its features?"</string>
@@ -613,7 +609,7 @@
<string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"Recent"</string>
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Back"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notifications"</string>
- <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Keyboard Shortcuts"</string>
+ <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Keyboard shortcuts"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Switch input method"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Applications"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assist"</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> notification: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"App may not work with split-screen."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"App does not support split-screen."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"App may not work on a secondary display."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"App does not support launch on secondary displays."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Open settings."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Open quick settings."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Close quick settings."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant apps don\'t require installation."</string>
<string name="app_info" msgid="6856026610594615344">"App info"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Go to web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobile data"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi is off"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth is off"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 4be584f..4af6840 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Desactivar datos móviles"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Conexión mediante Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Modo avión"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN activada"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Sin tarjeta SIM"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Cambio de proveedor de red"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Abrir detalles de la batería"</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Perfil de trabajo conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Perfil personal conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Dispositivo conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Administración del dispositivo"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Supervisión del perfil"</string>
<string name="monitoring_title" msgid="169206259253048106">"Supervisión de red"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -439,18 +439,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Inhabilitar VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Desconectar VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Ver políticas"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> administra tu dispositivo.\n\nTu administrador puede controlar y administrar la configuración, el acceso corporativo, las apps, los datos asociados a tu dispositivo y la información de ubicación.\n\nPara obtener más información, comunícate con tu administrador."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Tu organización administra tu dispositivo.\n\nTu administrador puede controlar y administrar la configuración, el acceso corporativo, las apps, los datos asociados a tu dispositivo y la información de ubicación.\n\nPara obtener más información, comunícate con tu administrador."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Tu organización instaló una autoridad de certificación en este dispositivo. Es posible que se controle o modifique el tráfico de tu red segura."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Tu organización instaló una autoridad de certificación en tu perfil de trabajo. Es posible que se controle o modifique el tráfico de tu red segura."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Hay una autoridad de certificación instalada en este dispositivo. Es posible que se controle o modifique el tráfico de tu red segura."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Tu administrador activó el registro de red, que supervisa el tráfico en tu dispositivo."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Estás conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que puede controlar la actividad de tu red, incluidos los correos electrónicos, las apps y los sitios web."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Estás conectado a <xliff:g id="VPN_APP_0">%1$s</xliff:g> y <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que pueden controlar tu actividad de red, incluidos los correos electrónicos, las apps y los sitios web."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Tu perfil de trabajo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que puede controlar tu actividad de red, incluidos los correos electrónicos, las apps y los sitios web."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Tu perfil personal está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que puede controlar tu actividad de red, incluidos los correos electrónicos, las apps y los sitios web."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"<xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> administra tu dispositivo."</string>
@@ -627,9 +623,9 @@
<string name="keyboard_shortcut_group_applications_youtube" msgid="6555453761294723317">"YouTube"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="9043614299194991263">"Calendario"</string>
<string name="tuner_full_zen_title" msgid="4540823317772234308">"Mostrar con controles de volumen"</string>
- <string name="volume_and_do_not_disturb" msgid="3373784330208603030">"No interrumpir"</string>
+ <string name="volume_and_do_not_disturb" msgid="3373784330208603030">"No molestar"</string>
<string name="volume_dnd_silent" msgid="4363882330723050727">"Combinación de teclas de botones de volumen"</string>
- <string name="volume_up_silent" msgid="7141255269783588286">"Desactivar el modo No interrumpir al subir el volumen"</string>
+ <string name="volume_up_silent" msgid="7141255269783588286">"Desactivar el modo No molestar al subir el volumen"</string>
<string name="battery" msgid="7498329822413202973">"Batería"</string>
<string name="clock" msgid="7416090374234785905">"Reloj"</string>
<string name="headset" msgid="4534219457597457353">"Auriculares"</string>
@@ -667,7 +663,7 @@
<string name="right_keycode" msgid="708447961000848163">"Clave de código derecho"</string>
<string name="left_icon" msgid="3096287125959387541">"Ícono izquierdo"</string>
<string name="right_icon" msgid="3952104823293824311">"Ícono derecho"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"Arrastra los mosaicos para agregarlos"</string>
+ <string name="drag_to_add_tiles" msgid="7058945779098711293">"Arrastra los íconos para agregarlos"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Arrastra aquí para quitar"</string>
<string name="qs_edit" msgid="2232596095725105230">"Editar"</string>
<string name="tuner_time" msgid="6572217313285536011">"Hora"</string>
@@ -705,6 +701,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Notificación de <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Es posible que la app no funcione en el modo de pantalla dividida."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"La app no es compatible con la función de pantalla dividida."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Es posible que la app no funcione en una pantalla secundaria."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"La app no puede iniciarse en pantallas secundarias."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Abrir Configuración"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Abrir la configuración rápida"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Cerrar configuración rápida"</string>
@@ -753,16 +751,15 @@
<string name="notification_channel_storage" msgid="3077205683020695313">"Almacenamiento"</string>
<string name="instant_apps" msgid="6647570248119804907">"Apps instantáneas"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Las Apps instantáneas no requieren instalación."</string>
- <string name="app_info" msgid="6856026610594615344">"Información de la app"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="app_info" msgid="6856026610594615344">"Información de apps"</string>
+ <string name="go_to_web" msgid="1106022723459948514">"Ir a la Web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Datos móviles"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi desactivado"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth desactivado"</string>
- <string name="dnd_is_off" msgid="6167780215212497572">"No interrumpir desactivado"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="862559028345233052">"Una regla automática (<xliff:g id="ID_1">%s</xliff:g>) activó el modo No interrumpir."</string>
- <string name="qs_dnd_prompt_app" msgid="7978037419334156034">"Una app (<xliff:g id="ID_1">%s</xliff:g>) activó el modo No interrumpir."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="2599343675391111951">"Una app o regla automática activó el modo No interrumpir."</string>
+ <string name="dnd_is_off" msgid="6167780215212497572">"No molestar desactivado"</string>
+ <string name="qs_dnd_prompt_auto_rule" msgid="862559028345233052">"Se activó el modo No molestar con una regla automática (<xliff:g id="ID_1">%s</xliff:g>)."</string>
+ <string name="qs_dnd_prompt_app" msgid="7978037419334156034">"Se activó el modo No molestar con una app (<xliff:g id="ID_1">%s</xliff:g>)."</string>
+ <string name="qs_dnd_prompt_auto_rule_app" msgid="2599343675391111951">"Se activó el modo No molestar con una app o regla automática."</string>
<string name="qs_dnd_until" msgid="3469471136280079874">"Hasta la(s) <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Mantener"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Reemplazar"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 030af0f..e64f037 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -134,8 +134,8 @@
<string name="accessibility_two_bars" msgid="6437363648385206679">"Dos barras"</string>
<string name="accessibility_three_bars" msgid="2648241415119396648">"Tres barras"</string>
<string name="accessibility_signal_full" msgid="9122922886519676839">"Señal al máximo"</string>
- <string name="accessibility_desc_on" msgid="2385254693624345265">"Sí"</string>
- <string name="accessibility_desc_off" msgid="6475508157786853157">"No"</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"Activado"</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"Desactivado"</string>
<string name="accessibility_desc_connected" msgid="8366256693719499665">"Conectado"</string>
<string name="accessibility_desc_connecting" msgid="3812924520316280149">"Conectando."</string>
<string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Datos móviles desactivados"</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_vpn_on" msgid="5993385083262856059">"La red VPN está activada."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"No hay tarjeta SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Cambiando red de operador."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Abrir detalles de la batería"</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Perfil de trabajo conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Perfil personal conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Dispositivo conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Administración de dispositivos"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Supervisión del perfil"</string>
<string name="monitoring_title" msgid="169206259253048106">"Supervisión de red"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -439,18 +439,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Inhabilitar VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Desconectar VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Ver políticas"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"El dispositivo está administrado por <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nEl administrador puede supervisar y gestionar los ajustes, el acceso corporativo, las aplicaciones, los datos asociados a este dispositivo y su información de ubicación.\n\nPara obtener más información, ponte en contacto con el administrador."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"El dispositivo está administrado por tu organización.\n\nEl administrador puede supervisar y gestionar los ajustes, el acceso corporativo, las aplicaciones, los datos asociados a este dispositivo y su información de ubicación.\n\nPara obtener más información, ponte en contacto con el administrador."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Tu organización ha instalado una entidad de certificación en este dispositivo. Es posible que se supervise o se modifique tu tráfico de red seguro."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Tu organización ha instalado una entidad de certificación en tu perfil de trabajo. Es posible que se supervise o se modifique tu tráfico de red seguro."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Se ha instalado una entidad de certificación en este dispositivo. Es posible que se supervise o se modifique tu tráfico de red seguro."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"El administrador ha activado el registro de la red para supervisar el tráfico en tu dispositivo."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Te has conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que puede supervisar tu actividad de red, como los correos electrónicos, las aplicaciones y los sitios web."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Te has conectado a <xliff:g id="VPN_APP_0">%1$s</xliff:g> y <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que pueden supervisar tu actividad de red, como los correos electrónicos, las aplicaciones y los sitios web."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Tu perfil de trabajo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que puede supervisar tu actividad de red, como los correos electrónicos, las aplicaciones y los sitios web."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Tu perfil personal está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que puede supervisar tu actividad de red, como los correos electrónicos, las aplicaciones y los sitios web."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Tu dispositivo está administrado por <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -549,8 +545,8 @@
<string name="do_not_silence" msgid="6878060322594892441">"No silenciar"</string>
<string name="do_not_silence_block" msgid="4070647971382232311">"No silenciar ni bloquear"</string>
<string name="tuner_full_importance_settings" msgid="3207312268609236827">"Controles de energía de las notificaciones"</string>
- <string name="tuner_full_importance_settings_on" msgid="7545060756610299966">"Sí"</string>
- <string name="tuner_full_importance_settings_off" msgid="8208165412614935229">"No"</string>
+ <string name="tuner_full_importance_settings_on" msgid="7545060756610299966">"Activado"</string>
+ <string name="tuner_full_importance_settings_off" msgid="8208165412614935229">"Desactivado"</string>
<string name="power_notification_controls_description" msgid="4372459941671353358">"Los controles de energía de las notificaciones permiten establecer un nivel de importancia de 0 a 5 para las notificaciones de las aplicaciones. \n\n"<b>"Nivel 5"</b>" \n- Mostrar en la parte superior de la lista de notificaciones \n- Permitir interrumpir en el modo de pantalla completa \n- Mostrar siempre \n\n"<b>"Nivel 4"</b>" \n- Evitar interrumpir en el modo de pantalla completa \n- Mostrar siempre \n\n"<b>"Nivel 3"</b>" \n- Evitar interrumpir en el modo de pantalla completa \n- No mostrar nunca \n\n"<b>"Nivel 2"</b>" \n- Evitar interrumpir en el modo de pantalla completa\n- No mostrar nunca \n- No emitir sonido ni vibrar nunca \n\n"<b>"Nivel 1"</b>" \n- Evitar interrumpir en el modo de pantalla completa \n- No mostrar nunca \n- No emitir sonido ni vibrar nunca \n- Ocultar de la pantalla de bloqueo y de la barra de estado \n- Mostrar en la parte inferior de la lista de notificaciones \n\n"<b>"Nivel 0"</b>" \n- Bloquear todas las notificaciones de la aplicación"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notificaciones"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"Ya no recibirás estas notificaciones."</string>
@@ -638,8 +634,8 @@
<string name="data_saver" msgid="5037565123367048522">"Ahorro de datos"</string>
<string name="accessibility_data_saver_on" msgid="8454111686783887148">"Ahorro de datos activado"</string>
<string name="accessibility_data_saver_off" msgid="8841582529453005337">"Ahorro de datos desactivado"</string>
- <string name="switch_bar_on" msgid="1142437840752794229">"Sí"</string>
- <string name="switch_bar_off" msgid="8803270596930432874">"No"</string>
+ <string name="switch_bar_on" msgid="1142437840752794229">"Activado"</string>
+ <string name="switch_bar_off" msgid="8803270596930432874">"Desactivado"</string>
<string name="nav_bar" msgid="1993221402773877607">"Barra de navegación"</string>
<string name="nav_bar_layout" msgid="3664072994198772020">"Diseño"</string>
<string name="left_nav_bar_button_type" msgid="8555981238887546528">"Tipo de botón a la izquierda extra"</string>
@@ -705,6 +701,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Notificación de <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Es posible que la aplicación no funcione con la pantalla dividida."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"La aplicación no admite la pantalla dividida."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Es posible que la aplicación no funcione en una pantalla secundaria."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"La aplicación no se puede iniciar en pantallas secundarias."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Abrir ajustes."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Abrir ajustes rápidos."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Cerrar ajustes rápidos."</string>
@@ -729,7 +727,7 @@
<string name="pip_skip_to_prev" msgid="1955311326688637914">"Volver al anterior"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"Teléfono apagado por calor"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"El teléfono ahora funciona con normalidad"</string>
- <string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"El teléfono se había calentado demasiado y se ha apagado para enfriarlo. Ahora funciona con normalidad.\n\nPuede calentarse demasiado si:\n • Usas aplicaciones que consumen muchos recursos (p. ej., apps de juegos, vídeos o navegación)\n • Descargas o subes archivos grandes\n • Lo usas a altas temperaturas"</string>
+ <string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"El teléfono se había calentado demasiado y se ha apagado para enfriarse. Ahora funciona con normalidad.\n\nPuede calentarse demasiado si:\n • Usas aplicaciones que consumen muchos recursos (p. ej., apps de juegos, vídeos o navegación)\n • Descargas o subes archivos grandes\n • Lo usas a altas temperaturas"</string>
<string name="high_temp_title" msgid="4589508026407318374">"El teléfono se está calentando"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Se limitan algunas funciones mientras el teléfono se enfría"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"El teléfono intentará enfriarse. Puedes seguir utilizándolo, pero es posible que funcione con mayor lentitud.\n\nUna vez que se haya enfriado, funcionará con normalidad."</string>
@@ -754,8 +752,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Aplicaciones Instantáneas"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"No es necesario instalar las Aplicaciones Instantáneas."</string>
<string name="app_info" msgid="6856026610594615344">"Información de la aplicación"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Ir a la Web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Datos móviles"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi desactivado"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth desactivado"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 250525e..23b4f31 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobiilne andmeside on väljas"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetoothi jagamine."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Lennurežiim."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN on sees."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM-kaarti pole."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Operaatori võrku muudetakse."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Aku üksikasjade avamine"</string>
@@ -195,10 +196,10 @@
<string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"WiFi on sisse lülitatud."</string>
<string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobiili <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Aku: <xliff:g id="STATE">%s</xliff:g>."</string>
- <string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"Lennukirežiim on väljas."</string>
- <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Lennukirežiim on sees."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Lennukirežiim on välja lülitatud."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Lennukirežiim on sisse lülitatud."</string>
+ <string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"Lennurežiim on väljas."</string>
+ <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Lennurežiim on sees."</string>
+ <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Lennurežiim on välja lülitatud."</string>
+ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Lennurežiim on sisse lülitatud."</string>
<string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Funktsioon Mitte segada on sisse lülitatud (ainult prioriteetsed)."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Funktsioon Mitte segada on sisse lülitatud, täielik vaikus."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Funktsioon Mitte segada on sisse lülitatud (ainult alarmid)."</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Tööprofiil on ühendatud rakendusega <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Isiklik profiil on ühendatud rakendusega <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Seade on ühendatud rakendusega <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Seadmehaldus"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profiili jälgimine"</string>
<string name="monitoring_title" msgid="169206259253048106">"Võrgu jälgimine"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -439,18 +439,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Keela VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Katkesta VPN-i ühendus"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Kuva eeskirjad"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Teie seadet haldab organisatsioon <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nAdministraator saab jälgida ning hallata seadeid, ettevõttesisest juurdepääsu, rakendusi, seadmega seotud andmeid ja seadme asukohateavet.\n\nLisateabe saamiseks võtke ühendust administraatoriga."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Teie seadet haldab teie organisatsioon.\n\nAdministraator saab jälgida ning hallata seadeid, ettevõttesisest juurdepääsu, rakendusi, seadmega seotud andmeid ja seadme asukohateavet.\n\nLisateabe saamiseks võtke ühendust administraatoriga."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Teie organisatsioon installis sellesse seadmesse sertifikaadi volituse. Teie turvalist võrguliiklust võidakse jälgida ja muuta."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Teie organisatsioon installis teie tööprofiilile sertifikaadi volituse. Teie turvalist võrguliiklust võidakse jälgida ja muuta."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Sertifikaadi volitus on sellesse seadmesse installitud. Teie turvalist võrguliiklust võidakse jälgida ja muuta."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Teie administraator lülitas sisse võrgu logimise funktsiooni, mis jälgib teie seadmes liiklust."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Teil on ühendus rakendusega <xliff:g id="VPN_APP">%1$s</xliff:g>, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Teil on ühendus rakendustega <xliff:g id="VPN_APP_0">%1$s</xliff:g> ja <xliff:g id="VPN_APP_1">%2$s</xliff:g>, mis saavad jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Teie tööprofiil on ühendatud rakendusega <xliff:g id="VPN_APP">%1$s</xliff:g>, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Teie isiklik profiil on ühendatud rakendusega <xliff:g id="VPN_APP">%1$s</xliff:g>, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Teie seadet haldab rakendus <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -518,7 +514,7 @@
<string name="status_bar_ethernet" msgid="5044290963549500128">"Ethernet"</string>
<string name="status_bar_alarm" msgid="8536256753575881818">"Äratus"</string>
<string name="status_bar_work" msgid="6022553324802866373">"Tööprofiil"</string>
- <string name="status_bar_airplane" msgid="7057575501472249002">"Lennukirežiim"</string>
+ <string name="status_bar_airplane" msgid="7057575501472249002">"Lennurežiim"</string>
<string name="add_tile" msgid="2995389510240786221">"Paani lisamine"</string>
<string name="broadcast_tile" msgid="3894036511763289383">"Paani ülekandmine"</string>
<string name="zen_alarm_warning_indef" msgid="3482966345578319605">"Kuulete järgmist äratust kell <xliff:g id="WHEN">%1$s</xliff:g> vaid siis, kui lülitate selle enne seda välja"</string>
@@ -705,6 +701,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Teenuse <xliff:g id="ID_1">%1$s</xliff:g> märguanne: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Rakendus ei pruugi poolitatud ekraaniga töötada."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Rakendus ei toeta jagatud ekraani."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Rakendus ei pruugi teisesel ekraanil töötada."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Rakendus ei toeta teisestel ekraanidel käivitamist."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Ava seaded."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Ava kiirseaded."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Sule kiirseaded."</string>
@@ -754,8 +752,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Installimata avatavad rakendused"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Installimata avatavaid rakendusi pole vaja installida."</string>
<string name="app_info" msgid="6856026610594615344">"Rakenduse teave"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Avage veebis"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobiilne andmeside"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"WiFi on välja lülitatud"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth on välja lülitatud"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 2adbd72..e96f718 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Datu mugikorrak desaktibatuta"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Konexioa partekatzea (Bluetooth)"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Hegaldi-modua"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN eginbidea aktibatuta."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Ez dago SIM txartelik."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Operadorearen sarea aldatzea."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Ireki bateriaren xehetasunak"</string>
@@ -299,7 +300,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi konexioa desaktibatuta"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Aktibatuta dago Wi-Fi konexioa"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Ez dago Wi-Fi sarerik erabilgarri"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Igorpena"</string>
+ <string name="quick_settings_cast_title" msgid="7709016546426454729">"Igorri"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Igortzen"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Izenik gabeko gailua"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Igortzeko prest"</string>
@@ -403,7 +404,7 @@
<string name="user_remove_user_title" msgid="4681256956076895559">"Erabiltzailea kendu nahi duzu?"</string>
<string name="user_remove_user_message" msgid="1453218013959498039">"Erabiltzailearen aplikazio eta datu guztiak ezabatuko dira."</string>
<string name="user_remove_user_remove" msgid="7479275741742178297">"Kendu"</string>
- <string name="battery_saver_notification_title" msgid="237918726750955859">"Bateria aurrezlea aktibatuta dago"</string>
+ <string name="battery_saver_notification_title" msgid="237918726750955859">"Bateria-aurrezlea aktibatuta dago"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Errendimendua eta atzeko planoko datuak murrizten ditu"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Desaktibatu bateria aurrezteko aukera"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> aplikazioak pantailan bistaratzen den guztia grabatuko du."</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"<xliff:g id="VPN_APP">%1$s</xliff:g> aplikaziora dago konektatuta laneko profila"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"<xliff:g id="VPN_APP">%1$s</xliff:g> aplikaziora konektatuta dago profil pertsonala"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"<xliff:g id="VPN_APP">%1$s</xliff:g> aplikaziora konektatuta dago gailua"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Gailuaren kudeaketa"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profila kontrolatzeko aukera"</string>
<string name="monitoring_title" msgid="169206259253048106">"Sareen kontrola"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -439,18 +439,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Desgaitu VPN konexioa"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Deskonektatu VPN sarea"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Ikusi gidalerroak"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> erakundeak kudeatzen dizu gailua.\n\nAdministratzaileak gainbegiratu eta kudea ditzake ezarpenak, enpresa-sarbidea, aplikazioak, gailuarekin erlazionatutako datuak eta gailuaren kokapen-informazioa.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Erakundeak kudeatzen dizu gailua.\n\nAdministratzaileak gainbegiratu eta kudea ditzake ezarpenak, enpresa-sarbidea, aplikazioak, gailuarekin erlazionatutako datuak eta gailuaren kokapen-informazioa.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Erakundeak ziurtagiri-emaile bat instalatu du gailuan. Baliteke sareko trafiko segurua gainbegiratzea edo aldatzea."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Erakundeak ziurtagiri-emaile bat instalatu dizu laneko profilean. Baliteke sareko trafiko segurua gainbegiratzea edo aldatzea."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Ziurtagiri-emaile bat dago instalatuta gailuan. Baliteke sareko trafiko segurua gainbegiratzea edo aldatzea."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Administratzaileak sare-erregistroak aktibatu ditu; horrela, zure gailuko trafikoa gainbegira dezake."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"<xliff:g id="VPN_APP">%1$s</xliff:g> aplikaziora konektatuta zaude eta hark sareko jarduerak gainbegira ditzake, mezu elektronikoak, aplikazioak eta webguneak barne."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"<xliff:g id="VPN_APP_0">%1$s</xliff:g> eta <xliff:g id="VPN_APP_1">%2$s</xliff:g> aplikazioetara konektatuta zaude, eta haiek sareko jarduerak gainbegira ditzakete, mezu elektronikoak, aplikazioak eta webguneak barne."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"<xliff:g id="VPN_APP">%1$s</xliff:g> aplikaziora dago konektatuta laneko profila, eta aplikazio horrek sareko jarduerak gainbegira ditzake, mezu elektronikoak, aplikazioak eta webguneak barne."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"<xliff:g id="VPN_APP">%1$s</xliff:g> aplikaziora konektatuta duzu profil pertsonala, eta aplikazio horrek sareko jarduerak gainbegira ditzake, mezu elektronikoak, aplikazioak eta webguneak barne."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"<xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> aplikazioak kudeatzen du gailu hau."</string>
@@ -705,6 +701,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> zerbitzuaren jakinarazpena: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Baliteke aplikazioak ez funtzionatzea pantaila zatituan."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Aplikazioak ez du onartzen pantaila zatitua"</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Baliteke aplikazioak ez funtzionatzea bigarren mailako pantailan."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Aplikazioak ez du onartzen bigarren mailako pantailarik."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Ireki ezarpenak."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Ireki ezarpen bizkorrak."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Itxi ezarpen bizkorrak."</string>
@@ -754,8 +752,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Zuzeneko aplikazioak"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Zuzeneko aplikazioak ez dira instalatu behar."</string>
<string name="app_info" msgid="6856026610594615344">"Aplikazioari buruzko informazioa"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Joan sarera"</string>
<string name="mobile_data" msgid="7094582042819250762">"Datu mugikorrak"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi konexioa desaktibatuta dago"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth konexioa desaktibatuta dago"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index e464690..8cbf67d 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -152,14 +152,12 @@
<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">"بدون سیم کارت."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"داده تلفن همراه"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"داده تلفن همراه روشن"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"داده تلفن همراه خاموش"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"اتصال اینترنت با بلوتوث تلفن همراه."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"حالت هواپیما."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN روشن است."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"سیمکارتی موجود نیست."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"تغییر شبکه شرکت مخابراتی."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"باز کردن جزئیات باتری"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"درحال شارژ شدن"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"داده 2G-3G موقتاً متوقف شده است"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"داده 4G موقتاً متوقف شده است"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"داده تلفن همراه موقتاً متوقف شده است"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"داده موقتاً متوقف شده است"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"مصرف داده شما به محدودیت دادهای که تنظیم کردید رسیده است. دیگر از داده تلفن همراه استفاده نمیکنید.\n\n درصورت ازسرگیری، ممکن است هزینههای مصرف داده اعمال شود."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"از سرگیری"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"اتصال اینترنتی ندارید"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi متصل شد"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"نقطه اتصال"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"اعلانها"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"چراغ قوه"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"داده تلفن همراه"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"مصرف داده"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"دادههای باقیمانده"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"بیش از حد مجاز"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"نمایه کاری به <xliff:g id="VPN_APP">%1$s</xliff:g> متصل شده است"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"نمایه شخصی به <xliff:g id="VPN_APP">%1$s</xliff:g> متصل شده است"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"دستگاه به <xliff:g id="VPN_APP">%1$s</xliff:g> متصل شده است"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"مدیریت دستگاه"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"کنترل نمایه"</string>
<string name="monitoring_title" msgid="169206259253048106">"کنترل شبکه"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"غیرفعال کردن VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"قطع اتصال VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"مشاهده خطمشیها"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"دستگاه شما تحت مدیریت <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> است.\n\nسرپرست سیستم شما میتواند تنظیمات، دسترسی شرکتی، برنامهها، دادههای مرتبط با دستگاه شما و اطلاعات مکان دستگاهتان را پایش و مدیریت کند.\n\nبرای اطلاعات بیشتر، با سرپرست سیستم تماس بگیرید."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"دستگاه شما تحت مدیریت سازمان شما است.\n\nسرپرست سیستم شما میتواند تنظیمات، دسترسی شرکتی، برنامهها، دادههای مرتبط با دستگاه شما و اطلاعات مکان دستگاهتان را پایش و مدیریت کند.\n\nبرای اطلاعات بیشتر، با سرپرست سیستم تماس بگیرید."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"سازمان شما مرجع گواهینامهای در این دستگاه نصب کرده است. ممکن است ترافیک امن شبکه شما پایش یا تغییر داده شود."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"سازمان شما مرجع گواهینامهای در نمایه کاری شما نصب کرده است. ممکن است ترافیک امن شبکه شما پایش یا تغییر داده شود."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"مرجع گواهینامهای در این دستگاه نصب شده است. ممکن است ترافیک امن شبکه شما پایش یا تغییر داده شود."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"سرپرست سیستم شما گزارشگیری از شبکه را (که ترافیک دستگاه شما را پایش میکند) روشن کرده است."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"به <xliff:g id="VPN_APP">%1$s</xliff:g> متصل شدهاید، که میتواند فعالیت شبکه شما را (ازجمله رایانامهها، برنامهها و وبسایتها) پایش کند."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"به <xliff:g id="VPN_APP_0">%1$s</xliff:g> و <xliff:g id="VPN_APP_1">%2$s</xliff:g> متصل شدهاید، که میتوانند فعالیت شما را در شبکه (ازجمله رایانامهها، برنامهها و وبسایتها) پایش کنند."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"نمایه کاری شما به <xliff:g id="VPN_APP">%1$s</xliff:g> متصل است، که میتواند فعالیت شما در شبکه (ازجمله رایانامهها، برنامهها و وبسایتها) را پایش کند."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"نمایه شخصی شما به <xliff:g id="VPN_APP">%1$s</xliff:g> متصل شده است، که میتواند فعالیت شما در شبکه (ازجمله رایانامهها، برنامهها و وبسایتها) را پایش کند."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"<xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> دستگاه شما را مدیریت میکند."</string>
@@ -569,12 +559,9 @@
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>، <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> و <xliff:g id="NUMBER_5">%3$d</xliff:g> مورد دیگر</item>
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>، <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> و <xliff:g id="NUMBER_5">%3$d</xliff:g> مورد دیگر</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"کنترلهای اعلان برای <xliff:g id="APP_NAME">%1$s</xliff:g> باز شد"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"کنترلهای اعلان برای <xliff:g id="APP_NAME">%1$s</xliff:g> بسته شد"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"مجاز کردن اعلانهای این کانال"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"همه دستهها"</string>
<string name="notification_more_settings" msgid="816306283396553571">"تنظیمات بیشتر"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"سفارشی کردن: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"اعلان <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"ممکن است برنامه با تقسیم صفحه کار نکند."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"برنامه از تقسیم صفحه پشتیبانی نمیکند."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"ممکن است برنامه در نمایشگر ثانویه کار نکند."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"برنامه از راهاندازی در نمایشگرهای ثانویه پشتیبانی نمیکند."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"باز کردن تنظیمات."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"باز کردن تنظیمات سریع."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"بستن تنظیمات سریع."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"منوی تصویر در تصویر"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> درحالت تصویر در تصویر است"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"اگر نمیخواهید <xliff:g id="NAME">%s</xliff:g> از این قابلیت استفاده کند، با ضربه زدن، تنظیمات را باز کنید و قابلیت را خاموش کنید."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"پخش"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"توقف موقت"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"رد شدن به بعدی"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"رد شدن به قبلی"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"تلفن به علت گرم شدن خاموش شد"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"اکنون تلفنتان عملکرد معمولش را دارد"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"تلفنتان خیلی گرم شده بود، بنابراین خاموش شد تا خنک شود. اکنون تلفنتان عملکرد معمولش را دارد.\n\nتلفنتان خیلی گرم میشود، اگر:\n • از برنامههای نیازمند پردازش زیاد (مانند بازی، برنامههای ویدیویی یا پیمایشی) استفاده کنید\n • فایلهای بزرگ بارگیری یا بارگذاری کنید\n • در دماهای بالا از تلفنتان استفاده کنید"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"برنامههای فوری"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"برنامههای فوری نیاز به نصب ندارند."</string>
<string name="app_info" msgid="6856026610594615344">"اطلاعات برنامه"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"رفتن به وب"</string>
<string name="mobile_data" msgid="7094582042819250762">"داده تلفن همراه"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi خاموش است"</string>
<string name="bt_is_off" msgid="2640685272289706392">"بلوتوث خاموش است"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 9be1b9a..4764fbe 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobiilidata poissa käytöstä"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Internetin jakaminen Bluetoothin kautta."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Lentokonetila."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN päällä"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Ei SIM-korttia."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Operaattorin verkko muuttuu."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Avaa akun tiedot."</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Työprofiili on yhteydessä sovellukseen <xliff:g id="VPN_APP">%1$s</xliff:g>."</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Henkilökohtainen profiili on yhteydessä sovellukseen <xliff:g id="VPN_APP">%1$s</xliff:g>."</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Laite on yhteydessä sovellukseen <xliff:g id="VPN_APP">%1$s</xliff:g>."</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Laitehallinta"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profiilin valvonta"</string>
<string name="monitoring_title" msgid="169206259253048106">"Verkon valvonta"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<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_button_view_policies" msgid="100913612638514424">"Näytä säännöt"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> hallinnoi tätä laitetta.\n\nJärjestelmänvalvoja voi valvoa ja hallinnoida asetuksiasi, yrityskäyttöä, sovelluksia, laitteeseesi yhdistettyjä tietoja sekä laitteesi sijaintitietoja.\n\nSaat lisätietoja järjestelmänvalvojalta."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Organisaatiosi hallinnoi tätä laitetta.\n\nJärjestelmänvalvoja voi valvoa ja hallinnoida asetuksiasi, yrityskäyttöä, sovelluksia, laitteeseesi yhdistettyjä tietoja sekä laitteesi sijaintitietoja.\n\nSaat lisätietoja järjestelmänvalvojalta."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Organisaatiosi asensi laitteeseen varmenteen myöntäjän. Suojattua verkkoliikennettäsi voidaan valvoa tai muuttaa."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Organisaatiosi lisäsi työprofiiliin varmenteen myöntäjän. Suojattua verkkoliikennettäsi voidaan valvoa tai muuttaa."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Laitteeseen on asennettu varmenteen myöntäjä. Suojattua verkkoliikennettäsi voidaan valvoa tai muuttaa."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Järjestelmänvalvoja on ottanut käyttöön verkkolokitietojen tallentamisen, joka valvoo laitteellasi tapahtuvaa liikennettä."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Olet yhteydessä sovellukseen <xliff:g id="VPN_APP">%1$s</xliff:g>, joka voi valvoa verkkotoimintaasi, esimerkiksi sähköposteja, sovelluksia ja verkkosivustoja."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Olet yhteydessä sovelluksiin <xliff:g id="VPN_APP_0">%1$s</xliff:g> ja <xliff:g id="VPN_APP_1">%2$s</xliff:g>, jotka voivat valvoa verkkotoimintaasi, esimerkiksi sähköposteja, sovelluksia ja verkkosivustoja."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Työprofiilisi on yhteydessä sovellukseen <xliff:g id="VPN_APP">%1$s</xliff:g>, joka voi valvoa toimintaasi verkossa, esimerkiksi sähköposteja, sovelluksia ja verkkosivustoja."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Henkilökohtainen profiilisi on yhteydessä sovellukseen <xliff:g id="VPN_APP">%1$s</xliff:g>, joka voi valvoa verkkotoimintaasi, esimerkiksi sähköposteja, sovelluksia ja verkkosivustoja."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Laitettasi hallinnoi <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Ilmoitus kohteesta <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Sovellus ei ehkä toimi jaetulla näytöllä."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Sovellus ei tue jaetun näytön tilaa."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Sovellus ei ehkä toimi toissijaisella näytöllä."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Sovellus ei tue käynnistämistä toissijaisilla näytöillä."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Avaa asetukset."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Avaa pika-asetukset."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Sulje pika-asetukset."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Pikasovelluksia ei tarvitse asentaa."</string>
<string name="app_info" msgid="6856026610594615344">"Sovelluksen tiedot"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Avaa verkossa"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobiilitiedonsiirto"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi on pois käytöstä"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth ei ole käytössä"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 794757a..b815012 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Données cellulaires désactivées"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Partage de connexion Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Mode Avion"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"RPV activé."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Aucune carte SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Modification du réseau du fournisseur de services"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Ouvrir les détails de la pile"</string>
@@ -194,7 +195,7 @@
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi désactivé"</string>
<string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"Wi-Fi activé."</string>
<string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Signal mobile : <xliff:g id="SIGNAL">%1$s</xliff:g>, <xliff:g id="TYPE">%2$s</xliff:g>, <xliff:g id="NETWORK">%3$s</xliff:g>"</string>
- <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batterie : <xliff:g id="STATE">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Pile : <xliff:g id="STATE">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"Mode Avion : désactivé"</string>
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Mode Avion : activé"</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Le mode Avion est désactivé."</string>
@@ -353,7 +354,7 @@
<string name="description_target_search" msgid="3091587249776033139">"Recherche"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Faire glisser le doigt vers le haut : <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
<string name="description_direction_left" msgid="7207478719805562165">"Faites glisser votre doigt vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="3070506961866919502">"Vous ne serez pas dérangé par les sonneries ni les vibrations, sauf pour les alarmes, les rappels, les événements et les appels des personnes que vous spécifiez."</string>
+ <string name="zen_priority_introduction" msgid="3070506961866919502">"Vous ne serez pas dérangé par les sonneries ni par les vibrations, sauf pour les alarmes, les rappels, les événements et les appels des personnes que vous spécifiez."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personnaliser"</string>
<string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Cette option permet de bloquer TOUS les sons et vibrations, y compris pour les alarmes, la musique, les vidéos et les jeux. Vous pourrez quand même faire des appels téléphoniques."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Cette option permet de bloquer TOUS les sons et vibrations, y compris pour les alarmes, la musique, les vidéos et les jeux."</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Profil professionnel connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Profil personnel connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Appareil connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Gestion d\'appareils"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Contrôle de profil"</string>
<string name="monitoring_title" msgid="169206259253048106">"Surveillance réseau"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"RPV"</string>
@@ -439,18 +439,14 @@
<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_button_view_policies" msgid="100913612638514424">"Afficher les politiques"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Votre appareil est géré par <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux données d\'entreprise, les applications, les données associées à l\'appareil et les renseignements sur sa localisation.\n\nPour plus d\'information, communiquez avec votre administrateur."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Votre appareil est géré par votre organisation.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux données d\'entreprise, les applications, les données associées à l\'appareil et les renseignements sur sa localisation.\n\nPour plus d\'information, communiquez avec votre administrateur."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Votre entreprise a installé une autorité de certification sur cet appareil. Votre trafic sur le réseau sécurisé peut être contrôlé ou modifié."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Votre entreprise a installé une autorité de certification dans votre profil professionnel. Votre trafic sur le réseau sécurisé peut être contrôlé ou modifié."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Une autorité de certification est installée sur cet appareil. Votre trafic sur le réseau sécurisé peut être contrôlé ou modifié."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Votre administrateur a activé la journalisation réseau, qui surveille le trafic sur votre appareil."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Vous êtes connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>, qui peut contrôler votre activité réseau, y compris les courriels, les applications et les sites Web."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Vous êtes connecté à <xliff:g id="VPN_APP_0">%1$s</xliff:g> et à <xliff:g id="VPN_APP_1">%2$s</xliff:g>, qui peuvent contrôler votre activité sur le réseau, y compris l\'activité relative aux courriels, aux applications et aux sites Web."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Votre profil professionnel est connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>, qui peut contrôler votre activité réseau, y compris les courriels, les applications et les sites Web."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Votre profil professionnel est connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>, qui peut contrôler votre activité réseau, y compris les courriels, les applications et les sites Web."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Votre appareil est géré par <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -705,6 +701,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Notification <xliff:g id="ID_1">%1$s</xliff:g> : <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Il est possible que l\'application ne fonctionne pas en mode Écran partagé."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"L\'application n\'est pas compatible avec l\'écran partagé."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Il est possible que l\'application ne fonctionne pas sur un écran secondaire."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"L\'application ne prend pas en charge le lancement sur les écrans secondaires."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Ouvrir les paramètres."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Ouvrir les réglages rapides."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Fermer les réglages rapides."</string>
@@ -754,8 +752,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Applications instantanées"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Les applications instantanées ne nécessitent pas d\'installation."</string>
<string name="app_info" msgid="6856026610594615344">"Détails de l\'application"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Accéder au Web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Données cellulaires"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Le Wi-Fi est désactivé"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Le Bluetooth est désactivé"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 57e057e..0dbe954 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Données mobiles désactivées"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Partage de connexion Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Mode Avion"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"Le VPN est activé."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Aucune carte SIM"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Modification du réseau de l\'opérateur"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Ouvrir les détails de la batterie"</string>
@@ -353,7 +354,7 @@
<string name="description_target_search" msgid="3091587249776033139">"Rechercher"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Faites glisser vers le haut pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Faites glisser vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="3070506961866919502">"Vous ne serez pas dérangé par les sonneries ni les vibrations, sauf pour les alarmes, les rappels, les événements et les appels des personnes que vous spécifiez."</string>
+ <string name="zen_priority_introduction" msgid="3070506961866919502">"Vous ne serez pas dérangé par les sonneries ni les vibrations, sauf pour les alarmes, les rappels, les événements et les appels des personnes que vous avez spécifiées."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personnaliser"</string>
<string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Cette option permet de bloquer TOUS les sons et les vibrations, y compris pour les alarmes, la musique, les vidéos et les jeux. Vous pourrez toujours passer des appels téléphoniques."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Cette option permet de bloquer TOUS les sons et les vibrations, y compris pour les alarmes, la musique, les vidéos et les jeux."</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Profil professionnel connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Profil personnel connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Appareil connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Gestion des appareils"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Contrôle du profil"</string>
<string name="monitoring_title" msgid="169206259253048106">"Contrôle du réseau"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -439,18 +439,14 @@
<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_button_view_policies" msgid="100913612638514424">"Afficher les règles"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Votre appareil est géré par <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux données d\'entreprise, les applications, les données associées à l\'appareil et les informations sur sa localisation.\n\nPour plus d\'informations, contactez votre administrateur."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Votre appareil est géré par votre organisation.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux données d\'entreprise, les applications, les données associées à l\'appareil et les informations sur sa localisation.\n\nPour plus d\'informations, contactez votre administrateur."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Votre entreprise a installé une autorité de certification sur cet appareil. Votre trafic sur le réseau sécurisé peut être contrôlé ou modifié."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Votre entreprise a installé une autorité de certification dans votre profil professionnel. Votre trafic sur le réseau sécurisé peut être contrôlé ou modifié."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Une autorité de certification est installée sur cet appareil. Votre trafic sur le réseau sécurisé peut être contrôlé ou modifié."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Votre administrateur a activé la journalisation du réseau, pour contrôler le trafic sur votre appareil."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Vous êtes connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>, qui peut contrôler votre activité sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Vous êtes connecté à <xliff:g id="VPN_APP_0">%1$s</xliff:g> et à <xliff:g id="VPN_APP_1">%2$s</xliff:g>, qui peuvent contrôler votre activité sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Votre profil professionnel est connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>, qui peut contrôler votre activité sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Votre profil personnel est connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>, qui peut contrôler votre activité sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Votre appareil est géré par <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -705,6 +701,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Notification <xliff:g id="ID_1">%1$s</xliff:g> : <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Il est possible que l\'application ne fonctionne pas en mode Écran partagé."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Application incompatible avec l\'écran partagé."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Il est possible que l\'application ne fonctionne pas sur un écran secondaire."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"L\'application ne peut être lancée sur des écrans secondaires."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Ouvrir les paramètres."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Ouvrir la fenêtre de configuration rapide."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Fermer la fenêtre de configuration rapide."</string>
@@ -754,8 +752,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Applis instantanées"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Les applis instantanées ne nécessitent pas d\'installation."</string>
<string name="app_info" msgid="6856026610594615344">"Infos sur l\'appli"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Accéder au site Web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Données mobiles"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi désactivé"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth désactivé"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index fda24b3..d7b24e2 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Os datos móbiles están desactivados"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Ancoraxe de Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Modo avión"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"A VPN está activada."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Non hai tarxeta SIM"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Cambio de rede do operador."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Abrir os detalles da batería"</string>
@@ -243,7 +244,7 @@
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Os datos 4G están en pausa"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Pausáronse os datos móbiles"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Os datos están en pausa"</string>
- <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Alcanzouse o límite de datos establecido. Xa non usarás os datos móbiles.\n\nSe continúas, pódense aplicar cargos polo uso de datos."</string>
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Alcanzouse o límite de datos que fixaches. Xa non estás usando datos móbiles.\n\nSe os reactivas, pódense aplicar cargos polo seu uso."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Retomar"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Sen Internet"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi conectada"</string>
@@ -276,7 +277,7 @@
<string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth desactivado"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"Non hai dispositivos sincronizados dispoñibles"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brillo"</string>
- <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotación automática"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Xirar automaticamente"</string>
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Xirar a pantalla automaticamente"</string>
<string name="accessibility_quick_settings_rotation_value" msgid="8187398200140760213">"Modo <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"Rotación bloqueada"</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"O perfil de traballo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"O perfil persoal está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"O dispositivo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Xestión de dispositivos"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Supervisión do perfil"</string>
<string name="monitoring_title" msgid="169206259253048106">"Supervisión de rede"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -439,18 +439,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Desactivar VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Desconectar VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Ver políticas"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"O teu dispositivo está xestionado por <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nO administrador pode controlar e xestionar a configuración, o acceso corporativo, as aplicacións, os datos asociados co dispositivo e a información de localización deste último.\n\nPara obter máis información, ponte en contacto co teu administrador."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"A túa organización xestiona o teu dispositivo.\n\nO administrador pode controlar e xestionar a configuración, o acceso corporativo, as aplicacións, os datos asociados co dispositivo e a información de localización deste último.\n\nPara obter máis información, ponte en contacto co teu administrador."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"A túa organización instalou unha autoridade de certificación neste dispositivo. É posible que se controle ou se modifique o teu tráfico de rede segura."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"A túa organización instalou unha autoridade de certificación no teu perfil de traballo. É posible que se controle ou se modifique o teu tráfico de rede segura."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Este dispositivo ten unha autoridade de certificación instalada. É posible que se controle ou se modifique o teu tráfico de rede segura."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"O administrador activou o rexistro na rede, que controla o tráfico do teu dispositivo."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Estás conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode controlar a túa actividade na rede, mesmo os correos electrónicos, as aplicacións e os sitios web."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Estás conectado a <xliff:g id="VPN_APP_0">%1$s</xliff:g> e a <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que poden controlar a túa actividade na rede, mesmo os correos electrónicos, as aplicacións e os sitios web."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"O teu perfil de traballo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode controlar a túa actividade na rede, mesmo os correos electrónicos, as aplicacións e os sitios web."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"O teu perfil persoal está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode controlar a túa actividade na rede, mesmo os correos electrónicos, as aplicacións e os sitios web."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"O teu dispositivo está xestionado por <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -705,6 +701,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Notificación de <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Pode que a aplicación non funcione coa pantalla dividida."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"A aplicación non é compatible coa función de pantalla dividida."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"É posible que a aplicación non funcione nunha pantalla secundaria."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"A aplicación non se pode iniciar en pantallas secundarias."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Abrir configuración."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Abrir a configuración rápida."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Pechar a configuración rápida."</string>
@@ -753,9 +751,8 @@
<string name="notification_channel_storage" msgid="3077205683020695313">"Almacenamento"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplicacións instantáneas"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"As aplicacións instantáneas non precisan instalación."</string>
- <string name="app_info" msgid="6856026610594615344">"Información da aplicación"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="app_info" msgid="6856026610594615344">"Información de aplicacións"</string>
+ <string name="go_to_web" msgid="1106022723459948514">"Acceder á web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Datos móbiles"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"A wifi está desactivada"</string>
<string name="bt_is_off" msgid="2640685272289706392">"O Bluetooth está desactivado"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 2cba93f9..aefc641 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -152,14 +152,12 @@
<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>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"મોબાઇલ ડેટા"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"મોબાઇલ ડેટા ચાલુ છે"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"મોબાઇલ ડેટા બંધ છે"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth ટિથરિંગ."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"એરપ્લેન મોડ."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN ચાલુ છે."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"કોઇ SIM કાર્ડ નથી."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"કેરીઅર નેટવર્કમાં ફેરફાર થઈ રહ્યો છે."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"બૅટરીની વિગતો ખોલો"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"ચાર્જ થઈ રહ્યું છે"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ડેટા થોભાવ્યો છે"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ડેટા થોભાવ્યો છે"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"મોબાઇલ ડેટા થોભાવ્યો છે"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"ડેટા થોભાવ્યો છે"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"તમે સેટ કરેલી ડેટા મર્યાદા પહોંચી ગઇ છે. તમે હવે મોબાઇલ ડેટાનો ઉપયોગ નથી કરી રહ્યાં.\n\nજો હવે તમે ફરી શરૂ કરો, તો ડેટા વપરાશ માટે શુલ્ક લાગુ થઇ શકે છે."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"ફરી શરૂ કરો"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"કોઈ ઇન્ટરનેટ કનેક્શન નથી"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi કનેક્ટ કર્યું"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"હોટસ્પોટ"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"સૂચનાઓ"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ફ્લેશલાઇટ"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"મોબાઇલ ડેટા"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ડેટા વપરાશ"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"બાકી ડેટા"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"મર્યાદાથી વધુ"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"કાર્ય પ્રોફાઇલ <xliff:g id="VPN_APP">%1$s</xliff:g> સાથે કનેક્ટ કરેલ છે"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"વ્યક્તિગત પ્રોફાઇલ <xliff:g id="VPN_APP">%1$s</xliff:g> સાથે કનેક્ટ કરેલ છે"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"આ ઉપકરણ <xliff:g id="VPN_APP">%1$s</xliff:g> સાથે કનેક્ટ કરેલ છે"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"ઉપકરણનું સંચાલન"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"પ્રોફાઇલ નિરીક્ષણ"</string>
<string name="monitoring_title" msgid="169206259253048106">"નેટવર્ક મૉનિટરિંગ"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN અક્ષમ કરો"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN ડિસ્કનેક્ટ કરો"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"નીતિઓ જુઓ"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"તમારું ઉપકરણ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> દ્વારા સંચાલિત કરવામાં આવે છે.\n\nતમારા વ્યવસ્થાપક સેટિંગ્સ, કૉર્પોરેટ ઍક્સેસ, ઍપ્લિકેશનો, તમારા ઉપકરણ સાથે સંકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતીનું નિરીક્ષણ અને સંચાલન કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"તમારું ઉપકરણ તમારી સંસ્થા દ્વારા સંચાલિત કરવામાં આવે છે.\n\nતમારા વ્યવસ્થાપક સેટિંગ્સ, કૉર્પોરેટ ઍક્સેસ, ઍપ્લિકેશનો, તમારા ઉપકરણ સાથે સંકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતીનું નિરીક્ષણ અને સંચાલન કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"તમારી સંસ્થાએ આ ઉપકરણ પર પ્રમાણપત્ર સત્તાધિકારી ઇન્સ્ટૉલ કર્યું છે. તમારા સુરક્ષિત નેટવર્ક ટ્રાફિકનું નિયમન થઈ શકે છે અથવા તેમાં ફેરફાર કરવામાં આવી શકે છે."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"તમારી સંસ્થાએ તમારી કાર્ય પ્રોફાઇલમાં પ્રમાણપત્ર સત્તાધિકારી ઇન્સ્ટૉલ કર્યું છે. તમારા સુરક્ષિત નેટવર્ક ટ્રાફિકનું નિયમન થઈ શકે છે અથવા તેમાં ફેરફાર કરવામાં આવી શકે છે."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"આ ઉપકરણ પર પ્રમાણપત્ર સત્તાધિકારી ઇન્સ્ટૉલ કરેલ છે. તમારા સુરક્ષિત નેટવર્ક ટ્રાફિકનું નિયમન થઈ શકે છે અથવા તેમાં ફેરફાર કરવામાં આવી શકે છે."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"તમારા વ્યવસ્થાપકે નેટવર્ક લૉગિંગ ચાલુ કર્યું છે, જે તમારા ઉપકરણ પર નેટવર્ક ટ્રાફિકનું નિયમન કરે છે."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"તમે <xliff:g id="VPN_APP">%1$s</xliff:g> સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ, ઍપ્લિકેશનો અને વેબસાઇટ સહિત તમારી નેટવર્ક પ્રવૃત્તિનું નિરીક્ષણ કરી શકે છે."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"તમે <xliff:g id="VPN_APP_0">%1$s</xliff:g> અને <xliff:g id="VPN_APP_1">%2$s</xliff:g> સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ, ઍપ્લિકેશનો અને વેબસાઇટ સહિત તમારી નેટવર્ક પ્રવૃત્તિનું નિરીક્ષણ કરી શકે છે."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"તમારી કાર્ય પ્રોફાઇલ <xliff:g id="VPN_APP">%1$s</xliff:g> સાથે કનેક્ટ કરેલ છે, જે ઇમેઇલ, ઍપ્લિકેશનો અને વેબસાઇટો સહિતની તમારી નેટવર્ક પ્રવૃત્તિનું નિયમન કરી શકે છે."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"તમારી વ્યક્તિગત પ્રોફાઇલ <xliff:g id="VPN_APP">%1$s</xliff:g> સાથે કનેક્ટ કરેલ છે, જે ઇમેઇલ, ઍપ્લિકેશનો અને વેબસાઇટો સહિતની તમારી નેટવર્ક પ્રવૃત્તિનું નિયમન કરી શકે છે."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"તમારું ઉપકરણ <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> દ્વારા સંચાલિત થાય છે."</string>
@@ -569,12 +559,9 @@
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> અને અન્ય <xliff:g id="NUMBER_5">%3$d</xliff:g></item>
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> અને અન્ય <xliff:g id="NUMBER_5">%3$d</xliff:g></item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> માટે સૂચના નિયંત્રણો ચાલુ છે"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> માટે સૂચના નિયંત્રણો બંધ છે"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"આ ચૅનલની સૂચનાઓને મંજૂરી આપો"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"બધી કૅટેગરી"</string>
<string name="notification_more_settings" msgid="816306283396553571">"વધુ સેટિંગ્સ"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"કસ્ટમાઇઝ કરો: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> સૂચના: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"વિભાજિત-સ્ક્રીન સાથે ઍપ્લિકેશન કદાચ કામ ન કરે."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"ઍપ્લિકેશન સ્ક્રીન-વિભાજનનું સમર્થન કરતી નથી."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"ઍપ્લિકેશન ગૌણ ડિસ્પ્લે પર કદાચ કામ ન કરે."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"ઍપ્લિકેશન ગૌણ ડિસ્પ્લે પર લૉન્ચનું સમર્થન કરતી નથી."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"સેટિંગ્સ ખોલો."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"ઝડપી સેટિંગ્સ ખોલો."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"ઝડપી સેટિંગ્સ બંધ કરો."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"ચિત્રમાં ચિત્ર મેનૂ"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ચિત્રમાં-ચિત્રની અંદર છે"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"જો તમે નથી ઇચ્છતા કે <xliff:g id="NAME">%s</xliff:g> આ સુવિધાનો ઉપયોગ કરે, તો સેટિંગ્સ ખોલવા માટે ટૅપ કરો અને તેને બંધ કરો."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"ચલાવો"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"થોભાવો"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"આગલા પર જાઓ"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"પહેલાંના પર જાઓ"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"ફોન વધુ પડતી ગરમીને લીધે બંધ થઇ ગયો છે"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"તમારો ફોન હવે સામાન્યપણે કાર્ય કરી રહ્યો છે"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"તમારો ફોન અત્યંત ગરમ હતો, તેથી તે ઠંડો થવા આપમેળે બંધ થઇ ગયો છે. તમારો ફોન હવે સામાન્યપણે કાર્ય કરી રહ્યો છે.\n\nતમારો ફોન અત્યંત ગરમ થઇ શકે છે, જો તમે:\n • એવી ઍપ્લિકેશન વાપરતા હો જે સંસાધન સઘન રીતે વાપરતી હોય (જેમ કે ગેમિંગ, વિડિઓ, અથવા નેવિગેટ કરતી ઍપ્લિકેશનો)\n • મોટી ફાઇલો અપલોડ અથવા ડાઉનલોડ કરતા હો\n • તમારા ફોનનો ઉપયોગ ઉચ્ચ તાપમાનમાં કરતા હો"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"ઝટપટ ઍપ્લિકેશનો"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ઝટપટ ઍપ્લિકેશનો માટે ઇન્સ્ટૉલેશનની જરૂર નથી."</string>
<string name="app_info" msgid="6856026610594615344">"ઍપ્લિકેશન માહિતી"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"વેબ પર જાઓ"</string>
<string name="mobile_data" msgid="7094582042819250762">"મોબાઇલ ડેટા"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi બંધ છે"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth બંધ છે"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 65dd1fa..5e20511 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"मोबाइल डेटा बंद है"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ब्लूटूथ टेदरिंग."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"हवाई जहाज मोड."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN चालू."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"कोई सिम कार्ड नहीं है."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"वाहक नेटवर्क बदलना."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"बैटरी का विवरण खोलें"</string>
@@ -241,7 +242,7 @@
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G डेटा रोक दिया गया है"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"मोबाइल डेटा रोक दिया गया है"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"डेटा रोक दिया गया है"</string>
- <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"आपने जो डेटा सीमा सेट की थी, वहां तक पहुंचा जा चुका है. अब आप मोबाइल डेटा का उपयोग नहीं कर रहे हैं.\n\nअगर आप फिर से शुरू करते हैं, तो डेटा उपयोग के लिए शुल्क लगाया जा सकता है."</string>
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"आपने जो डेटा सीमा सेट की थी, वह पूरी हो चुकी है. अब आप मोबाइल डेटा का उपयोग नहीं कर रहे हैं.\n\nअगर आप फिर से शुरू करते हैं, तो डेटा उपयोग के लिए शुल्क लगाया जा सकता है."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"फिर से शुरू करें"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"कोई इंटरनेट कनेक्शन नहीं"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"वाई-फ़ाई कनेक्ट किया गया"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"कार्य प्रोफ़ाइल <xliff:g id="VPN_APP">%1$s</xliff:g> से कनेक्ट है"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"व्यक्तिगत प्रोफ़ाइल <xliff:g id="VPN_APP">%1$s</xliff:g> से कनेक्ट है"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"डिवाइस <xliff:g id="VPN_APP">%1$s</xliff:g> से कनेक्ट है"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"डिवाइस प्रबंधन"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"प्रोफ़ाइल को मॉनीटर करना"</string>
<string name="monitoring_title" msgid="169206259253048106">"नेटवर्क को मॉनीटर करना"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN अक्षम करें"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN डिस्कनेक्ट करें"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"नीतियां देखें"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> आपके डिवाइस का प्रबंधन करता है.\n\nआपका व्यवस्थापक सेटिंग, कॉर्पोरेट एक्सेस, ऐप्लिकेशन, आपके डिवाइस से संबद्ध डेटा और आपके डिवाइस की स्थान की जानकारी की निगरानी कर सकता है और उन्हें प्रबंधित कर सकता है.\n\nअधिक जानकारी के लिए, अपने व्यवस्थापक से संपर्क करें."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"आपका संगठन आपके डिवाइस का प्रबंधन करता है.\n\nआपका व्यवस्थापक सेटिंग, कॉर्पोरेट एक्सेस, ऐप्लिकेशन, आपके डिवाइस से संबद्ध डेटा और आपके डिवाइस की स्थान की जानकारी की निगरानी कर सकता है और उन्हें प्रबंधित कर सकता है.\n\nअधिक जानकारी के लिए, अपने व्यवस्थापक से संपर्क करें."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"आपके संगठन ने इस डिवाइस पर एक प्रमाणपत्र प्राधिकरण इंस्टॉल किया है. आपके सुरक्षित नेटवर्क की निगरानी या उसमें बदलाव किया जा सकता है."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"आपके संगठन ने आपकी कार्य प्रोफ़ाइल में एक प्रमाणपत्र प्राधिकरण इंस्टॉल किया है. आपके सुरक्षित नेटवर्क ट्रैफ़िक की निगरानी या उसमें बदलाव किया जा सकता है."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"इस डिवाइस पर एक प्रमाणपत्र प्राधिकरण इंस्टॉल किया गया है. आपके सुरक्षित नेटवर्क ट्रैफ़िक की निगरानी या उसमें बदलाव किया जा सकता है."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"आपके व्यवस्थापक ने नेटवर्क लॉगिंग चालू किया है, जो आपके डिवाइस पर ट्रैफ़िक की निगरानी करता है."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"आप <xliff:g id="VPN_APP">%1$s</xliff:g> से कनेक्ट हैं, जो ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकते हैं."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"आप <xliff:g id="VPN_APP_0">%1$s</xliff:g> और <xliff:g id="VPN_APP_1">%2$s</xliff:g> से कनेक्ट हैं, जो ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकते हैं."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"आपकी कार्य प्रोफ़ाइल <xliff:g id="VPN_APP">%1$s</xliff:g> से कनेक्ट है, जो ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"आपकी व्यक्तिगत प्रोफ़ाइल <xliff:g id="VPN_APP">%1$s</xliff:g> से कनेक्ट है, जो ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"<xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> आपका डिवाइस प्रबंधित करता है."</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> नोटिफ़िकेशन: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"हो सकता है कि ऐप्लिकेशन विभाजित स्क्रीन के साथ काम ना करे."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"ऐप विभाजित स्क्रीन का समर्थन नहीं करता है."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"हो सकता है कि ऐप्लिकेशन दूसरे प्रदर्शन पर काम नहीं करे."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"दूसरे प्रदर्शन पर यह ऐप्लिकेशन लॉन्च नहीं हो सकता."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"सेटिंग खोलें."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"त्वरित सेटिंग खोलें."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"त्वरित सेटिंग बंद करें."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"झटपट ऐप्स"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"झटपट ऐप्स के लिए इंस्टॉलेशन ज़रूरी नहीं है."</string>
<string name="app_info" msgid="6856026610594615344">"ऐप की जानकारी"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"वेब पर जाएं"</string>
<string name="mobile_data" msgid="7094582042819250762">"मोबाइल डेटा"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"वाई-फ़ाई बंद है"</string>
<string name="bt_is_off" msgid="2640685272289706392">"ब्लूटूथ बंद है"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 8261522..d2e064b 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -158,6 +158,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobilni su podaci isključeni"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Posredno povezivanje Bluetootha."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Način rada u zrakoplovu"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN uključen."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Nema SIM kartice."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Promjena mreže operatera."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Otvaranje pojedinosti o bateriji"</string>
@@ -306,7 +307,7 @@
<string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"Nema dostupnih uređaja"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Svjetlina"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATSKI"</string>
- <string name="quick_settings_inversion_label" msgid="8790919884718619648">"Zamijeni boje"</string>
+ <string name="quick_settings_inversion_label" msgid="8790919884718619648">"Zamjena boja"</string>
<string name="quick_settings_color_space_label" msgid="853443689745584770">"Način korekcije boje"</string>
<string name="quick_settings_more_settings" msgid="326112621462813682">"Više postavki"</string>
<string name="quick_settings_done" msgid="3402999958839153376">"Gotovo"</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Radni profil povezan je s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Osobni profil povezan je s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Uređaj je povezan s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Upravljanje uređajem"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Nadzor profila"</string>
<string name="monitoring_title" msgid="169206259253048106">"Nadzor mreže"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -439,18 +439,14 @@
<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_button_view_policies" msgid="100913612638514424">"Prikaži pravila"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Uređajem upravlja organizacija <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nAdministrator može nadzirati postavke, korporacijski pristup, aplikacije, podatke o uređaju i lokaciji uređaja te upravljati njima.\n\nZa više informacija obratite se administratoru."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Uređajem upravlja vaša organizacija.\n\nAdministrator može nadzirati postavke, korporacijski pristup, aplikacije, podatke o uređaju i lokaciji uređaja te upravljati njima.\n\nZa više informacija obratite se administratoru."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Vaša je organizacija instalirala izdavač certifikata na ovom uređaju. Vaš sigurni mrežni promet možda se nadzire ili modificira."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Vaša je organizacija instalirala izdavač certifikata na vašem radnom profilu. Vaš sigurni mrežni promet možda se nadzire ili modificira."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Na ovom je uređaju instaliran izdavač certifikata. Vaš sigurni mrežni promet možda se nadzire ili modificira."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Administrator je uključio mrežni zapisnik koji nadzire promet na vašem uređaju."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Povezani ste s aplikacijom <xliff:g id="VPN_APP">%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_two_named_vpns" msgid="4198511413729213802">"Povezani ste s aplikacijama <xliff:g id="VPN_APP_0">%1$s</xliff:g> i <xliff:g id="VPN_APP_1">%2$s</xliff:g> koje mogu nadzirati vašu aktivnost na mreži, uključujući e-poruke, aplikacije i web-lokacije."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Vaš je radni profil povezan s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g> koja može nadzirati vašu aktivnost na mreži, uključujući e-poruke, aplikacije i web-lokacije."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Vaš je osobni profil povezan s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g> koja može nadzirati vašu aktivnost na mreži, uključujući e-poruke, aplikacije i web-lokacije."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Vašim uređajem upravlja aplikacija <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -707,6 +703,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> obavijest: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Aplikacija možda neće funkcionirati s podijeljenim zaslonom."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Aplikacija ne podržava podijeljeni zaslon."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Aplikacija možda neće funkcionirati na sekundarnom zaslonu."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Aplikacija ne podržava pokretanje na sekundarnim zaslonima."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Otvaranje postavki."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Otvaranje brzih postavki."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Zatvaranje brzih postavki."</string>
@@ -756,8 +754,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant aplikacije"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant aplikacije nije potrebno instalirati."</string>
<string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Prijeđi na web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobilni podaci"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi je isključen"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth je isključen"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 409d4ab..a3db611 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -152,14 +152,12 @@
<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">"Nincs SIM."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"Mobiladatok"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Mobiladatok bekapcsolva"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobiladatok kikapcsolva"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth megosztása."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Repülőgép üzemmód."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN bekapcsolva."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Nincs SIM-kártya."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Szolgáltatói hálózat váltása."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Az akkumulátorral kapcsolatos részletek megnyitása"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Töltés folyamatban…"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"A 2G és 3G adatforgalom szünetel."</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"A 4G adatforgalom szünetel"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Mobiladatok szüneteltetve"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Az adatforgalom szünetel"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Elérte a beállított adatkorlátot. A továbbiakban nem használ mobiladat-forgalmat.\n\nHa a folytatást választja, szolgáltatója adathasználati díjat számíthat fel."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Folytatás"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Nincs internet"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi csatlakoztatva"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Értesítések"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Zseblámpa"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobiladatok"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Adathasználat"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Fennmaradó adatmennyiség"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Túllépte a korlátot"</string>
@@ -363,7 +358,7 @@
<string name="zen_silence_introduction" msgid="3137882381093271568">"Ez letiltja az ÖSSZES hanghatást és rezgést, beleértve az ébresztések, zeneszámok, videók és játékok hangjait is."</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">"A kevésbé sürgős értesítések lentebb vannak"</string>
- <string name="notification_tap_again" msgid="7590196980943943842">"Koppintson rá ismét a megnyitáshoz"</string>
+ <string name="notification_tap_again" msgid="7590196980943943842">"Koppintson ismét a megnyitáshoz"</string>
<string name="keyguard_unlock" msgid="8043466894212841998">"Húzza felfelé az ujját a feloldáshoz"</string>
<string name="do_disclosure_generic" msgid="5615898451805157556">"Az eszközt az Ön szervezete kezeli"</string>
<string name="do_disclosure_with_name" msgid="5640615509915445501">"Az eszközt a(z) <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> felügyeli."</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"A munkaprofil csatlakozik a következőhöz: <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"A személyes profil a következőhöz csatlakozik: <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Az eszköz a következőhöz csatlakozik: <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Eszközkezelés"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profilfelügyelet"</string>
<string name="monitoring_title" msgid="169206259253048106">"Hálózatfigyelés"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN letiltása"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN-kapcsolat bontása"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Házirendek megtekintése"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Az eszközt a(z) <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> felügyeli.\n\nA rendszergazda figyelheti és kezelheti a beállításokat, a vállalati hozzáférést, az alkalmazásokat, az eszközhöz tartozó adatokat, valamint az eszköz helyadatait.\n\nHa további információra van szüksége, vegye fel a kapcsolatot a rendszergazdával."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Az eszközt az Ön szervezete felügyeli.\n\nA rendszergazda figyelheti és kezelheti a beállításokat, a vállalati hozzáférést, az alkalmazásokat, az eszközhöz tartozó adatokat, valamint az eszköz helyadatait.\n\nHa további információra van szüksége, vegye fel a kapcsolatot a rendszergazdával."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Szervezete tanúsítványkibocsátót telepített az eszközre. Ezáltal figyelhetik és befolyásolhatják az Ön biztonságos hálózati forgalmát."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Szervezete tanúsítványkibocsátót telepített a munkaprofilba. Ezáltal figyelhetik és befolyásolhatják az Ön biztonságos hálózati forgalmát."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Az eszközre tanúsítványkibocsátó van telepítve. Ezáltal figyelhetik és befolyásolhatják az Ön biztonságos hálózati forgalmát."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"A rendszergazda bekapcsolta az eszköz forgalmát figyelő hálózati naplózást."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Ön kapcsolódik a(z) <xliff:g id="VPN_APP">%1$s</xliff:g> alkalmazáshoz, amely figyelheti hálózati tevékenységét, beleértve a levelezést, valamint az alkalmazás- és webhelyhasználatot."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Ön csatlakozik a(z) <xliff:g id="VPN_APP_0">%1$s</xliff:g> és a(z) <xliff:g id="VPN_APP_1">%2$s</xliff:g> alkalmazásokhoz, amelyek figyelhetik hálózati tevékenységét, beleértve a levelezést, valamint az alkalmazás- és webhelyhasználatot."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Munkaprofilja csatlakozik a(z) <xliff:g id="VPN_APP">%1$s</xliff:g> alkalmazáshoz, amely figyelheti hálózati tevékenységét, beleértve a levelezést, az alkalmazásokat és a webhelyeket."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Az Ön személyes profilja csatlakozik a(z) <xliff:g id="VPN_APP">%1$s</xliff:g> alkalmazáshoz, amely figyelheti hálózati tevékenységeit, beleértve a levelezést, az alkalmazásokat és a webhelyeket."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Az eszközt a(z) <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> kezeli."</string>
@@ -569,12 +559,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> és <xliff:g id="NUMBER_5">%3$d</xliff:g> másik</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> és <xliff:g id="NUMBER_2">%3$d</xliff:g> másik</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> értesítésvezérlői megnyitva"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> értesítésvezérlői kikapcsolva"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Értesítések engedélyezése erről a csatornáról"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"Minden kategória"</string>
<string name="notification_more_settings" msgid="816306283396553571">"További beállítások"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"Személyre szabás: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -618,7 +605,7 @@
<string name="keyboard_key_num_lock" msgid="5052537581246772117">"Num Lock"</string>
<string name="keyboard_key_numpad_template" msgid="8729216555174634026">"Numerikus: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_shortcut_group_system" msgid="6472647649616541064">"Rendszer"</string>
- <string name="keyboard_shortcut_group_system_home" msgid="3054369431319891965">"Otthon"</string>
+ <string name="keyboard_shortcut_group_system_home" msgid="3054369431319891965">"Kezdőoldal"</string>
<string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"Legutóbbiak"</string>
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Vissza"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Értesítések"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g>-értesítések: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Lehet, hogy az alkalmazás nem működik osztott képernyős nézetben."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Az alkalmazás nem támogatja az osztott képernyős nézetet."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Előfordulhat, hogy az alkalmazás nem működik másodlagos kijelzőn."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Az alkalmazás nem támogatja a másodlagos kijelzőn történő indítást."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Beállítások megnyitása."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Gyorsbeállítások megnyitása."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Gyorsbeállítások bezárása"</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"Kép a képben menü"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"A(z) <xliff:g id="NAME">%s</xliff:g> kép a képben funkciót használ"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Ha nem szeretné, hogy a(z) <xliff:g id="NAME">%s</xliff:g> használja ezt a funkciót, koppintson a beállítások megnyitásához, és kapcsolja ki."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"Lejátszás"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"Szüneteltetés"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"Ugrás a következőre"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"Ugrás az előzőre"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"A meleg miatt kikapcsolt"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"A telefon most már megfelelően működik"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"Telefonja túlmelegedett, így kikapcsolt, hogy lehűlhessen. Most már megfelelően működik.\n\nA telefon akkor melegedhet túl, ha Ön:\n • Energiaigényes alkalmazásokat használ (például játékokat, videókat vagy navigációs alkalmazásokat)\n • Nagy fájlokat tölt le vagy fel\n • Melegben használja a telefonját"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Azonnali alkalmazások"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Az azonnali alkalmazásokat nem kell telepíteni."</string>
<string name="app_info" msgid="6856026610594615344">"Alkalmazásinformáció"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Tovább az internetre"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobiladatok"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"A Wi-Fi ki van kapcsolva"</string>
<string name="bt_is_off" msgid="2640685272289706392">"A Bluetooth ki van kapcsolva"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 12565d1..ce37991 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -86,7 +86,7 @@
<string name="accessibility_accessibility_button" msgid="7601252764577607915">"Մատչելիություն"</string>
<string name="accessibility_recent" msgid="5208608566793607626">"Համատեսք"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Որոնել"</string>
- <string name="accessibility_camera_button" msgid="8064671582820358152">"Ֆոտոխցիկ"</string>
+ <string name="accessibility_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>
@@ -152,11 +152,12 @@
<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_cell_data" msgid="5326139158682385073">"Բջջային տվյալներ"</string>
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"Բջջային ինտերնետ"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"Բջջային տվյալները միացված են"</string>
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Բջջային տվյալներն անջատված են"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-ը կապվում է:"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Ինքնաթիռի ռեժիմ"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"Միացնել VPN-ը։"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM քարտ չկա:"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Օպերատորի ցանցի փոփոխում:"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Բացել մարտկոցի տվյալները"</string>
@@ -200,7 +201,7 @@
<string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Չխանգարելու ընտրանքը միացված է: Ընդհատել միայն կարևոր ծանուցումների դեպքում:"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Չանհանգստացնել՝ ընդհանուր լուռ վիճակը:"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Չանհանգստացնել՝ միայն զարթուցիչ"</string>
- <string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Չընդհատել:"</string>
+ <string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Չանհանգստացնել:"</string>
<string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Չխանգարելու ընտրանքն անջատված է:"</string>
<string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Չխանգարելու ընտրանքն անջատվեց:"</string>
<string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Չխանգարելու ընտրանքը միացվեց:"</string>
@@ -263,25 +264,25 @@
<string name="accessibility_rotation_lock_on_landscape_changed" msgid="3135965553707519743">"Էկրանն այժմ կողպված է հորիզոնական դիրքում:"</string>
<string name="accessibility_rotation_lock_on_portrait_changed" msgid="8922481981834012126">"Էկրանն այժմ կողպված է ուղղահայաց դիրքում:"</string>
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
- <string name="start_dreams" msgid="5640361424498338327">"Էկրանի խնայարար"</string>
+ <string name="start_dreams" msgid="5640361424498338327">"Էկրանապահ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Չխանգարել"</string>
+ <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Չանհանգստացնել"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Միայն կարևոր ծանուցումների դեպքում"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Միայն զարթուցիչ"</string>
- <string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"Ընդհանուր լուռ վիճակը"</string>
+ <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>
- <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"Հասանելի զուգավորված սարքեր չկան"</string>
+ <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"Զուգակցված սարքեր չկան"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Պայծառություն"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Ինքնապտտում"</string>
- <string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Ինքնուրույն պտտել էկրանը"</string>
+ <string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Ավտոմատ պտտել էկրանը"</string>
<string name="accessibility_quick_settings_rotation_value" msgid="8187398200140760213">"<xliff:g id="ID_1">%s</xliff:g> ռեժիմ"</string>
<string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"Պտտումը կողպված է"</string>
<string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"Դիմանկար"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"Լանդշաֆտ"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Մուտքագրման եղանակը"</string>
- <string name="quick_settings_location_label" msgid="5011327048748762257">"Տեղադրություն"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"Տեղորոշում"</string>
<string name="quick_settings_location_off_label" msgid="7464544086507331459">"Անջատել տեղադրությունը"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Մեդիա սարք"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
@@ -305,7 +306,7 @@
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Պայծառություն"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"Ինքնաշխատ"</string>
<string name="quick_settings_inversion_label" msgid="8790919884718619648">"Շրջել գույները"</string>
- <string name="quick_settings_color_space_label" msgid="853443689745584770">"Գույների կարգավորման ռեժիմ"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"Գունաշտկման ռեժիմ"</string>
<string name="quick_settings_more_settings" msgid="326112621462813682">"Հավելյալ կարգավորումներ"</string>
<string name="quick_settings_done" msgid="3402999958839153376">"Պատրաստ է"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Կապակցված է"</string>
@@ -351,10 +352,10 @@
<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_voice" msgid="2284540992298200729">"Այս գործողությունն արգելափակում է ԲՈԼՈՐ ձայներն ու թրթռումները, այդ թվում նաև զարթուցիչների, երաժշտության, տեսանյութերի և խաղերի ձայներն ու թրթռումները: Սակայն կկարողանաք կատարել հեռախոսազանգեր:"</string>
- <string name="zen_silence_introduction" msgid="3137882381093271568">"Այս գործողությունն արգելափակում է ԲՈԼՈՐ ձայներն ու թրթռումները, այդ թվում նաև զարթուցիչների, երաժշտության, տեսանյութերի և խաղերի ձայներն ու թրթռումները:"</string>
+ <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Այս գործողությունն արգելափակում է ԲՈԼՈՐ ձայներն ու թրթռոցները, այդ թվում զարթուցիչները, երաժշտությունը, տեսանյութերի և խաղերի ձայները: Դուք կկարողանաք հեռախոսազանգեր անել։"</string>
+ <string name="zen_silence_introduction" msgid="3137882381093271568">"Այս գործողությունն արգելափակում է ԲՈԼՈՐ ձայներն ու թրթռոցները, այդ թվում նաև զարթուցիչների, երաժշտության, տեսանյութերի և խաղերի ձայներն ու թրթռոցները:"</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="7590196980943943842">"Կրկին հպեք՝ բացելու համար"</string>
@@ -365,7 +366,7 @@
<string name="voice_hint" msgid="8939888732119726665">"Սահահարվածեք ձայնային հուշման պատկերակից"</string>
<string name="camera_hint" msgid="7939688436797157483">"Սահահարվածեք խցիկի պատկերակից"</string>
<string name="interruption_level_none_with_warning" msgid="5114872171614161084">"Կատարյալ լռություն: Արդյունքում կանջատվի նաև էկրանի ընթերցիչների ձայնը:"</string>
- <string name="interruption_level_none" msgid="6000083681244492992">"Ընդհանուր լուռ վիճակը"</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>
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"Ընդհանուր\nլուռ վիճակը"</string>
@@ -404,7 +405,7 @@
<string name="battery_saver_notification_title" msgid="237918726750955859">"Մարտկոցի տնտեսումը միացված է"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Նվազեցնում է ծանրաբեռնվածությունը և ֆոնային տվյալները"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Անջատել մարտկոցի տնտեսումը"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ծրագիրը կսկսի հավաքագրել այն ամենն ինչ ցուցադրվում է ձեր էկրանին:"</string>
+ <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ծրագիրը կսկսի հավաքել այն ամենն ինչ ցուցադրվում է ձեր էկրանին:"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Այլևս ցույց չտալ"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Մաքրել բոլորը"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Մեկնարկել հիմա"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Աշխատանքային պրոֆիլը կապակցված է <xliff:g id="VPN_APP">%1$s</xliff:g> հավելվածին"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Անձնական պրոֆիլը կապակցված է <xliff:g id="VPN_APP">%1$s</xliff:g> հավելվածին"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Սարքը կապակցված է <xliff:g id="VPN_APP">%1$s</xliff:g> հավելվածին"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Սարքերի կառավարում"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Պրոֆիլի վերահսկում"</string>
<string name="monitoring_title" msgid="169206259253048106">"Ցանցի մշտադիտարկում"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Անջատել VPN-ը"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Անջատել VPN-ը"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Դիտել քաղաքականությունները"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Ձեր սարքը կառավարվում է <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\n-ի կողմից: Ձեր ադմինիստրատորը կարող է վերահսկել և կառավարել կարգավորումները, կորպորատիվ օգտագործման թույլտվությունները, հավելվածները, սարքին կապված տվյալները և սարքի տեղադրման մասին տեղեկատվությունը:\n\nՄանրամասների համար դիմեք ձեր ադմինիստրատորին:"</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Ձեր շարժական սարքը կառավարվում է ձեր կազմակերպության կողմից։\n\nՁեր ադմինիստրատորը կարող է վերահսկել և կառավարել կարգավորումները, կորպորատիվ օգտագործման թույլտվությունները, հավելվածները, սարքին կապված տվյալները և սարքի տեղադրման մասին տեղեկատվությունը:\n\nՄանրամասների համար դիմեք ձեր ադմինիստրատորին:"</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Ձեր կազմակերպությունը այս սարքում տեղադրել է վկայագրման կենտրոն։ Ձեր ցանցի ապահով թրաֆիկը կարող է վերահսկվել կամ փոփոխվել։"</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Ձեր կազմակերպությունը ձեր աշխատանքային պրոֆիլում տեղադրել է վկայագրման կենտրոն։ Ձեր ցանցի ապահով թրաֆիկը կարող է վերահսկվել կամ փոփոխվել։"</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Այս սարքում տեղադրված է վկայագրման կենտրոն։ Ձեր ցանցի ապահով թրաֆիկը կարող է վերահսկվել կամ փոփոխվել։"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Ձեր ադմինիստրատորը միացրել է ցանցային իրադարձությունների գրանցումը, որը վերահսկում է ձեր սարքի թրաֆիկը։"</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Դուք կապակցված եք <xliff:g id="VPN_APP">%1$s</xliff:g> հավելվածին, որը կարող է վերահսկել ձեր ցանցային գործողությունը, այդ թվում նաև էլփոստը, հավելվածները և կայքերը:"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Դուք կապակցված եք <xliff:g id="VPN_APP_0">%1$s</xliff:g> և <xliff:g id="VPN_APP_1">%2$s</xliff:g> հավելվածներին, որոնք կարող են վերահսկել ձեր ցանցային գործունեությունը, այդ թվում նաև էլփոստը, հավելվածները և կայքերը:"</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Ձեր աշխատանքային պրոֆիլը կապակցված է <xliff:g id="VPN_APP">%1$s</xliff:g> հավելվածին, որը կարող է վերահսկել ձեր ցանցային գործունեությունը, այդ թվում նաև էլփոստը, հավելվածները և կայքերը:"</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Ձեր անձնական պրոֆիլը կապակցված է <xliff:g id="VPN_APP">%1$s</xliff:g> հավելվածին, որը կարող է վերահսկել ձեր ցանցային գործունեությունը, այդ թվում նաև էլփոստը, հավելվածները և կայքերը:"</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Ձեր սարքը կառավարվում է <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> հավելվածի կողմից:"</string>
@@ -614,7 +610,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Հետ"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Ծանուցումներ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Ստեղնային դյուրանցումներ"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Փոխարկել մուտքագրման եղանակը"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Փոխել ներածման եղանակը"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Հավելվածներ"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Օգնություն"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Դիտարկիչ"</string>
@@ -625,15 +621,15 @@
<string name="keyboard_shortcut_group_applications_youtube" msgid="6555453761294723317">"YouTube"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="9043614299194991263">"Օրացույց"</string>
<string name="tuner_full_zen_title" msgid="4540823317772234308">"Ցույց տալ ձայնի ուժգնության կառավարման տարրերի հետ"</string>
- <string name="volume_and_do_not_disturb" msgid="3373784330208603030">"Չընդհատել"</string>
+ <string name="volume_and_do_not_disturb" msgid="3373784330208603030">"Չանհանգստացնել"</string>
<string name="volume_dnd_silent" msgid="4363882330723050727">"Ձայնի կոճակների դյուրանցում"</string>
- <string name="volume_up_silent" msgid="7141255269783588286">"Ելնել Չխանգարել գործառույթից ձայնի ավելացման կոճակը սեղմելիս"</string>
+ <string name="volume_up_silent" msgid="7141255269783588286">"Ելնել Չանհանգստացնել գործառույթից ձայնի ավելացման կոճակը սեղմելիս"</string>
<string name="battery" msgid="7498329822413202973">"Մարտկոց"</string>
<string name="clock" msgid="7416090374234785905">"Ժամացույց"</string>
<string name="headset" msgid="4534219457597457353">"Ականջակալ"</string>
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Ականջակալը կապակցված է"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Ականջակալը կապակցված է"</string>
- <string name="data_saver" msgid="5037565123367048522">"Տվյալների խնայում"</string>
+ <string name="data_saver" msgid="5037565123367048522">"Թրաֆիկի խնայում"</string>
<string name="accessibility_data_saver_on" msgid="8454111686783887148">"Տվյալների խնայումը միացված է"</string>
<string name="accessibility_data_saver_off" msgid="8841582529453005337">"Տվյալների խնայումն անջատված է"</string>
<string name="switch_bar_on" msgid="1142437840752794229">"Միացնել"</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> ծանուցում՝ <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Հավելվածը չի կարող աշխատել տրոհված էկրանի ռեժիմում:"</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Հավելվածը չի աջակցում էկրանի տրոհումը:"</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Հավելվածը չի կարող աշխատել երկրորդական էկրանի վրա։"</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Հավելվածը չի աջակցում երկրորդական էկրանների վրա գործարկումը։"</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Բացել կարգավորումները:"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Բացել արագ կարգավորումները:"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Փակել արագ կարգավորումները:"</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Ակնթարթորեն գործարկվող հավելվածներ"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Ակնթարթորեն գործարկվող հավելվածները տեղադրում չեն պահանջում։"</string>
<string name="app_info" msgid="6856026610594615344">"Հավելվածի տվյալներ"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Բացեք համացանցում"</string>
<string name="mobile_data" msgid="7094582042819250762">"Բջջային ինտերնետ"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi-ն անջատված է"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth-ն անջատված է"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 2954b79..9f20663 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Data Seluler Tidak Aktif"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Tethering bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Mode pesawat."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN aktif."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Tidak ada kartu SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Jaringan operator berubah."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Membuka detail baterai"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Profil kerja tersambung ke <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Profil pribadi tersambung ke <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Perangkat tersambung ke <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Pengelolaan perangkat"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Pemantauan profil"</string>
<string name="monitoring_title" msgid="169206259253048106">"Pemantauan jaringan"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Nonaktifkan VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Putuskan sambungan VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Lihat Kebijakan"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Perangkat dikelola oleh <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nAdmin dapat memantau dan mengelola setelan, akses perusahaan, aplikasi, data yang terkait dengan perangkat, dan informasi lokasi perangkat.\n\nUntuk informasi selengkapnya, hubungi admin."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Perangkat dikelola oleh organisasi.\n\nAdmin dapat memantau dan mengelola setelan, akses perusahaan, aplikasi, data yang terkait dengan perangkat, dan informasi lokasi perangkat.\n\nUntuk informasi selengkapnya, hubungi admin."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Organisasi Anda menginstal otoritas sertifikat di perangkat ini. Traffic jaringan aman Anda mungkin dipantau atau diubah."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Organisasi Anda menginstal otoritas sertifikat di profil kerja. Traffic jaringan aman Anda mungkin dipantau atau diubah."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Otoritas sertifikat diinstal di perangkat. Traffic jaringan aman Anda mungkin dipantau atau diubah."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Admin telah mengaktifkan pencatatan jaringan, yang memantau traffic di perangkat."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Anda tersambung ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Anda tersambung ke <xliff:g id="VPN_APP_0">%1$s</xliff:g> dan <xliff:g id="VPN_APP_1">%2$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Profil kerja Anda tersambung ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Profil pribadi Anda tersambung ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Perangkat dikelola oleh <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Notifikasi <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Aplikasi mungkin tidak berfungsi dengan layar terpisah."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"App tidak mendukung layar terpisah."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Aplikasi mungkin tidak berfungsi pada layar sekunder."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Aplikasi tidak mendukung peluncuran pada layar sekunder."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Buka setelan."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Buka setelan cepat."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Tutup setelan cepat."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Aplikasi Instan"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Aplikasi instan tidak perlu diinstal."</string>
<string name="app_info" msgid="6856026610594615344">"Info aplikasi"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Buka di web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Data seluler"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi nonaktif"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth nonaktif"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 3fbd7cb..af981ed 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Slökkt á farsímagögnum"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Tjóðrun með Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Flugstilling"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"Kveikt á VPN."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Ekkert SIM-kort."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Skipt um farsímakerfi."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Opna upplýsingar um rafhlöðu"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Vinnusnið er tengt við <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Einkaprófíll er tengdur við <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Tæki er tengt við <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Tækjastjórnun"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Fylgst með sniði"</string>
<string name="monitoring_title" msgid="169206259253048106">"Neteftirlit"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Slökkva á VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Aftengja VPN-net"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Skoða stefnur"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> stjórnar tækinu þínu.\n\nKerfisstjórinn getur fylgst með og breytt stillingum, fyrirtækjaaðgangi, forritum, gögnum sem tengjast tækinu þínu og staðsetningarupplýsingum tækisins.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Fyrirtækið þitt stjórnar tækinu þínu.\n\nKerfisstjórinn getur fylgst með og breytt stillingum, fyrirtækjaaðgangi, forritum, gögnum sem tengjast tækinu þínu og staðsetningarupplýsingum tækisins.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Fyrirtækið þitt setti upp CA-vottorð á þessu tæki. Eftirlit kann að vera haft með öruggri netnotkun þinni eða henni kann að vera breytt."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Fyrirtækið þitt setti upp CA-vottorð á vinnusniðinu þínu. Eftirlit kann að vera haft með öruggri netnotkun þinni eða henni kann að vera breytt."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"CA-vottorð er uppsett á þessu tæki. Eftirlit kann að vera haft með öruggri netnotkun þinni eða henni kann að vera breytt."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Kerfisstjóri hefur kveikt á eftirliti netkerfa, sem fylgist með netumferð á tækinu þínu."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Þú ert með tengingu við <xliff:g id="VPN_APP">%1$s</xliff:g>, sem getur fylgst með netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Þú ert með tengingu við <xliff:g id="VPN_APP_0">%1$s</xliff:g> og <xliff:g id="VPN_APP_1">%2$s</xliff:g>, sem geta fylgst með netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Vinnusniðið þitt er tengt <xliff:g id="VPN_APP">%1$s</xliff:g>, sem getur fylgst með netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Einkaprófíllinn þinn er tengdur við <xliff:g id="VPN_APP">%1$s</xliff:g>, sem getur fylgst með netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Þessu tæki er stýrt af <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> tilkynning: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Hugsanlega virkar forritið ekki ef skjánum er skipt upp."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Forritið styður ekki að skjánum sé skipt."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Hugsanlegt er að forritið virki ekki á öðrum skjá."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Forrit styður ekki opnun á öðrum skjá."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Opna stillingar."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Opna flýtistillingar."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Loka flýtistillingum."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Skyndiforrit"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Skyndiforrit þurfa ekki uppsetningu."</string>
<string name="app_info" msgid="6856026610594615344">"Forritsupplýsingar"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Fara á vefinn"</string>
<string name="mobile_data" msgid="7094582042819250762">"Farsímagögn"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Slökkt á Wi-Fi"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Slökkt á Bluetooth"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index f0a7ef3..a635485 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Dati mobili disattivati"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Tethering Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Modalità aereo."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN attiva."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Nessuna SIM presente."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Cambio rete operatore."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Visualizza i dettagli relativi alla batteria"</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Profilo di lavoro collegato a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Profilo personale collegato a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Dispositivo collegato a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Gestione dei dispositivi"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitoraggio del profilo"</string>
<string name="monitoring_title" msgid="169206259253048106">"Monitoraggio rete"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -439,18 +439,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Disattiva VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Scollega VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Visualizza le norme"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Il dispositivo è gestito da <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nL\'amministratore può monitorare e gestire impostazioni, accesso aziendale, app, dati associati al dispositivo e informazioni sulla posizione del dispositivo.\n\nPer ulteriori informazioni, contatta l\'amministratore."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Il dispositivo è gestito dalla tua organizzazione.\n\nL\'amministratore può monitorare e gestire impostazioni, accesso aziendale, app, dati associati al dispositivo e informazioni sulla posizione del dispositivo.\n\nPer ulteriori informazioni, contatta l\'amministratore."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"La tua organizzazione ha installato un\'autorità di certificazione sul dispositivo. Il tuo traffico di rete protetto potrebbe essere monitorato o modificato."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"La tua organizzazione ha installato un\'autorità di certificazione nel tuo profilo di lavoro. Il tuo traffico di rete protetto potrebbe essere monitorato o modificato."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Sul dispositivo è installata un\'autorità di certificazione. Il tuo traffico di rete protetto potrebbe essere monitorato o modificato."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"L\'amministratore ha attivato i log di rete, che consentono di monitorare il traffico sul dispositivo."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Sei connesso a <xliff:g id="VPN_APP">%1$s</xliff:g>, che consente di monitorare le attività di rete, inclusi siti web, email e app."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Sei connesso a <xliff:g id="VPN_APP_0">%1$s</xliff:g> e <xliff:g id="VPN_APP_1">%2$s</xliff:g>, che consentono di monitorare le attività di rete, inclusi siti web, email e app."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Il tuo profilo di lavoro è collegato a <xliff:g id="VPN_APP">%1$s</xliff:g>, da cui è possibile monitorare la tua attività di rete, inclusi siti web, email e app."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Il tuo profilo personale è collegato a <xliff:g id="VPN_APP">%1$s</xliff:g>, da cui è possibile monitorare la tua attività di rete, inclusi siti web, email e app."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Il dispositivo è gestito dall\'app <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -705,6 +701,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Notifica di <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"L\'app potrebbe non funzionare con lo schermo diviso."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"L\'app non supporta la modalità Schermo diviso."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"L\'app potrebbe non funzionare su un display secondario."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"L\'app non supporta l\'avvio su display secondari."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Apri le impostazioni."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Apri le impostazioni rapide."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Chiudi le impostazioni rapide."</string>
@@ -754,8 +752,7 @@
<string name="instant_apps" msgid="6647570248119804907">"App istantanee"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Le app istantanee non richiedono l\'installazione."</string>
<string name="app_info" msgid="6856026610594615344">"Informazioni app"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Vai sul Web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Dati mobili"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi disattivato"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth non attivo"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 3d3b38d..be2a6ac 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -154,14 +154,12 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"קצה"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"אין כרטיס SIM."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"חבילת גלישה"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"חבילת הגלישה פועלת"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"חבילת הגלישה כבויה"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"שיתוף אינטרנט דרך Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"מצב טיסה"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN פועל."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"אין כרטיס SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"רשת ספק משתנה."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"פתיחת פרטי סוללה"</string>
@@ -244,11 +242,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"הסוללה נטענת"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"השימוש בנתוני 2G-3G מושהה"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"השימוש בנתוני 4G מושהה"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"חבילת הגלישה מושהה"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"השימוש בנתונים מושהה"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"הגעת למגבלת הנתונים שהגדרת. אתה כבר לא משתמש בחבילת גלישה.\n\nאם תמשיך, ייתכנו חיובים על שימוש בנתונים."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"המשך"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"אין חיבור לאינטרנט"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi מחובר"</string>
@@ -313,7 +309,7 @@
<string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"אין מכשירים זמינים"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"בהירות"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"אוטומטי"</string>
- <string name="quick_settings_inversion_label" msgid="8790919884718619648">"הפוך צבעים"</string>
+ <string name="quick_settings_inversion_label" msgid="8790919884718619648">"היפוך צבעים"</string>
<string name="quick_settings_color_space_label" msgid="853443689745584770">"מצב תיקון צבע"</string>
<string name="quick_settings_more_settings" msgid="326112621462813682">"הגדרות נוספות"</string>
<string name="quick_settings_done" msgid="3402999958839153376">"בוצע"</string>
@@ -323,8 +319,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"נקודה לשיתוף אינטרנט"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"הודעות"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"פנס"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"חבילת גלישה"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"שימוש בנתונים"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"מכסת נתונים נותרת"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"חריגה מההגבלה"</string>
@@ -361,9 +356,9 @@
<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_customize_button" msgid="7948043278226955063">"התאם אישית"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"פעולה זו מבטלת את כל הצלילים והרטט, כולל צלילים ורטט שמקורם בהתראות, מוזיקה, סרטונים ומשחקים. תוכל עדיין להתקשר."</string>
+ <string name="zen_priority_introduction" msgid="3070506961866919502">"צלילים ורטט לא יופעלו, פרט להתראות, תזכורות, אירועים ואנשים מסוימים שמתקשרים אליך, אם יש כאלה שציינת."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"התאמה אישית"</string>
+ <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"פעולה זו מבטלת את כל הצלילים והרטט, כולל צלילים ורטט שמקורם בהתראות, מוזיקה, סרטונים ומשחקים. בכל מקרה, עדיין אפשר להתקשר."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"פעולה זו מבטלת את כל הצלילים והרטט, כולל בהתראות, מוזיקה, סרטונים ומשחקים."</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>
@@ -437,8 +432,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"פרופיל העבודה מחובר לאפליקציה <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"הפרופיל האישי מחובר לאפליקציה <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"המכשיר מחובר לאפליקציה <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"ניהול מכשירים"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"מעקב אחר פרופיל"</string>
<string name="monitoring_title" msgid="169206259253048106">"מעקב אחר פעילות ברשת"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -447,18 +441,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"השבת VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"נתק את ה-VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"הצג מדיניות"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"המכשיר שלך מנוהל על ידי <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nמנהל המערכת יכול לנטר ולנהל הגדרות, גישה ארגונית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר.\n\nלמידע נוסף, פנה למנהל המערכת."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"המכשיר מנוהל על ידי הארגון שלך.\n\nמנהל המערכת יכול לנטר ולנהל הגדרות, גישה ארגונית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר.\n\nלמידע נוסף, פנה למנהל המערכת."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"הארגון שלך התקין רשות אישורים במכשיר. ניתן לעקוב אחר התנועה ברשת המאובטחת או לשנות אותה."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"הארגון שלך התקין רשות אישורים בפרופיל העבודה. ניתן לעקוב אחר התנועה ברשת המאובטחת או לשנות אותה."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"במכשיר זה מותקנת רשות אישורים. ניתן לעקוב אחר התנועה ברשת המאובטחת או לשנות אותה."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"מנהל המערכת הפעיל את התכונה \'רישום התנועה ברשת\', שמנטרת את תנועת הנתונים במכשיר."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"אתה מחובר לאפליקציה <xliff:g id="VPN_APP">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"אתה מחובר לאפליקציות <xliff:g id="VPN_APP_0">%1$s</xliff:g> ו-<xliff:g id="VPN_APP_1">%2$s</xliff:g>, שיכולות לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"פרופיל העבודה שלך מחובר לאפליקציה <xliff:g id="VPN_APP">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"הפרופיל האישי שלך מחובר לאפליקציה <xliff:g id="VPN_APP">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"המכשיר שלך מנוהל על ידי <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -577,15 +567,12 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> ו-<xliff:g id="NUMBER_5">%3$d</xliff:g> אחרים</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> ו-<xliff:g id="NUMBER_2">%3$d</xliff:g> אחר</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"פקדי ההודעות של <xliff:g id="APP_NAME">%1$s</xliff:g> נפתחו"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"פקדי ההודעות של <xliff:g id="APP_NAME">%1$s</xliff:g> נסגרו"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"התר הודעות מערוץ זה"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"כל הקטגוריות"</string>
<string name="notification_more_settings" msgid="816306283396553571">"הגדרות נוספות"</string>
- <string name="notification_app_settings" msgid="3743278649182392015">"התאם אישית: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
+ <string name="notification_app_settings" msgid="3743278649182392015">"התאמה אישית: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
<string name="notification_done" msgid="5279426047273930175">"סיום"</string>
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"בקרת הודעות"</string>
@@ -627,7 +614,7 @@
<string name="keyboard_key_numpad_template" msgid="8729216555174634026">"מקלדת נומרית <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_shortcut_group_system" msgid="6472647649616541064">"מערכת"</string>
<string name="keyboard_shortcut_group_system_home" msgid="3054369431319891965">"דף הבית"</string>
- <string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"אחרונים"</string>
+ <string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"מהזמן האחרון"</string>
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"הקודם"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"הודעות"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"מקשי קיצור במקלדת"</string>
@@ -650,7 +637,7 @@
<string name="headset" msgid="4534219457597457353">"אוזניות"</string>
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"אוזניות מחוברות"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"אוזניות מחוברות"</string>
- <string name="data_saver" msgid="5037565123367048522">"חוסך הנתונים (Data Saver)"</string>
+ <string name="data_saver" msgid="5037565123367048522">"חוסך הנתונים<br>(Data Saver)"</string>
<string name="accessibility_data_saver_on" msgid="8454111686783887148">"חוסך הנתונים (Data Saver) פועל"</string>
<string name="accessibility_data_saver_off" msgid="8841582529453005337">"חוסך הנתונים (Data Saver) כבוי"</string>
<string name="switch_bar_on" msgid="1142437840752794229">"פועל"</string>
@@ -682,7 +669,7 @@
<string name="right_keycode" msgid="708447961000848163">"קוד מפתח ימני"</string>
<string name="left_icon" msgid="3096287125959387541">"סמל שמאלי"</string>
<string name="right_icon" msgid="3952104823293824311">"סמל ימני"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"גרור כדי להוסיף משבצות"</string>
+ <string name="drag_to_add_tiles" msgid="7058945779098711293">"ניתן לגרור כדי להוסיף או להסיר משבצות"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"גרור לכאן כדי להסיר"</string>
<string name="qs_edit" msgid="2232596095725105230">"ערוך"</string>
<string name="tuner_time" msgid="6572217313285536011">"שעה"</string>
@@ -720,6 +707,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"הודעת <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"ייתכן שהיישום לא יפעל עם מסך מפוצל."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"האפליקציה אינה תומכת במסך מפוצל."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"ייתכן שהאפליקציה לא תפעל במסך משני."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"האפליקציה אינה תומכת בהפעלה במסכים משניים."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"פתיחת הגדרות."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"פתיחה של \'הגדרות מהירות\'."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"סגירה של \'הגדרות מהירות\'."</string>
@@ -738,14 +727,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"תפריט \'תמונה בתוך תמונה\'"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> במצב תמונה בתוך תמונה"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"אם אינך רוצה שהתכונה הזו תשמש את <xliff:g id="NAME">%s</xliff:g>, הקש כדי לפתוח את ההגדרות ולכבות את התכונה."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"הפעל"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"השהה"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"דלג אל הבא"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"דלג אל הקודם"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"הטלפון כבה עקב התחממות"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"הטלפון פועל כרגיל עכשיו"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"הטלפון שלך התחמם יותר מדי וכבה כדי להתקרר. הטלפון פועל כרגיל עכשיו.\n\nייתכן שהטלפון יתחמם יותר מדי אם:\n • תשתמש באפליקציות עתירות משאבים (כגון משחקים, אפליקציות וידאו או אפליקציות ניווט)\n • תוריד או תעלה קבצים גדולים\n • תשתמש בטלפון בטמפרטורות גבוהות"</string>
@@ -773,8 +758,7 @@
<string name="instant_apps" msgid="6647570248119804907">"אפליקציות אינסטנט"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"אפליקציות אינסטנט לא דורשות התקנה."</string>
<string name="app_info" msgid="6856026610594615344">"פרטי אפליקציה"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"התחבר לאינטרנט"</string>
<string name="mobile_data" msgid="7094582042819250762">"נתונים סלולריים"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi כבוי"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth כבוי"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 980ad5b..2c8eec0 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"モバイルデータ OFF"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetoothテザリング。"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"機内モード。"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN は ON です。"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIMカードが挿入されていません。"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"携帯通信会社のネットワークを変更します。"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"電池の詳細情報を開きます"</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"仕事用プロファイルは <xliff:g id="VPN_APP">%1$s</xliff:g> に接続しています"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"個人用プロファイルは <xliff:g id="VPN_APP">%1$s</xliff:g> に接続しています"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"端末は <xliff:g id="VPN_APP">%1$s</xliff:g> に接続しています"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"端末管理"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"プロファイルの監視"</string>
<string name="monitoring_title" msgid="169206259253048106">"ネットワーク監視"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -439,18 +439,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPNを無効にする"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPNを切断"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"ポリシーを見る"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"この端末は <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> によって管理されています。\n\n管理者は、この端末に関連付けられた設定、コーポレート アクセス、アプリ、データと、端末の位置情報を監視、管理できます。\n\n詳しくは管理者にお問い合わせください。"</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"この端末は組織によって管理されています。\n\n管理者は、この端末に関連付けられた設定、コーポレート アクセス、アプリ、データと、端末の位置情報を監視、管理できます。\n\n詳しくは管理者にお問い合わせください。"</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"組織によってこの端末に認証局がインストールされました。保護されたネットワーク トラフィックが監視、変更される場合があります。"</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"組織によって、あなたの仕事用プロファイルに認証局がインストールされました。保護されたネットワーク トラフィックが監視、変更される場合があります。"</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"この端末には認証局がインストールされています。保護されたネットワーク トラフィックが監視、変更される可能性があります。"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"管理者がネットワーク ログを有効にしているため、この端末のトラフィックが監視されています。"</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"<xliff:g id="VPN_APP">%1$s</xliff:g> に接続しています。このアプリはあなたのネットワーク アクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"<xliff:g id="VPN_APP_0">%1$s</xliff:g> と <xliff:g id="VPN_APP_1">%2$s</xliff:g> に接続しています。これらのアプリは、あなたのネットワーク アクティビティ(メール、アプリ、ウェブサイト)を監視できます。"</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"この仕事用プロファイルは <xliff:g id="VPN_APP">%1$s</xliff:g> に接続しています。このアプリはあなたのネットワーク アクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。"</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"この個人用プロファイルは <xliff:g id="VPN_APP">%1$s</xliff:g> に接続しています。このアプリはあなたのネットワーク アクティビティ(メール、アプリ、ウェブサイト)を監視できます。"</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"この端末は <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>で管理されています。"</string>
@@ -705,6 +701,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> の通知: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"アプリは分割画面では動作しないことがあります。"</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"アプリで分割画面がサポートされていません。"</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"アプリは 2 次画面では動作しないことがあります。"</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"アプリは 2 次画面での起動に対応していません"</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"設定を開きます。"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"クイック設定を開きます。"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"クイック設定を閉じます。"</string>
@@ -754,8 +752,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant Apps はインストールせずに利用できます。"</string>
<string name="app_info" msgid="6856026610594615344">"アプリ情報"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"ウェブページを開く"</string>
<string name="mobile_data" msgid="7094582042819250762">"モバイルデータ"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi は OFF です"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth は OFF です"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index d31179f..1eec67e 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -152,14 +152,12 @@
<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>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"მობილური ინტერნეტი"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"მობილური ინტერნეტი ჩართულია"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"მობილური ინტერნეტი გამორთულია"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-ის ჩართვა"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"თვითმფრინავის რეჟიმი"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN ჩართულია."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM ბარათი არ არის."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"ოპერატორის ქსელის შეცვლა"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"ბატარეის დეტალების გახსნა"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"იტენება"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G მონაცემები შეჩერებულია"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G მონაცემები შეჩერებულია"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"მობილური ინტერნეტი დაპაუზებულია"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"მონაცემები შეჩერებულია"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"მიღწეულია მონაცემთა მოხმარების თქვენ მიერ მითითებული ლიმიტი. ამიტომ, მობილური ინტერნეტის გამოყენება აღარ ხდება.\n\nგანახლების შემთხვევაში, შეიძლება მობილური ინტერნეტის საფასურის გადახდა მოგიწიოთ."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"გაგრძელება"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"ინტერნეტ კავშირი არ არის"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi დაკავშირებულია"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"წვდომის წერტილი"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"შეტყობინებები"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ფანარი"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"მობილური ინტერნეტი"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"მონაცემთა მოხმარება"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"დარჩენილი მონაცემები"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"ლიმიტი გადაჭარბებულია"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"სამსახურის პროფილი დაკავშირებულია <xliff:g id="VPN_APP">%1$s</xliff:g>-თან"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"პირადი პროფილი დაკავშირებულია <xliff:g id="VPN_APP">%1$s</xliff:g>-თან"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"მოწყობილობა დაკავშირებულია <xliff:g id="VPN_APP">%1$s</xliff:g>-თან"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"მოწყობილობის მართვა"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"პროფილის მონიტორინგი"</string>
<string name="monitoring_title" msgid="169206259253048106">"ქსელის მონიტორინგი"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN-ის გაუქმება"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN-ის გათიშვა"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"წესების ნახვა"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"თქვენს მოწყობილობას მართავს <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nთქვენს ადმინისტრატორს შეუძლია მოწყობილობასთან დაკავშირებული პარამეტრების, კორპორაციული წვდომის, აპებისა და მონაცემების (მათ შორის, თქვენი მოწყობილობის მდებარეობის ინფორმაციის) მონიტორინგი და მართვა.\n\nდამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"თქვენს მოწყობილობას მართავს თქვენი ორგანიზაცია.\n\nთქვენს ადმინისტრატორს შეუძლია მოწყობილობასთან დაკავშირებული პარამეტრების, კორპორაციული წვდომის, აპებისა და მონაცემების (მათ შორის, თქვენი მოწყობილობის მდებარეობის ინფორმაციის) მონიტორინგი და მართვა.\n\nდამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"თქვენმა ორგანიზაციამ ამ მოწყობილობაზე სერტიფიცირების ორგანო დააინსტალირა. თქვენი ქსელის დაცული ტრაფიკი შეიძლება შეიცვალოს, ან მასზე მონიტორინგი განხორციელდეს."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"თქვენმა ორგანიზაციამ სამსახურის პროფილში სერტიფიცირების ორგანო დააინსტალირა. თქვენი ქსელის დაცული ტრაფიკი შეიძლება შეიცვალოს, ან მასზე მონიტორინგი განხორციელდეს."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"ამ მოწყობილობაზე დაინსტალირებულია სერტიფიცირების ორგანო. თქვენი ქსელის დაცული ტრაფიკი შეიძლება შეიცვალოს, ან მასზე მონიტორინგი განხორციელდეს."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"თქვენმა ადმინისტრატორმა ჩართო ქსელის ჟურნალირება, რომელიც თქვენი მოწყობილობის ტრაფიკის მონიტორინგს ახორციელებს."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"თქვენ დაკავშირებული ხართ <xliff:g id="VPN_APP">%1$s</xliff:g>-თან, რომელსაც შეუძლია თქვენი ქსელის აქტივობის (მათ შორის, ელფოსტის, აპებისა და ვებსაიტების) მონიტორინგი."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"თქვენ დაკავშირებული ხართ <xliff:g id="VPN_APP_0">%1$s</xliff:g>-სა და <xliff:g id="VPN_APP_1">%2$s</xliff:g>-თან, რომელთაც შეუძლია თქვენი ქსელის აქტივობის (მათ შორის, ელფოსტის, აპებისა და ვებსაიტების) მონიტორინგი."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"თქვენი სამსახურის პროფილი დაკავშირებულია <xliff:g id="VPN_APP">%1$s</xliff:g>-თან, რომელსაც შეუძლია თქვენი ქსელის აქტივობის (მათ შორის, ელფოსტის, აპებისა და ვებსაიტების) მონიტორინგი."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"თქვენი პირადი პროფილი დაკავშირებულია <xliff:g id="VPN_APP">%1$s</xliff:g>-თან, რომელსაც შეუძლია თქვენი ქსელის აქტივობის (მათ შორის, ელფოსტის, აპებისა და ვებსაიტების) მონიტორინგი."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"თქვენს მოწყობილობას მართავს <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -569,12 +559,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> და <xliff:g id="NUMBER_5">%3$d</xliff:g> სხვა</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> და <xliff:g id="NUMBER_2">%3$d</xliff:g> სხვა</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"შეტყობინებების მართვა „<xliff:g id="APP_NAME">%1$s</xliff:g>“-ისთვის გახსნილია"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"შეტყობინებების მართვა „<xliff:g id="APP_NAME">%1$s</xliff:g>“-ისთვის დახურულია"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"ამ არხიდან შეტყობინებების დაშვება"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"ყველა კატეგორია"</string>
<string name="notification_more_settings" msgid="816306283396553571">"დამატებითი პარამეტრები"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"მორგება: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -674,7 +661,7 @@
<string name="right_keycode" msgid="708447961000848163">"მარჯვენა კლავიშის კოდი"</string>
<string name="left_icon" msgid="3096287125959387541">"მარცხენა ხატულა"</string>
<string name="right_icon" msgid="3952104823293824311">"მარჯვენა ხატულა"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"ფილების დასამატებლად, გადაიტანეთ ჩავლებით"</string>
+ <string name="drag_to_add_tiles" msgid="7058945779098711293">"ფაილების დასამატებლად, გადაიტანეთ ჩავლებით"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"ამოსაშლელად, ჩავლებით გადმოიტანეთ აქ"</string>
<string name="qs_edit" msgid="2232596095725105230">"რედაქტირება"</string>
<string name="tuner_time" msgid="6572217313285536011">"დრო"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> შეტყობინება: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"აპმა შეიძლება არ იმუშაოს გაყოფილი ეკრანის რეჟიმში."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"ეკრანის გაყოფა არ არის მხარდაჭერილი აპის მიერ."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"აპმა შეიძლება არ იმუშაოს მეორეულ ეკრანზე."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"მეორეულ ეკრანზე გაშვება მხარდაუჭერელია აპის მიერ."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"პარამეტრების გახსნა."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"სწრაფი პარამეტრების გახსნა."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"სწრაფი პარამეტრების დახურვა."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"მენიუ „გამოსახულება გამოსახულებაში“"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> იყენებს რეჟიმს „გამოსახულება გამოსახულებაში“"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"თუ არ გსურთ, რომ <xliff:g id="NAME">%s</xliff:g> ამ ფუნქციას იყენებდეს, აქ შეხებით შეგიძლიათ გახსნათ პარამეტრები და გამორთოთ."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"დაკვრა"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"დაპაუზება"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"შემდეგზე გადასვლა"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"წინაზე გადასვლა"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"ტელეფონი გამოირთო გაცხელების გამო"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"თქვენი ტელეფონი ახლა ჩვეულებრივად მუშაობს"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"თქვენი ტელეფონი გამოირთო გასაგრილებლად, რადგან ის მეტისმეტად გაცხელდა. ახლა ის ჩვეულებრივად მუშაობს.\n\nტელეფონის გაცხელების მიზეზებია:\n • რესურსტევადი აპების გამოყენება (მაგ. სათამაშო, ვიდეო ან ნავიგაციის აპების)\n • დიდი ფაილების ჩამოტვირთვა ან ატვირთვა\n • ტელეფონის გამოყენება მაღალი ტემპერატურისას"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"მყისიერი აპები"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"მყისიერი აპები ინსტალაციას არ საჭიროებს."</string>
<string name="app_info" msgid="6856026610594615344">"აპის შესახებ"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"ვებზე გადასვლა"</string>
<string name="mobile_data" msgid="7094582042819250762">"მობილური ინტერნეტი"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi გამორთულია"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth გამორთულია"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 75aa5e3..eaffc9e 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Мобильдік деректер өшірулі"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth тетеринг."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Ұшақ режимі."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN қосулы."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM картасы жоқ."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Оператор желісі өзгертілуде."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Батарея мәліметтерін ашу"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Жұмыс профилі <xliff:g id="VPN_APP">%1$s</xliff:g> қолданбасына қосылған"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Жеке профиль <xliff:g id="VPN_APP">%1$s</xliff:g> қолданбасына қосылған"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Құрылғы <xliff:g id="VPN_APP">%1$s</xliff:g> қолданбасына қосылған"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Құрылғыны басқару"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Профильді бақылау"</string>
<string name="monitoring_title" msgid="169206259253048106">"Желіні бақылау"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN (Виртуалды жеке желі)"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN функциясын өшіру"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN желісін ажырату"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Саясаттарды көру"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Құрылғыңызды <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> басқарады.\n\nӘкімші параметрлерді, корпоративтік кіру құқығын, қолданбаларды, құрылғыңызбен байланысты деректерді және құрылғыңыздың орналасқан жері туралы ақпаратты бақылай және басқара алады.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Құрылғыңызды ұйымыңыз басқарады.\n\nӘкімші параметрлерді, корпоративтік кіру құқығын, қолданбаларды, құрылғыңызбен байланысты деректерді және құрылғыңыздың орналасқан жері туралы ақпаратты бақылай және басқара алады.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Ұйымыңыз осы құрылғыда сертификат орнатқан. Қорғалған желі трафигіңіз бақылануы немесе өзгертілуі мүмкін."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Ұйымыңыз жұмыс профиліңізде сертификат орнатқан. Қорғалған желі трафигіңіз бақылануы немесе өзгертілуі мүмкін."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Осы құрылғыда сертификат орнатылған. Қорғалған желі трафигіңіз бақылануы немесе өзгертілуі мүмкін."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Әкімші құрылғыңыздағы трафикті бақылайтын желі журналын жүргізуді қосқан."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Желідегі әрекеттеріңізді, соның ішінде электрондық хабарларды, қолданбаларды және вебсайттарды бақылай алатын <xliff:g id="VPN_APP">%1$s</xliff:g> желісіне қосылдыңыз."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Желідегі әрекеттеріңізді, соның ішінде электрондық хабарларды, қолданбаларды және вебсайттарды бақылай алатын <xliff:g id="VPN_APP_0">%1$s</xliff:g> және <xliff:g id="VPN_APP_1">%2$s</xliff:g> желілеріне қосылдыңыз."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Жұмыс профиліңіз желідегі белсенділігіңізді, соның ішінде электрондық хабарларды, қолданбаларды және веб-сайттарды бақылай алатын <xliff:g id="VPN_APP">%1$s</xliff:g> қолданбасына қосылған."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Жеке профиліңіз желідегі белсенділігіңізді, соның ішінде электрондық хабарларды, қолданбаларды және веб-сайттарды бақылай алатын <xliff:g id="VPN_APP">%1$s</xliff:g> қолданбасына қосылған."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Құрылғыңызды <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> басқарады."</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> хабарландыруы: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Қолданба бөлінген экранда жұмыс істемеуі мүмкін."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Қодланба бөлінген экранды қолдамайды."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Қолданба қосымша дисплейде жұмыс істемеуі мүмкін."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Қолданба қосымша дисплейлерде іске қосуды қолдамайды."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Параметрлерді ашу."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Жылдам параметрлерді ашу."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Жылдам параметрлерді жабу."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Лездік қолданбаларды орнатудың қажеті жоқ."</string>
<string name="app_info" msgid="6856026610594615344">"Қолданба ақпараты"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Вебке өту"</string>
<string name="mobile_data" msgid="7094582042819250762">"Мобильдік деректер"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi өшірулі"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth өшірулі"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index eb351b3..138276f 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -152,14 +152,12 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"វ៉ាយហ្វាយ"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"គ្មានស៊ីមកាត។"</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"ទិន្នន័យទូរសព្ទចល័ត"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"ទិន្នន័យទូរសព្ទចល័តបានបើក"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"ទិន្នន័យទូរសព្ទចល័តបានបិទ"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ការភ្ជាប់ប៊្លូធូស។"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"របៀបពេលជិះយន្តហោះ"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"បើក VPN ។"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"គ្មានស៊ីមកាតទេ។"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"ការប្តូរបណ្តាញក្រុមហ៊ុនផ្តល់សេវា។"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"បើកព័ត៌មានលម្អិតអំពីថ្ម"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"កំពុងសាកថ្ម"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"ទិន្នន័យ 2G-3G ត្រូវបានផ្អាក"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"ទិន្នន័យ 4G ត្រូវបានផ្អាក"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"ទិន្នន័យទូរសព្ទចល័តបានផ្អាក"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"ទិន្នន័យត្រូវបានផ្អាក"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"បានឈានដល់កម្រិតទិន្នន័យដែលអ្នកបានកំណត់ហើយ។ ឥឡូវអ្នកមិនប្រើទិន្នន័យទូរសព្ទចល័តទៀតទេ។\n\nអាចនឹងគិតថ្លៃលើការប្រើទិន្នន័យ ប្រសិនបើអ្នកបន្តប្រើឡើងវិញ។"</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"បន្ត"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"គ្មានការតភ្ជាប់អ៊ីនធឺណិត"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"បានភ្ជាប់វ៉ាយហ្វាយ"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ហតស្ប៉ត"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"ការជូនដំណឹង"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ពិល"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"ទិន្នន័យទូរសព្ទចល័ត"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ការប្រើទិន្នន័យ"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ទិន្នន័យនៅសល់"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"លើសដែនកំណត់"</string>
@@ -350,16 +345,16 @@
<string-array name="recents_blacklist_array">
</string-array>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"បានបញ្ចូលថ្ម"</string>
- <string name="expanded_header_battery_charging" msgid="205623198487189724">"កំពុងបញ្ចូលថ្ម"</string>
+ <string name="expanded_header_battery_charging" msgid="205623198487189724">"កំពុងសាកថ្ម"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> រហូតដល់ពេញ"</string>
<string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"មិនកំពុងបញ្ចូលថ្ម"</string>
<string name="ssl_ca_cert_warning" msgid="9005954106902053641">"បណ្ដាញអាច\nត្រូវបានត្រួតពិនិត្យ"</string>
<string name="description_target_search" msgid="3091587249776033139">"ស្វែងរក"</string>
<string name="description_direction_up" msgid="7169032478259485180">"រុញឡើងលើដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
<string name="description_direction_left" msgid="7207478719805562165">"រុញទៅឆ្វេងដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
- <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_voice" msgid="2284540992298200729">"វារារាំងសំឡេង និងរំញ័រទាំងអស់ ដោយរួមបញ្ចូលទាំងសំឡេងរោទិ៍ តន្ត្រី វីដេអូ និងហ្គេម។ អ្នកនឹងនៅតែអាចធ្វើការហៅទូរស័ព្ទបានដដែល។"</string>
+ <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"វារារាំងសំឡេង និងរំញ័រទាំងអស់ ដោយរួមបញ្ចូលទាំងសំឡេងរោទ៍ តន្ត្រី វីដេអូ និងហ្គេម។ អ្នកនឹងនៅតែអាចធ្វើការហៅទូរសព្ទបានដដែល។"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"វារារាំងសំឡេង និងរំញ័រទាំងអស់ដែលចេញពីម៉ោងរោទិ៍ តន្ត្រី វីដេអូ និងហ្គេម។"</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>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"កម្រងព័ត៌មានការងារត្រូវបានភ្ជាប់ទៅ <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"កម្រងព័ត៌មានផ្ទាល់ខ្លួនត្រូវបានភ្ជាប់ទៅ <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"ឧបករណ៍ត្រូវបានភ្ជាប់ទៅ <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"ការគ្រប់គ្រងឧបករណ៍"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"តាមដានប្រវត្ថិរូប"</string>
<string name="monitoring_title" msgid="169206259253048106">"ការត្រួតពិនិត្យបណ្ដាញ"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"បិទ VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"ផ្ដាច់ VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"មើលគោលការណ៍"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"ឧបករណ៍របស់អ្នកស្ថិតក្រោមការគ្រប់គ្រងរបស់ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>។\n\nអ្នកគ្រប់គ្រងរបស់អ្នកអាចតាមដាន និងគ្រប់គ្រងការកំណត់ ការចូលប្រើជាលក្ខណៈក្រុមហ៊ុន កម្មវិធី ទិន្នន័យដែលពាក់ព័ន្ធនឹងឧបករណ៍របស់អ្នក និងព័ត៌មានទីតាំងនៃឧបករណ៍របស់អ្នក។\n\nសម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។"</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"ឧបករណ៍របស់អ្នកស្ថិតក្រោមការគ្រប់គ្រងរបស់ស្ថាប័នអ្នក។\n\nអ្នកគ្រប់គ្រងរបស់អ្នកអាចតាមដាន និងគ្រប់គ្រងការកំណត់ ការចូលប្រើជាលក្ខណៈក្រុមហ៊ុន កម្មវិធី ទិន្នន័យដែលពាក់ព័ន្ធនឹងឧបករណ៍របស់អ្នក និងព័ត៌មានទីតាំងនៃឧបករណ៍របស់អ្នក។\n\nសម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។"</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"ស្ថាប័នរបស់អ្នកបានដំឡើងអាជ្ញាធរវិញ្ញាបនបត្រនៅលើឧបករណ៍នេះ។ ចរាចរណ៍បណ្តាញដែលមានសុវត្ថិភាពរបស់អ្នកអាចត្រូវបានតាមដាន ឬកែសម្រួល។"</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"ស្ថាប័នរបស់អ្នកបានដំឡើងអាជ្ញាធរវិញ្ញាបនបត្រនៅក្នុងកម្រងព័ត៌មានការងារ។ ចរាចរណ៍បណ្តាញដែលមានសុវត្ថិភាពរបស់អ្នកអាចត្រូវបានតាមដាន ឬកែសម្រួល។"</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"បានដំឡើងអាជ្ញាធរវិញ្ញាបនបត្រនៅលើឧបករណ៍នេះ។ ចរាចរណ៍បណ្តាញដែលមានសុវត្ថិភាពរបស់អ្នកអាចត្រូវបានតាមដាន ឬកែសម្រួល។"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"អ្នកគ្រប់គ្រងរបស់អ្នកបានបើកការធ្វើកំណត់ហេតុបណ្តាញ ដែលនឹងតាមដានចរាចរណ៍នៅលើឧបករណ៍របស់អ្នក។"</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"អ្នកបានភ្ជាប់ទៅ <xliff:g id="VPN_APP">%1$s</xliff:g> ដែលអាចតាមដានសកម្មភាពក្នុងបណ្តាញរបស់អ្នក រួមទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រផងដែរ។"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"អ្នកបានភ្ជាប់ទៅ <xliff:g id="VPN_APP_0">%1$s</xliff:g> និង <xliff:g id="VPN_APP_1">%2$s</xliff:g> ដែលអាចតាមដានសកម្មភាពបណ្តាញរបស់អ្នក រួមទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រផងដែរ។"</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"កម្រងព័ត៌មានការងាររបស់អ្នកត្រូវបានភ្ជាប់ទៅ <xliff:g id="VPN_APP">%1$s</xliff:g> ដែលអាចតាមដានសកម្មភាពបណ្តាញរបស់អ្នក រួមទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រផងដែរ។"</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"កម្រងព័ត៌មានផ្ទាល់ខ្លួនរបស់អ្នកត្រូវបានភ្ជាប់ទៅ <xliff:g id="VPN_APP">%1$s</xliff:g> ដែលអាចតាមដានសកម្មភាពបណ្តាញរបស់អ្នក រួមទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រផងដែរ។"</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"ឧបករណ៍របស់អ្នកគ្រប់គ្រងដោយ <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> ។"</string>
@@ -569,12 +559,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, និង <xliff:g id="NUMBER_5">%3$d</xliff:g> ផ្សេងទៀត</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g>, និង <xliff:g id="NUMBER_2">%3$d</xliff:g> ផ្សេងទៀត</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"ការគ្រប់គ្រងការជូនដំណឹងសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g> បានបើក"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"ការគ្រប់គ្រងការជូនដំណឹងសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g> បានបិទ"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"អនុញ្ញាតឲ្យមានការជូនដំណឹងពីប៉ុស្តិ៍នេះ"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"ប្រភេទទាំងអស់"</string>
<string name="notification_more_settings" msgid="816306283396553571">"ការកំណត់ច្រើនទៀត"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"ប្ដូរតាមបំណង៖ <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> ការជូនដំណឹង៖ <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"កម្មវិធីអាចនឹងមិនដំណើរការនៅលើអេក្រង់បំបែកទេ"</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"កម្មវិធីមិនគាំទ្រអេក្រង់បំបែកជាពីរទេ"</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"កម្មវិធីនេះប្រហែលជាមិនដំណើរការនៅលើអេក្រង់បន្ទាប់បន្សំទេ។"</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"កម្មវិធីនេះមិនអាចចាប់ផ្តើមបានទេ ដោយសារអេក្រង់បន្ទាប់បន្សំមិនស្គាល់វា។"</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"បើកការកំណត់"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"បើកការកំណត់រហ័ស"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"បិទការកំណត់រហ័ស"</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"ម៉ឺនុយរូបភាពក្នុងរូបភាព"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ស្ថិតក្នុងមុខងាររូបភាពក្នុងរូបភាព"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"ប្រសិនបើអ្នកមិនចង់ឲ្យ <xliff:g id="NAME">%s</xliff:g> ប្រើមុខងារនេះទេ សូមចុចដើម្បីបើកការកំណត់ រួចបិទវា។"</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"លេង"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"ផ្អាក"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"រំលងទៅបន្ទាប់"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"រំលងទៅក្រោយ"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"ទូរសព្ទបានបិទដោយសារវាឡើងកម្តៅ"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"ឥឡូវនេះទូរសព្ទរបស់អ្នកកំពុងដំណើរការធម្មតា"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"ទូរសព្ទរបស់អ្នកក្តៅពេក ដូច្នេះវាបានបិទដើម្បីបន្ថយកម្តៅ។ ឥឡូវនេះ ទូរសព្ទរបស់អ្នកកំពុងដំណើរការធម្មតា។\n\nទូរសព្ទរបស់អ្នកអាចនឹងឡើងកម្តៅខ្លាំងជ្រុល ប្រសិនបើអ្នក៖\n • ប្រើប្រាស់កម្មវិធីដែលប្រើប្រាស់ទិន្នន័យច្រើនក្នុងរយៈពេលខ្លី (ដូចជាហ្គេម វីដេអូ ឬកម្មវិធីរុករក)\n • ទាញយក ឬបង្ហោះឯកសារដែលមានទំហំធំ\n • ប្រើប្រាស់ទូរសព្ទរបស់អ្នកនៅកន្លែងមានសីតុណ្ហភាពខ្ពស់"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"កម្មវិធីប្រើភ្លាមៗ"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"កម្មវិធីប្រើភ្លាមៗមិនតម្រូវឲ្យមានការដំឡើងទេ។"</string>
<string name="app_info" msgid="6856026610594615344">"ព័ត៌មានកម្មវិធី"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"ចូលទៅកាន់បណ្តាញ"</string>
<string name="mobile_data" msgid="7094582042819250762">"ទិន្នន័យចល័ត"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi បានបិទ"</string>
<string name="bt_is_off" msgid="2640685272289706392">"ប៊្លូធូសបានបិទ"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index f17b3af..39fe3e5 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -24,7 +24,7 @@
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ಪಟ್ಟಿಯಿಂದ ತೆಗೆದುಹಾಕು"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಪರದೆಗಳು ಇಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ಇತ್ತೀಚಿನ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ವಜಾಗೊಳಿಸು"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ಇತ್ತೀಚಿನ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ವಜಾಗೊಳಿಸಿ"</string>
<plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
<item quantity="one">ಸಮಗ್ರ ನೋಟದಲ್ಲಿರುವ %d ಪರದೆಗಳು</item>
<item quantity="other">ಸಮಗ್ರ ನೋಟದಲ್ಲಿರುವ %d ಪರದೆಗಳು</item>
@@ -40,7 +40,7 @@
<string name="invalid_charger_text" msgid="5474997287953892710">"ಒದಗಿಸಿರುವ ಚಾರ್ಜರ್ ಮಾತ್ರ ಬಳಸಿ."</string>
<string name="battery_low_why" msgid="4553600287639198111">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="battery_saver_confirmation_title" msgid="5299585433050361634">"ಬ್ಯಾಟರಿ ಉಳಿತಾಯವನ್ನು ಆನ್ ಮಾಡುವುದೇ?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"ಆನ್ ಮಾಡು"</string>
+ <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"ಆನ್ ಮಾಡಿ"</string>
<string name="battery_saver_start_action" msgid="5576697451677486320">"ಬ್ಯಾಟರಿ ಉಳಿತಾಯವನ್ನು ಆನ್ ಮಾಡಿ"</string>
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"ವೈ-ಫೈ"</string>
@@ -152,14 +152,12 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"ಎಡ್ಜ್"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"ವೈ-ಫೈ"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"ಯಾವುದೇ ಸಿಮ್ ಇಲ್ಲ."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"ಮೊಬೈಲ್ ಡೇಟಾ"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"ಮೊಬೈಲ್ ಡೇಟಾ ಆನ್"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"ಮೊಬೈಲ್ ಡೇಟಾ ಆಫ್"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ಬ್ಲೂಟೂತ್ ಟೆಥರಿಂಗ್."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ಏರೋಪ್ಲೇನ್ ಮೋಡ್"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"ನಲ್ಲಿ VPN"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"ಯಾವುದೇ ಸಿಮ್ ಇಲ್ಲ."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"ವಾಹಕ ನೆಟ್ವರ್ಕ್ ಬದಲಾಯಿಸುವಿಕೆ."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"ಬ್ಯಾಟರಿ ವಿವರಗಳನ್ನು ತೆರೆಯಿರಿ"</string>
@@ -177,7 +175,7 @@
<!-- no translation found for accessibility_casting (6887382141726543668) -->
<skip />
<string name="accessibility_work_mode" msgid="2478631941714607225">"ಕೆಲಸದ ಮೋಡ್"</string>
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> ವಜಾಗೊಳಿಸು."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> ವಜಾಗೊಳಿಸಿ."</string>
<string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ವಜಾಗೊಳಿಸಲಾಗಿದೆ."</string>
<string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ಇತ್ತೀಚಿನ ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ವಜಾಗೊಳಿಸಲಾಗಿದೆ."</string>
<string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ ತೆರೆಯಿರಿ."</string>
@@ -242,17 +240,15 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ಡೇಟಾವನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ಡೇಟಾ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"ಡೇಟಾ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"ಡೇಟಾ ಬಳಕೆಯು ನೀವು ಹೊಂದಿಸಿರುವ ಮಿತಿಯನ್ನು ತಲುಪಿದೆ. ಹೀಗಾಗಿ ನೀವು ಈಗ ಮೊಬೈಲ್ ಡೇಟಾ ಬಳಸುತ್ತಿಲ್ಲ.\n\nನೀವು ಮುಂದುವರಿದರೆ, ಡೇಟಾ ಬಳಕೆಗೆ ಶುಲ್ಕ ತೆರಬೇಕಾಗಬಹುದು."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"ಮುಂದುವರಿಸು"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವಿಲ್ಲ"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"ವೈ-ಫೈ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS ಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"ಸ್ಥಾನವನ್ನು GPS ಮೂಲಕ ಹೊಂದಿಸಲಾಗಿದೆ"</string>
- <string name="accessibility_location_active" msgid="2427290146138169014">"ಸ್ಥಾನ ವಿನಂತಿಗಳು ಸಕ್ರಿಯವಾಗಿವೆ"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"ಸ್ಥಳ ವಿನಂತಿಗಳು ಸಕ್ರಿಯವಾಗಿವೆ"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"ಎಲ್ಲಾ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೆರವುಗೊಳಿಸು."</string>
<string name="notification_group_overflow_indicator" msgid="1863231301642314183">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string>
<plurals name="notification_group_overflow_description" formatted="false" msgid="4579313201268495404">
@@ -286,8 +282,8 @@
<string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"ಪೋಟ್ರೇಟ್"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"ಲ್ಯಾಂಡ್ಸ್ಕೇಪ್"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"ಇನ್ಪುಟ್ ವಿಧಾನ"</string>
- <string name="quick_settings_location_label" msgid="5011327048748762257">"ಸ್ಥಾನ"</string>
- <string name="quick_settings_location_off_label" msgid="7464544086507331459">"ಸ್ಥಾನ ಆಫ್ ಆಗಿದೆ"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"ಸ್ಥಳ"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"ಸ್ಥಳ ಆಫ್ ಆಗಿದೆ"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"ಮಾಧ್ಯಮ ಸಾಧನ"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"ತುರ್ತು ಕರೆಗಳು ಮಾತ್ರ"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ಹಾಟ್ಸ್ಪಾಟ್"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"ಅಧಿಸೂಚನೆಗಳು"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ಫ್ಲಾಶ್ಲೈಟ್"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"ಮೊಬೈಲ್ ಡೇಟಾ"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ಡೇಟಾ ಬಳಕೆ"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ಉಳಿದಿರುವ ಡೇಟಾ"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"ಮಿತಿ ಮೀರಿದೆ"</string>
@@ -359,8 +354,8 @@
<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_voice" msgid="2284540992298200729">"ಇದು ಅಲಾರಮ್ಗಳು, ಸಂಗೀತ, ವೀಡಿಯೊಗಳು, ಮತ್ತು ಆಟಗಳು ಸೇರಿದಂತೆ ಎಲ್ಲಾ ಧ್ವನಿಗಳು ಮತ್ತು ವೈಬ್ರೇಶನ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ. ನಿಮಗೆ ಈಗಲೂ ಫೋನ್ ಕರೆಗಳನ್ನು ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ."</string>
- <string name="zen_silence_introduction" msgid="3137882381093271568">"ಇದು ಅಲಾರಮ್ಗಳು, ಸಂಗೀತ, ವೀಡಿಯೊಗಳು, ಮತ್ತು ಆಟಗಳು ಸೇರಿದಂತೆ ಎಲ್ಲಾ ಧ್ವನಿಗಳು ಮತ್ತು ವೈಬ್ರೇಶನ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ."</string>
+ <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"ಇದು ಅಲಾರಮ್ಗಳು, ಸಂಗೀತ, ವೀಡಿಯೊಗಳು, ಮತ್ತು ಗೇಮ್ಗಳು ಸೇರಿದಂತೆ ಎಲ್ಲಾ ಧ್ವನಿಗಳು ಮತ್ತು ವೈಬ್ರೇಶನ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ. ನಿಮಗೆ ಈಗಲೂ ಫೋನ್ ಕರೆಗಳನ್ನು ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ."</string>
+ <string name="zen_silence_introduction" msgid="3137882381093271568">"ಇದು ಅಲಾರಮ್ಗಳು, ಸಂಗೀತ, ವೀಡಿಯೊಗಳು, ಮತ್ತು ಗೇಮ್ಗಳು ಸೇರಿದಂತೆ ಎಲ್ಲಾ ಧ್ವನಿಗಳು ಮತ್ತು ವೈಬ್ರೇಶನ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ."</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="7590196980943943842">"ತೆರೆಯಲು ಮತ್ತೆ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ಅನ್ನು <xliff:g id="VPN_APP">%1$s</xliff:g> ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"ವೈಯಕ್ತಿಕ ಪ್ರೊಫೈಲ್ ಅನ್ನು <xliff:g id="VPN_APP">%1$s</xliff:g> ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"<xliff:g id="VPN_APP">%1$s</xliff:g> ಗೆ ಸಾಧನವನ್ನು ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"ಸಾಧನ ನಿರ್ವಹಣೆ"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ಪ್ರೊಫೈಲ್ ಮೇಲ್ವಿಚಾರಣೆ"</string>
<string name="monitoring_title" msgid="169206259253048106">"ನೆಟ್ವರ್ಕ್ ಪರಿವೀಕ್ಷಣೆ"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN ಸಂಪರ್ಕಕಡಿತಗೊಳಿಸಿ"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"ಕಾರ್ಯನೀತಿಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"ನಿಮ್ಮ ಸಾಧನವನ್ನು <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ನಿರ್ವಹಿಸುತ್ತಿದೆ.\n\nಸೆಟ್ಟಿಂಗ್ಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ಅಪ್ಲಿಕೇಶನ್ಗಳು, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾ ಮತ್ತು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"ನಿಮ್ಮ ಸಾಧನವನ್ನು ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ನಿರ್ವಹಿಸುತ್ತಿದೆ.\n\nಸೆಟ್ಟಿಂಗ್ಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ಅಪ್ಲಿಕೇಶನ್ಗಳು, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾ, ಮತ್ತು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ಈ ಸಾಧನದಲ್ಲಿ ಪ್ರಮಾಣಪತ್ರ ಅಂಗೀಕಾರವನ್ನು ಸ್ಥಾಪಿಸಿದೆ. ನಿಮ್ಮ ಸುರಕ್ಷಿತ ನೆಟ್ವರ್ಕ್ ಟ್ರಾಫಿಕ್ ಅನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಅಥವಾ ಮಾರ್ಪಡಿಸಬಹುದು."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ನಲ್ಲಿ ಪ್ರಮಾಣಪತ್ರ ಅಂಗೀಕಾರವನ್ನು ಸ್ಥಾಪಿಸಿದೆ. ನಿಮ್ಮ ಸುರಕ್ಷಿತ ನೆಟ್ವರ್ಕ್ ಟ್ರಾಫಿಕ್ ಅನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಅಥವಾ ಮಾರ್ಪಡಿಸಬಹುದು."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"ಈ ಸಾಧನದಲ್ಲಿ ಪ್ರಮಾಣಪತ್ರ ಅಂಗೀಕಾರವನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿದೆ. ನಿಮ್ಮ ಸುರಕ್ಷಿತ ನೆಟ್ವರ್ಕ್ ಟ್ರಾಫಿಕ್ ಅನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಅಥವಾ ಮಾರ್ಪಡಿಸಬಹುದು."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನೆಟ್ವರ್ಕ್ ಲಾಗಿಂಗ್ ಆನ್ ಮಾಡಿದ್ದಾರೆ. ಇದು ನಿಮ್ಮ ಸಾಧನದ ಟ್ರಾಫಿಕ್ ಅನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುತ್ತದೆ."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"ನೀವು <xliff:g id="VPN_APP">%1$s</xliff:g> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದ್ದೀರಿ. ಇದು ನಿಮ್ಮ ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳೂ ಸೇರಿದಂತೆ ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"ನೀವು <xliff:g id="VPN_APP_0">%1$s</xliff:g> ಹಾಗೂ <xliff:g id="VPN_APP_1">%2$s</xliff:g> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದ್ದೀರಿ. ಇವು ನಿಮ್ಮ ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳೂ ಸೇರಿದಂತೆ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ <xliff:g id="VPN_APP">%1$s</xliff:g> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ. ಇದು ನಿಮ್ಮ ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳೂ ಸೇರಿದಂತೆ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಪ್ರೊಫೈಲ್ <xliff:g id="VPN_APP">%1$s</xliff:g> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ. ಇದು ನಿಮ್ಮ ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳೂ ಸೇರಿದಂತೆ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"ನಿಮ್ಮ ಸಾಧನವನ್ನು <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> ನಿಂದ ನಿರ್ವಹಿಸಲಾಗಿದೆ."</string>
@@ -495,7 +485,7 @@
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ಮರೆಮಾಡಿ"</string>
<string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ನೀವು ಬಳಸುತ್ತಿರುವಿರಿ"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"ಕರೆಮಾಡಿ"</string>
- <string name="stream_system" msgid="7493299064422163147">"ಸಿಸ್ಟಮ್"</string>
+ <string name="stream_system" msgid="7493299064422163147">"ಸಿಸ್ಟಂ"</string>
<string name="stream_ring" msgid="8213049469184048338">"ರಿಂಗ್"</string>
<string name="stream_music" msgid="9086982948697544342">"ಮಾಧ್ಯಮ"</string>
<string name="stream_alarm" msgid="5209444229227197703">"ಅಲಾರಮ್"</string>
@@ -510,7 +500,7 @@
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ವಾಲ್ಯೂಮ್ ನಿಯಂತ್ರಣಗಳನ್ನು ತೋರಿಸಲಾಗಿದೆ. ವಜಾಗೊಳಿಸಲು ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ವಾಲ್ಯೂಮ್ ನಿಯಂತ್ರಣಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ"</string>
- <string name="system_ui_tuner" msgid="708224127392452018">"ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್"</string>
+ <string name="system_ui_tuner" msgid="708224127392452018">"ಸಿಸ್ಟಂ UI ಟ್ಯೂನರ್"</string>
<string name="show_battery_percentage" msgid="5444136600512968798">"ಎಂಬೆಡ್ ಮಾಡಲಾದ ಬ್ಯಾಟರಿ ಶೇಕಡಾ ತೋರಿಸಿ"</string>
<string name="show_battery_percentage_summary" msgid="3215025775576786037">"ಚಾರ್ಜ್ ಮಾಡದಿರುವಾಗ ಸ್ಥಿತಿ ಪಟ್ಟಿ ಐಕಾನ್ ಒಳಗೆ ಬ್ಯಾಟರಿ ಮಟ್ಟದ ಶೇಕಡಾವನ್ನು ತೋರಿಸಿ"</string>
<string name="quick_settings" msgid="10042998191725428">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
@@ -533,12 +523,12 @@
<string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ಹಾಟ್ಸ್ಪಾಟ್"</string>
<string name="accessibility_managed_profile" msgid="6613641363112584120">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್"</string>
<string name="tuner_warning_title" msgid="7094689930793031682">"ಕೆಲವರಿಗೆ ಮೋಜು ಆಗಿದೆ ಎಲ್ಲರಿಗೆ ಇಲ್ಲ"</string>
- <string name="tuner_warning" msgid="8730648121973575701">"ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್ ನಿಮಗೆ Android ಬಳಕೆದಾರ ಅಂತರಸಂಪರ್ಕವನ್ನು ಸರಿಪಡಿಸಲು ಮತ್ತು ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ಹೆಚ್ಚುವರಿ ಮಾರ್ಗಗಳನ್ನು ನೀಡುತ್ತದೆ. ಈ ಪ್ರಾಯೋಗಿಕ ವೈಶಿಷ್ಟ್ಯಗಳು ಭವಿಷ್ಯದ ಬಿಡುಗಡೆಗಳಲ್ಲಿ ಬದಲಾಗಬಹುದು, ವಿರಾಮವಾಗಬಹುದು ಅಥವಾ ಕಾಣಿಸಿಕೊಳ್ಳದಿರಬಹುದು. ಎಚ್ಚರಿಕೆಯಿಂದ ಮುಂದುವರಿಯಿರಿ."</string>
+ <string name="tuner_warning" msgid="8730648121973575701">"ಸಿಸ್ಟಂ UI ಟ್ಯೂನರ್ ನಿಮಗೆ Android ಬಳಕೆದಾರ ಅಂತರಸಂಪರ್ಕವನ್ನು ಸರಿಪಡಿಸಲು ಮತ್ತು ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ಹೆಚ್ಚುವರಿ ಮಾರ್ಗಗಳನ್ನು ನೀಡುತ್ತದೆ. ಈ ಪ್ರಾಯೋಗಿಕ ವೈಶಿಷ್ಟ್ಯಗಳು ಭವಿಷ್ಯದ ಬಿಡುಗಡೆಗಳಲ್ಲಿ ಬದಲಾಗಬಹುದು, ವಿರಾಮವಾಗಬಹುದು ಅಥವಾ ಕಾಣಿಸಿಕೊಳ್ಳದಿರಬಹುದು. ಎಚ್ಚರಿಕೆಯಿಂದ ಮುಂದುವರಿಯಿರಿ."</string>
<string name="tuner_persistent_warning" msgid="8597333795565621795">"ಈ ಪ್ರಾಯೋಗಿಕ ವೈಶಿಷ್ಟ್ಯಗಳು ಭವಿಷ್ಯದ ಬಿಡುಗಡೆಗಳಲ್ಲಿ ಬದಲಾಗಬಹುದು, ವಿರಾಮವಾಗಬಹುದು ಅಥವಾ ಕಾಣಿಸಿಕೊಳ್ಳದಿರಬಹುದು. ಎಚ್ಚರಿಕೆಯಿಂದ ಮುಂದುವರಿಯಿರಿ."</string>
<string name="got_it" msgid="2239653834387972602">"ಅರ್ಥವಾಯಿತು"</string>
- <string name="tuner_toast" msgid="603429811084428439">"ಅಭಿನಂದನೆಗಳು! ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್ ಅನ್ನು ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಸೇರಿಸಲಾಗಿದೆ"</string>
+ <string name="tuner_toast" msgid="603429811084428439">"ಅಭಿನಂದನೆಗಳು! ಸಿಸ್ಟಂ UI ಟ್ಯೂನರ್ ಅನ್ನು ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಸೇರಿಸಲಾಗಿದೆ"</string>
<string name="remove_from_settings" msgid="8389591916603406378">"ಸೆಟ್ಟಿಂಗ್ಗಳಿಂದ ತೆಗೆದುಹಾಕಿ"</string>
- <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ಸೆಟ್ಟಿಂಗ್ಗಳಿಂದ ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್ ತೆಗೆದುಹಾಕುವುದೇ ಮತ್ತು ಅದರ ಎಲ್ಲಾ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಬಳಸುವುದನ್ನು ನಿಲ್ಲಿಸುವುದೇ?"</string>
+ <string name="remove_from_settings_prompt" msgid="6069085993355887748">"ಸೆಟ್ಟಿಂಗ್ಗಳಿಂದ ಸಿಸ್ಟಂ UI ಟ್ಯೂನರ್ ತೆಗೆದುಹಾಕುವುದೇ ಮತ್ತು ಅದರ ಎಲ್ಲಾ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಬಳಸುವುದನ್ನು ನಿಲ್ಲಿಸುವುದೇ?"</string>
<string name="activity_not_found" msgid="348423244327799974">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿಲ್ಲ"</string>
<string name="clock_seconds" msgid="7689554147579179507">"ಗಡಿಯಾರದ ಸೆಕೆಂಡುಗಳನ್ನು ತೋರಿಸು"</string>
<string name="clock_seconds_desc" msgid="6282693067130470675">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯಲ್ಲಿ ಗಡಿಯಾರ ಸೆಕೆಂಡುಗಳನ್ನು ತೋರಿಸು. ಇದಕ್ಕೆ ಬ್ಯಾಟರಿ ಬಾಳಿಕೆಯು ಪರಿಣಾಮಬೀರಬಹುದು."</string>
@@ -547,7 +537,7 @@
<string name="experimental" msgid="6198182315536726162">"ಪ್ರಾಯೋಗಿಕ"</string>
<string name="enable_bluetooth_title" msgid="5027037706500635269">"ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡುವುದೇ?"</string>
<string name="enable_bluetooth_message" msgid="9106595990708985385">"ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ ಅನ್ನು ಟ್ಯಾಬ್ಲೆಟ್ಗೆ ಸಂಪರ್ಕಿಸಲು, ನೀವು ಮೊದಲು ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ."</string>
- <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"ಆನ್ ಮಾಡು"</string>
+ <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"ಆನ್ ಮಾಡಿ"</string>
<string name="show_silently" msgid="6841966539811264192">"ಸ್ಥಬ್ಧವಾಗಿ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸಿ"</string>
<string name="block" msgid="2734508760962682611">"ಎಲ್ಲಾ ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ"</string>
<string name="do_not_silence" msgid="6878060322594892441">"ಮೌನವಾಗಿಸಬೇಡಿ"</string>
@@ -569,12 +559,9 @@
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, ಮತ್ತು ಇತರ <xliff:g id="NUMBER_5">%3$d</xliff:g></item>
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, ಮತ್ತು ಇತರ <xliff:g id="NUMBER_5">%3$d</xliff:g></item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನ ಅಧಿಸೂಚನೆ ನಿಯಂತ್ರಣಗಳನ್ನು ತೆರೆಯಲಾಗಿದೆ"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನ ಅಧಿಸೂಚನೆ ನಿಯಂತ್ರಣಗಳನ್ನು ಮುಚ್ಚಲಾಗಿದೆ"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"ಈ ಚಾನಲ್ನ ಅಧಿಸೂಚನೆಗಳಿಗೆ ಅನುಮತಿ ನೀಡಿ"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"ಎಲ್ಲ ವರ್ಗಗಳು"</string>
<string name="notification_more_settings" msgid="816306283396553571">"ಹೆಚ್ಚಿನ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"ಕಸ್ಟಮೈಸ್: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -700,9 +687,9 @@
<string name="accessibility_action_divider_top_50" msgid="6385859741925078668">"50% ಮೇಲಕ್ಕೆ"</string>
<string name="accessibility_action_divider_top_30" msgid="6201455163864841205">"30% ಮೇಲಕ್ಕೆ"</string>
<string name="accessibility_action_divider_bottom_full" msgid="301433196679548001">"ಕೆಳಗಿನ ಪೂರ್ಣ ಪರದೆ"</string>
- <string name="accessibility_qs_edit_tile_label" msgid="8374924053307764245">"ಸ್ಥಾನ <xliff:g id="POSITION">%1$d</xliff:g>, <xliff:g id="TILE_NAME">%2$s</xliff:g>. ಎಡಿಟ್ ಮಾಡಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <string name="accessibility_qs_edit_tile_label" msgid="8374924053307764245">"ಸ್ಥಳ <xliff:g id="POSITION">%1$d</xliff:g>, <xliff:g id="TILE_NAME">%2$s</xliff:g>. ಎಡಿಟ್ ಮಾಡಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="accessibility_qs_edit_add_tile_label" msgid="8133209638023882667">"<xliff:g id="TILE_NAME">%1$s</xliff:g>. ಸೇರಿಸಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <string name="accessibility_qs_edit_position_label" msgid="5055306305919289819">"ಸ್ಥಾನ <xliff:g id="POSITION">%1$d</xliff:g>. ಆಯ್ಕೆಮಾಡಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <string name="accessibility_qs_edit_position_label" msgid="5055306305919289819">"ಸ್ಥಳ <xliff:g id="POSITION">%1$d</xliff:g>. ಆಯ್ಕೆಮಾಡಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="accessibility_qs_edit_move_tile" msgid="2461819993780159542">"<xliff:g id="TILE_NAME">%1$s</xliff:g> ಸರಿಸಿ"</string>
<string name="accessibility_qs_edit_remove_tile" msgid="7484493384665907197">"<xliff:g id="TILE_NAME">%1$s</xliff:g> ತೆಗೆದುಹಾಕಿ"</string>
<string name="accessibility_qs_edit_tile_added" msgid="8050200862063548309">"<xliff:g id="POSITION">%2$d</xliff:g> ಸ್ಥಾನಕ್ಕೆ <xliff:g id="TILE_NAME">%1$s</xliff:g> ಸೇರಿಸಲಾಗಿದೆ"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> ಅಧಿಸೂಚನೆ: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"ವಿಭಜಿಸಿದ ಪರದೆಯಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ಕೆಲಸ ಮಾಡದೇ ಇರಬಹುದು."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"ಅಪ್ಲಿಕೇಶನ್ ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"ಎರಡನೇ ಡಿಸ್ಪ್ಲೇಗಳಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ಕೆಲಸ ಮಾಡದೇ ಇರಬಹುದು."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"ಎರಡನೇ ಡಿಸ್ಪ್ಲೇಗಳಲ್ಲಿ ಪ್ರಾರಂಭಿಸುವಿಕೆಯನ್ನು ಅಪ್ಲಿಕೇಶನ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಮುಚ್ಚಿ."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ ಮೆನು"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ಚಿತ್ರದಲ್ಲಿನ ಚಿತ್ರದಲ್ಲಿದೆ"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> ಈ ವೈಶಿಷ್ಟ್ಯ ಬಳಸುವುದನ್ನು ನೀವು ಬಯಸದಿದ್ದರೆ, ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆದು, ಅದನ್ನು ಆಫ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"ಪ್ಲೇ"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"ವಿರಾಮಗೊಳಿಸಿ"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"ಮುಂದಕ್ಕೆ ಸ್ಕಿಪ್ ಮಾಡಿ"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"ಹಿಂದಕ್ಕೆ ಸ್ಕಿಪ್ ಮಾಡಿ"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"ಫೋನ್ ಬಿಸಿಯಾಗಿದ್ದರಿಂದ ಆಫ್ ಆಗಿದೆ"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"ಈಗ ನಿಮ್ಮ ಫೋನ್ ಎಂದಿನಂತೆ ಕೆಲಸ ಮಾಡುತ್ತಿದೆ"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"ನಿಮ್ಮ ಫೋನ್ ತುಂಬಾ ಬಿಸಿಯಾಗಿತ್ತು, ತಣ್ಣಗಾಗಲು ಅದು ತಾನಾಗಿ ಆಫ್ ಆಗಿದೆ. ಈಗ ನಿಮ್ಮ ಫೋನ್ ಎಂದಿನಂತೆ ಕೆಲಸ ಮಾಡುತ್ತಿದೆ.\n\nನಿಮ್ಮ ಫೋನ್ ಬಿಸಿಯಾಗಲು ಕಾರಣಗಳು:\n • ಹೆಚ್ಚು ಸಂಪನ್ಮೂಲ ಉಪಯೋಗಿಸುವ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಬಳಕೆ (ಉದಾ, ಗೇಮಿಂಗ್, ವೀಡಿಯೊ/ನ್ಯಾವಿಗೇಶನ್ ಅಪ್ಲಿಕೇಶನ್ಗಳು)\n • ದೊಡ್ಡ ಫೈಲ್ಗಳ ಡೌನ್ಲೋಡ್ ಅಥವಾ ಅಪ್ಲೋಡ್\n • ಅಧಿಕ ಉಷ್ಣಾಂಶದಲ್ಲಿ ಫೋನಿನ ಬಳಕೆ"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"ತತ್ಕ್ಷಣ ಆಪ್ಗಳು"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ತತ್ಕ್ಷಣ ಆಪ್ಗಳಿಗೆ ಸ್ಥಾಪನೆಯ ಅಗತ್ಯವಿಲ್ಲ."</string>
<string name="app_info" msgid="6856026610594615344">"ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"ವೆಬ್ಗೆ ಹೋಗಿ"</string>
<string name="mobile_data" msgid="7094582042819250762">"ಮೊಬೈಲ್ ಡೇಟಾ"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"ವೈ-ಫೈ ಆಫ್ ಆಗಿದೆ"</string>
<string name="bt_is_off" msgid="2640685272289706392">"ಬ್ಲೂಟೂತ್ ಆಫ್ ಆಗಿದೆ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 5db9dc4..889ccc8 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -152,14 +152,12 @@
<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>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"모바일 데이터"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"모바일 데이터 사용"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"모바일 데이터 사용 중지"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"블루투스 테더링입니다."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"비행기 모드입니다."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN 켜짐"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM 카드가 없습니다."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"이동통신사 네트워크가 변경됩니다."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"배터리 세부정보 열기"</string>
@@ -244,11 +242,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"충전 중"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G 데이터 사용 중지됨"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G 데이터 사용 중지됨"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"모바일 데이터가 일시 중지됨"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"데이터 사용 중지됨"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"설정한 데이터 한도에 도달했습니다. 더 이상 모바일 데이터를 사용하지 않습니다.\n\n계속하면 데이터 사용량에 따른 요금이 부과될 수 있습니다."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"재개"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"인터넷에 연결되지 않음"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi 연결됨"</string>
@@ -321,8 +317,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"핫스팟"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"알림"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"손전등"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"모바일 데이터"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"데이터 사용"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"잔여 데이터"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"한도 초과"</string>
@@ -435,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"직장 프로필이 <xliff:g id="VPN_APP">%1$s</xliff:g>에 연결되었습니다."</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"개인 프로필이 <xliff:g id="VPN_APP">%1$s</xliff:g>에 연결되어 있습니다."</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"기기가 <xliff:g id="VPN_APP">%1$s</xliff:g>에 연결되어 있습니다."</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"기기 관리"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"프로필 모니터링"</string>
<string name="monitoring_title" msgid="169206259253048106">"네트워크 모니터링"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -445,18 +439,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN 사용 중지"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN 연결 해제"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"정책 보기"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>에서 관리하는 기기입니다.\n\n관리자는 설정, 기업 액세스, 앱, 기기와 관련된 데이터 및 기기의 위치 정보를 모니터링하고 관리할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"조직에서 관리하는 기기입니다.\n\n관리자는 설정, 기업 액세스, 앱, 기기와 관련된 데이터 및 기기의 위치 정보를 모니터링하고 관리할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"조직에서 이 기기에 인증기관을 설치했습니다. 보안 네트워크 트래픽을 모니터링 또는 수정할 수 있습니다."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"조직에서 직장 프로필에 인증기관을 설치했습니다. 보안 네트워크 트래픽을 모니터링 또는 수정할 수 있습니다."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"이 기기에는 인증기관이 설치되어 있습니다. 보안 네트워크 트래픽을 모니터링 또는 수정할 수 있습니다."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"관리자가 기기에서 발생하는 트래픽을 모니터링하는 네트워크 로깅을 사용 설정했습니다."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"<xliff:g id="VPN_APP">%1$s</xliff:g>에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"<xliff:g id="VPN_APP_0">%1$s</xliff:g> 및 <xliff:g id="VPN_APP_1">%2$s</xliff:g>에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"직장 프로필이 <xliff:g id="VPN_APP">%1$s</xliff:g>에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"개인 프로필이 <xliff:g id="VPN_APP">%1$s</xliff:g>에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"<xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>에서 관리하는 기기입니다."</string>
@@ -571,12 +561,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> 외 <xliff:g id="NUMBER_5">%3$d</xliff:g>개</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> 외 <xliff:g id="NUMBER_2">%3$d</xliff:g>개</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> 알림 컨트롤을 열었습니다."</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> 알림 컨트롤을 닫았습니다."</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"이 채널의 알림을 허용합니다."</string>
<string name="notification_all_categories" msgid="5407190218055113282">"전체 카테고리"</string>
<string name="notification_more_settings" msgid="816306283396553571">"설정 더보기"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"맞춤설정: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -714,6 +701,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> 알림: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"앱이 분할 화면에서 작동하지 않을 수 있습니다."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"앱이 화면 분할을 지원하지 않습니다."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"앱이 보조 디스플레이에서 작동하지 않을 수도 있습니다."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"앱이 보조 디스플레이에서의 실행을 지원하지 않습니다."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"설정 열기"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"빠른 설정 열기"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"빠른 설정 닫기"</string>
@@ -732,14 +721,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"PIP 메뉴"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g>에서 PIP 사용 중"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g>에서 이 기능이 사용되는 것을 원하지 않는 경우 탭하여 설정을 열고 기능을 사용 중지하세요."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"재생"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"일시중지"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"다음으로 건너뛰기"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"이전으로 건너뛰기"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"발열로 인해 휴대전화 전원이 종료됨"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"휴대전화가 정상적으로 실행 중입니다."</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"휴대전화가 과열되어 온도를 낮추기 위해 전원이 종료되었습니다. 지금은 휴대전화가 정상적으로 실행 중입니다.\n\n휴대전화가 과열되는 이유는 다음과 같습니다.\n • 리소스를 많이 사용하는 앱 사용(예: 게임, 동영상 또는 내비게이션 앱)\n • 대용량 파일을 다운로드 또는 업로드\n • 온도가 높은 곳에서 휴대폰 사용"</string>
@@ -767,8 +752,7 @@
<string name="instant_apps" msgid="6647570248119804907">"빠른 실행 앱"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"빠른 실행 앱은 설치가 필요하지 않습니다."</string>
<string name="app_info" msgid="6856026610594615344">"앱 정보"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"웹으로 이동"</string>
<string name="mobile_data" msgid="7094582042819250762">"모바일 데이터"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi가 사용 중지됨"</string>
<string name="bt_is_off" msgid="2640685272289706392">"블루투스가 사용 중지됨"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 457df7d..6d6d8da4 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -152,15 +152,13 @@
<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>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"Мобилдик Интернет"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Мобилдик Интернет күйгүзүлгөн"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"Мобилдик Интернет өчүрүлгөн"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth аркылуу интернет бөлүшүү."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Учак тартиби."</string>
- <string name="accessibility_no_sims" msgid="3957997018324995781">"SIM-карта жок"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN күйүк."</string>
+ <string name="accessibility_no_sims" msgid="3957997018324995781">"SIM карта жок"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Оператор тармагы өзгөртүлүүдө."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Батареянын чоо-жайын ачуу"</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"Батарея <xliff:g id="NUMBER">%d</xliff:g> пайыз."</string>
@@ -200,7 +198,7 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Учак режими күйүк."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Учак режими өчүрүлдү."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Учак режими күйгүзүлдү."</string>
- <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Тынчымды алба деген күйүк, артыкчылыктуулар гана."</string>
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Тынчымды алба режими иштетилген. Шашылыш эскертмелер гана көрүнөт."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Тынчымды албагыла, жымжырт болсун."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Тынчымды алба деген күйүк, ойготкучтар гана."</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Тынчымды алба."</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Кубатталууда"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G дайындары тындырылды."</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G дайындары тындырылды"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Мобилдик Интернет кызматы тындырылды"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Дайындар тындырылды"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Трафик сиз койгон чекке жетти. Эми мобилдик Интернетти колдоно албайсыз.\n\nЭгер улантсаңыз, дайындарды өткөрүү үчүн акы алынышы мүмкүн."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Улантуу"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Интернет байланыш жок"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi байланышта"</string>
@@ -271,7 +267,7 @@
<string name="start_dreams" msgid="5640361424498338327">"Көшөгө"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</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>
@@ -319,9 +315,8 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Туташуу чекити"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Эскертмелер"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Кол чырак"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
- <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Дайындардын колдонулушу"</string>
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобилдик Интернет"</string>
+ <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Дайындардын өткөрүлүшү"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Калган дайындар"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Чектен ашты"</string>
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> колдонулду"</string>
@@ -357,10 +352,10 @@
<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_voice" msgid="2284540992298200729">"Ушуну менен эскертүүлөрдүн, музыканын, видеолордун жана оюндардын үндөрү жана дирилдөөлөрү сыяктуу нерселердин баары өчүрүлөт. Бирок телефон чала бересиз."</string>
- <string name="zen_silence_introduction" msgid="3137882381093271568">"Ушуну менен эскертүүлөрдүн, музыканын, видеолордун жана оюндардын үндөрү жана дирилдөөлөрү сыяктуу нерселердин БААРЫ өчүрүлөт."</string>
+ <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Ушуну менен эскертүүлөрдүн, музыканын, видеолордун жана оюндардын үндөрү жана дирилдөөлөрү өчүрүлөт. Бирок телефон менен сүйлөшө бересиз."</string>
+ <string name="zen_silence_introduction" msgid="3137882381093271568">"Ушуну менен эскертүүлөрдүн, музыканын, видеолордун жана оюндардын үндөрү жана дирилдөөлөрү өчүрүлөт."</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="7590196980943943842">"Ачуу үчүн кайра таптап коюңуз"</string>
@@ -372,7 +367,7 @@
<string name="camera_hint" msgid="7939688436797157483">"Сүрөтчөнү серпип камерага өтүңүз"</string>
<string name="interruption_level_none_with_warning" msgid="5114872171614161084">"Толук жымжырттык талап кылынат. Бул экрандагыны окугучтарды да тынчтандырат."</string>
<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>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Жумуш профили <xliff:g id="VPN_APP">%1$s</xliff:g> колдонмосуна туташкан"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Жеке профиль <xliff:g id="VPN_APP">%1$s</xliff:g> тармагына туташкан"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Түзмөк <xliff:g id="VPN_APP">%1$s</xliff:g> тармагына туташкан"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Түзмөктү башкаруу"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Профилди көзөмөлдөө"</string>
<string name="monitoring_title" msgid="169206259253048106">"Тармакка көз салуу"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN\'ди өчүрүү"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN\'ди ажыратуу"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Саясаттарды карап көрүү"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Түзмөгүңүздү <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> башкарат.\n\nАдминистраторуңуз жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, түзмөгүңүзгө байланыштуу дайындарды жана түзмөгүңүздүн жайгашкан жери тууралуу маалыматты көзөмөлдөп жана башкара алат.\n\nКөбүрөөк маалымат алуу үчүн администраторуңузга кайрылыңыз."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Түзмөгүңүздү уюмуңуз башкарат.\n\nАдминистраторуңуз жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, түзмөгүңүзгө байланыштуу дайындарды жана түзмөгүңүздүн жайгашкан жери тууралуу маалыматты көзөмөлдөп жана башкара алат.\n\nКөбүрөөк маалымат алуу үчүн администраторуңузга кайрылыңыз."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Ишканаңыз бул түзмөккө тастыктоочу борборду орнотту. Коопсуз тармагыңыздын трафиги көзөмөлдөнүп же өзгөртүлүшү мүмкүн."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Ишканаңыз жумуш профилиңизге тастыктоочу борборду орнотту. Коопсуз тармагыңыздын трафиги көзөмөлдөнүп же өзгөртүлүшү мүмкүн."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Бул түзмөктө тастыктоочу борбор орнотулган. Коопсуз тармагыңыздын трафиги көзөмөлдөнүп же өзгөртүлүшү мүмкүн."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Администраторуңуз түзмөгүңүздөгү трафикти көзөмөлдөөчү тармактын таржымалын каттоо функциясын иштетти."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди тескей турган <xliff:g id="VPN_APP">%1$s</xliff:g> колдонмосуна туташып турасыз."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди көзөмөлдөй турган <xliff:g id="VPN_APP_0">%1$s</xliff:g> жана <xliff:g id="VPN_APP_1">%2$s</xliff:g> колдонмолоруна туташып турасыз."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Жумуш профилиңиз электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактык аракеттериңизди көзөмөлдөй турган <xliff:g id="VPN_APP">%1$s</xliff:g> колдонмосуна туташып турат."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Жеке профилиңиз электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди көзөмөлдөй турган <xliff:g id="VPN_APP">%1$s</xliff:g> колдонмосуна туташып турат."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Түзмөгүңүз <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> тарабынан башкарылат."</string>
@@ -569,12 +559,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> жана дагы <xliff:g id="NUMBER_5">%3$d</xliff:g></item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> жана дагы <xliff:g id="NUMBER_2">%3$d</xliff:g></item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосу үчүн эскертмени көзөмөлдөө функциялары ачылды"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосу үчүн эскертмени көзөмөлдөө функциялары жабылды"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Бул каналдан келген эскертмелерге уруксат берүү"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"Бардык категориялар"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Дагы жөндөөлөр"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"Ыңгайлаштыруу: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> эскертмеси: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Колдонмодо экран бөлүнбөшү мүмкүн."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Колдонмодо экран бөлүнбөйт."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Колдонмо көмөкчү дисплейде иштебей калышы мүмкүн."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Колдонмо көмөкчү дисплейлерде иштетилбейт."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Жөндөөлөрдү ачуу."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Ыкчам жөндөөлөрдү ачуу."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Ыкчам жөндөөлөрдү жабуу."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"Сүрөт ичиндеги сүрөт менюсу"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> – сүрөт ичиндеги сүрөт"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Эгер <xliff:g id="NAME">%s</xliff:g> колдонмосу бул функцияны пайдаланбасын десеңиз, жөндөөлөрдү ачып туруп, аны өчүрүп коюңуз."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"Ойнотуу"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"Тындыруу"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"Кийинкисине өткөрүп жиберүү"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"Мурункусуна өткөрүп жиберүү"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"Телефон ысыгандыктан өчүрүлдү"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"Телефонуңуз кадимкидей иштеп жатат"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"Телефонуңуз өтө ысып кеткендиктен, аны муздатуу үчүн өчүрүлдү. Эми телефонуңуз кадимкидей иштеп жатат.\n\nТелефонуңуз төмөнкү шарттарда ысып кетиши мүмкүн:\n • Ашыкча ресурс короткон колдонмолорду (оюндар, видео же чабыттоо колдонмолору) пайдалансаңыз \n • Ири көлөмдөгү файлдарды жүктөп алсаңыз же берсеңиз\n • Телефонуңузду жогорку температураларда пайдалансаңыз"</string>
@@ -765,9 +750,8 @@
<string name="instant_apps" msgid="6647570248119804907">"Ыкчам ачылуучу колдонмолор"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Ыкчам ачылуучу колдонмолорду орнотуу талап кылынбайт."</string>
<string name="app_info" msgid="6856026610594615344">"Колдонмо тууралуу"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
- <string name="mobile_data" msgid="7094582042819250762">"Мобилдик дайындар"</string>
+ <string name="go_to_web" msgid="1106022723459948514">"Интернетке өтүү"</string>
+ <string name="mobile_data" msgid="7094582042819250762">"Мобилдик Интернет"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi өчүк"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth өчүк"</string>
<string name="dnd_is_off" msgid="6167780215212497572">"\"Тынчымды алба\" режими өчүк"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index f1e0ad0..b0f32ee 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -152,14 +152,12 @@
<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">"ບໍ່ມີຊິມ."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"ອິນເຕີເນັດມືຖື"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"ເປີດອິນເຕີເນັດມືຖືແລ້ວ"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"ປິດອິນເຕີເນັດມືຖືແລ້ວ"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ການປ່ອຍສັນຍານ Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ໂໝດໃນຍົນ."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN ເປີດ."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"ບໍ່ມີແຜ່ນ SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"ການປ່ຽນແປງເຄືອຂ່າຍບໍລິສັດເຄືອຂ່າຍມືຖື."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"ເປີດລາຍລະອຽດແບັດເຕີຣີ"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"ກຳລັງສາກໄຟ"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"ຂໍ້ມູນ 2G-3G ຢຸດຊົ່ວຄາວແລ້ວ"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"ຂໍ້ມູນ 4G ຢຸດຊົ່ວຄາວແລ້ວ"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"ຢຸດການໃຊ້ອິນເຕີເນັດມືຖືຊົ່ວຄາວແລ້ວ"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"ຂໍ້ມູນຢຸດຊົ່ວຄາວແລ້ວ"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"ທ່ານໃຊ້ອິນເຕີເນັດຮອດຈຳນວນທີ່ທ່ານຈຳກັດປະລິມານໄວ້ແລ້ວ. ທ່ານຈະບໍ່ນຳໃຊ້ການເຊື່ອມຕໍ່ຜ່ານເຄືອຂ່າຍມືຖືອີກຕໍ່ໄປ.\n\nຫາກທ່ານສືບຕໍ່ໃຊ້ໄປອີກ, ທ່ານອາດຖືກຮຽກເກັບເງິນຄ່າບໍລິການໄດ້."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"ເລີ່ມຕໍ່"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"ບໍ່ມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"ເຊື່ອມຕໍ່ Wi--Fi ແລ້ວ"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ຮັອດສະປອດ"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"ການແຈ້ງເຕືອນ"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ໄຟສາຍ"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"ອິນເຕີເນັດມືຖື"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ການນຳໃຊ້ຂໍ້ມູນ"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ຂໍ້ມູນທີ່ຍັງເຫຼືອ"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"ເກີນຂີດຈຳກັດ"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກເຊື່ອມຕໍ່ຫາ <xliff:g id="VPN_APP">%1$s</xliff:g> ແລ້ວ"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"ໂປຣໄຟລ໌ສ່ວນຕົວເຊື່ອມຕໍ່ຫາ <xliff:g id="VPN_APP">%1$s</xliff:g> ແລ້ວ"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"ອຸປະກອນເຊື່ອມຕໍ່ຫາ <xliff:g id="VPN_APP">%1$s</xliff:g> ແລ້ວ"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"ການຈັດການອຸປະກອນ"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ການຕິດຕາມໂປຣໄຟລ໌"</string>
<string name="monitoring_title" msgid="169206259253048106">"ການກວດສອບຕິດຕາມເຄືອຂ່າຍ"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"ປິດການໃຊ້ VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"ຕັດການເຊື່ອມຕໍ່ VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"ເບິ່ງນະໂຍບາຍ"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"ອຸປະກອນຂອງທ່ານແມ່ນຖືກຈັດການໂດຍ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານສາມາດຕິດຕາມ ແລະ ຈັດການການຕັ້ງຄ່າຕ່າງໆ, ການເຂົ້າເຖິງອົງກອນ, ແອັບ, ຂໍ້ມູນທີ່ເຊື່ອມໂຍງກັບອຸປະກອນ ແລະ ຂໍ້ມູນສະຖານທີ່ຂອງອຸປະກອນທ່ານໄດ້.\n\nສຳລັບຂໍ້ມູນເພີ່ມເຕີມ, ໃຫ້ຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"ອຸປະກອນຂອງທ່ານແມ່ນຖືກຈັດການໂດຍອົງກອນຂອງທ່ານ.\n\nຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານສາມາດຕິດຕາມ ແລະ ຈັດການການຕັ້ງຄ່າຕ່າງໆ, ການເຂົ້າເຖິງອົງກອນ, ແອັບ, ຂໍ້ມູນທີ່ເຊື່ອມໂຍງກັບອຸປະກອນ ແລະ ຂໍ້ມູນສະຖານທີ່ຂອງອຸປະກອນທ່ານໄດ້.\n\nສຳລັບຂໍ້ມູນເພີ່ມເຕີມ, ໃຫ້ຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"ອົງກອນຂອງທ່ານຕິດຕັ້ງອຳນາດໃບຮັບຮອງໄວ້ໃນອຸປະກອນນີ້. ທຣາບຟິກເຄືອຂ່າຍທີ່ເຂົ້າລະຫັດໄວ້ຂອງທ່ານອາດຖືກຕິດຕາມ ຫຼື ແກ້ໄຂໄດ້."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"ອົງກອນຂອງທ່ານຕິດຕັ້ງອຳນາດໃບຮັບຮອງໄວ້ໃນໂປຣໄຟລ໌ບ່ອນເຮັດວຽກນີ້. ທຣາບຟິກເຄືອຂ່າຍທີ່ເຂົ້າລະຫັດໄວ້ຂອງທ່ານອາດຖືກຕິດຕາມ ຫຼື ແກ້ໄຂໄດ້."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"ມີອຳນາດໃບຮັບຮອງຕິດຕັ້ງຢູ່ໃນອຸປະກອນນີ້. ທຣາບຟິກເຄືອຂ່າຍທີ່ເຂົ້າລະຫັດໄວ້ຂອງທ່ານອາດຖືກຕິດຕາມ ຫຼື ແກ້ໄຂໄດ້."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"ຜູ້ເບິ່ງແຍງຂອງທ່ານໄດ້ເປີດໃຊ້ການບັນທຶກເຄືອຂ່າຍໄວ້, ເຊິ່ງຈະຕິດຕາມທຣາບຟິກໃນອຸປະກອນຂອງທ່ານ."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"ທ່ານເຊື່ອມຕໍ່ກັບ <xliff:g id="VPN_APP">%1$s</xliff:g> ແລ້ວ, ເຊິ່ງຈະສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍ, ຮວມທັງອີເມວ, ແອັບ ແລະ ເວັບໄຊຕ່າງໆຂອງທ່ານໄດ້."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"ທ່ານເຊື່ອມຕໍ່ກັບ <xliff:g id="VPN_APP_0">%1$s</xliff:g> ແລະ <xliff:g id="VPN_APP_1">%2$s</xliff:g> ແລ້ວ, ເຊິ່ງຈະສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍ, ຮວມທັງອີເມວ, ແອັບ ແລະ ເວັບໄຊຕ່າງໆຂອງທ່ານໄດ້."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານເຊື່ອມຕໍ່ຫາ <xliff:g id="VPN_APP">%1$s</xliff:g>, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍຂອງທ່ານ, ຮວມເຖິງອີເມວ, ແອັບ ແລະ ເວັບໄຊ."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"ໂປຣໄຟລ໌ສ່ວນຕົວຂອງທ່ານເຊື່ອມຕໍ່ກັບ <xliff:g id="VPN_APP">%1$s</xliff:g> ແລ້ວ, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍ, ຮວມທັງອີເມວ, ແອັບ ແລະ ເວັບໄຊຕ່າງໆຂອງທ່ານໄດ້."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"ອຸປະກອນຂອງທ່ານແມ່ນຈັດການໂດຍ <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -569,12 +559,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> ແລະ ອີກ <xliff:g id="NUMBER_5">%3$d</xliff:g> ຊ່ອງອື່ນໆ</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> ແລະ ອີກ <xliff:g id="NUMBER_2">%3$d</xliff:g> ຊ່ອງອື່ນໆ</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"ເປີດຕົວຄວບຄຸມການແຈ້ງເຕືອນສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ແລ້ວ"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"ປິດຕົວຄວບຄຸມການແຈ້ງເຕືອນສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ແລ້ວ"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"ອະນຸຍາດການແຈ້ງເຕືອນຈາກຊ່ອງນີ້"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"ທຸກໝວດໝູ່"</string>
<string name="notification_more_settings" msgid="816306283396553571">"ການຕັ້ງຄ່າເພີ່ມເຕີມ"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"ປັບແຕ່ງ: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"ການແຈ້ງເຕືອນ <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"ແອັບອາດໃຊ້ບໍ່ໄດ້ກັບການແບ່ງໜ້າຈໍ."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"ແອັບບໍ່ຮອງຮັບໜ້າຈໍແບບແຍກກັນ."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"ແອັບອາດຮອງຮັບການເປີດໃນໜ້າຈໍທີສອງ."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"ແອັບບໍ່ຮອງຮັບການເປີດໃນໜ້າຈໍທີສອງ."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"ເປີດການຕັ້ງຄ່າ."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"ເປີດການຕັ້ງຄ່າດ່ວນ."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"ປິດການຕັ້ງຄ່າດ່ວນ."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"ເມນູຊ້ອນຮູບພາບ"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ແມ່ນເປັນການສະແດງຜົນຫຼາຍຢ່າງພ້ອມກັນ"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"ຫາກທ່ານບໍ່ຕ້ອງການ <xliff:g id="NAME">%s</xliff:g> ໃຫ້ໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ແຕະເພື່ອເປີດການຕັ້ງຄ່າ ແລ້ວປິດມັນໄວ້."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"ຫຼິ້ນ"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"ຢຸດຊົ່ວຄາວ"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"ຂ້າມໄປລາຍການໜ້າ"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"ຂ້າມໄປລາຍການກ່ອນນີ້"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"ປິດໂທລະສັບເນື່ອງຈາກຮ້ອນເກີນໄປ"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"ໂທລະສັບຂອງທ່ານຕອນນີ້ເຮັດວຽກປົກກະຕິແລ້ວ"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"ໂທລະສັບຂອງທ່ານຮ້ອນເກີນໄປ, ດັ່ງນັ້ນມັນຈຶ່ງຖືກປິດໄວ້ເພື່ອໃຫ້ເຢັນກ່ອນ. ໂທລະສັບຂອງທ່ານຕອນນີ້ເຮັດວຽກປົກກະຕິແລ້ວ.\n\nໂທລະສັບຂອງທ່ານອາດຮ້ອນຫາກວ່າທ່ານ:\n • ໃຊ້ແອັບທີ່ກິນຊັບພະຍາກອນຫຼາຍ (ເຊັ່ນ: ເກມ, ວິດີໂອ ຫຼື ແອັບການນຳທາງ)\n • ດາວໂຫລດ ຫຼື ອັບໂຫລດຮູບພາບຂະໜາດໃຫຍ່\n • ໃຊ້ໂທລະສັບຂອງທ່ານໃນບ່ອນທີ່ມີອຸນຫະພູມສູງ"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"ອິນສະແຕນແອັບ"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ອິນສະແຕນແອັບບໍ່ຈຳເປັນຕ້ອງມີການຕິດຕັ້ງ."</string>
<string name="app_info" msgid="6856026610594615344">"ຂໍ້ມູນແອັບ"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"ໄປທີ່ເວັບ"</string>
<string name="mobile_data" msgid="7094582042819250762">"ອິນເຕີເນັດມືຖື"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ປິດຢູ່"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth ປິດຢູ່"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 400f585..8a5de8b 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -154,14 +154,12 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Kraštas"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"Nėra SIM kortelės."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"Mobiliojo ryšio duomenys"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Mobiliojo ryšio duomenys įjungti"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobiliojo ryšio duomenys išjungti"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"„Bluetooth“ įrenginio kaip modemo naudojimas."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Lėktuvo režimas."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN įjungtas."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Nėra SIM kortelės."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Keičiamas operatoriaus tinklas."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Atidaryti išsamią akumuliatoriaus informaciją"</string>
@@ -244,11 +242,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Įkrovimas"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G duomenys pristabdyti"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G duomenys pristabdyti"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Mobiliojo ryšio duomenys pristabdyti"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Duomenys pristabdyti"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Pasiektas nustatytas duomenų limitas. Nebenaudojate mobiliojo ryšio duomenų.\n\nJei tęsite, gali būti taikomi duomenų naudojimo mokesčiai."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Atnaujinti"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Nėra interneto ryš."</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Prisij. prie „Wi-Fi“"</string>
@@ -323,8 +319,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Viešosios interneto prieigos taškas"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Pranešimai"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Žibintuvėlis"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobiliojo ryšio duomenys"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Duomenų naudojimas"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Likę duomenys"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Viršytas limitas"</string>
@@ -437,8 +432,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Darbo profilis susietas su programa „<xliff:g id="VPN_APP">%1$s</xliff:g>“"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Asmeninis profilis susietas su programa „<xliff:g id="VPN_APP">%1$s</xliff:g>“"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Įrenginys susietas su programa „<xliff:g id="VPN_APP">%1$s</xliff:g>“"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Įrenginio tvarkymas"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profilio stebėjimas"</string>
<string name="monitoring_title" msgid="169206259253048106">"Tinklo stebėjimas"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -447,18 +441,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Išjungti VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Atjungti VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Žr. politiką"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Įrenginį tvarko „<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>“.\n\nAdministratorius gali stebėti ir tvarkyti nustatymus, įmonės prieigą, programas, su įrenginiu susietus duomenis ir įrenginio vietovės informaciją.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Įrenginį tvarko organizacija.\n\nAdministratorius gali stebėti ir tvarkyti nustatymus, įmonės prieigą, programas, su įrenginiu susietus duomenis ir įrenginio vietovės informaciją.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Jūsų organizacija įdiegė šiame įrenginyje sertifikato įgaliojimą. Jūsų saugaus tinklo srautas gali būti stebimas arba keičiamas."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Jūsų organizacija įdiegė darbo profilyje sertifikato įgaliojimą. Jūsų saugaus tinklo srautas gali būti stebimas arba keičiamas."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Šiame įrenginyje įdiegtas sertifikato įgaliojimas. Jūsų saugaus tinklo srautas gali būti stebimas arba keičiamas."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Administratorius įjungė tinklo duomenų įrašymą į žurnalą. Įjungus šią funkciją stebimas srautas jūsų įrenginyje."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Esate prisijungę prie programos „<xliff:g id="VPN_APP">%1$s</xliff:g>“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Esate prisijungę prie programų „<xliff:g id="VPN_APP_0">%1$s</xliff:g>“ ir „<xliff:g id="VPN_APP_1">%2$s</xliff:g>“, kurios gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Darbo profilis susietas su programa „<xliff:g id="VPN_APP">%1$s</xliff:g>“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Asmeninis profilis susietas su programa „<xliff:g id="VPN_APP">%1$s</xliff:g>“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Įrenginį tvarko „<xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>“."</string>
@@ -577,12 +567,9 @@
<item quantity="many">„<xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>“, „<xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>“ ir dar <xliff:g id="NUMBER_5">%3$d</xliff:g> kanalo</item>
<item quantity="other">„<xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>“, „<xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>“ ir dar <xliff:g id="NUMBER_5">%3$d</xliff:g> kanalų</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ pranešimų valdikliai atidaryti"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ pranešimų valdikliai uždaryti"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Leisti pranešimus iš šio kanalo"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"Visos kategorijos"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Daugiau nustatymų"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"Tinkinti: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -720,6 +707,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"„<xliff:g id="ID_1">%1$s</xliff:g>“ pranešimas: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Programa gali neveikti naudojant skaidytą ekraną."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Programoje nepalaikomas skaidytas ekranas."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Programa gali neveikti antriniame ekrane."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Programa nepalaiko pristatymo antriniuose ekranuose."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Atidaryti nustatymus."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Atidaryti sparčiuosius nustatymus."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Uždaryti sparčiuosius nustatymus."</string>
@@ -738,14 +727,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"Vaizdo vaizde meniu"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> rodom. vaizdo vaizde"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Jei nenorite, kad <xliff:g id="NAME">%s</xliff:g> naudotų šią funkciją, palietę atidarykite nustatymus ir išjunkite ją."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"Leisti"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"Pristabdyti"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"Praleisti ir eiti į kitą"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"Praleisti ir eiti į ankstesnį"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"Telefonas išjungt., nes įkaito"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"Dabar telefonas veikia įprastai"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"Telefonas per daug įkaito, todėl buvo išj., kad atvėstų. Dabar telefonas veikia įprastai.\n\nTelefonas gali per daug įkaisti, jei:\n • esate įjungę daug išteklių naudoj. progr. (pvz., žaidimų, vaizdo įr. arba navig. progr.);\n • atsis. arba įkeliate didelius failus;\n • telefoną naudojate aukštoje temper."</string>
@@ -773,8 +758,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Akimirksniu įkeliamos programėlės"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Akimirksniu įkeliamų programėlių nereikia įdiegti."</string>
<string name="app_info" msgid="6856026610594615344">"Programos informacija"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Eiti į žiniatinklį"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobilieji duomenys"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"„Wi-Fi“ išjungtas"</string>
<string name="bt_is_off" msgid="2640685272289706392">"„Bluetooth“ išjungtas"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 1f40686..5a83120 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -153,14 +153,12 @@
<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">"Nav SIM kartes."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"Mobilie dati"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Mobilie dati ieslēgti"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobilie dati izslēgti"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth piesaiste."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Lidmašīnas režīms."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN ieslēgts"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Nav SIM kartes."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Mobilo sakaru operatora tīkla mainīšana."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Atvērt akumulatora informāciju"</string>
@@ -243,11 +241,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Notiek uzlāde"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G datu lietojums ir apturēts"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G datu lietojums ir apturēts"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Mobilo datu lietojums apturēts"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Datu lietojums ir apturēts"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Ir sasniegts jūsu iestatītais datu ierobežojums. Jūs vairs neizmantojat mobilos datus.\n\nJa atsāksiet, var tikt piemērota maksa par datu lietojumu."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Atsākt"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Nav interneta sav."</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Izv. sav. ar Wi-Fi"</string>
@@ -321,8 +317,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Tīklājs"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Paziņojumi"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Zibspuldze"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobilie dati"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Datu lietojums"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Atlikušie dati"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Pārsniegts ierobežojums"</string>
@@ -435,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Darba profilam tika izveidots savienojums ar lietotni <xliff:g id="VPN_APP">%1$s</xliff:g>."</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Personīgajam profilam ir izveidots savienojums ar lietotni <xliff:g id="VPN_APP">%1$s</xliff:g>."</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Izveidots savienojums ar lietotni <xliff:g id="VPN_APP">%1$s</xliff:g>."</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Ierīces pārvaldība"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profila pārraudzība"</string>
<string name="monitoring_title" msgid="169206259253048106">"Tīkla pārraudzība"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -445,18 +439,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Atspējot VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Atvienot VPN tīklu"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Skatīt politikas"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Jūsu ierīci pārvalda <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nAdministrators var pārraudzīt un pārvaldīt iestatījumus, korporatīvo piekļuvi, lietotnes, ar ierīci saistītos datus un ierīces atrašanās vietas informāciju.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Jūsu ierīci pārvalda jūsu organizācija.\n\nAdministrators var pārraudzīt un pārvaldīt iestatījumus, korporatīvo piekļuvi, lietotnes, ar ierīci saistītos datus un ierīces atrašanās vietas informāciju.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Jūsu organizācija instalēja sertifikātu šajā ierīcē. Jūsu drošā tīkla datplūsma var tikt uzraudzīta."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Jūsu organizācija instalēja sertifikātu jūsu darba profilā. Jūsu drošā tīkla datplūsma var tikt uzraudzīta."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Šajā ierīcē ir instalēts sertifikāts. Drošā tīkla datplūsma var tikt uzraudzīta."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Administrators ieslēdza tīkla reģistrēšanu, kuru izmanto, lai pārraudzītu datplūsmu jūsu ierīcē."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Ir izveidots savienojums ar lietotni <xliff:g id="VPN_APP">%1$s</xliff:g>, kas var pārraudzīt jūsu darbības tīklā, tostarp e-pasta ziņojumus, lietotnes un vietnes."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Ir izveidots savienojums ar lietotnēm <xliff:g id="VPN_APP_0">%1$s</xliff:g> un <xliff:g id="VPN_APP_1">%2$s</xliff:g>, kas var pārraudzīt jūsu darbības tīklā, tostarp e-pasta ziņojumus, lietotnes un vietnes."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Jūsu darba profilam ir izveidots savienojums ar lietotni <xliff:g id="VPN_APP">%1$s</xliff:g>, kas var pārraudzīt jūsu darbības tīklā, tostarp saņemtos un nosūtītos e-pasta ziņojumus, instalētās lietotnes un apmeklētās tīmekļa vietnes."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Jūsu personīgais profils ir piesaistīts lietotnei <xliff:g id="VPN_APP">%1$s</xliff:g>, kas var pārraudzīt jūsu darbības tīklā, tostarp saņemtos un nosūtītos e-pasta ziņojumus, instalētās lietotnes un apmeklētās tīmekļa vietnes."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Jūsu ierīci pārvalda <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -573,12 +563,9 @@
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> un vēl <xliff:g id="NUMBER_5">%3$d</xliff:g></item>
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> un vēl <xliff:g id="NUMBER_5">%3$d</xliff:g></item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> paziņojumu vadīklas ir atvērtas"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"Lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> paziņojumu vadīklas ir aizvērtas"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Atļaut paziņojumus no šī kanāla"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"Visas kategorijas"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Citi iestatījumi"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"Pielāgot: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -716,6 +703,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> paziņojums: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Iespējams, lietotnē nedarbosies ekrāna sadalīšana."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Lietotnē netiek atbalstīta ekrāna sadalīšana."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Lietotne, iespējams, nedarbosies sekundārajā displejā."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Lietotnē netiek atbalstīta palaišana sekundārajos displejos."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Atvērt iestatījumus."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Atvērt ātros iestatījumus."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Aizvērt ātros iestatījumus."</string>
@@ -734,14 +723,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"Izvēlne attēlam attēlā"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ir attēlā attēlā"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Ja nevēlaties lietotnē <xliff:g id="NAME">%s</xliff:g> izmantot šo funkciju, pieskarieties, lai atvērtu iestatījumus un funkciju izslēgtu."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"Atskaņot"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"Apturēt"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"Pāriet uz nākamo"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"Pāriet uz iepriekšējo"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"Tālrunis izslēgts karstuma dēļ"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"Tagad jūsu tālrunis darbojas normāli"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"Jūsu tālrunis bija pārkarsis un tika izslēgts. Tagad tas darbojas normāli.\n\nTālrunis var sakarst, ja:\n • tiek izmantotas lietotnes, kas patērē daudz enerģijas (piem., spēles, video lietotnes vai navigācija);\n • tiek lejupielādēti/augšupielādēti lieli faili;\n • tālrunis tiek lietots augstā temperatūrā."</string>
@@ -769,8 +754,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Tūlītējās lietotnes"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Tūlītējām lietotnēm nav nepieciešama instalēšana."</string>
<string name="app_info" msgid="6856026610594615344">"Lietotnes informācija"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Pāriet uz tīmekli"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobilie dati"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ir izslēgts"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth ir izslēgts"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 9bb785a..8838e70 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Мобилниот интернет е исклучен"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Се поврзува со Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Режим на работа во авион."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN е вклучена."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Нема СИМ-картичка"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Променување на мрежата на операторот."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Отвори ги деталите за батеријата"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Работниот профил е поврзан на <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Личниот профил е поврзан на <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Уредот е поврзан на <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Управување со уреди"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Следење профил"</string>
<string name="monitoring_title" msgid="169206259253048106">"Следење на мрежата"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Оневозможи ВПН"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Исклучи ВПН"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Прикажи „Политики“"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Со уредот управува <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nАдминистраторот може да ги следи и да управува со поставките, корпоративниот пристап, апликациите, податоците поврзани со уредот и информациите за локацијата на уредот.\n\nЗа повеќе информации, контактирајте со администраторот."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Со уредот управува вашата организација.\n\nАдминистраторот може да ги следи и да управува со поставките, корпоративниот пристап, апликациите, податоците поврзани со уредот и информациите за локацијата на уредот.\n\nЗа повеќе информации, контактирајте со администраторот."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Вашата организација инсталираше авторитет за сертификат на уредов. Сообраќајот на вашата безбедна мрежа можно е да се следи или изменува."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Вашата организација инсталираше авторитет за сертификат на вашиот работен профил. Вашиот безбеден мрежен сообраќај можно е да се следи или изменува."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"На уредов е инсталиран авторитет за сертификат. Вашиот безбеден мрежен сообраќај можно е да се следи или изменува."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Вашиот администратор вклучил евиденција на мрежата, што подразбира следење на сообраќајот на вашиот уред."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Поврзани сте на <xliff:g id="VPN_APP">%1$s</xliff:g>, што може да ја следи вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-сајтовите."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Поврзани сте на <xliff:g id="VPN_APP_0">%1$s</xliff:g> и <xliff:g id="VPN_APP_1">%2$s</xliff:g>, што може да ја следат вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-сајтовите."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Вашиот работен профил е поврзан на <xliff:g id="VPN_APP">%1$s</xliff:g>, што може да ја следи вашата активност на мрежата, заедно со е-пораките, апликациите и веб-сајтовите."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Вашиот личен профил е поврзан на <xliff:g id="VPN_APP">%1$s</xliff:g>, што може да ја следи вашата активност на мрежата, заедно со е-пораките, апликациите и веб-сајтовите."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"<xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> управува со уредов."</string>
@@ -667,7 +663,7 @@
<string name="right_icon" msgid="3952104823293824311">"Десна икона"</string>
<string name="drag_to_add_tiles" msgid="7058945779098711293">"Повлечете за додавање плочки"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Повлечете тука за да се отстрани"</string>
- <string name="qs_edit" msgid="2232596095725105230">"Уреди"</string>
+ <string name="qs_edit" msgid="2232596095725105230">"Измени"</string>
<string name="tuner_time" msgid="6572217313285536011">"Време"</string>
<string-array name="clock_options">
<item msgid="5965318737560463480">"Прикажи часови, минути и секунди"</item>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Известување од <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Апликацијата можеби нема да работи во поделен екран."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Апликацијата не поддржува поделен екран."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Аппликацијата може да не функционира на второстепен екран."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Апликацијата не поддржува стартување на второстепени екрани."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Отворете ги поставките."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Отворете ги брзите поставки."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Затворете ги брзите поставки."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Инстант апликации"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Инстант апликациите нема потреба да се инсталираат."</string>
<string name="app_info" msgid="6856026610594615344">"Информации за апликација"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Одете на интернет"</string>
<string name="mobile_data" msgid="7094582042819250762">"Мобилен интернет"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi е исклучено"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth е исклучен"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index cc16c77..4e2890a 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -50,7 +50,7 @@
<string name="status_bar_settings_notifications" msgid="397146176280905137">"അറിയിപ്പുകൾ"</string>
<string name="bluetooth_tethered" msgid="7094101612161133267">"ബ്ലൂടൂത്ത് ടെതർ ചെയ്തു"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ടൈപ്പുചെയ്യൽ രീതികൾ സജ്ജീകരിക്കുക"</string>
- <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ഭൗതിക കീബോർഡ്"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ഫിസിക്കൽ കീബോർഡ്"</string>
<string name="usb_device_permission_prompt" msgid="834698001271562057">"USB ഉപകരണം ആക്സസ്സ് ചെയ്യാൻ <xliff:g id="APPLICATION">%1$s</xliff:g> എന്ന അപ്ളിക്കേഷനെ അനുവദിക്കണോ?"</string>
<string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"USB ആക്സസ്സറി ആക്സസ്സുചെയ്യാൻ <xliff:g id="APPLICATION">%1$s</xliff:g> എന്ന അപ്ലിക്കേഷനെ അനുവദിക്കണോ?"</string>
<string name="usb_device_confirm_prompt" msgid="5161205258635253206">"ഈ USB ഉപകരണം കണക്റ്റുചെയ്തിരിക്കുമ്പോൾ <xliff:g id="ACTIVITY">%1$s</xliff:g> തുറക്കണോ?"</string>
@@ -152,14 +152,12 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"വൈഫൈ"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"സിം ഇല്ല."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"മൊബൈൽ ഡാറ്റ"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"മൊബൈൽ ഡാറ്റ ഓണാണ്"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"മൊബൈൽ ഡാറ്റ ഓഫാണ്"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ബ്ലൂടൂത്ത് ടെതറിംഗ്."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ഫ്ലൈറ്റ് മോഡ്."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN ഓണാണ്."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM കാർഡൊന്നുമില്ല."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"കാരിയർ നെറ്റ്വർക്ക് മാറ്റൽ."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"ബാറ്ററി വിശദാംശങ്ങൾ തുറക്കുക"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"ചാർജ്ജുചെയ്യുന്നു"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ഡാറ്റ താൽക്കാലികമായി നിർത്തി"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ഡാറ്റ താൽക്കാലികമായി നിർത്തി"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"മൊബൈൽ ഡാറ്റ തല്ക്കാലം നിര്ത്തിയിരിക്കുന്നു"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"ഡാറ്റ താൽക്കാലികമായി നിർത്തി"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"നിങ്ങൾ സജ്ജമാക്കിയ ഡാറ്റ പരിധി എത്തിക്കഴിഞ്ഞു. ഇനിയങ്ങോട്ട് നിങ്ങൾക്ക് മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കാൻ സാധിക്കുകയില്ല.\n\nതുടരുകയാണെങ്കിൽ, ഡാറ്റാ ഉപയോഗത്തിന് നിരക്കുകൾ ബാധകമായേക്കാം."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"പുനരാരംഭിക്കുക"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"ഇന്റർനെറ്റ് കണക്ഷൻ ഇല്ല"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"വൈഫൈ കണക്റ്റുചെയ്തു"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ഹോട്ട്സ്പോട്ട്"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"അറിയിപ്പുകൾ"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ടോർച്ച്"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"മൊബൈൽ ഡാറ്റ"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ഡാറ്റ ഉപയോഗം"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ശേഷിക്കുന്ന ഡാറ്റ"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"പരിധി കഴിഞ്ഞു"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"<xliff:g id="VPN_APP">%1$s</xliff:g> ആപ്പിലേക്ക് ഔദ്യോഗിക പ്രൊഫൈൽ കണക്റ്റുചെയ്തിരിക്കുന്നു"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"<xliff:g id="VPN_APP">%1$s</xliff:g> ആപ്പിലേക്ക് വ്യക്തിഗത പ്രൊഫൈൽ കണക്റ്റുചെയ്തിരിക്കുന്നു"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"<xliff:g id="VPN_APP">%1$s</xliff:g> ആപ്പിലേക്ക് ഉപകരണം കണക്റ്റുചെയ്തിരിക്കുന്നു"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"ഉപകരണ മാനേജ്മെന്റ്"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"പ്രൊഫൈൽ നിരീക്ഷിക്കൽ"</string>
<string name="monitoring_title" msgid="169206259253048106">"നെറ്റ്വർക്ക് നിരീക്ഷിക്കൽ"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN പ്രവർത്തനരഹിതമാക്കുക"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN വിച്ഛേദിക്കുക"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"നയങ്ങൾ കാണുക"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നത് <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> എന്ന സ്ഥാപനമാണ്. \n\nക്രമീകരണം, കോർപ്പറേറ്റ് ആക്സസ്, ആപ്പുകൾ, നിങ്ങളുടെ ഉപകരണവുമായി ബന്ധപ്പെട്ട ഡാറ്റ, ഉപകരണത്തിന്റെ ലൊക്കേഷൻ വിവരങ്ങൾ എന്നിവ കൈകാര്യം ചെയ്യാനും നിരീക്ഷിക്കാനും നിങ്ങളുടെ അഡ്മിന് കഴിയും.\n\nകൂടുതൽ വിവരങ്ങൾക്ക് നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നത് നിങ്ങളുടെ സ്ഥാപനമാണ്.\n\nക്രമീകരണം, കോർപ്പറേറ്റ് ആക്സസ്, ആപ്പുകൾ, നിങ്ങളുടെ ഉപകരണവുമായി ബന്ധപ്പെട്ട ഡാറ്റ, ഉപകരണത്തിന്റെ ലൊക്കേഷൻ വിവരങ്ങൾ എന്നിവ കൈകാര്യം ചെയ്യാനും നിരീക്ഷിക്കാനും നിങ്ങളുടെ അഡ്മിന് കഴിയും.\n\nകൂടുതൽ വിവരങ്ങൾക്ക് നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"ഈ ഉപകരണത്തിൽ നിങ്ങളുടെ സ്ഥാപനമൊരു സർട്ടിഫിക്കറ്റ് അതോറിറ്റി ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്നു. നിങ്ങളുടെ സുരക്ഷിത നെറ്റ്വർക്ക് ട്രാഫിക്ക് നിരീക്ഷിക്കപ്പെടുകയോ പരിഷ്കരിക്കപ്പെടുയോ ചെയ്തേക്കാം."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലിൽ നിങ്ങളുടെ സ്ഥാപനമൊരു സർട്ടിഫിക്കറ്റ് അതോറിറ്റി ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്നു. നിങ്ങളുടെ സുരക്ഷിത നെറ്റ്വർക്ക് ട്രാഫിക്ക് നിരീക്ഷിക്കപ്പെടുകയോ പരിഷ്കരിക്കപ്പെടുയോ ചെയ്തേക്കാം."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"നിങ്ങളുടെ ഉപകരണത്തിൽ ഒരു സർട്ടിഫിക്കറ്റ് അതോറിറ്റി ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്നു. നിങ്ങളുടെ സുരക്ഷിത നെറ്റ്വർക്ക് ട്രാഫിക്ക് നിരീക്ഷിക്കപ്പെടുകയോ പരിഷ്കരിക്കപ്പെടുയോ ചെയ്തേക്കാം."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"നിങ്ങളുടെ അഡ്മിൻ, നെറ്റ്വർക്ക് ലോഗിംഗ് ഓണാക്കിയിട്ടുണ്ട്, ഇതിന് നിങ്ങളുടെ ഉപകരണത്തിലെ ട്രാഫിക്ക് നിരീക്ഷിക്കാൻ കഴിയും."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"നിങ്ങൾ <xliff:g id="VPN_APP">%1$s</xliff:g> എന്ന ആപ്പിലേക്ക് കണക്റ്റുചെയ്തിരിക്കുന്നു, ഇമെയിലുകൾ, ആപ്പുകൾ, വെബ്സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ നെറ്റ്വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാൻ ഈ ആപ്പിന് കഴിയും."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"നിങ്ങൾ <xliff:g id="VPN_APP_0">%1$s</xliff:g>, <xliff:g id="VPN_APP_1">%2$s</xliff:g> എന്നീ ആപ്പുകളിലേക്ക് കണക്റ്റുചെയ്തിരിക്കുന്നു, ഇമെയിലുകൾ, ആപ്പുകൾ, വെബ്സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ നെറ്റ്വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാൻ ഈ ആപ്പിന് കഴിയും."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"<xliff:g id="VPN_APP">%1$s</xliff:g> ആപ്പിലേക്ക് നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ കണക്റ്റുചെയ്തിരിക്കുന്നു, ഇമെയിലുകൾ, ആപ്സ്, വെബ്സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ നെറ്റ്വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാൻ ഈ ആപ്പിന് കഴിയും."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"<xliff:g id="VPN_APP">%1$s</xliff:g> ആപ്പിലേക്ക് നിങ്ങളുടെ വ്യക്തിഗത പ്രൊഫൈൽ കണക്റ്റുചെയ്തിരിക്കുന്നു, ഇമെയിലുകൾ, ആപ്പുകൾ, വെബ്സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ നെറ്റ്വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാൻ ഈ ആപ്പിന് കഴിയും."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"നിങ്ങളുടെ ഉപകരണം മാനേജുചെയ്യുന്നത് <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> ആണ്."</string>
@@ -569,12 +559,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> എന്നിവയും മറ്റ് <xliff:g id="NUMBER_5">%3$d</xliff:g> എണ്ണവും</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> എന്നിവയും മറ്റ് <xliff:g id="NUMBER_2">%3$d</xliff:g> എണ്ണവും</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിന്റെ അറിയിപ്പ് നിയന്ത്രണങ്ങൾ തുറന്നു"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിന്റെ അറിയിപ്പ് നിയന്ത്രണങ്ങൾ അടച്ചു"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"ഈ ചാനലിൽ നിന്നുള്ള അറിയിപ്പുകൾ അനുവദിക്കുക"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"എല്ലാ വിഭാഗങ്ങളും"</string>
<string name="notification_more_settings" msgid="816306283396553571">"കൂടുതൽ ക്രമീകരണം"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"ഇഷ്ടാനുസൃതമാക്കുക: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> അറിയിപ്പ്: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"സ്പ്ലിറ്റ്-സ്ക്രീനിനൊപ്പം ആപ്പ് പ്രവർത്തിച്ചേക്കില്ല."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"സ്പ്ലിറ്റ്-സ്ക്രീനിനെ ആപ്പ് പിന്തുണയ്ക്കുന്നില്ല."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"രണ്ടാം ഡിസ്പ്ലേയിൽ ആപ്പ് പ്രവർത്തിച്ചേക്കില്ല."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"രണ്ടാം ഡിസ്പ്ലേകളിൽ സമാരംഭിക്കുന്നത് ആപ്പ് അനുവദിക്കുന്നില്ല."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"ക്രമീകരണം തുറക്കുക."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"ദ്രുത ക്രമീകരണം തുറക്കുക."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"ദ്രുത ക്രമീകരണം അടയ്ക്കുക."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"\'ചിത്രത്തിനുള്ളിൽ ചിത്രം\' മെനു"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ചിത്രത്തിനുള്ളിലെ ചിത്രത്തിലാണ്"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> ഈ ഫീച്ചർ ഉപയോഗിക്കുന്നതിൽ നിങ്ങൾക്ക് താൽപ്പര്യമില്ലെങ്കിൽ, ടാപ്പുചെയ്ത് ക്രമീകരണം തുറന്ന് അത് ഓഫാക്കുക."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"പ്ലേ ചെയ്യുക"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"താൽക്കാലികമായി നിർത്തുക"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"അടുത്തതിലേക്ക് പോകുക"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"മുമ്പത്തേതിലേക്ക് പോകുക"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"ചൂട് കൂടിയതിനാൽ ഫോൺ ഓഫാക്കി"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"ഫോൺ ഇപ്പോൾ സാധാരണഗതിയിൽ പ്രവർത്തിക്കുന്നു"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"ഫോൺ ചൂടായിരിക്കുന്നതിനാൽ തണുക്കാൻ ഓഫാക്കിയിരിക്കുന്നു. ഫോൺ ഇപ്പോൾ സാധാരണഗതിയിൽ പ്രവർത്തിക്കുന്നു.\n\nഫോണിന് ചൂട് കൂടാൻ കാരണം:\n • ഗെയിമിംഗ്, വീഡിയോ അല്ലെങ്കിൽ നാവിഗേഷൻ തുടങ്ങിയ റിസോഴ്സ്-ഇന്റൻസീവായ ആപ്പുകൾ ഉപയോഗിക്കുന്നത്\n • വലിയ ഫയലുകൾ അപ്ലോഡോ ഡൗൺലോഡോ ചെയ്യുന്നത്\n • ഉയർന്ന താപനിലയിൽ ഫോൺ ഉപയോഗിക്കുന്നത്"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"ഇൻസ്റ്റന്റ് ആപ്പ്"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ഇൻസ്റ്റന്റ് ആപ്പിന് ഇൻസ്റ്റലേഷൻ ആവശ്യമില്ല."</string>
<string name="app_info" msgid="6856026610594615344">"ആപ്പ് വിവരം"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"വെബിൽ പോവുക"</string>
<string name="mobile_data" msgid="7094582042819250762">"മൊബൈൽ ഡാറ്റ"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"വൈഫൈ ഓഫാണ്"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth ഓഫാണ്"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 26bd51c..dae34b0 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -150,14 +150,12 @@
<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>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"Мобайл дата"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Мобайл дата асаалттай байна"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"Мобайл дата унтраалттай байна"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth модем болж байна."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Нислэгийн горим"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN асаалттай байна."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM карт байхгүй."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Дамжуулагч сүлжээг өөрчилж байна."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Тэжээлийн дэлгэрэнгүй мэдээллийг нээх"</string>
@@ -240,11 +238,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Цэнэглэж байна"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G дата-г түр зогсоосон байна"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G дата-г түр зогсоосон байна"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Мобайл датаг түр зогсоосон"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Дата-г түр зогсоосон байна"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Таны тогтоосон датаны хязгаарт хүрсэн тул мобайл дата ашиглалт зогссон байна.\n\nҮргэлжлүүлсэн тохиолдолд дата ашиглалтын төлбөр гарна."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Үргэлжлүүлэх"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Интернет холболт байхгүй"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi холбогдсон"</string>
@@ -317,8 +313,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Сүлжээний цэг"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Мэдэгдэл"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Гар чийдэн"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобайл дата"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Дата ашиглалт"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Үлдсэн дата"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Хязгаараас хэтэрсэн"</string>
@@ -431,8 +426,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Ажлын профайл <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбогдсон"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Хувийн профайл <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбогдсон байна"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Төхөөрөмж <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбогдсон байна"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Төхөөрөмжийн удирдлага"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Профайл хяналт"</string>
<string name="monitoring_title" msgid="169206259253048106">"Сүлжээний хяналт"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -441,18 +435,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN идэвхгүйжүүлэх"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN таслах"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Удирдамж харах"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Таны төхөөрөмжийг <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> удирддаг.\n\nТаны админ тохиргоо, байгууллагын хандалт, апп, таны төхөөрөмжтэй холбоотой өгөгдөл, төхөөрөмжийн байршлын мэдээллийг хянаж, удирдах боломжтой.\n\nДэлгэрэнгүй мэдээлэл авах бол админтайгаа холбогдоно уу."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Таны төхөөрөмжийг байгууллага тань удирддаг.\n\nТаны админ тохиргоо, байгууллагын хандалт, апп, таны төхөөрөмжтэй холбоотой өгөгдөл, төхөөрөмжийн байршлын мэдээллийг хянаж, удирдах боломжтой.\n\nДэлгэрэнгүй мэдээлэл авах бол админтайгаа холбогдоно уу."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Таны байгууллага энэ төхөөрөмжид сертификатын зөвшөөрлийг суулгасан байна. Таны аюулгүй сүлжээний ачааллыг өөрчлөх эсвэл хянах боломжтой."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Таны байгууллага таны ажлын профайлд сертификатын зөвшөөрөл суулгасан байна. Таны аюулгүй сүлжээний ачааллыг өөрчлөх эсвэл хянах боломжтой."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Сертификатын зөвшөөрлийг энэ төхөөрөмжид суулгасан байна. Таны аюулгүй сүлжээний ачааллыг өөрчлөх эсвэл хянах боломжтой."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Таны админ төхөөрөмжийн ачааллыг хянадаг сүлжээний логийг асаасан байна."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Та имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбогдсон байна."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Та имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой <xliff:g id="VPN_APP_0">%1$s</xliff:g>, <xliff:g id="VPN_APP_1">%2$s</xliff:g>-д холбогдсон байна."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Таны ажлын профайл <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбогдсон байна. Энэ нь таны имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Таны хувийн профайлыг имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбосон байна."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Таны төхөөрөмжийг <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> удирддаг."</string>
@@ -569,12 +559,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, бусад <xliff:g id="NUMBER_5">%3$d</xliff:g></item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g>, бусад <xliff:g id="NUMBER_2">%3$d</xliff:g></item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н мэдэгдлийн хяналтыг нээсэн"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н мэдэгдлийн хяналтыг хаасан"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Энэ сувгийн мэдэгдлийг зөвшөөрөх"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"Бүх ангилал"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Бусад тохиргоо"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"Өөрчлөх: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> мэдэгдэл: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Апп хуваагдсан дэлгэцэд ажиллахгүй."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Энэ апп нь дэлгэц хуваах тохиргоог дэмждэггүй."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Апп хоёрдогч дэлгэцэд ажиллахгүй."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Аппыг хоёрдогч дэлгэцэд эхлүүлэх боломжгүй."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Тохиргоог нээнэ үү."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Хурдан тохиргоог нээнэ үү."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Хурдан тохиргоог хаана уу."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"Зургийн цэсэнд байгаа зураг"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> зураг доторх зурганд байна"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Та <xliff:g id="NAME">%s</xliff:g>-г энэ онцлогийг ашиглахыг хүсэхгүй байвал тохиргоог нээгээд, үүнийг унтраана уу."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"Тоглуулах"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"Түр зогсоох"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"Дараагийн медиад очих"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"Өмнөх медиад очих"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"Халснаас үүдэн утас унтарсан"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"Таны утас одоо хэвийн ажиллаж байна"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"Таны утас хэт халсан тул хөргөхөөр унтраасан болно. Таны утас одоо хэвийн ажиллаж байна.\n\nХэрэв та дараахыг хийвэл таны утас хэт халж болзошгүй:\n • Их хэмжээний нөөц хэрэглээний апп (тоглоом, видео эсвэл шилжилтийн апп зэрэг)\n • Багтаамж ихтэй файл татах, байршуулах\n • Утсаа өндөр температурт ашиглах"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Шуурхай апп"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Шуурхай аппыг суулгах шаардлагагүй."</string>
<string name="app_info" msgid="6856026610594615344">"Апп-н мэдээлэл"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Вэбэд очих"</string>
<string name="mobile_data" msgid="7094582042819250762">"Мобайл дата"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi унтраалттай байна"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth унтраалттай байна"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 2b16ff1..32a9800 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -152,14 +152,12 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"वाय-फाय"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"सिम नाही."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"मोबाइल डेटा"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"मोबाइल डेटा चालू आहे"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"मोबाइल डेटा बंद आहे"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ब्लूटुथ टिथरिंग."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"विमान मोड."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN चालू."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"सिम कार्ड नाही."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"वाहक नेटवर्क बदलणे."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"बॅटरी तपशील उघडा"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"चार्ज होत आहे"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G डेटास विराम दिला आहे"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G डेटास विराम दिला आहे"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"मोबाइल डेटा थांबवला आहे"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"डेटास विराम दिला आहे"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"आपण सेट केलेली डेटा मर्यादा संपली. आता आपले मोबाइल डेटा वापरणे बंद आहे.\n\nआपण ते पुन्हा सुरू केल्यास, डेटा वापरासाठी शुल्क लागू होईल."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"पुन्हा सुरु करा"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"इंटरनेट कनेक्शन नाही"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"वाय-फाय कनेक्ट केले"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"हॉटस्पॉट"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"सूचना"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"फ्लॅशलाइट"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"मोबाइल डेटा"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"डेटा वापर"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"शिल्लक डेटा"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"मर्यादेबाहेर"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"कार्य प्रोफाइल <xliff:g id="VPN_APP">%1$s</xliff:g> शी कनेक्ट केलेले आहे"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"वैयक्तिक प्रोफाइल <xliff:g id="VPN_APP">%1$s</xliff:g> शी कनेक्ट केलेले आहे"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"डिव्हाइस <xliff:g id="VPN_APP">%1$s</xliff:g> शी कनेक्ट केलेले आहे"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"डिव्हाइस व्यवस्थापन"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"प्रोफाईल परीक्षण"</string>
<string name="monitoring_title" msgid="169206259253048106">"नेटवर्क परीक्षण"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN अक्षम करा"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN डिस्कनेक्ट करा"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"धोरणे पहा"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"तुमचे डिव्हाइस <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> व्यवस्थापित करते.\n\nतुमचा प्रशासक सेटिंग्ज, कॉर्पोरेट अॅक्सेस, अॅप्स, आपल्या डिव्हाइसशी संबंधित डेटा आणि आपल्या डिव्हाइसच्या ठिकाणाची माहिती मॉनिटर करू आणि व्यवस्थापित करू शकतो.\n\nआणखी माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"तुमचे डिव्हाइस तुमची संस्था व्यवस्थापित करते.\n\nतुमचा प्रशासक सेटिंग्ज, कॉर्पोरेट अॅक्सेस, अॅप्स, आपल्या डिव्हाइसशी संबंधित डेटा आणि आपल्या डिव्हाइसच्या ठिकाणाची माहिती मॉनिटर करू आणि व्यवस्थापित करू शकतो.\n\nआणखी माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"आपल्या संस्थेने या डिव्हाइसवर प्रमाणपत्र अधिकार स्थापित केला आहे. आपल्या सुरक्षित नेटवर्क रहदारीचे परीक्षण केले जाऊ शकते किंवा ती सुधारली जाऊ शकते."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"आपल्या संस्थेने आपल्या कार्य प्रोफाइलवर प्रमाणपत्र अधिकार स्थापित केला आहे. आपल्या सुरक्षित नेटवर्क रहदारीचे परीक्षण केले जाऊ शकते किंवा ती सुधारली जाऊ शकते."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"या डिव्हाइसवर प्रमाणपत्र अधिकार स्थापित केला आहे. आपल्या सुरक्षित नेटवर्क रहदारीचे परीक्षण केले जाऊ शकते किंवा ती सुधारली जाऊ शकते."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"आपल्या प्रशासकाने नेटवर्क लॉगिंग चालू केले आहे, जे आपल्या डिव्हाइसवरील रहदारीचे परीक्षण करते."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"तुम्ही <xliff:g id="VPN_APP">%1$s</xliff:g> शी कनेक्ट केले आहे, जे ईमेल, अॅप्स आणि वेबसाइटसहित आपल्या नेटवर्क क्रिया मॉनिटर करू शकते."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"तुम्ही <xliff:g id="VPN_APP_0">%1$s</xliff:g> आणि <xliff:g id="VPN_APP_1">%2$s</xliff:g> शी कनेक्ट केले आहे, जे ईमेल, अॅप्स आणि वेबसाइटसहित आपल्या नेटवर्क क्रिया मॉनिटर करू शकते."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"आपले कार्य प्रोफाइल <xliff:g id="VPN_APP">%1$s</xliff:g> शी कनेक्ट केले आहे, जे ईमेल, अॅप्स आणि वेबसाइटसह आपल्या नेटवर्क क्रियाकलापाचे परीक्षण करू शकते."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"आपले वैयक्तिक प्रोफाइल <xliff:g id="VPN_APP">%1$s</xliff:g> शी कनेक्ट केले आहे, जे ईमेल, अॅप्स आणि वेबसाइटसह आपल्या नेटवर्क क्रियाकलापाचे परीक्षण करू शकते."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"आपले डिव्हाइस <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> ने व्यवस्थापित केले आहे."</string>
@@ -552,10 +542,10 @@
<string name="block" msgid="2734508760962682611">"सर्व सूचना अवरोधित करा"</string>
<string name="do_not_silence" msgid="6878060322594892441">"शांत करू नका"</string>
<string name="do_not_silence_block" msgid="4070647971382232311">"शांत किंवा अवरोधित करू नका"</string>
- <string name="tuner_full_importance_settings" msgid="3207312268609236827">"उर्जा सूचना नियंत्रणे"</string>
+ <string name="tuner_full_importance_settings" msgid="3207312268609236827">"पॉवर सूचना नियंत्रणे"</string>
<string name="tuner_full_importance_settings_on" msgid="7545060756610299966">"चालू"</string>
<string name="tuner_full_importance_settings_off" msgid="8208165412614935229">"बंद"</string>
- <string name="power_notification_controls_description" msgid="4372459941671353358">"उर्जा सूचना नियंत्रणांसह, आपण अॅपच्या सूचनांसाठी महत्त्व स्तर 0 ते 5 पर्यंत सेट करू शकता. \n\n"<b>"स्तर 5"</b>" \n- सूचना सूचीच्या शीर्षस्थानी दर्शवा \n- पूर्ण स्क्रीन व्यत्ययास अनुमती द्या \n- नेहमी डोकावून पहा \n\n"<b>"स्तर 4"</b>" \n- पूर्ण स्क्रीन व्यत्ययास प्रतिबंधित करा \n- नेहमी डोकावून पहा \n\n"<b>"स्तर 3"</b>" \n- पूर्ण स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n\n"<b>"स्तर 2"</b>" \n- पूर्ण स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n- कधीही ध्वनी किंवा कंपन करू नका \n\n"<b>"स्तर 1"</b>" \n- पूर्ण स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n- कधीही ध्वनी किंवा कंपन करू नका \n- लॉक स्क्रीन आणि स्टेटस बार मधून लपवा \n- सूचना सूचीच्या तळाशी दर्शवा \n\n"<b>"स्तर 0"</b>" \n- अॅपमधील सर्व सूचना अवरोधित करा"</string>
+ <string name="power_notification_controls_description" msgid="4372459941671353358">"पॉवर सूचना नियंत्रणांसह, आपण अॅपच्या सूचनांसाठी महत्त्व स्तर 0 ते 5 पर्यंत सेट करू शकता. \n\n"<b>"स्तर 5"</b>" \n- सूचना सूचीच्या शीर्षस्थानी दर्शवा \n- पूर्ण स्क्रीन व्यत्ययास अनुमती द्या \n- नेहमी डोकावून पहा \n\n"<b>"स्तर 4"</b>" \n- पूर्ण स्क्रीन व्यत्ययास प्रतिबंधित करा \n- नेहमी डोकावून पहा \n\n"<b>"स्तर 3"</b>" \n- पूर्ण स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n\n"<b>"स्तर 2"</b>" \n- पूर्ण स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n- कधीही ध्वनी किंवा कंपन करू नका \n\n"<b>"स्तर 1"</b>" \n- पूर्ण स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n- कधीही ध्वनी किंवा कंपन करू नका \n- लॉक स्क्रीन आणि स्टेटस बार मधून लपवा \n- सूचना सूचीच्या तळाशी दर्शवा \n\n"<b>"स्तर 0"</b>" \n- अॅपमधील सर्व सूचना अवरोधित करा"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"सूचना"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"आपल्याला यापुढे या सूचना प्राप्त होणार नाहीत."</string>
<string name="notification_num_channels" msgid="2048144408999179471">"<xliff:g id="NUMBER">%d</xliff:g> सूचना श्रेण्या"</string>
@@ -569,12 +559,9 @@
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, आणि <xliff:g id="NUMBER_5">%3$d</xliff:g> इतर</item>
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, आणि <xliff:g id="NUMBER_5">%3$d</xliff:g> इतर</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी सूचना नियंत्रणे खुली आहेत"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी सूचना नियंत्रणे बंद आहेत"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"या चॅनेलकडील सूचनांना मान्यता द्या"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"सर्व श्रेण्या"</string>
<string name="notification_more_settings" msgid="816306283396553571">"अधिक सेटिंग्ज"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"सानुकूल करा: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> सूचना: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"अॅप कदाचित विभाजित-स्क्रीनसह कार्य करू शकत नाही."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"अॅप स्क्रीन-विभाजनास समर्थन देत नाही."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"दुय्यम डिस्प्लेवर अॅप कदाचित चालणार नाही."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"दुय्यम डिस्प्लेंवर अॅप लाँचचे समर्थन करत नाही."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"सेटिंग्ज उघडा."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"जलद सेटिंग्ज उघडा."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"जलद सेटिंग्ज बंद करा."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"चित्र मेनूमधील चित्र"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> चित्रामध्ये चित्र मध्ये आहे"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> ने हे वैशिष्ट्य वापरू नये असे आपल्याला वाटत असल्यास, टॅप करून सेटिंग्ज उघडा आणि ते बंद करा."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"प्ले करा"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"थांबवा"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"डावलून पुढे जा"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"डावलून मागे जा"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"तापल्यामुळे फोन बंद झाला"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"आपला फोन आता व्यवस्थित चालू आहे"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"आपला फोन खूप तापलाय, म्हणून तो थंड होण्यासाठी बंद झाला आहे. आपला फोन आता व्यवस्थित चालू आहे.\n\nआपण असे केल्यास आपला फोन खूप तापेल:\n •संसाधन केंद्रित अॅप वापरणे (गेमिंग, व्हिडिओ किंवा नेव्हिगेशन अॅप यासारखे)\n •मोठ्या फायली डाउनलोड किंवा अपलोड करणे\n •उच्च तापमानामध्ये आपला फोन वापरणे"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"इन्सटंट अॅप्स"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"इन्सटंट अॅप्सना स्थापनेची आवश्यकता नसते."</string>
<string name="app_info" msgid="6856026610594615344">"अॅप माहिती"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"वेबवर जा"</string>
<string name="mobile_data" msgid="7094582042819250762">"मोबाइल डेटा"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"वाय-फाय बंद आहे"</string>
<string name="bt_is_off" msgid="2640685272289706392">"ब्लूटुथ बंद आहे"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 2241227..8e09a79 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -152,14 +152,12 @@
<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">"Tiada SIM."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"Data Mudah Alih"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Data Mudah Alih Dihidupkan"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"Data Mudah Alih Dimatikan"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Penambatan Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Mod pesawat"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN dihidupkan."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Tiada kad SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Perubahan rangkaian pembawa."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Buka butiran bateri"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Mengecas"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Data 2G-3G dijeda"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Data 4G dijeda"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Data mudah alih dijeda"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Data dijeda"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Had data yang anda tetapkan telah dicapai. Anda tidak lagi menggunakan data mudah alih.\n\nJika anda menyambung semula, caj mungkin digunakan untuk penggunaan data."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Sambung semula"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Tiada smbg Internet"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi disambungkan"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Tempat liputan"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Pemberitahuan"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lampu suluh"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Data mudah alih"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Penggunaan data"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Baki data"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Melebihi had"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Profil kerja dihubungkan ke <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Profil peribadi dihubungkan ke <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Peranti dihubungkan ke <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Pengurusan peranti"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Pemantauan profil"</string>
<string name="monitoring_title" msgid="169206259253048106">"Pemantauan rangkaian"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Lumpuhkan VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Putuskan sambungan VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Lihat Dasar"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Peranti anda diurus oleh <xliff:g id="ORGANIZATION_NAME">%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\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Peranti anda diurus oleh organisasi.\n\nPentadbir anda boleh memantau dan mengurus tetapan, akses korporat, apl, data yang dikaitkan dengan peranti serta maklumat lokasi peranti anda.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Organisasi anda memasang sijil kuasa pada peranti ini. Trafik rangkaian selamat anda mungkin dipantau atau diubah suai."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Organisasi anda memasang sijil kuasa dalam profil kerja anda. Trafik rangkaian selamat anda mungkin dipantau atau diubah suai."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Sijil kuasa dipasang pada peranti ini. Trafik rangkaian selamat anda mungkin dipantau atau diubah suai."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Pentadbir anda telah menghidupkan pengelogan rangkaian yang memantau trafik pada peranti anda."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Anda dihubungkan ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Anda dihubungkan ke <xliff:g id="VPN_APP_0">%1$s</xliff:g> dan <xliff:g id="VPN_APP_1">%2$s</xliff:g>, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Profil kerja anda dihubungkan ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang dapat memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Profil peribadi anda dihubungkan ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Peranti anda diurus oleh <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -569,12 +559,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> dan <xliff:g id="NUMBER_5">%3$d</xliff:g> yang lain</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> dan <xliff:g id="NUMBER_2">%3$d</xliff:g> yang lain</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Kawalan pemberitahuan untuk <xliff:g id="APP_NAME">%1$s</xliff:g> dibuka"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"Kawalan pemberitahuan untuk <xliff:g id="APP_NAME">%1$s</xliff:g> ditutup"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Benarkan pemberitahuan daripada saluran ini"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"Semua Kategori"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Lagi tetapan"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"Sesuaikan: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Pemberitahuan <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Apl mungkin tidak berfungsi dengan skrin pisah."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Apl tidak menyokong skrin pisah."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Apl mungkin tidak berfungsi pada paparan kedua."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Apl tidak menyokong pelancaran pada paparan kedua."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Buka tetapan."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Buka tetapan pantas."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Tutup tetapan pantas."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"Menu gambar dalam gambar"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> terdapat dalam gambar dalam gambar"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Jika anda tidak mahu <xliff:g id="NAME">%s</xliff:g> menggunakan ciri ini, ketik untuk membuka tetapan dan matikan ciri."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"Main"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"Jeda"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"Langkau ke seterusnya"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"Langkau ke sebelumnya"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"Telefon dimatikan kerana panas"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"Telefon anda kini berjalan seperti biasa"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"Telefon anda terlalu panas, jadi telefon itu telah dimatikan untuk menyejuk. Sekarang, telefon anda berjalan seperti biasa.\n\nTelefon anda mungkin menjadi terlalu panas jika anda:\n • Menggunakan apl intensif sumber (seperti permainan, video atau apl navigasi)\n • Memuat turun atau memuat naik fail besar\n • Menggunakan telefon anda dalam suhu tinggi"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Apl Segera"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Apl segera tidak memerlukan pemasangan."</string>
<string name="app_info" msgid="6856026610594615344">"Maklumat apl"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Pergi ke web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Data mudah alih"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi dimatikan"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth dimatikan"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 4c50569..d228313 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -155,8 +155,9 @@
<string name="accessibility_cell_data" msgid="5326139158682385073">"မိုဘိုင်းဒေတာ"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"မိုဘိုင်းဒေတာကို ဖွင့်ထားပါသည်"</string>
<string name="accessibility_cell_data_off" msgid="443267573897409704">"မိုဘိုင်းဒေတာကို ပိတ်ထားပါသည်"</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_vpn_on" msgid="5993385083262856059">"VPN ကို ဖွင့်ထားသည်။"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM ကဒ် မရှိပါ"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"ဝန်ဆောင်မှုဌာန ကွန်ရက် ပြောင်းလဲနေစဉ်။"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"ဘက်ထရီ အသေးစိတ် အချက်အလက်များကို ဖွင့်ပါ"</string>
@@ -296,7 +297,7 @@
<string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"ကွန်ရက်မရှိပါ"</string>
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ဝိုင်ဖိုင်ပိတ်ရန်"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ကိုဖွင့်ပါ"</string>
- <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ဝိုင်ဖိုင်ကွန်ရက် မရနိုင်ပါ"</string>
+ <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi ကွန်ရက် မရှိပါ"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"ကာစ်တင်"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"အမည်မတပ် ကိရိယာ"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"အလုပ်ပရိုဖိုင်ကို <xliff:g id="VPN_APP">%1$s</xliff:g> သို့ ချိတ်ဆက်ထားသည်"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"ကိုယ်ပိုင်ပရိုဖိုင်ကို <xliff:g id="VPN_APP">%1$s</xliff:g> သို့ ချိတ်ဆက်ထားပါသည်"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"စက်ပစ္စည်းကို <xliff:g id="VPN_APP">%1$s</xliff:g> သို့ ချိတ်ဆက်ထားသည်"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"စက်ပစ္စည်း စီမံခန့်ခွဲမှု"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ပရိုဖိုင် စောင့်ကြပ်မှု"</string>
<string name="monitoring_title" msgid="169206259253048106">"ကွန်ရက်ကို စောင့်ကြပ်ခြင်း"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN ကို ပိတ်ထားရန်"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN ကို အဆက်ဖြတ်ရန်"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"မူဝါဒများကို ကြည့်ရန်"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"သင့်စက်ပစ္စည်းကို <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> အဖွဲ့အစည်းက စီမံခန့်ခွဲထားပါသည်။\n\nသင်၏ စီမံခန့်ခွဲသူသည် ဆက်တင်များ၊ အဖွဲ့အစည်း အသုံးပြုခွင့်များ၊ အက်ပ်များ၊ စက်ပစ္စည်းနှင့် ဆက်စပ်နေသည့် ဒေတာများနှင့် စက်ပစ္စည်း၏ တည်နေရာအချက်အလက်များကို စောင့်ကြည့်၍ စီမံနိုင်ပါသည်။\n\nနောက်ထပ် အချက်အလက်များအတွက် စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။"</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"သင့်စက်ပစ္စည်းကို သင်၏အဖွဲ့အစည်းက စီမံခန့်ခွဲထားပါသည်။\n\nသင်၏ စီမံခန့်ခွဲသူသည် ဆက်တင်များ၊ အဖွဲ့အစည်း အသုံးပြုခွင့်များ၊ အက်ပ်များ၊ စက်ပစ္စည်းနှင့် ဆက်စပ်နေသည့် ဒေတာများနှင့် စက်ပစ္စည်း၏ တည်နေရာအချက်အလက်များကို စောင့်ကြည့်၍ စီမံနိုင်ပါသည်။\n\nနောက်ထပ် အချက်အလက်များအတွက် စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။"</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"သင်၏ အဖွဲ့အစည်းက ဤစက်ပစ္စည်းတွင် စီမံခန့်ခွဲမှုဆိုင်ရာ အသိအမှတ်ပြုလက်မှတ်ကို ထည့်သွင်းထားပါသည်။ လုံခြုံမှုရှိသော ကွန်ရက်ဒေတာစီးဆင်းမှုကို စောင့်ကြည့်ခြင်း သို့မဟုတ် ပြုပြင်ခြင်းများ ပြုလုပ်နိုင်ပါသည်။"</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"သင်၏ အဖွဲ့အစည်းသည် သင်၏ အလုပ်ပရိုဖိုင်တွင် စီမံခန့်ခွဲမှုဆိုင်ရာ အသိအမှတ်ပြုလက်မှတ်ကို ထည့်သွင်းထားပါသည်။ လုံခြုံမှုရှိသော ကွန်ရက်ဒေတာစီးဆင်းမှုကို စောင့်ကြည့်ခြင်း သို့မဟုတ် ပြုပြင်ခြင်းများ ပြုလုပ်နိုင်ပါသည်။"</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"ဤစက်ပစ္စည်းတွင် စီမံခန့်ခွဲမှုဆိုင်ရာ အသိအမှတ်ပြုလက်မှတ်ကို ထည့်သွင်းထားပါသည်။ လုံခြုံမှုရှိသော ကွန်ရက်ဒေတာစီးဆင်းမှုကို စောင့်ကြည့်ခြင်း သို့မဟုတ် ပြုပြင်ခြင်းများ ပြုလုပ်နိုင်ပါသည်။"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"စက်ပစ္စည်းပေါ်ရှိ ဒေတာစီးဆင်းမှုများကို စောင့်ကြည့်နိုင်သည့် ကွန်ရက်မှတ်တမ်းတင်ခြင်းစနစ်ကို သင်၏ စီမံခန့်ခွဲသူက ဖွင့်ထားပါသည်။"</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"သင်သည် သင်၏ အီးမေးလ်၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည့် <xliff:g id="VPN_APP">%1$s</xliff:g> သို့ ချိတ်ဆက်ထားပါသည်။"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"သင်သည် သင်၏ အီးမေးလ်၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင်၏ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည့် <xliff:g id="VPN_APP_0">%1$s</xliff:g> နှင့် <xliff:g id="VPN_APP_1">%2$s</xliff:g> သို့ ချိတ်ဆက်ထားပါသည်။"</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"သင်၏အလုပ်ပရိုဖိုင်သည် အီးမေးလ်၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင်၏ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည့် <xliff:g id="VPN_APP">%1$s</xliff:g> သို့ ချိတ်ဆက်ထားပါသည်။"</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"သင်၏ ကိုယ်ပိုင်ပရိုဖိုင်သည် အီးမေးလ်၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင်၏ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည့် <xliff:g id="VPN_APP">%1$s</xliff:g> သို့ ချိတ်ဆက်ထားပါသည်။"</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"သင့်စက်ပစ္စည်းကို <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> က စီမံခန့်ခွဲထားပါသည်။"</string>
@@ -482,7 +478,7 @@
<string name="screen_pinning_title" msgid="3273740381976175811">"မျက်နှာပြင် ပင်ထိုးပြီးပါပြီ"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"သင်ပင်မဖြုတ်မခြင်း ၎င်းကို ပြသထားပါမည်။ ပင်ဖြုတ်ရန် Back နှင့် Overview ကို ထိ၍ဖိထားပါ။"</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"သင်ပင်မဖြုတ်မချင်း ၎င်းကိုပြသထားပါမည်။ ပင်ဖြုတ်ရန် Overview ကိုထိပြီး ဖိထားပါ။"</string>
- <string name="screen_pinning_positive" msgid="3783985798366751226">"အဲဒါ ရပါပြီ"</string>
+ <string name="screen_pinning_positive" msgid="3783985798366751226">"ရပါပြီ"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"မလိုတော့ပါ"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ဝှက်မည်လား?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"နောက်တစ်ကြိမ်သင် ချိန်ညှိချက်များဖွင့်လျှင် ၎င်းပေါ်လာပါမည်။"</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> အကြောင်းကြားချက် − <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"မျက်နှာပြင် ခွဲခြမ်းပြသမှုဖြင့် အက်ပ်သည် အလုပ်လုပ်မည် မဟုတ်ပါ။"</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"အက်ပ်သည် မျက်နှာပြင်ခွဲပြရန် ပံ့ပိုးထားခြင်းမရှိပါ။"</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"အက်ပ်သည် ဒုတိယမျက်နှာပြင်ပြသမှုတွင် အလုပ်လုပ်မည် မဟုတ်ပါ။"</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"အက်ပ်ကို ဒုတိယဖန်မျက်နှာပြင်ပြသမှုတွင် ဖွင့်ရန်အတွက် ပံ့ပိုးမထားပါ။"</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"ဆက်တင်များကို ဖွင့်ပါ။"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"အမြန်ဆက်တင်များကို ဖွင့်ပါ။"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"အမြန်ဆက်တင်များကို ပိတ်ပါ။"</string>
@@ -727,7 +725,7 @@
<string name="pip_skip_to_prev" msgid="1955311326688637914">"ယခင်တစ်ခုသို့ ပြန်သွားရန်"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"အပူရှိန်ကြောင့်ဖုန်းပိတ်ထားသည်"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"သင်၏ဖုန်းသည် ပုံမှန် အလုပ်လုပ်နေပါသည်"</string>
- <string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"သင့်ဖုန်းအလွန်ပူနေသည့်အတွက် အေးသွားစေရန် ပိတ်ထားပါသည်။ ယခုပုံမှန် အလုပ်လုပ်ပါပြီ။\n\nအောက်ပါတို့ကိုသုံးလျှင် ပူလာပါမည်-\n • အရင်းအမြစ်များသောအက်ပ်ကို သုံခြင်း (ဥပမာ ဂိမ်းကစားခြင်း၊ ဗီဒီယိုကြည့်ခြင်း (သို့) လမ်းညွှန်အက်ပ်)\n • ကြီးမားသောဖိုင်များ ဒေါင်းလုဒ် (သို့) အပ်လုဒ်လုပ်ခြင်း\n • အပူရှိန်မြင့်သောနေရာတွင် သုံးခြင်း"</string>
+ <string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"သင့်ဖုန်းအလွန်ပူနေသည့်အတွက် အေးသွားစေရန် ပိတ်ထားပါသည်။ ယခုပုံမှန် အလုပ်လုပ်ပါပြီ။\n\nအောက်ပါတို့ကိုသုံးလျှင် ပူလာပါမည်-\n • အရင်းအမြစ်များသောအက်ပ်ကို သုံးခြင်း (ဥပမာ ဂိမ်းကစားခြင်း၊ ဗီဒီယိုကြည့်ခြင်း (သို့) လမ်းညွှန်အက်ပ်)\n • ကြီးမားသောဖိုင်များ ဒေါင်းလုဒ် (သို့) အပ်လုဒ်လုပ်ခြင်း\n • အပူရှိန်မြင့်သောနေရာတွင် သုံးခြင်း"</string>
<string name="high_temp_title" msgid="4589508026407318374">"ဖုန်း ပူနွေးလာပါပြီ"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ဖုန်းကို အေးအောင်ပြုလုပ်နေစဉ်တွင် အချို့ဝန်ဆောင်မှုများကို ကန့်သတ်ထားပါသည်"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"သင့်ဖုန်းသည် အလိုအလျောက် ပြန်အေးသွားပါလိမ့်မည်။ ဖုန်းကို အသုံးပြုနိုင်ပါသေးသည် သို့သော် ပိုနှေးနိုင်ပါသည်။\n\nသင့်ဖုန်း အေးသွားသည်နှင့် ပုံမှန်အတိုင်း ပြန်အလုပ်လုပ်ပါလိမ့်မည်။"</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ချက်ခြင်းသုံးအက်ပ်များကို ထည့်သွင်းစရာမလိုပါ။"</string>
<string name="app_info" msgid="6856026610594615344">"အက်ပ်အချက်အလက်"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"ဝဘ်သို့ သွားရန်"</string>
<string name="mobile_data" msgid="7094582042819250762">"မိုဘိုင်းဒေတာ"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ကို ပိတ်ထားသည်"</string>
<string name="bt_is_off" msgid="2640685272289706392">"ဘလူးတုသ်ကို ပိတ်ထားသည်"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index dd7469a..bfb0244 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobildata er slått av"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-internettdeling."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Flymodus."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN på."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Mangler SIM-kort."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Bytting av operatørnettverk."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Åpne informasjon om batteriet"</string>
@@ -296,7 +297,7 @@
<string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Ingen nettverk"</string>
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi er av"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi er på"</string>
- <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Ingen Wi-Fi-nettverk er tilgjengelige"</string>
+ <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Ingen tilgjengelige Wi-Fi-nettverk"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Enhet uten navn"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Jobbprofilen er koblet til <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Den personlige profilen er koblet til <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Enheten er koblet til <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Enhetsadministrasjon"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profilovervåking"</string>
<string name="monitoring_title" msgid="169206259253048106">"Nettverksovervåking"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Deaktiver VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Koble fra VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Se retningslinjer"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Enheten din administreres av <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nAdministratoren kan overvåke og administrere innstillinger, bedriftstilgang, apper, data som er tilknyttet enheten, og enhetens posisjonsinformasjon.\n\nKontakt administratoren for å få mer informasjon."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Enheten din administreres av organisasjonen din.\n\nAdministratoren kan overvåke og administrere innstillinger, bedriftstilgang, apper, data som er tilknyttet enheten, og enhetens posisjonsinformasjon.\n\nKontakt administratoren for å få mer informasjon."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Organisasjonen din installerte en sertifiseringsinstans på denne enheten. Den sikre nettverkstrafikken din kan overvåkes eller endres."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Organisasjonen din installerte en sertifiseringsinstans i jobbprofilen din. Den sikre nettverkstrafikken din kan overvåkes eller endres."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"En sertifiseringsinstans er installert på denne enheten. Den sikre nettverkstrafikken din kan overvåkes eller endres."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Administratoren din har slått på loggføring av nettverk, som overvåker trafikken på enheten din."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Du er koblet til <xliff:g id="VPN_APP">%1$s</xliff:g>, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Du er koblet til <xliff:g id="VPN_APP_0">%1$s</xliff:g> og <xliff:g id="VPN_APP_1">%2$s</xliff:g>, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Jobbprofilen din er koblet til <xliff:g id="VPN_APP">%1$s</xliff:g>, som kan overvåke nettverksaktiviteten din, inkludert e-poster, apper og nettsteder."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Den personlige profilen din er koblet til <xliff:g id="VPN_APP">%1$s</xliff:g>, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Enheten din administreres av <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -645,7 +641,7 @@
<string name="nav_bar_default" msgid="8587114043070993007">"(standard)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Utklippstavle"</item>
- <item msgid="5742013440802239414">"Nøkkelkode"</item>
+ <item msgid="5742013440802239414">"Tastkode"</item>
<item msgid="8802889973626281575">"Bytteknapp for tastatur"</item>
<item msgid="8175437057325747277">"Ingen"</item>
</string-array>
@@ -661,11 +657,11 @@
<string name="adjust_button_width" msgid="6138616087197632947">"Juster bredden på knappen"</string>
<string name="clipboard" msgid="1313879395099896312">"Utklippstavle"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Spesialtilpasset navigasjonsknapp"</string>
- <string name="left_keycode" msgid="2010948862498918135">"Venstre-nøkkelkode"</string>
- <string name="right_keycode" msgid="708447961000848163">"Høyre-nøkkelkode"</string>
+ <string name="left_keycode" msgid="2010948862498918135">"Venstre-tastkode"</string>
+ <string name="right_keycode" msgid="708447961000848163">"Høyre-tastkode"</string>
<string name="left_icon" msgid="3096287125959387541">"Venstre-ikon"</string>
<string name="right_icon" msgid="3952104823293824311">"Høyre-ikon"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"Dra for å legge til fliser"</string>
+ <string name="drag_to_add_tiles" msgid="7058945779098711293">"Dra for å legge til felt"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Dra hit for å fjerne"</string>
<string name="qs_edit" msgid="2232596095725105230">"Endre"</string>
<string name="tuner_time" msgid="6572217313285536011">"Tid"</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g>-varsel: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Det kan hende at appen ikke fungerer med delt skjerm."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Appen støtter ikke delt skjerm."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Appen fungerer kanskje ikke på en sekundær skjerm."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Appen støtter ikke oppstart på sekundære skjermer."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Åpne innstillingene."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Åpner hurtiginnstillingene."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Lukk hurtiginnstillingene."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Du trenger ikke å installere instant-apper."</string>
<string name="app_info" msgid="6856026610594615344">"Info om appen"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Gå til nettstedet"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobildata"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi er av"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth er av"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index d9f3bb4..5099435 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -152,14 +152,12 @@
<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>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"मोबाइल डेटा"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"मोबाइल डेटा सक्रिय छ"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"मोबाइल डेटा निष्क्रिय छ"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ब्लुटुथ टेदर गर्दै।"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"हवाइजहाज मोड।"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN सक्रिय छ।"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM कार्ड छैन।"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"वाहक नेटवर्क परिवर्तन हुँदै।"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"ब्याट्री सम्बन्धी विवरणहरूलाई खोल्नुहोस्"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"चार्ज गर्दै"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G डेटा रोकिएको छ"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G डेटा रोकिएको छ"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"मोबाइल डेटा पज गरिएको छ"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"डेटा रोकिएको छ"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"तपाईंले सेट गर्नुभएको डेटाको अधिकतम सीमामा पुगिएको छ। तपाईंले अब उप्रान्त मोबाइल डेटाको प्रयोग गर्नुहुने छैन। \n\nतपाईंले प्रयोग जारी राख्नुभयो भने डेटा प्रयोगका शुल्कहरू लाग्न सक्छन्।"</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"पुनः सुरु गर्नुहोस्"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"इन्टरनेट जडान छैन"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi जडित"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"हटस्पट"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"अधिसूचनाहरू"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"फ्ल्यासलाइट"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"मोबाइल डेटा"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"डेटाको प्रयोग"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"बाँकी डेटा"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"सीमाभन्दा बढी"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"कार्य प्रोफाइल <xliff:g id="VPN_APP">%1$s</xliff:g> मा जडान छ"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"व्यक्तिगत प्रोफाइललाई <xliff:g id="VPN_APP">%1$s</xliff:g> मा जडान गरिएको छ"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"उक्त यन्त्रलाई <xliff:g id="VPN_APP">%1$s</xliff:g> मा जडान गरिएको छ"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"यन्त्रको व्यवस्थापन"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"प्रोफाइल अनुगमन गर्दै"</string>
<string name="monitoring_title" msgid="169206259253048106">"सञ्जाल अनुगमन"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN असक्षम गर्नुहोस्"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"विच्छेद VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"नीतिहरू हेर्नुहोस्"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ले तपाईंको यन्त्रको व्यवस्थापन गर्छ।BREAK\n\nतपाईंका प्रशासकले सेटिङहरू, संस्थागत पहुँच, अनुप्रयोगहरू, तपाईंको यन्त्रसँग सम्बन्धित डेटा र तपाईंको यन्त्रको स्थान सम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"तपाईंको संगठनले तपाईंको यन्त्रको व्यवस्थापन गर्छ।\n\nतपाईंका प्रशासकले सेटिङहरू, संस्थागत पहुँच, अनुप्रयोगहरू, तपाईंको यन्त्रसँग सम्बन्धित डेटा र तपाईंको यन्त्रको स्थान सम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"तपाईंको संगठनले तपाईंको कार्य प्रोफाइलमा एउटा प्रमाणपत्र सम्बन्धी अख्तियार सुविधा स्थापित गऱ्यो। तपाईंको सुरक्षित नेटवर्क ट्राफिकको अनुगमन वा परिमार्जन हुनसक्छ।"</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"तपाईंको संगठनले तपाईंको कार्य प्रोफाइलमा एउटा प्रमाणपत्र सम्बन्धी अख्तियार सुविधा स्थापना गरेको छ। तपाईंको सुरक्षित नेटवर्क ट्राफिकको अनुगमन वा परिमार्जन हुनसक्छ।"</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"यस यन्त्रमा एउटा प्रमाणपत्र सम्बन्धी अख्तियार सुविधा स्थापना गरिएको छ। तपाईंको सुरक्षित नेटवर्कको ट्राफिकको अनुगमन वा परिमार्जन हुनसक्छ।"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"तपाईंका प्रशासकले तपाईंको यन्त्रमा ट्राफिकको अनुगमन गर्ने नेटवर्क लग गर्ने प्रक्रियालाई सक्रिय गर्नुभएको छ।"</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"तपाईं इमेल, अनुप्रयोग र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP">%1$s</xliff:g> मा जडान हुनुहुन्छ।"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"तपाईं इमेल, अनुप्रयोग र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP_0">%1$s</xliff:g> र <xliff:g id="VPN_APP_1">%2$s</xliff:g> मा जडान हुनुहुन्छ।"</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"तपाईंको कार्य प्रोफाइल तपाईंका इमेल, अनुप्रयोग र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP">%1$s</xliff:g> मा जडान छ।"</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"तपाईंको व्यक्तिगत प्रोफाइल इमेल, अनुप्रयोग र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP">%1$s</xliff:g> मा जडान छ।"</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"तपाईंको यन्त्र <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> द्वारा व्यवस्थापन गरिएको छ।"</string>
@@ -569,12 +559,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> र <xliff:g id="NUMBER_5">%3$d</xliff:g> अन्य</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> र <xliff:g id="NUMBER_2">%3$d</xliff:g> अन्य</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> का सूचना सम्बन्धी नियन्त्रणहरूलाई खोलियो"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> का सूचना सम्बन्धी नियन्त्रणहरूलाई बन्द गरियो"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"यो च्यानलका सूचनाहरूलाई अनुमति दिनुहोस्"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"सबै कोटिहरू"</string>
<string name="notification_more_settings" msgid="816306283396553571">"थप सेटिङहरू"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"आफू अनुकूल पार्नुहोस्: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> को सूचना: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"अनुप्रयोगले विभाजित-स्क्रिनमा काम नगर्न सक्छ।"</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"अनुप्रयोगले विभाजित-स्क्रिनलाई समर्थन गर्दैन।"</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"यो अनुप्रयोगले सहायक प्रदर्शनमा काम नगर्नसक्छ।"</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"अनुप्रयोगले सहायक प्रदर्शनहरूमा लोकार्पण गर्ने गतिविधिलाई समर्थन गर्दैन।"</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"सेटिङहरूलाई खोल्नुहोस्।"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"द्रुत सेटिङहरूलाई खोल्नुहोस्।"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"द्रुत सेटिङहरूलाई बन्द गर्नुहोस्।"</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"तस्बिर मेनुमा तस्बिर"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> तस्बिरभित्रको तस्बिरमा छ"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"तपाईं <xliff:g id="NAME">%s</xliff:g> ले यो सुविधा प्रयोग नगरोस् भन्ने चाहनुहुन्छ भने ट्याप गरेर सेटिङहरू खोल्नुहोस् र यसलाई निष्क्रिय पार्नुहोस्।"</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"प्ले गर्नुहोस्"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"पज गर्नुहोस्"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"अर्कोमा जानुहोस्"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"अघिल्लोमा जानुहोस्"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"फोन अति नै तातिएकाले चिसिन बन्द भयो"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"तपाईंको फोन अब सामान्य ढंगले चल्दै छ"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"तपाईंको फोन अति नै तातिएकाले चिसिन बन्द भयो। तपाईंको फोन अब सामान्य ढंगले चल्दै छ।\n\nतपाईंले निम्न कुराहरू गर्नुभयो भने तपाईंको फोन अत्यन्त तातो हुनसक्छ:\n • धेरै संसाधन खपत गर्ने अनुप्रयोगहरूको प्रयोग (जस्तै गेमिङ, भिडियो वा नेभिगेसन अनुप्रयोगहरू)\n • ठूला फाइलहरूको डाउनलोड वा अपलोड\n • उच्च तापक्रममा फोनको प्रयोग"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"तात्कालिक अनुप्रयोगहरू"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"तात्कालिक अनुप्रयोगहरूलाई स्थापना गर्नु पर्दैन|"</string>
<string name="app_info" msgid="6856026610594615344">"अनुप्रयोगका बारे जानकारी"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"वेबमा जानुहोस्"</string>
<string name="mobile_data" msgid="7094582042819250762">"मोबाइल डेटा"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi‑Fi निष्क्रिय छ"</string>
<string name="bt_is_off" msgid="2640685272289706392">"ब्लुटुथ निष्क्रिय छ"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index bccf148..fe418e2 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -152,14 +152,12 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wifi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"Geen simkaart."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"Mobiele data"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Mobiele data aan"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobiele data uit"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-tethering."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Vliegtuigmodus."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN ingeschakeld."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Geen simkaart."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Netwerk van provider wordt gewijzigd."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Accudetails openen"</string>
@@ -195,7 +193,7 @@
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi uitgeschakeld."</string>
<string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"Wifi ingeschakeld."</string>
<string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobiel <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
- <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Accu: <xliff:g id="STATE">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batterij: <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"Vliegtuigmodus uit."</string>
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Vliegtuigmodus aan."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Vliegtuigmodus uitgeschakeld."</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Opladen"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G/3G-data zijn onderbroken"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-data zijn onderbroken"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Mobiele data zijn onderbroken"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Gegevens zijn onderbroken"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"De datalimiet die je hebt ingesteld, is bereikt. Je gebruikt geen mobiele data meer.\n\nAls je hervat, kunnen er kosten voor datagebruik in rekening worden gebracht."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Hervatten"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Geen internetverbinding"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Verbonden via wifi"</string>
@@ -279,7 +275,7 @@
<string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth uit"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"Geen gekoppelde apparaten beschikbaar"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Helderheid"</string>
- <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatische rotatie"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatisch draaien"</string>
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Scherm automatisch draaien"</string>
<string name="accessibility_quick_settings_rotation_value" msgid="8187398200140760213">"Modus voor <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"Rotatie vergrendeld"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Meldingen"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Zaklamp"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobiele data"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Datagebruik"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Resterende gegevens"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Limiet overschreden"</string>
@@ -363,7 +358,7 @@
<string name="zen_silence_introduction" msgid="3137882381093271568">"Hiermee worden ALLE geluiden en trillingen geblokkeerd, waaronder die voor alarmen, muziek, video\'s en games."</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">"Minder urgente meldingen onderaan"</string>
- <string name="notification_tap_again" msgid="7590196980943943842">"Tik nogmaals om te openen"</string>
+ <string name="notification_tap_again" msgid="7590196980943943842">"Tik nog eens om te openen"</string>
<string name="keyguard_unlock" msgid="8043466894212841998">"Veeg omhoog om te ontgrendelen"</string>
<string name="do_disclosure_generic" msgid="5615898451805157556">"Dit apparaat wordt beheerd door je organisatie"</string>
<string name="do_disclosure_with_name" msgid="5640615509915445501">"Dit apparaat wordt beheerd door <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Werkprofiel verbonden met <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Persoonlijk profiel verbonden met <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Apparaat verbonden met <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Apparaatbeheer"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profielcontrole"</string>
<string name="monitoring_title" msgid="169206259253048106">"Netwerkcontrole"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN uitschakelen"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Verbinding met VPN verbreken"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Beleid bekijken"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Je apparaat wordt beheerd door <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nJe beheerder kan instellingen, zakelijke toegang, apps, aan je apparaat gekoppelde gegevens en de locatiegegevens van je apparaat controleren en beheren.\n\nNeem contact op met je beheerder voor meer informatie."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Je apparaat wordt beheerd door je organisatie.\n\nJe beheerder kan instellingen, zakelijke toegang, apps, aan je apparaat gekoppelde gegevens en de locatiegegevens van je apparaat controleren en beheren.\n\nNeem contact op met je beheerder voor meer informatie."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Je organisatie heeft een certificeringsinstantie geïnstalleerd op dit apparaat. Je beveiligde netwerkverkeer kan worden bijgehouden of aangepast."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Je organisatie heeft een certificeringsinstantie geïnstalleerd in je werkprofiel. Je beveiligde netwerkverkeer kan worden bijgehouden of aangepast."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Er is een certificeringsinstantie geïnstalleerd op dit apparaat. Je beveiligde netwerkverkeer kan worden bijgehouden of aangepast."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Je beheerder heeft netwerkregistratie ingeschakeld, waarmee het verkeer op je apparaat wordt bijgehouden."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Je bent verbonden met <xliff:g id="VPN_APP">%1$s</xliff:g>, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden gecontroleerd."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Je bent verbonden met <xliff:g id="VPN_APP_0">%1$s</xliff:g> en <xliff:g id="VPN_APP_1">%2$s</xliff:g>, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden bijgehouden."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Je werkprofiel is verbonden met <xliff:g id="VPN_APP">%1$s</xliff:g>, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden bijgehouden."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Je persoonlijke profiel is verbonden met <xliff:g id="VPN_APP">%1$s</xliff:g>, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden bijgehouden."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Je apparaat wordt beheerd door <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -569,12 +559,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> en <xliff:g id="NUMBER_5">%3$d</xliff:g> andere</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> en <xliff:g id="NUMBER_2">%3$d</xliff:g> andere</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Beheeropties voor meldingen voor <xliff:g id="APP_NAME">%1$s</xliff:g> geopend"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"Beheeropties voor meldingen voor <xliff:g id="APP_NAME">%1$s</xliff:g> gesloten"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Meldingen van dit kanaal toestaan"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"Alle categorieën"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Meer instellingen"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"Aanpassen: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -589,7 +576,7 @@
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozefunctie <xliff:g id="TIME_AMOUNT">%1$s</xliff:g> actief"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Accugebruik"</string>
<string name="battery_detail_charging_summary" msgid="1279095653533044008">"Accubesparing niet beschikbaar tijdens opladen"</string>
- <string name="battery_detail_switch_title" msgid="6285872470260795421">"Accubesparing"</string>
+ <string name="battery_detail_switch_title" msgid="6285872470260795421">"Batterijbesparing"</string>
<string name="battery_detail_switch_summary" msgid="9049111149407626804">"Vermindert de prestaties en achtergrondgegevens"</string>
<string name="keyboard_key_button_template" msgid="6230056639734377300">"Knop <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string>
@@ -637,7 +624,7 @@
<string name="volume_and_do_not_disturb" msgid="3373784330208603030">"Niet storen"</string>
<string name="volume_dnd_silent" msgid="4363882330723050727">"Volumeknoppen als sneltoets"</string>
<string name="volume_up_silent" msgid="7141255269783588286">"\'Niet storen\' afsluiten bij volume omhoog"</string>
- <string name="battery" msgid="7498329822413202973">"Accu"</string>
+ <string name="battery" msgid="7498329822413202973">"Batterij"</string>
<string name="clock" msgid="7416090374234785905">"Klok"</string>
<string name="headset" msgid="4534219457597457353">"Headset"</string>
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Hoofdtelefoon aangesloten"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g>-melding: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"App werkt mogelijk niet met gesplitst scherm."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"App biedt geen ondersteuning voor gesplitst scherm."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"App werkt mogelijk niet op een secundair display."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"App biedt geen ondersteuning voor lancering op secundaire displays."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Instellingen openen."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Snelle instellingen openen."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Snelle instellingen sluiten."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"Beeld-in-beeld-menu"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> is in beeld-in-beeld"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Als je niet wilt dat <xliff:g id="NAME">%s</xliff:g> deze functie gebruikt, tik je om de instellingen te openen en schakel je de functie uit."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"Afspelen"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"Onderbreken"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"Doorgaan naar volgende"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"Teruggaan naar vorige"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"Telefoon uitgezet wegens hitte"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"Je telefoon presteert nu weer zoals gebruikelijk"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"Je telefoon was te warm en is uitgeschakeld om af te koelen. Je telefoon presteert nu weer zoals gebruikelijk.\n\nJe telefoon kan warm worden als je:\n • bronintensieve apps gebruikt (zoals game-, video-, of navigatie-apps),\n • grote bestanden up- of downloadt,\n • je telefoon gebruikt bij hoge temperaturen."</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant-apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant-apps hoeven niet te worden geïnstalleerd."</string>
<string name="app_info" msgid="6856026610594615344">"App-info"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Ga naar internet"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobiele data"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wifi is uitgeschakeld"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth is uitgeschakeld"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 3793bbf..b10783e 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -152,14 +152,12 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"ਕਿਨਾਰਾ"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"ਕੋਈ SIM ਨਹੀਂ।"</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"ਮੋਬਾਈਲ ਡੈਟਾ"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"ਮੋਬਾਈਲ ਡੈਟਾ ਚਾਲੂ ਹੈ"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"ਮੋਬਾਈਲ ਡੈਟਾ ਬੰਦ ਹੈ"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth ਟੀਥਰਿੰਗ।"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ਏਅਰਪਲੇਨ ਮੋਡ।"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN ਚਾਲੂ ਹੈ।"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"ਕੋਈ SIM ਕਾਰਡ ਨਹੀਂ।"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"ਕੈਰੀਅਰ ਨੈੱਟਵਰਕ ਪਰਿਵਰਤਨ।"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"ਬੈਟਰੀ ਵੇਰਵੇ ਖੋਲ੍ਹੋ"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"ਮੋਬਾਈਲ ਡੈਟਾ ਰੋਕ ਦਿੱਤਾ ਗਿਆ ਹੈ"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"ਤੁਸੀਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਸੈੱਟ ਕੀਤੀ ਗਈ ਡੈਟਾ ਸੀਮਾ \'ਤੇ ਪਹੁੰਚ ਚੁੱਕੇ ਹੋ। ਤੁਸੀਂ ਹੁਣ ਮੋਬਾਈਲ ਡੈਟੇ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰ ਰਹੇ ਹੋ।\n\nਜੇਕਰ ਤੁਸੀਂ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਦੇ ਹੋ, ਤਾਂ ਡੈਟਾ ਵਰਤੋਂ ਲਈ ਖਰਚੇ ਲਾਗੂ ਹੋ ਸਕਦੇ ਹਨ।"</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਕਰੋ"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"ਕੋਈ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਨਹੀਂ"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi ਕਨੈਕਟ ਕੀਤਾ"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ਹੌਟਸਪੌਟ"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"ਸੂਚਨਾਵਾਂ"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ਫਲੈਸ਼ਲਾਈਟ"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"ਮੋਬਾਈਲ ਡੈਟਾ"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ਡੈਟਾ ਉਪਯੋਗ"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ਬਾਕੀ ਡੈਟਾ"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"ਸੀਮਾ ਤੋਂ ਵੱਧ"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ <xliff:g id="VPN_APP">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"ਨਿੱਜੀ ਪ੍ਰੋਫਾਈਲ <xliff:g id="VPN_APP">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"ਡੀਵਾਈਸ <xliff:g id="VPN_APP">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"ਡੀਵਾਈਸ ਪ੍ਰਬੰਧਨ"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ਪ੍ਰੋਫਾਈਲ ਦਾ ਨਿਰੀਖਣ ਕਰਨਾ"</string>
<string name="monitoring_title" msgid="169206259253048106">"ਨੈੱਟਵਰਕ ਨਿਰੀਖਣ ਕਰ ਰਿਹਾ ਹੈ"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN ਨੂੰ ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"ਨੀਤੀਆਂ ਵੇਖੋ"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਨਾਲ ਸਬੰਧਿਤ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਾਂ, ਡੈਟੇ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਦੀ ਨਿਗਰਾਨੀ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਨਾਲ ਸਬੰਧਿਤ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਾਂ, ਡੈਟੇ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਇੱਕ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਟੀ ਸਥਾਪਤ ਕੀਤੀ ਗਈ ਹੈ। ਤੁਹਾਡੇ ਸੁਰੱਖਿਅਤ ਨੈੱਟਵਰਕ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ ਜਾਂ ਉਸਨੂੰ ਸੋਧਿਆ ਜਾ ਸਕਦਾ ਹੈ।"</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਇੱਕ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਟੀ ਸਥਾਪਤ ਕੀਤੀ ਗਈ ਹੈ। ਤੁਹਾਡੇ ਸੁਰੱਖਿਅਤ ਨੈੱਟਵਰਕ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ ਜਾਂ ਉਸਨੂੰ ਸੋਧਿਆ ਜਾ ਸਕਦਾ ਹੈ।"</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"ਇੱਕ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਟੀ ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਸਥਾਪਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਤੁਹਾਡੇ ਸੁਰੱਖਿਅਤ ਨੈੱਟਵਰਕ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ ਜਾਂ ਉਸਨੂੰ ਸੋਧਿਆ ਜਾ ਸਕਦਾ ਹੈ।"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਨੈੱਟਵਰਕ ਲੌਗਿੰਗ ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਹੋਇਆ ਹੈ, ਜੋ ਤੁਹਾਡੀ ਡੀਵਾਈਸ \'ਤੇ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕਰਦਾ ਹੈ।"</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"ਤੁਸੀਂ <xliff:g id="VPN_APP">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"ਤੁਸੀਂ <xliff:g id="VPN_APP_0">%1$s</xliff:g> ਅਤੇ <xliff:g id="VPN_APP_1">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀਆਂ ਹਨ।"</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"ਤੁਹਾਡਾ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ <xliff:g id="VPN_APP">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"ਤੁਹਾਡਾ ਨਿੱਜੀ ਪ੍ਰੋਫਾਈਲ <xliff:g id="VPN_APP">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"ਤੁਹਾਡੀ ਡੀਵਾਈਸ <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।"</string>
@@ -569,12 +559,9 @@
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, ਅਤੇ <xliff:g id="NUMBER_5">%3$d</xliff:g> ਹੋਰ</item>
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, ਅਤੇ <xliff:g id="NUMBER_5">%3$d</xliff:g> ਹੋਰ</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਸੂਚਨਾ ਕੰਟਰੋਲਾਂ ਨੂੰ ਖੋਲ੍ਹਿਆ ਗਿਆ"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਸੂਚਨਾ ਕੰਟਰੋਲਾਂ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"ਇਸ ਚੈਨਲ ਤੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"ਸਭ ਸ਼੍ਰੇਣੀਆਂ"</string>
<string name="notification_more_settings" msgid="816306283396553571">"ਹੋਰ ਸੈਟਿੰਗਾਂ"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ ਕਰੋ: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> ਸੂਚਨਾ: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਐਪ ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਨਾਲ ਕੰਮ ਨਾ ਕਰੇ।"</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"ਐਪ ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਨੂੰ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ।"</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਐਪ ਸੈਕੰਡਰੀ ਡਿਸਪਲੇ \'ਤੇ ਕੰਮ ਨਾ ਕਰ ਸਕੇ।"</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"ਐਪ ਸੈਕੰਡਰੀ ਡਿਸਪਲੇਜ਼ ਨੂੰ ਲਾਂਚ ਕਰਨ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ।"</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ।"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ ਨੂੰ ਖੋਲ੍ਹੋ।"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ ਨੂੰ ਬੰਦ ਕਰੋ।"</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ ਮੀਨੂ"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ \'ਚ ਹੈ"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"ਜੇ ਤੁਸੀਂ ਨਹੀਂ ਚਾਹੁੰਦੇ ਕਿ <xliff:g id="NAME">%s</xliff:g> ਐਪ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੇ, ਤਾਂ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।"</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"ਚਲਾਓ"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"ਵਿਰਾਮ ਦਿਓ"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"ਅਗਲੇ \'ਤੇ ਜਾਓ"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"ਪਿਛਲੇ \'ਤੇ ਜਾਓ"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"ਗਰਮ ਹੋਣ ਕਾਰਨ ਫ਼ੋਨ ਬੰਦ ਹੋ ਗਿਆ"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਹੁਣ ਸਹੀ ਚੱਲ ਰਿਹਾ ਹੈ"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਬਹੁਤ ਗਰਮ ਸੀ, ਇਸ ਲਈ ਇਹ ਠੰਡਾ ਹੋਣ ਵਾਸਤੇ ਬੰਦ ਹੋ ਗਿਆ ਸੀ। ਤੁਹਾਡਾ ਫ਼ੋਨ ਹੁਣ ਸਹੀ ਚੱਲ ਰਿਹਾ ਹੈ।\n\nਤੁਹਾਡਾ ਫ਼ੋਨ ਬਹੁਤ ਗਰਮ ਹੋ ਸਕਦਾ ਹੈ ਜੇ:\n • ਤੁਸੀਂ ਸਰੋਤਾਂ ਦੀ ਵੱਧ ਵਰਤੋਂ ਵਾਲੀਆਂ ਐਪਾਂ (ਜਿਵੇਂ ਗੇਮਿੰਗ, ਵੀਡੀਓ, ਜਾਂ ਆਵਾਗੌਣ ਐਪਾਂ) ਵਰਤਦੇ ਹੋ \n • ਵੱਡੀਆਂ ਫ਼ਾਈਲਾਂ ਡਾਊਨਲੋਡ ਜਾਂ ਅੱਪਲੋਡ ਕਰਦੇ ਹੋ\n • ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਉੱਚ ਤਾਪਮਾਨਾਂ ਵਿੱਚ ਵਰਤਦੇ ਹੋ"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"ਤਤਕਾਲ ਐਪਾਂ"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ਤਤਕਾਲ ਐਪਾਂ ਨੂੰ ਸਥਾਪਨਾ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ।"</string>
<string name="app_info" msgid="6856026610594615344">"ਐਪ ਜਾਣਕਾਰੀ"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"ਵੈੱਬ \'ਤੇ ਜਾਓ"</string>
<string name="mobile_data" msgid="7094582042819250762">"ਮੋਬਾਈਲ ਡੈਟਾ"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ਬੰਦ ਹੈ"</string>
<string name="bt_is_off" msgid="2640685272289706392">"ਬਲੂਟੁੱਥ ਬੰਦ ਹੈ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 528f7c2..643cb26 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -154,14 +154,12 @@
<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">"Brak karty SIM."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"Mobilna transmisja danych"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Mobilna transmisja danych włączona"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobilna transmisja danych wyłączona"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Powiązanie Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Tryb samolotowy."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"Sieć VPN włączona."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Brak karty SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Zmiana sieci operatora."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Zobacz szczegóły baterii"</string>
@@ -244,11 +242,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Ładowanie"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Transmisja danych 2G-3G została wstrzymana"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Transmisja danych 4G została wstrzymana"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Mobilna transmisja danych jest wstrzymana"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Transmisja danych została wstrzymana"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Osiągnięto ustawiony limit danych. Nie korzystasz już z komórkowej transmisji danych.\n\nJeśli włączysz ją ponownie, może zostać naliczona opłata za transmisję danych."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Wznów"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Brak internetu"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi: połączono"</string>
@@ -323,8 +319,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Powiadomienia"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Latarka"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobilna transmisja danych"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Użycie danych"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Pozostały limit"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Przekroczono limit"</string>
@@ -363,7 +358,7 @@
<string name="description_direction_left" msgid="7207478719805562165">"Przesuń w lewo: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_priority_introduction" msgid="3070506961866919502">"Urządzenie nie będzie odtwarzać dźwięków ani włączać wibracji, z wyjątkiem wybranych przez Ciebie alarmów, przypomnień, wydarzeń i kontaktów."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Dostosuj"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"To zablokuje WSZYSTKIE dźwięki i wibracje, w tym alarmy, muzykę, filmy i gry. Nadal będzie można wykonywać połączenia."</string>
+ <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"To zablokuje WSZYSTKIE dźwięki i wibracje, w tym alarmy, muzykę, filmy i gry. Nadal będzie można wykonywać połączenia."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"To zablokuje WSZYSTKIE dźwięki i wibracje – w tym alarmy, muzykę, filmy i gry."</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">"Poniżej widać mniej pilne powiadomienia"</string>
@@ -437,8 +432,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Profil do pracy połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Profil osobisty połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Urządzenie połączone z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Zarządzanie urządzeniami"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitorowanie profilu"</string>
<string name="monitoring_title" msgid="169206259253048106">"Monitorowanie sieci"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -447,18 +441,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Wyłącz VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Rozłącz z VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Zobacz zasady"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Urządzeniem zarządza <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nAdministrator może monitorować ustawienia, firmowe uprawnienia dostępu, aplikacje, dane dotyczące urządzenia i lokalizacji oraz nimi zarządzać.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Urządzeniem zarządza Twoja organizacja.\n\nAdministrator może monitorować ustawienia, firmowe uprawnienia dostępu, aplikacje, dane dotyczące urządzenia i lokalizacji oraz nimi zarządzać.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Twoja organizacja zainstalowała urząd certyfikacji na tym urządzeniu. Zabezpieczony ruch w sieci może być monitorowany i zmieniany."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Twoja organizacja zainstalowała urząd certyfikacji w Twoim profilu do pracy. Zabezpieczony ruch w sieci może być monitorowany i zmieniany."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Urząd certyfikacji zainstalowany na tym urządzeniu. Twój zabezpieczony ruch w sieci może być monitorowany i zmieniany."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Administrator włączył rejestrowanie sieciowe, które pozwala monitorować ruch na Twoim urządzeniu."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Łączysz się z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Łączysz się z aplikacjami <xliff:g id="VPN_APP_0">%1$s</xliff:g> i <xliff:g id="VPN_APP_1">%2$s</xliff:g>, które mogą monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Twój profil do pracy jest połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Twój profil osobisty jest połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Twoim urządzeniem zarządza <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -577,12 +567,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> i <xliff:g id="NUMBER_5">%3$d</xliff:g> innego</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> i <xliff:g id="NUMBER_2">%3$d</xliff:g> inny</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Sterowanie powiadomieniami aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> otwarte"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"Sterowanie powiadomieniami aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> zamknięte"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Zezwól na powiadomienia z tego kanału"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"Wszystkie kategorie"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Więcej ustawień"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"Dostosuj: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -720,6 +707,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Powiadomienie z aplikacji <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Aplikacja może nie działać przy podzielonym ekranie."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Aplikacja nie obsługuje dzielonego ekranu."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Aplikacja może nie działać na ekranie dodatkowym."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Aplikacja nie obsługuje uruchamiania na ekranach dodatkowych."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Otwórz ustawienia."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Otwórz szybkie ustawienia."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Zamknij szybkie ustawienia."</string>
@@ -738,14 +727,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"Menu funkcji Obraz w obrazie"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"Aplikacja <xliff:g id="NAME">%s</xliff:g> działa w trybie obraz w obrazie"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Jeśli nie chcesz, by aplikacja <xliff:g id="NAME">%s</xliff:g> korzystała z tej funkcji, otwórz ustawienia i ją wyłącz."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"Odtwórz"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"Wstrzymaj"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"Dalej"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"Wstecz"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"Telefon wyłączony: przegrzanie"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"Telefon działa teraz normalnie"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"Telefon był zbyt gorący i wyłączył się, by obniżyć temperaturę. Urządzenie działa teraz normalnie.\n\nTelefon może się przegrzać, gdy:\n • Używasz aplikacji zużywających dużo zasobów (np. gier, nawigacji czy odtwarzaczy filmów)\n • Pobierasz lub przesyłasz duże pliki\n • Używasz telefonu w wysokiej temperaturze"</string>
@@ -773,8 +758,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Aplikacje błyskawiczne"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Aplikacji błyskawicznych nie trzeba instalować."</string>
<string name="app_info" msgid="6856026610594615344">"O aplikacji"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Wejdź na stronę internetową"</string>
<string name="mobile_data" msgid="7094582042819250762">"Komórkowa transmisja danych"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi jest wyłączone"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth jest wyłączony"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 6692560..8c6efb0 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Dados móveis desativados"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Tethering Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Modo avião."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN ativada."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Sem cartão SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Alteração de rede de operadora."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Abrir detalhes da bateria"</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Perfil de trabalho conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Perfil pessoal conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"O dispositivo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Gerenciamento de dispositivos"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitoramento de perfis"</string>
<string name="monitoring_title" msgid="169206259253048106">"Monitoramento de rede"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -439,18 +439,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Desativar VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Desconectar VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Ver políticas"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Seu dispositivo é gerenciado por <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nO administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e informações de localização do dispositivo.\n\nPara ver mais informações, entre em contato com o administrador."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Seu dispositivo é gerenciado pela sua organização.\n\nO administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e informações de localização do dispositivo.\n\nPara ver mais informações, entre em contato com o administrador."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Sua organização instalou uma autoridade de certificação neste dispositivo. É possível monitorar ou modificar seu tráfego de rede seguro."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Sua organização instalou uma autoridade de certificação no seu perfil de trabalho. É possível monitorar ou modificar seu tráfego de rede seguro."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Uma autoridade de certificação foi instalada neste dispositivo. É possível monitorar ou modificar seu tráfego de rede seguro."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Seu administrador ativou o registro de rede, que monitora o tráfego no seu dispositivo."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Você está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Você está conectado a <xliff:g id="VPN_APP_0">%1$s</xliff:g> e <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que podem monitorar sua atividade de rede, incluindo e-mails, apps e websites."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Seu perfil de trabalho está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorar sua atividade de rede, incluindo e-mails, apps e websites."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Seu perfil pessoal está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorar sua atividade de rede, incluindo e-mails, apps e websites."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Seu dispositivo é gerenciado por <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -705,6 +701,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Notificação do <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"É possível que o app não funcione com o recurso de divisão de tela."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"O app não é compatível com a divisão de tela."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"É possível que o app não funcione em uma tela secundária."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"O app não é compatível com a inicialização em telas secundárias."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Abrir configurações."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Abrir as configurações rápidas."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Fechar as configurações rápidas."</string>
@@ -754,8 +752,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Os Instant Apps não requerem instalação."</string>
<string name="app_info" msgid="6856026610594615344">"Informações do app"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Acessar a Web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Dados móveis"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"O Wi-Fi está desativado"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth desativado"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 845a48c..58b002b 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Dados móveis desativados"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Ligação Bluetooth via telemóvel."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Modo de avião"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN ativada."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Nenhum cartão SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Rede do operador em mudança."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Abrir detalhes da bateria"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Perfil de trabalho ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Perfil pessoal ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Dispositivo ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Gestão de dispositivos"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitorização de perfis"</string>
<string name="monitoring_title" msgid="169206259253048106">"Monitorização da rede"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Desativar a VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Desligar VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Ver Políticas"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"O dispositivo é gerido pela <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nO administrador pode monitorizar e gerir definições, acesso empresarial, aplicações, dados associados ao dispositivo e informações de localização do dispositivo.\n\nContacte o administrador para obter mais informações."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"O dispositivo é gerido pela sua entidade.\n\nO administrador pode monitorizar e gerir definições, acesso empresarial, aplicações, dados associados ao dispositivo e informações de localização do dispositivo.\n\nContacte o administrador para obter mais informações."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"A sua entidade instalou uma autoridade de certificação neste dispositivo. O tráfego da sua rede segura pode ser monitorizado ou alterado."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"A sua entidade instalou uma autoridade de certificação no seu perfil de trabalho. O tráfego da sua rede segura pode ser monitorizado ou alterado."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Está instalada uma autoridade de certificação neste dispositivo. O tráfego da sua rede segura pode ser monitorizado ou alterado."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"O administrador ativou os registos de rede, que monitorizam o tráfego no seu dispositivo."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Está ligado às redes <xliff:g id="VPN_APP_0">%1$s</xliff:g> e <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que podem monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"O seu perfil de trabalho está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"O seu perfil pessoal está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"O seu dispositivo é gerido pelo <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Notificação do <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"A aplicação pode não funcionar com o ecrã dividido."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"A aplicação não é compatível com o ecrã dividido."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"A aplicação pode não funcionar num ecrã secundário."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"A aplicação não é compatível com o início em ecrãs secundários."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Abrir as definições."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Abrir as definições rápidas."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Fechar as definições rápidas."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Aplicações instantâneas"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"As Aplicações instantâneas não requerem instalação."</string>
<string name="app_info" msgid="6856026610594615344">"Informações da aplicação"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Aceder à Web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Dados móveis"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi desativado"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth desativado"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 6692560..8c6efb0 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Dados móveis desativados"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Tethering Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Modo avião."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN ativada."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Sem cartão SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Alteração de rede de operadora."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Abrir detalhes da bateria"</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Perfil de trabalho conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Perfil pessoal conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"O dispositivo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Gerenciamento de dispositivos"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitoramento de perfis"</string>
<string name="monitoring_title" msgid="169206259253048106">"Monitoramento de rede"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -439,18 +439,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Desativar VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Desconectar VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Ver políticas"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Seu dispositivo é gerenciado por <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nO administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e informações de localização do dispositivo.\n\nPara ver mais informações, entre em contato com o administrador."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Seu dispositivo é gerenciado pela sua organização.\n\nO administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e informações de localização do dispositivo.\n\nPara ver mais informações, entre em contato com o administrador."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Sua organização instalou uma autoridade de certificação neste dispositivo. É possível monitorar ou modificar seu tráfego de rede seguro."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Sua organização instalou uma autoridade de certificação no seu perfil de trabalho. É possível monitorar ou modificar seu tráfego de rede seguro."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Uma autoridade de certificação foi instalada neste dispositivo. É possível monitorar ou modificar seu tráfego de rede seguro."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Seu administrador ativou o registro de rede, que monitora o tráfego no seu dispositivo."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Você está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Você está conectado a <xliff:g id="VPN_APP_0">%1$s</xliff:g> e <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que podem monitorar sua atividade de rede, incluindo e-mails, apps e websites."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Seu perfil de trabalho está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorar sua atividade de rede, incluindo e-mails, apps e websites."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Seu perfil pessoal está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorar sua atividade de rede, incluindo e-mails, apps e websites."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Seu dispositivo é gerenciado por <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -705,6 +701,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Notificação do <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"É possível que o app não funcione com o recurso de divisão de tela."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"O app não é compatível com a divisão de tela."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"É possível que o app não funcione em uma tela secundária."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"O app não é compatível com a inicialização em telas secundárias."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Abrir configurações."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Abrir as configurações rápidas."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Fechar as configurações rápidas."</string>
@@ -754,8 +752,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Os Instant Apps não requerem instalação."</string>
<string name="app_info" msgid="6856026610594615344">"Informações do app"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Acessar a Web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Dados móveis"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"O Wi-Fi está desativado"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth desativado"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 5b66fe2..089d3181 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -158,6 +158,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Date mobile dezactivate"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Conectarea ca modem prin Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Mod Avion."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"Rețea VPN activată"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Fără SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Se schimbă rețeaua operatorului."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Deschideți detaliile privind bateria"</string>
@@ -431,8 +432,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Profilul de serviciu este conectat la <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Profil personal conectat la <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Dispozitiv conectat la <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Gestionarea dispozitivului"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitorizarea profilului"</string>
<string name="monitoring_title" msgid="169206259253048106">"Monitorizarea rețelei"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -441,18 +441,14 @@
<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_button_view_policies" msgid="100913612638514424">"Afișați politicile"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Dispozitivul este gestionat de <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nAdministratorul dvs. poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactați administratorul."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Dispozitivul este gestionat de organizația dvs.\n\nAdministratorul dvs. poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactați administratorul."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Organizația dvs. a instalat un certificat CA pe acest dispozitiv. Traficul dvs. sigur de rețea poate fi monitorizat sau modificat."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Organizația dvs. a instalat un certificat CA în profilul dvs. de serviciu. Traficul dvs. sigur de rețea poate fi monitorizat sau modificat."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Pe acest dispozitiv este instalat un certificat CA. Traficul dvs. sigur de rețea poate fi monitorizat sau modificat."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Administratorul dvs. a activat înregistrarea în jurnal pentru rețea, funcție ce monitorizează traficul de pe dispozitivul dvs."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"V-ați conectat la aplicația <xliff:g id="VPN_APP">%1$s</xliff:g>, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"V-ați conectat la <xliff:g id="VPN_APP_0">%1$s</xliff:g> și la <xliff:g id="VPN_APP_1">%2$s</xliff:g>, care vă pot monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Profilul dvs. de serviciu este conectat la <xliff:g id="VPN_APP">%1$s</xliff:g>, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Profilul dvs. personal este conectat la <xliff:g id="VPN_APP">%1$s</xliff:g>, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Dispozitivul dvs. este gestionat de <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -709,6 +705,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Notificare <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Este posibil ca aplicația să nu funcționeze cu ecranul împărțit."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Aplicația nu acceptă ecranul împărțit."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Este posibil ca aplicația să nu funcționeze pe un afișaj secundar."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Aplicația nu acceptă lansare pe afișaje secundare."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Deschideți setările."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Deschideți setările rapide."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Închideți setările rapide."</string>
@@ -758,8 +756,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Aplicații instantanee"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Aplicațiile instantanee nu necesită instalare."</string>
<string name="app_info" msgid="6856026610594615344">"Informații despre aplicație"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Accesați pe web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Date mobile"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Conexiunea Wi-Fi este dezactivată"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Funcția Bluetooth este dezactivată"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 7b85e2e..b9ab8fd 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -159,6 +159,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Мобильный Интернет отключен"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-модем"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Режим полета."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"Режим VPN включен."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Нет SIM-карты."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Сменить сеть"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Сведения о расходе заряда батареи"</string>
@@ -278,7 +279,7 @@
<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>
- <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"Нет доступных подключенных устройств"</string>
+ <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"Нет доступных сопряженных устройств"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Яркость"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Автоповорот"</string>
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Автоповорот экрана"</string>
@@ -403,7 +404,7 @@
<string name="user_logout_notification_text" msgid="3350262809611876284">"Выход от имени пользователя"</string>
<string name="user_logout_notification_action" msgid="1195428991423425062">"ВЫЙТИ ОТ ИМЕНИ ПОЛЬЗОВАТЕЛЯ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Добавить пользователя?"</string>
- <string name="user_add_user_message_short" msgid="2161624834066214559">"После создания профиля его потребуется настроить.\n\nЛюбой пользователь устройства может обновлять приложения для всех аккаунтов."</string>
+ <string name="user_add_user_message_short" msgid="2161624834066214559">"Когда вы добавите пользователя, ему потребуется настроить профиль.\n\nЛюбой пользователь устройства может обновлять приложения для всех аккаунтов."</string>
<string name="user_remove_user_title" msgid="4681256956076895559">"Удалить аккаунт?"</string>
<string name="user_remove_user_message" msgid="1453218013959498039">"Все приложения и данные этого пользователя будут удалены."</string>
<string name="user_remove_user_remove" msgid="7479275741742178297">"Удалить"</string>
@@ -433,8 +434,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"В рабочем профиле запущено приложение \"<xliff:g id="VPN_APP">%1$s</xliff:g>\""</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"В личном профиле запущено приложение \"<xliff:g id="VPN_APP">%1$s</xliff:g>\""</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"На устройстве запущено приложение \"<xliff:g id="VPN_APP">%1$s</xliff:g>\""</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Управление устройством"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Мониторинг профиля"</string>
<string name="monitoring_title" msgid="169206259253048106">"Отслеживание сетей"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"Настройки VPN"</string>
@@ -443,18 +443,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Отключить VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Отключить VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Просмотреть политику"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Вашим устройством управляет организация \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\".\n\nАдминистратор может контролировать настройки, приложения и параметры доступа к корпоративным ресурсам на этом устройстве, а также связанные с ним данные (например, сведения о местоположении).\n\nЗа подробной информацией обращайтесь к администратору."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Этим устройством управляет ваша организация.\n\nАдминистратор может контролировать настройки, приложения и параметры доступа к корпоративным ресурсам на этом устройстве, а также связанные с ним данные (например, сведения о местоположении).\n\nЗа подробной информацией обращайтесь к администратору."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Ваша организация установила сертификат ЦС на устройство. Она может отслеживать и изменять защищенный сетевой трафик."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Ваша организация установила сертификат ЦС в рабочем профиле. Она может отслеживать и изменять защищенный сетевой трафик."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"На устройстве установлен сертификат ЦС. Ваш защищенный сетевой трафик могут отслеживать и изменять."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Администратор включил ведение сетевого журнала, чтобы отслеживать трафик на вашем устройстве."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Запущено приложение \"<xliff:g id="VPN_APP">%1$s</xliff:g>\". Оно может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и сайтами."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Запущены приложения \"<xliff:g id="VPN_APP_0">%1$s</xliff:g>\" и \"<xliff:g id="VPN_APP_1">%2$s</xliff:g>\". Они могут отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и сайтами."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"В рабочем профиле запущено приложение \"<xliff:g id="VPN_APP">%1$s</xliff:g>\", которое может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и веб-сайтами."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"В личном профиле запущено приложение \"<xliff:g id="VPN_APP">%1$s</xliff:g>\", которое может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и сайтами."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Этим устройством управляет приложение \"<xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>\""</string>
@@ -713,6 +709,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Уведомление <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Приложение не поддерживает разделение экрана."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Приложение не поддерживает разделение экрана."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Приложение может не работать на дополнительном экране."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Приложение не поддерживает запуск на дополнительных экранах."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Открыть настройки."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Развернуть быстрые настройки."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Скрыть быстрые настройки."</string>
@@ -762,8 +760,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Приложения с мгновенным запуском"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Приложения с мгновенным запуском не требуется устанавливать."</string>
<string name="app_info" msgid="6856026610594615344">"О приложении"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Перейти в браузер"</string>
<string name="mobile_data" msgid="7094582042819250762">"Моб. Интернет"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Модуль Wi-Fi отключен"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Модуль Bluetooth отключен"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index d539d1c..38f5db1 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -152,14 +152,12 @@
<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>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"ජංගම දත්ත"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"ජංගම දත්ත ක්රියාත්මකයි"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"ජංගම දත්ත ක්රියාවිරහිතයි"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"බ්ලූටූත් ටෙදරින්."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"අහස්යානා ආකාරය."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN ක්රියාත්මකයි."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM කාඩ්පත නැත."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"වාහක ජාලය වෙනස් වේ."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"බැටරි විස්තර විවෘත කරන්න"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"ආරෝපණය වෙමින්"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G දත්ත විරාම කර ඇත"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G දත්ත විරාම කර ඇත"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"ජංගම දත්ත විරාම කර ඇත"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"දත්ත විරාම කර ඇත"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"ඔබ සැකසූ දත්ත සීමාව ළඟා වී ඇත. ඔබ තවදුරටත් ජංගම දත්ත භාවිත නොකරයි. \n\nඔබ නැවත ආරම්භ කළහොත්, දත්ත භාවිතය සඳහා ගාස්තු අදාළ විය හැකිය."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"නැවත පටන්ගන්න"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"අන්තර්ජාල සම්බන්ධතාවයක් නැත"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi සම්බන්ධිතයි"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"හොට්ස්පොට්"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"දැනුම්දීම්"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"සැණෙළි ආලෝකය"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"ජංගම දත්ත"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"දත්ත භාවිතය"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ඉතිරි ඇති දත්ත"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"සීමාවට වඩා වැඩිය"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"කාර්යාල පැතිකඩ <xliff:g id="VPN_APP">%1$s</xliff:g> වෙත සම්බන්ධ වුණි"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"පුද්ගලික පැතිකඩ <xliff:g id="VPN_APP">%1$s</xliff:g> වෙත සම්බන්ධ වුණි"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"උපාංගය <xliff:g id="VPN_APP">%1$s</xliff:g> වෙත සම්බන්ධ වුණි"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"උපාංග කළමනාකරණය"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"පැතිකඩ නිරීක්ෂණය කිරීම"</string>
<string name="monitoring_title" msgid="169206259253048106">"ජාල නිරීක්ෂණය"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN අබල කරන්න."</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN විසන්ධි කරන්න"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"ප්රතිපත්ති පෙන්වන්න"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"ඔබගේ උපාංගය ඔබගේ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> විසින් කළමනාකරණය කරනු ලැබේ. \n\nඔබේ පරිපාලකට ඔබේ උපාංගය හා සම්බන්ධිත සැකසීම්, ආයතනික ප්රවේශය, යෙදුම්, දත්ත සහ ඔබේ උපාංග ස්ථාන තොරතුරු නිරීක්ෂණය සහ කළමනාකරණය කිරීමට හැකිය.\n\nවැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"ඔබගේ උපාංගය ඔබගේ සංවිධානය විසින් කළමනාකරණය කරනු ලැබේ.\n\nඔබේ පරිපාලකට ඔබේ උපාංගය හා සම්බන්ධිත සැකසීම්, ආයතනික ප්රවේශය, යෙදුම්, දත්ත සහ ඔබේ උපාංග ස්ථාන තොරතුරු නිරීක්ෂණය සහ කළමනාකරණය කිරීමට හැකිය.\n\nවැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"ඔබගේ සංවිධානය ඔබගේ උපාංගය තුළ සහතික අධිකාරියක් ස්ථාපනය කර තිබේ. ඔබගේ ආරක්ෂක ජාල තදබදය නිරීක්ෂණය හෝ වෙනස් කිරීමට පුළුවනි."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"ඔබගේ සංවිධානය ඔබගේ කාර්යාල පැතිකඩ තුළ සහතික අධිකාරියක් ස්ථාපනය කර තිබේ. ඔබගේ ආරක්ෂක ජාල තදබදය නිරීක්ෂණය හෝ වෙනස් කිරීමට පුළුවනි."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"මෙම උපාංගය තුළ සහතික අධිකාරියක් ස්ථාපනය කර තිබේ. ඔබගේ ආරක්ෂක ජාල තදබදය නිරීක්ෂණය හෝ වෙනස් කිරීමට පුළුවනි."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"ඔබගේ පරිපාලක ඔබගේ උපාංගය මත තදබදය නිරීක්ෂණය කරන ජාල ලොග් කිරීම ක්රියාත්මක කර ඇත."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ ජාල ක්රියාකාරකම් නිරීක්ෂණය කළ හැකි <xliff:g id="VPN_APP">%1$s</xliff:g>, වෙත ඔබ සම්බන්ධ වී ඇත."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ ජාල ක්රියාකාරකම් නිරීක්ෂණය කළ හැකි <xliff:g id="VPN_APP_0">%1$s</xliff:g> සහ <xliff:g id="VPN_APP_1">%2$s</xliff:g> වෙත ඔබ සම්බන්ධ වී ඇත."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ ජාල ක්රියාකාරකම් නිරීක්ෂණය කළ හැකි <xliff:g id="VPN_APP">%1$s</xliff:g>, වෙත ඔබේ කාර්යාල පැතිකඩ සම්බන්ධ වී ඇත."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ ජාල ක්රියාකාරකම් නිරීක්ෂණය කළ හැකි <xliff:g id="VPN_APP">%1$s</xliff:g> වෙත ඔබේ පුද්ගලික පැතිකඩ සම්බන්ධ වී ඇත."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"ඔබගේ උපාංගය <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> මගින් කළමනාකරණය කෙරේ."</string>
@@ -569,12 +559,9 @@
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, සහ තවත් <xliff:g id="NUMBER_5">%3$d</xliff:g>ක්</item>
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, සහ තවත් <xliff:g id="NUMBER_5">%3$d</xliff:g>ක්</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා දැනුම්දීම් පාලන විවෘත කරන ලදී"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා දැනුම්දීම් පාලන වසන ලදී"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"මෙම නාලිකාව වෙතින් දැනුම්දීම් සඳහා ඉඩ දෙන්න"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"සියලු ප්රවර්ග"</string>
<string name="notification_more_settings" msgid="816306283396553571">"තව සැකසීම්"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"අභිමත කරන්න: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> දැනුම්දීම: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"යෙදුම බෙදුම්-තිරය සමග ක්රියා නොකළ හැකිය."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"යෙදුම බෙදුණු-තිරය සඳහා සහාය නොදක්වයි."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"යෙදුම ද්විතියික සංදර්ශකයක ක්රියා නොකළ හැකිය."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"යෙදුම ද්විතීයික සංදර්ශක මත දියත් කිරීම සඳහා සහාය නොදක්වයි."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"සැකසීම් විවෘත කරන්න."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"ඉක්මන් සැකසීම් විවෘත කරන්න."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"ඉක්මන් සැකසීම් වසන්න."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"පින්තූරය තුළ පින්තූරය මෙනුව"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> පින්තූරය-තුළ-පින්තූරය තුළ වේ"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"ඔබට <xliff:g id="NAME">%s</xliff:g> මෙම විශේෂාංගය භාවිත කිරීමට අවශ්ය නැති නම්, සැකසීම් විවෘත කිරීමට තට්ටු කර එය ක්රියාවිරහිත කරන්න."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"ධාවනය කරන්න"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"විරාම කරන්න"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"ඊළඟ එකට පනින්න"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"පෙර එකට පනින්න"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"දුරකථනය රත් වීම නිසා ක්රියාවිරහිත කරන ලදී"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"ඔබගේ දුරකථනය දැන් සාමාන්ය ලෙස ධාවනය වේ"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"ඔබේ දුරකථනය ඉතාම උණුසුම්ය, එම නිසා එය සිසිල් වීමට ක්රියාවිරහිත කරන ලදී. ධැන් ඔබේ දුරකථනය සාමාන්ය පරිදි ධාවනය වේ.\n\nඔබ පහත දේවල් සිදු කළහොත් ඔබේ දුරකථනය ඉතාම උණුසුම් විය හැකිය:\n • සම්පත්-දැඩි සත්කාරක යෙදුම් භාවිතය (ක්රීඩා, වීඩියෝ, හෝ සංචලන යෙදුම් යනාදී)\n • විශාල ගොනු බාගැනීම හෝ උඩුගත කිරීම\n • ඔබේ දුරකථනය අධික උෂ්ණත්වයේදී භාවිත කිරීම"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"ක්ෂණික යෙදුම්"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"ක්ෂණික යෙදුම් ස්ථාපනය කිරීම අවශ්ය නොවේ."</string>
<string name="app_info" msgid="6856026610594615344">"යෙදුම් තොරතුරු"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"වෙබය වෙත යන්න"</string>
<string name="mobile_data" msgid="7094582042819250762">"ජංගම දත්ත"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ක්රියා විරහිතයි"</string>
<string name="bt_is_off" msgid="2640685272289706392">"බ්ලූටූත් ක්රියා විරහිතයි"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index a1af259..ebb07a5 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -159,6 +159,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobilné dáta sú vypnuté"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Pripojenie cez Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Režim v lietadle."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN je zapnuté."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Žiadna SIM karta."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Zmena siete operátora"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Otvoriť podrobnosti o batérii"</string>
@@ -233,8 +234,8 @@
<string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobilný hotspot je vypnutý."</string>
<string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobilný hotspot je zapnutý."</string>
<string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Prenášanie bolo zastavené."</string>
- <string name="accessibility_quick_settings_work_mode_off" msgid="7045417396436552890">"Pracovný režim – vyp."</string>
- <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Pracovný režim – zap."</string>
+ <string name="accessibility_quick_settings_work_mode_off" msgid="7045417396436552890">"Pracovný režim vypnutý"</string>
+ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Pracovný režim zapnutý"</string>
<string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Pracovný režim je vypnutý."</string>
<string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Pracovný režim je zapnutý."</string>
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Šetrič dát bol vypnutý."</string>
@@ -316,7 +317,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Hotovo"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Pripojené"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Pripája sa..."</string>
- <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Zdieľanie dátového pripojenia"</string>
+ <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Zdieľané pripojenie"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Upozornenia"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Baterka"</string>
@@ -357,9 +358,9 @@
<string name="description_target_search" msgid="3091587249776033139">"Vyhľadávanie"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Prejdite prstom nahor: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Prejdite prstom doľava: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="3070506961866919502">"Nebudú vás rušiť zvuky ani vibrácie s výnimkou budíkov, pripomenutí, udalostí a volajúcich, ktoré špecifikujete."</string>
+ <string name="zen_priority_introduction" msgid="3070506961866919502">"Nebudú vás rušiť zvuky ani vibrácie s výnimkou budíkov, pripomenutí, udalostí a vybraných volajúcich."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Prispôsobiť"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Zablokujú sa tým VŠETKY zvuky a vibrácie vrátane zvukov budíkov, hudby, videí a hier. Stále však budete môcť telefonovať."</string>
+ <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Budú zablokované všetky zvuky a vibrácie vrátane budíkov, hudby, videí a hier. Stále však budete môcť telefonovať."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Zablokujú sa tým VŠETKY zvuky a vibrácie vrátane zvukov budíkov, hudby, videí a hier."</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">"Menej naliehavé upozornenia sa nachádzajú nižšie"</string>
@@ -433,8 +434,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Pracovný profil je pripojený k aplikácii <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Osobný profil je pripojený k aplikácii <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Zariadenie je pripojené k aplikácii <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Správa zariadení"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitorovanie profilu"</string>
<string name="monitoring_title" msgid="169206259253048106">"Sledovanie siete"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +443,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Deaktivovať VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Odpojiť sieť VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Zobraziť pravidlá"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Zariadenie spravuje organizácia <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nSprávca môže sledovať a spravovať nastavenia, firemný prístup, aplikácie a údaje súvisiace s týmto zariadením vrátane informácií o polohe vášho zariadenia.\n\nĎalšie informácie vám poskytne správca."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Zariadenie spravuje vaša organizácia.\n\nSprávca môže sledovať a spravovať nastavenia, firemný prístup, aplikácie a údaje súvisiace s týmto zariadením vrátane informácií o polohe vášho zariadenia.\n\nĎalšie informácie vám poskytne správca."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Organizácia nainštalovala pre toto zariadenie certifikačnú autoritu. Zabezpečená sieťová premávka môže byť sledovaná či upravená."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Organizácia nainštalovala pre váš pracovný profil certifikačnú autoritu. Zabezpečená sieťová premávka môže byť sledovaná či upravená."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"V tomto zariadení je nainštalovaná certifikačná autorita. Zabezpečená sieťová premávka môže byť sledovaná či upravená."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Správca aktivoval zapisovanie do denníka siete, ktoré sleduje premávku na vašom zariadení."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Pripojili ste sa k aplikácii <xliff:g id="VPN_APP">%1$s</xliff:g>, ktorá môže sledovať vašu aktivitu v sieti, vrátane správ, aplikácií a webových stránok."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Pripojili ste sa k aplikáciám <xliff:g id="VPN_APP_0">%1$s</xliff:g> a <xliff:g id="VPN_APP_1">%2$s</xliff:g>, ktoré môžu sledovať vašu aktivitu v sieti, vrátane správ, aplikácií a webových stránok."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Váš pracovný profil je pripojený k aplikácii <xliff:g id="VPN_APP">%1$s</xliff:g>, ktorá môže sledovať vašu aktivitu v sieti vrátane správ, aplikácií a webových stránok."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Váš osobný profil je pripojený k aplikácii <xliff:g id="VPN_APP">%1$s</xliff:g>, ktorá môže sledovať vašu aktivitu v sieti vrátane správ, aplikácií a webových stránok."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Vaše zariadenie spravuje aplikácia <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -713,11 +709,13 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Upozornenie <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Aplikácia nemusí fungovať so zapnutou rozdelenou obrazovkou."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Aplikácia nepodporuje rozdelenú obrazovku."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Aplikácia nemusí fungovať na sekundárnej obrazovke."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Aplikácia nepodporuje spúšťanie na sekundárnych obrazovkách."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Otvoriť nastavenia"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Otvoriť rýchle nastavenia"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Zavrieť rýchle nastavenia"</string>
<string name="accessibility_quick_settings_alarm_set" msgid="1863000242431528676">"Budík bol nastavený."</string>
- <string name="accessibility_quick_settings_user" msgid="1567445362870421770">"Prihlásený/-á ako <xliff:g id="ID_1">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_user" msgid="1567445362870421770">"Prihlásený používateľ <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_no_internet" msgid="31890692343084075">"Žiadny internet"</string>
<string name="accessibility_quick_settings_open_details" msgid="4230931801728005194">"Otvoriť podrobnosti"</string>
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Otvoriť nastavenia <xliff:g id="ID_1">%s</xliff:g>"</string>
@@ -745,7 +743,7 @@
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Pravá skratka"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Ľavá skratka tiež odomkne"</string>
<string name="lockscreen_unlock_right" msgid="1529992940510318775">"Pravá skratka tiež odomkne"</string>
- <string name="lockscreen_none" msgid="4783896034844841821">"Žiadne"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"Žiadna"</string>
<string name="tuner_launch_app" msgid="1527264114781925348">"Spustiť aplikáciu <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="tuner_other_apps" msgid="4726596850501162493">"Ďalšie aplikácie"</string>
<string name="tuner_circle" msgid="2340998864056901350">"Kruh"</string>
@@ -762,9 +760,8 @@
<string name="instant_apps" msgid="6647570248119804907">"Okamžité aplikácie"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Okamžité aplikácie nevyžadujú inštaláciu."</string>
<string name="app_info" msgid="6856026610594615344">"Info o aplikácii"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
- <string name="mobile_data" msgid="7094582042819250762">"Mobilné dátové prenosy"</string>
+ <string name="go_to_web" msgid="1106022723459948514">"Prejsť na internet"</string>
+ <string name="mobile_data" msgid="7094582042819250762">"Mobilné dáta"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Pripojenie Wi-Fi je vypnuté"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Rozhranie Bluetooth je vypnuté"</string>
<string name="dnd_is_off" msgid="6167780215212497572">"Nastavenie Nerušiť je vypnuté"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 3edd141..94ca50a 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -154,14 +154,12 @@
<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">"Ni kartice SIM."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"Prenos podatkov v mobilnem omrežju"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Prenos podatkov v mobilnem omrežju je vklopljen"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"Prenos podatkov v mobilnem omrežju je izklopljen"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Internet prek Bluetootha."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Način za letalo."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"Omrežje VPN je vklopljeno."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Ni kartice SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Spreminjanje omrežja operaterja."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Odpiranje podrobnosti o akumulatorju"</string>
@@ -222,7 +220,7 @@
<string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"Poročanje o lokaciji je vklopljeno."</string>
<string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"Poročanje o lokaciji je izklopljeno."</string>
<string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"Poročanje o lokaciji je vklopljeno."</string>
- <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarm je nastavljen na <xliff:g id="TIME">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarm je nastavljen čez: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_close" msgid="3115847794692516306">"Zapri podokno."</string>
<string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Daljši čas."</string>
<string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Krajši čas."</string>
@@ -246,11 +244,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Polnjenje"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Prenos podatkov v omrežju 2G/3G je zaustavljen"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Prenos podatkov v omrežju 4G je zaustavljen"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Prenos podatkov v mobil. omrežju je zaustavljen"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Prenos podatkov je zaustavljen"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Dosegli ste nastavljeno omejitev porabe podatkov. Prenosa podatkov v mobilnem omrežju ne uporabljate več.\n\nČe nadaljujete, lahko nastanejo stroški prenosa podatkov."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Nadaljuj"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Ni internetne povez."</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi povezan"</string>
@@ -325,8 +321,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Dostopna točka"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Obvestila"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Svetilka"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Prenos podatkov v mobilnem omrežju"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Poraba podatkov"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Preostala količina podatkov"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Omejitev prekoračena"</string>
@@ -439,8 +434,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Delovni profil je povezan z aplikacijo <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Osebni profil je povezan z aplikacijo <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Naprava je povezana z aplikacijo <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Upravljanje naprav"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Nadzor nad profilom"</string>
<string name="monitoring_title" msgid="169206259253048106">"Nadzor omrežja"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -449,18 +443,14 @@
<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_button_view_policies" msgid="100913612638514424">"Prikaži pravilnike"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Napravo upravlja organizacija <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nSkrbnik lahko nadzira in upravlja nastavitve, dostop za podjetje, aplikacije, z napravo povezane podatke in podatke o lokaciji naprave.\n\nZa več informacij se obrnite na skrbnika."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Napravo upravlja vaša organizacija.\n\nSkrbnik lahko nadzira in upravlja nastavitve, dostop za podjetje, aplikacije, z napravo povezane podatke in podatke o lokaciji naprave.\n\nZa več informacij se obrnite na skrbnika."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Vaša organizacija je v to napravo namestila overitelja potrdil. Varni omrežni promet se lahko nadzira ali spreminja."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Vaša organizacija je v vaš delovni profil namestila overitelja potrdil. Varni omrežni promet se lahko nadzira ali spreminja."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"V tej napravi je nameščen overitelj potrdil. Varni omrežni promet se lahko nadzira ali spreminja."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Skrbnik je vklopil beleženje omrežnega prometa, ki nadzira promet v napravi."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Povezani ste z aplikacijo <xliff:g id="VPN_APP">%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_two_named_vpns" msgid="4198511413729213802">"Povezani ste z aplikacijama <xliff:g id="VPN_APP_0">%1$s</xliff:g> in <xliff:g id="VPN_APP_1">%2$s</xliff:g>, ki lahko nadzirata omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Delovni profil je povezan z aplikacijo <xliff:g id="VPN_APP">%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_personal_profile_named_vpn" msgid="3133980926929069283">"Osebni profil je povezan z aplikacijo <xliff:g id="VPN_APP">%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_do_header_generic" msgid="96588491028288691">"Napravo upravlja aplikacija <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -579,12 +569,9 @@
<item quantity="few"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> in <xliff:g id="NUMBER_5">%3$d</xliff:g> drugi</item>
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> in <xliff:g id="NUMBER_5">%3$d</xliff:g> drugih</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Kontrolniki obvestil za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g> so odprti"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"Kontrolniki obvestil za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g> so zaprti"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Dovoli obvestila iz tega kanala"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"Vse kategorije"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Več nastavitev"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"Prilagodi: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -722,6 +709,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Obvestilo za <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Aplikacija morda ne deluje v načinu razdeljenega zaslona."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Aplikacija ne podpira načina razdeljenega zaslona."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Aplikacija morda ne bo delovala na sekundarnem zaslonu."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Aplikacija ne podpira zagona na sekundarnih zaslonih."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Odpri nastavitve."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Odpri hitre nastavitve."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Zapri hitre nastavitve."</string>
@@ -740,14 +729,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"Meni za sliko v sliki"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> je v načinu slika v sliki"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Če ne želite, da aplikacija <xliff:g id="NAME">%s</xliff:g> uporablja to funkcijo, se dotaknite, da odprete nastavitve, in funkcijo izklopite."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"Predvajaj"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"Začasno ustavi"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"Preskoči na naslednjega"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"Preskoči na prejšnjega"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"Tel. izklopljen zaradi vročine"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"Zdaj telefon normalno deluje"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"Telefon je bil prevroč, zato se je izklopil, da se ohladi. Zdaj normalno deluje.\n\nTelefon lahko postane prevroč ob:\n • uporabi aplikacij, ki intenzivno porabljajo sredstva (npr. za igranje iger, videoposnetke ali navigacijo)\n • prenosu ali nalaganju velikih datotek\n • uporabi telefona pri visokih temp."</string>
@@ -775,8 +760,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Aplikacije brez nameščanja"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Aplikacij brez nameščanja ni treba namestiti."</string>
<string name="app_info" msgid="6856026610594615344">"Podatki o aplikaciji"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Pojdi v splet"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobilni podatki"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi je izklopljen"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth je izklopljen"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 18aaa27..b83679e 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Të dhënat celulare janë joaktive"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Po lidhet me \"bluetooth\"."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"modaliteti i aeroplanit"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN-ja është aktive."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Nuk ka kartë SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Rrjeti i operatorit celular po ndryshohet."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Hap detajet e baterisë"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Profili i punës është i lidhur me <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Profili personal është i lidhur me <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Pajisja është e lidhur me <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Menaxhimi i pajisjes"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitorimi i profilit"</string>
<string name="monitoring_title" msgid="169206259253048106">"Monitorimi i rrjetit"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Çaktivizo VPN-në"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Shkëput VPN-në"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Shiko politikat"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Pajisja jote menaxhohet nga <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nAdministratori mund të monitorojë dhe menaxhojë cilësimet, qasjen e korporatës, aplikacionet, të dhënat e lidhura me pajisjen tënde, si dhe informacionet e vendndodhjes së pajisjes tënde.\n\nPër më shumë informacione, kontakto me administratorin."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Pajisja jote menaxhohet nga organizata jote.\n\nAdministratori mund të monitorojë dhe menaxhojë cilësimet, qasjen e korporatës, aplikacionet, të dhënat e lidhura me pajisjen tënde, si dhe informacionet e vendndodhjes së pajisjes tënde.\n\nPër më shumë informacione, kontakto me administratorin."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Organizata jote instaloi një autoritet certifikate në këtë pajisje. Trafiku i rrjetit tënd të sigurt mund të monitorohet ose modifikohet."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Organizata jote instaloi një autoritet certifikate në profilin tënd të punës. Trafiku i rrjetit tënd të sigurt mund të monitorohet ose modifikohet."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Në këtë pajisje është instaluar një autoritet certifikate. Trafiku i rrjetit tënd të sigurt mund të monitorohet ose modifikohet."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Administratori ka aktivizuar regjistrimin e rrjetit, i cili monitoron trafikun në pajisjen tënde."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Je lidhur me aplikacionin <xliff:g id="VPN_APP">%1$s</xliff:g>, i cili mund të monitorojë aktivitetin tënd në rrjet, duke përfshirë mail-et, aplikacionet dhe sajtet e uebit."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Je lidhur me aplikacionet <xliff:g id="VPN_APP_0">%1$s</xliff:g> dhe <xliff:g id="VPN_APP_1">%2$s</xliff:g>, të cilat mund të monitorojnë aktivitetin tënd në rrjet, duke përfshirë mail-et, aplikacionet dhe sajtet e uebit."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Profili yt i punës është i lidhur me <xliff:g id="VPN_APP">%1$s</xliff:g>, i cili mund të monitorojë aktivitetin tënd në rrjet, duke përfshirë mail-et, aplikacionet dhe sajtet e uebit."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Profili yt personal është i lidhur me <xliff:g id="VPN_APP">%1$s</xliff:g>, i cili mund të monitorojë aktivitetin tënd në rrjet, duke përfshirë mail-et, aplikacionet dhe sajtet e uebit."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Pajisja jote menaxhohet nga <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -619,7 +615,7 @@
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Asistenti"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Shfletuesi"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2064197111278436375">"Kontaktet"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="6257036897441939004">"Mail-i"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="6257036897441939004">"Email-i"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="638701213803242744">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="4775559515850922780">"Muzikë"</string>
<string name="keyboard_shortcut_group_applications_youtube" msgid="6555453761294723317">"YouTube"</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Njoftim nga <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Aplikacioni mund të mos funksionojë me ekranin e ndarë."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Aplikacioni nuk mbështet ekranin e ndarë."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Aplikacioni mund të mos funksionojë në një ekran dytësor."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Aplikacioni nuk mbështet nisjen në ekrane dytësore."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Hap cilësimet."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Hap cilësimet e shpejta."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Mbyll cilësimet e shpejta."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Aplikacionet e çastit"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Aplikacionet e çastit nuk kërkojnë instalim."</string>
<string name="app_info" msgid="6856026610594615344">"Informacioni mbi aplikacionin"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Shko në ueb"</string>
<string name="mobile_data" msgid="7094582042819250762">"Të dhënat celulare"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi është joaktiv"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth-i është joaktiv"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 5eee968..0e435bc 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -158,6 +158,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Мобилни подаци су искључени"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth привезивање."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Режим рада у авиону."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN је укључен."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Нема SIM картице."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Промена мреже мобилног оператера."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Отвори детаље о батерији"</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Профил за Work је повезан са апликацијом <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Лични профил је повезан са апликацијом <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Уређај је повезан са апликацијом <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Управљање уређајима"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Надгледање профила"</string>
<string name="monitoring_title" msgid="169206259253048106">"Надгледање мреже"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -439,18 +439,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Онемогући VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Прекини везу са VPN-ом"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Прикажи смернице"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Уређајем управља <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nАдминистратор може да надгледа подешавања, корпоративни приступ, апликације, податке повезане са уређајем и информације о локацији уређаја, као и да управља њима.\n\nВише информација потражите од администратора."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Уређајем управља организација.\n\nАдминистратор може да надгледа подешавања, корпоративни приступ, апликације, податке повезане са уређајем и информације о локацији уређаја, као и да управља њима.\n\nВише информација потражите од администратора."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Организација је на овом уређају инсталирала ауторитет за издавање сертификата. Безбедни мрежни саобраћај може да се прати или мења."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Организација је на профилу за Work инсталирала ауторитет за издавање сертификата. Безбедни мрежни саобраћај може да се прати или мења."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"На овом уређају је инсталиран ауторитет за издавање сертификата. Безбедни мрежни саобраћај може да се прати или мења."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Администратор је укључио евидентирање мреже, које прати саобраћај на уређају."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Повезани сте са апликацијом <xliff:g id="VPN_APP">%1$s</xliff:g>, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Повезани сте са апликацијама <xliff:g id="VPN_APP_0">%1$s</xliff:g> и <xliff:g id="VPN_APP_1">%2$s</xliff:g>, које могу да надгледају активности на мрежи, укључујући имејлове, апликације и веб-сајтове."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Профил за Work је повезан са апликацијом <xliff:g id="VPN_APP">%1$s</xliff:g>, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Лични профил је повезан са апликацијом <xliff:g id="VPN_APP">%1$s</xliff:g>, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Уређајем управља <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -707,6 +703,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Обавештења за <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Апликација можда неће функционисати са подељеним екраном."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Апликација не подржава подељени екран."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Апликација можда неће функционисати на секундарном екрану."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Апликација не подржава покретање на секундарним екранима."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Отвори Подешавања."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Отвори Брза подешавања."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Затвори Брза подешавања."</string>
@@ -756,8 +754,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Инстант апликације"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Инстант апликације не захтевају инсталацију."</string>
<string name="app_info" msgid="6856026610594615344">"Информације о апликацији"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Иди на веб"</string>
<string name="mobile_data" msgid="7094582042819250762">"Мобилни подаци"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi је искључен"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth је искључен"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index a5f5ae5..d9df745 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobildata har inaktiverats"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Internetdelning via Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Flygplansläge"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN har aktiverats."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Inget SIM-kort."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Byter leverantörsnätverk."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Visa uppgifter om batteri"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Jobbprofilen är ansluten till <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Den personliga profilen är ansluten till <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Enheten är ansluten till <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Enhetshantering"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profilövervakning"</string>
<string name="monitoring_title" msgid="169206259253048106">"Nätverksövervakning"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Inaktivera VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Koppla från VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Visa policyer"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Din enhet hanteras av <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nAdministratören kan övervaka och hantera inställningar, företagsåtkomst, appar, data med koppling till enheten och enhetens plats.\n\nKontakta administratören om du vill veta mer."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Din enhet hanteras av organisationen.\n\nAdministratören kan övervaka och hantera inställningar, företagsåtkomst, appar, data med koppling till enheten och enhetens plats.\n\nKontakta administratören om du vill veta mer."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Organisationen har installerat en certifikatutfärdare på enheten. Din säkra nätverkstrafik kan övervakas och ändras."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Organisationen har installerat en certifikatutfärdare i jobbprofilen. Din säkra nätverkstrafik kan övervakas och ändras."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"En certifikatutfärdare är installerad på enheten. Din säkra nätverkstrafik kan övervakas och ändras."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Administratören har aktiverat nätverksloggning som övervakar trafik på enheten."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Du är ansluten till <xliff:g id="VPN_APP">%1$s</xliff:g> som kan övervaka din nätverksaktivitet, inklusive e-postmeddelanden, appar och webbplatser."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Du är ansluten till <xliff:g id="VPN_APP_0">%1$s</xliff:g> och <xliff:g id="VPN_APP_1">%2$s</xliff:g> som kan övervaka din nätverksaktivitet, inklusive e-postmeddelanden, appar och webbplatser."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Jobbprofilen är ansluten till <xliff:g id="VPN_APP">%1$s</xliff:g> som kan övervaka din nätverksaktivitet, exempelvis e-post, appar och webbplatser."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Din personliga profil är ansluten till <xliff:g id="VPN_APP">%1$s</xliff:g> som kan övervaka din nätverksaktivitet, exempelvis e-post, appar och webbplatser."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Enheten hanteras av <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g>-avisering: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Appen kanske inte fungerar med delad skärm."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Appen har inte stöd för delad skärm."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Appen kanske inte fungerar på en sekundär skärm."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Appen kan inte köras på en sekundär skärm."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Öppna inställningarna."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Öppna snabbinställningarna."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Stäng snabbinställningarna"</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Snabbappar behöver inte installeras."</string>
<string name="app_info" msgid="6856026610594615344">"Info om appen"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Öppna webbplatsen"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobildata"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi är inaktiverat"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth är inaktiverat"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 68728c2..14319ad 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -156,7 +156,8 @@
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"Data ya Simu Imewashwa"</string>
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Data ya Simu Imezimwa"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Shiriki intaneti kwa Bluetooth."</string>
- <string name="accessibility_airplane_mode" msgid="834748999790763092">"Hali ya ndege."</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"Hali ya ndegeni."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN imewashwa."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Hakuna SIM kadi."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Mabadiliko ya mtandao wa mtoa huduma."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Fungua maelezo ya betri"</string>
@@ -215,7 +216,7 @@
<string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"Programu ya kuonyesha mahali ulipo imewashwa."</string>
<string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"Programu ya Kuonyesha mahali ulipo imezimwa."</string>
<string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"Programu ya Kuonyesha mahali ulipo imewashwa."</string>
- <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Kengele imewekwa <xliff:g id="TIME">%s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Kengele imewashwa na italia <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_close" msgid="3115847794692516306">"Funga paneli."</string>
<string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Muda zaidi."</string>
<string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Muda kidogo"</string>
@@ -352,8 +353,8 @@
<string name="description_direction_up" msgid="7169032478259485180">"Sogeza juu kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
<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_voice" msgid="2284540992298200729">"Hatua hii huzuia sauti na mitetemo YOTE, ikiwa na pamoja na ile inayotokana na kengele, muziki, video na michezo. Bado utaweza kupiga simu."</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"Badilisha upendavyo"</string>
+ <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Hatua hii huzuia sauti na mitetemo YOTE, ikiwa ni pamoja na ile inayotokana na kengele, muziki, video na michezo. Bado utaweza kupiga simu."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Hatua hii huzuia sauti na mitetemo YOTE, ikiwa ni pamoja na ile inayotokana na kengele, muziki, video na michezo."</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>
@@ -397,7 +398,7 @@
<string name="user_logout_notification_text" msgid="3350262809611876284">"Mwondoe mtumiaji wa sasa"</string>
<string name="user_logout_notification_action" msgid="1195428991423425062">"ONDOA MTUMIAJI"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Ungependa kuongeza mtumiaji?"</string>
- <string name="user_add_user_message_short" msgid="2161624834066214559">"Mtumiaji mpya unayemwongeza anahitaji kuongeza akaunti yake.\n\nMtumiaji yoyote anaweza kusasisha programu kwa niaba ya watumiaji wengine wote."</string>
+ <string name="user_add_user_message_short" msgid="2161624834066214559">"Mtumiaji mpya utakayemwongeza atahitaji kuongeza akaunti yake.\n\nMtumiaji yoyote anaweza kusasisha programu kwa niaba ya wengine wote."</string>
<string name="user_remove_user_title" msgid="4681256956076895559">"Je, ungependa kuondoa mtumiaji?"</string>
<string name="user_remove_user_message" msgid="1453218013959498039">"Programu na data yote ya mtumiaji huyu itafutwa."</string>
<string name="user_remove_user_remove" msgid="7479275741742178297">"Ondoa"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Wasifu wa kazini umeunganishwa kwenye <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Wasifu wa binafsi umeunganishwa kwenye <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Kifaa kimeunganishwa kwenye <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Udhibiti wa kifaa"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Ufuatiliaji wasifu"</string>
<string name="monitoring_title" msgid="169206259253048106">"Ufuatiliaji wa mtandao"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Zima VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Ondoa VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Angalia Sera"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Kifaa chako kinadhibitiwa na <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nMsimamizi wako anaweza kufuatilia na kudhibiti mipangilio, ufikiaji wa maudhui ya shirika, programu, data inayohusiana na kifaa chako na maelezo kuhusu mahali kifaa kipo.\n\nKwa maelezo zaidi, wasiliana na msimamizi wako."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Kifaa chako kinadhibitiwa na shirika lako.\n\nMsimamizi wako anaweza kufuatilia na kudhibiti mipangilio, ufikiaji wa maudhui ya shirika, programu, data inayohusiana na kifaa chako na maelezo kuhusu mahali kifaa kipo.\n\nKwa maelezo zaidi, wasiliana na msimamizi wako."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Shirika lako limesakinisha mamlaka ya cheti kwenye kifaa hiki. Huenda shughuli kwenye mtandao wako salama zikafuatiliwa au kubadilishwa."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Shirika lako limesakinisha mamlaka ya cheti katika wasifu wako wa kazini. Huenda shughuli kwenye mtandao wako salama zikafuatiliwa au kubadilishwa."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Mamlaka ya cheti imesakinishwa kwenye kifaa hiki. Huenda shughuli kwenye mtandao wako salama zikafuatiliwa au kubadilishwa."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Msimamizi wako amewasha kumbukumbu ya kuingia mtandaoni, ambayo hufuatilia shughuli kwenye kifaa chako."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Umeunganishwa kwenye <xliff:g id="VPN_APP">%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_two_named_vpns" msgid="4198511413729213802">"Umeunganishwa kwenye <xliff:g id="VPN_APP_0">%1$s</xliff:g> na <xliff:g id="VPN_APP_1">%2$s</xliff:g>, ambazo zinaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Wasifu wako wa kazini umeunganishwa kwenye <xliff:g id="VPN_APP">%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_personal_profile_named_vpn" msgid="3133980926929069283">"Wasifu wako wa binafsi umeunganishwa kwenye <xliff:g id="VPN_APP">%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_do_header_generic" msgid="96588491028288691">"Kifaa chako kinadhibitiwa na <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -614,9 +610,9 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Nyuma"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Arifa"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Mikato ya Kibodi"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Badilisha mbinu ya kuingiza data"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Kubadili mbinu ya kuingiza data"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Programu"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Programu ya maagizo ya sauti"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Programu ya usaidizi"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Kivinjari"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2064197111278436375">"Anwani"</string>
<string name="keyboard_shortcut_group_applications_email" msgid="6257036897441939004">"Barua pepe"</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Arifa kutoka <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Huenda programu isifanye kazi kwenye skrini inayogawanywa."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Programu haiwezi kutumia skrini iliyogawanywa."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Huenda programu isifanye kazi kwenye dirisha lingine."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Programu haiwezi kutumia kipengele cha uzinduzi kwenye madirisha mengine."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Fungua mipangilio."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Fungua mipangilio ya haraka."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Funga mipangilio ya haraka."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Programu Zinazofunguka Papo Hapo"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Huhitaji kusakinisha programu zinazofunguka papo hapo."</string>
<string name="app_info" msgid="6856026610594615344">"Maelezo ya programu"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Nenda kwenye wavuti"</string>
<string name="mobile_data" msgid="7094582042819250762">"Data ya simu"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi imezimwa"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth imezimwa"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index ef637c4..92778a8 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"மொபைல் தரவு முடக்கப்பட்டது"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"புளூடூத் டெதெரிங்."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"விமானப் பயன்முறை."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN இயக்கத்தில் உள்ளது."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"சிம் கார்டு இல்லை."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"மொபைல் நிறுவன மாற்றம்."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"பேட்டரி விவரங்களைத் திறக்கும்"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"<xliff:g id="VPN_APP">%1$s</xliff:g> உடன் பணிவிவரம் இணைக்கப்பட்டுள்ளது"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"தனிப்பட்ட சுயவிவரம் <xliff:g id="VPN_APP">%1$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளது"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"சாதனம் <xliff:g id="VPN_APP">%1$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளது"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"சாதன நிர்வாகம்"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"சுயவிவரத்தைக் கண்காணித்தல்"</string>
<string name="monitoring_title" msgid="169206259253048106">"நெட்வொர்க்கைக் கண்காணித்தல்"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPNஐ முடக்கு"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPNஐத் துண்டி"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"கொள்கைகளைக் காட்டு"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"சாதனத்தை <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> நிர்வகிக்கிறது.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், பயன்பாடுகள், உங்கள் சாதனத்துடன் தொடர்புடைய தரவு, சாதனங்களின் இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்.\n\nமேலும் தகவலுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"சாதனத்தை உங்கள் நிறுவனம் நிர்வகிக்கிறது.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், பயன்பாடுகள், உங்கள் சாதனத்துடன் தொடர்புடைய தரவு, சாதனங்களின் இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்.\n\nமேலும் தகவலுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"உங்கள் நிறுவனம் இந்தச் சாதனத்தில் சான்றிதழ் அங்கீகாரத்தை நிறுவியுள்ளது. உங்களின் பாதுகாப்பான நெட்வொர்க் ட்ராஃபிக் கண்காணிக்கப்படலாம் அல்லது மாற்றப்படலாம்."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"உங்கள் நிறுவனம், பணி விவரத்தில் சான்றிதழ் அங்கீகாரத்தை நிறுவியுள்ளது. உங்களின் பாதுகாப்பான நெட்வொர்க் ட்ராஃபிக் கண்காணிக்கப்படலாம் அல்லது மாற்றப்படலாம்."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"இந்தச் சாதனத்தில் சான்றிதழ் அங்கீகாரம் நிறுவப்பட்டுள்ளது. உங்களின் பாதுகாப்பான நெட்வொர்க் ட்ராஃபிக் கண்காணிக்கப்படலாம் அல்லது மாற்றப்படலாம்."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"உங்கள் நிர்வாகி, நெட்வொர்க் பதிவெடுத்தலை இயக்கியுள்ளார். இது சாதனத்தில் ட்ராஃபிக்கைக் கண்காணிக்கும்."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய <xliff:g id="VPN_APP">%1$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளீர்கள்."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய <xliff:g id="VPN_APP_0">%1$s</xliff:g> மற்றும் <xliff:g id="VPN_APP_1">%2$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளீர்கள்."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய <xliff:g id="VPN_APP">%1$s</xliff:g> உடன் உங்கள் பணி விவரம் இணைக்கப்பட்டுள்ளது."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய <xliff:g id="VPN_APP">%1$s</xliff:g> உடன் உங்களின் தனிப்பட்ட சுயவிவரம் இணைக்கப்பட்டுள்ளது."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"உங்கள் சாதனத்தை நிர்வகிப்பது: <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> அறிவிப்பு: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"திரைப் பிரிப்பில் பயன்பாடு வேலைசெய்யாமல் போகக்கூடும்."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"திரையைப் பிரிப்பதைப் பயன்பாடு ஆதரிக்கவில்லை."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"இரண்டாம்நிலைத் திரையில் பயன்பாடுகள் வேலை செய்யாமல் போகக்கூடும்."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"இரண்டாம்நிலைத் திரைகளில் பயன்பாட்டைத் தொடங்க முடியாது."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"அமைப்புகளைத் திற."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"விரைவு அமைப்புகளைத் திற."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"விரைவு அமைப்புகளை மூடு."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"இன்ஸ்டண்ட் பயன்பாடுகள்"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"இன்ஸ்டண்ட் பயன்பாடுகளுக்கு நிறுவல் தேவையில்லை."</string>
<string name="app_info" msgid="6856026610594615344">"பயன்பாட்டுத் தகவல்"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"இணையத்திற்குச் செல்"</string>
<string name="mobile_data" msgid="7094582042819250762">"மொபைல் தரவு"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"வைஃபை முடக்கத்தில் உள்ளது"</string>
<string name="bt_is_off" msgid="2640685272289706392">"புளூடூத் முடக்கத்தில் உள்ளது"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 3a23ee8..4a2b86c 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -152,14 +152,12 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"ఎడ్జ్"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"సిమ్ లేదు."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"మొబైల్ డేటా"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"మొబైల్ డేటా ఆన్ చేయబడింది"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"మొబైల్ డేటా ఆఫ్ చేయబడింది"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"బ్లూటూత్ టెథెరింగ్."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ఎయిర్ప్లేన్ మోడ్."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPNలో."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM కార్డ్ లేదు."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"క్యారియర్ నెట్వర్క్ మారుస్తుంది."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"బ్యాటరీ వివరాలను తెరుస్తుంది"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"ఛార్జ్ అవుతోంది"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G డేటా పాజ్ చేయబడింది"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G డేటా పాజ్ చేయబడింది"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"మొబైల్ డేటా పాజ్ చేయబడింది"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"డేటా పాజ్ చేయబడింది"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"మీరు సెట్ చేసిన డేటా పరిమితిని చేరుకున్నారు. మీరు ఇప్పుడు మొబైల్ డేటాను ఉపయోగించడం లేదు.\n\nమీరు పునఃప్రారంభిస్తే, డేటా వినియోగానికి ఛార్జీలు చెల్లించాల్సి రావచ్చు."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"పునఃప్రారంభించు"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"ఇంటర్నెట్ కనెక్షన్ లేదు"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi కనెక్ట్ చేయబడింది"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"హాట్స్పాట్"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"నోటిఫికేషన్లు"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ఫ్లాష్లైట్"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"మొబైల్ డేటా"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"డేటా వినియోగం"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"మిగిలిన డేటా"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"పరిమితి మించిపోయింది"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"<xliff:g id="VPN_APP">%1$s</xliff:g>కి కార్యాలయ ప్రొఫైల్ కనెక్ట్ చేయబడింది"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"వ్యక్తిగత ప్రొఫైల్ <xliff:g id="VPN_APP">%1$s</xliff:g>కి కనెక్ట్ చేయబడింది"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"పరికరం <xliff:g id="VPN_APP">%1$s</xliff:g>కి కనెక్ట్ చేయబడింది"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"పరికర నిర్వహణ"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ప్రొఫైల్ పర్యవేక్షణ"</string>
<string name="monitoring_title" msgid="169206259253048106">"నెట్వర్క్ పర్యవేక్షణ"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPNని నిలిపివేయి"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPNను డిస్కనెక్ట్ చేయి"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"విధానాలను వీక్షించండి"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"మీ పరికరం <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> నిర్వహణలో ఉంది.\n\nమీ నిర్వాహకులు మీ పరికరం అనుబంధిత సెట్టింగ్లు, కార్పొరేట్ ప్రాప్యత, అనువర్తనాలు, డేటా మరియు మీ పరికర స్థాన సమాచారం పర్యవేక్షించగలరు మరియు నిర్వహించగలరు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకులను సంప్రదించండి."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"మీ పరికరం మీ సంస్థ నిర్వహణలో ఉంది.\n\nమీ నిర్వాహకులు మీ పరికరం అనుబంధిత సెట్టింగ్లు, కార్పొరేట్ ప్రాప్యత, అనువర్తనాలు, డేటాను మరియు మీ పరికర స్థాన సమాచారాన్ని పర్యవేక్షించగలరు మరియు నిర్వహించగలరు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకులను సంప్రదించండి."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"ఈ పరికరంలో మీ సంస్థ ఒక ప్రమాణపత్ర అధికారాన్ని ఇన్స్టాల్ చేసింది. మీ సురక్షిత నెట్వర్క్ ట్రాఫిక్ పర్యవేక్షించబడవచ్చు లేదా సవరించబడవచ్చు."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"మీ కార్యాలయ ప్రొఫైల్లో మీ సంస్థ ఒక ప్రమాణపత్ర అధికారాన్ని ఇన్స్టాల్ చేసింది. మీ సురక్షిత నెట్వర్క్ ట్రాఫిక్ పర్యవేక్షించబడవచ్చు లేదా సవరించబడవచ్చు."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"ఈ పరికరంలో ప్రమాణపత్ర అధికారం ఇన్స్టాల్ చేయబడింది. మీ సురక్షిత నెట్వర్క్ ట్రాఫిక్ పర్యవేక్షించబడవచ్చు లేదా సవరించబడవచ్చు."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"మీ నిర్వాహకులు మీ పరికరంలోని ట్రాఫిక్ని పర్యవేక్షించగల నెట్వర్క్ లాగింగ్ని ఆన్ చేసారు."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"మీరు <xliff:g id="VPN_APP">%1$s</xliff:g>కి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"మీరు ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల <xliff:g id="VPN_APP_0">%1$s</xliff:g> మరియు <xliff:g id="VPN_APP_1">%2$s</xliff:g>కి కనెక్ట్ చేయబడ్డారు."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"మీ కార్యాలయ ప్రొఫైల్ ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల <xliff:g id="VPN_APP">%1$s</xliff:g>కి కనెక్ట్ చేయబడింది."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"మీ వ్యక్తిగత ప్రొఫైల్ ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగల <xliff:g id="VPN_APP">%1$s</xliff:g>కి కనెక్ట్ చేయబడింది."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"మీ పరికరం <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> ద్వారా నిర్వహించబడుతోంది."</string>
@@ -569,12 +559,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> మరియు మరో <xliff:g id="NUMBER_5">%3$d</xliff:g></item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> మరియు మరో <xliff:g id="NUMBER_2">%3$d</xliff:g></item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> యొక్క నోటిఫికేషన్ నియంత్రణలు తెరవబడ్డాయి"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> యొక్క నోటిఫికేషన్ నియంత్రణలు మూసివేయబడ్డాయి"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"ఈ ఛానెల్ యొక్క నోటిఫికేషన్లను అనుమతించండి"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"అన్ని వర్గాలు"</string>
<string name="notification_more_settings" msgid="816306283396553571">"మరిన్ని సెట్టింగ్లు"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"అనుకూలీకరించండి: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> నోటిఫికేషన్: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"స్క్రీన్ విభజనతో అనువర్తనం పని చేయకపోవచ్చు."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"అనువర్తనంలో స్క్రీన్ విభజనకు మద్దతు లేదు."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"ప్రత్యామ్నాయ ప్రదర్శనపై యాప్ పని చేయకపోవచ్చు."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"ప్రత్యామ్నాయ ప్రదర్శనలపై ప్రారంభానికి యాప్ మద్దతు లేదు."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"సెట్టింగ్లను తెరవండి."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"శీఘ్ర సెట్టింగ్లను తెరవండి."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"శీఘ్ర సెట్టింగ్లను మూసివేయండి."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"చిత్రంలో చిత్రం మెను"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> చిత్రంలో చిత్రం రూపంలో ఉంది"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> ఈ లక్షణాన్ని ఉపయోగించకూడదు అని మీరు అనుకుంటే, సెట్టింగ్లను తెరవడానికి నొక్కి, దీన్ని ఆఫ్ చేయండి."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"ప్లే చేయి"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"పాజ్ చేయి"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"దాటవేసి తదుపరి దానికి వెళ్లు"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"దాటవేసి మునుపటి దానికి వెళ్లు"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"వేడెక్కినందుకు ఫోన్ ఆఫ్ చేయబడింది"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"మీ ఫోన్ చాలా వేడిగా ఉంది, కనుక చల్లబర్చడానికి ఆఫ్ చేయబడింది. మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది.\n\nమీరు ఇలా చేస్తే మీ ఫోన్ చాలా వేడెక్కవచ్చు:\n • వనరు-ఆధారిత అనువర్తనాలు (గేమింగ్, వీడియో లేదా నావిగేషన్ వంటి అనువర్తనాలు) ఉపయోగించడం\n • పెద్ద ఫైల్లను డౌన్లోడ్ లేదా అప్లోడ్ చేయడం\n • అధిక ఉష్ణోగ్రతలలో మీ ఫోన్ని ఉపయోగించడం"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"తక్షణ అనువర్తనాలు"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"తక్షణ అనువర్తనాలకు ఇన్స్టాలేషన్ అవసరం లేదు."</string>
<string name="app_info" msgid="6856026610594615344">"అనువర్తన సమాచారం"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"వెబ్కు వెళ్లు"</string>
<string name="mobile_data" msgid="7094582042819250762">"మొబైల్ డేటా"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ఆఫ్లో ఉంది"</string>
<string name="bt_is_off" msgid="2640685272289706392">"బ్లూటూత్ ఆఫ్లో ఉంది"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index dc1cd01..2ee0438 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -152,14 +152,12 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"EDGE"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"WiFi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"ไม่มีซิมการ์ด"</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"อินเทอร์เน็ตมือถือ"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"อินเทอร์เน็ตมือถือเปิดอยู่"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"อินเทอร์เน็ตมือถือปิดอยู่"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"การปล่อยสัญญาณบลูทูธ"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"โหมดใช้งานบนเครื่องบิน"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN เปิดอยู่"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"ไม่มีซิมการ์ด"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"การเปลี่ยนเครือข่ายผู้ให้บริการ"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"เปิดรายละเอียดแบตเตอรี่"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"กำลังชาร์จ"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"หยุดการใช้ข้อมูล 2G-3G ชั่วคราวแล้ว"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"หยุดการใช้ข้อมูล 4G ชั่วคราวแล้ว"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"หยุดการใช้อินเทอร์เน็ตมือถือชั่วคราว"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"หยุดการใช้ข้อมูลชั่วคราวแล้ว"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"คุณใช้อินเทอร์เน็ตถึงปริมาณที่กำหนดไว้แล้ว คุณไม่ได้ใช้อินเทอร์เน็ตมือถือแล้วในขณะนี้\n\nหากใช้ต่อ อาจมีการเรียกเก็บค่าบริการอินเทอร์เน็ต"</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"ทำต่อ"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"ไม่มีอินเทอร์เน็ต"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"เชื่อมต่อ WiFi แล้ว"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ฮอตสปอต"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"การแจ้งเตือน"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ไฟฉาย"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"อินเทอร์เน็ตมือถือ"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"การใช้อินเทอร์เน็ต"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ข้อมูลที่เหลืออยู่"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"เกินขีดจำกัด"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"โปรไฟล์งานเชื่อมต่ออยู่กับ <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"โปรไฟล์ส่วนตัวเชื่อมต่ออยู่กับ <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"อุปกรณ์เชื่อมต่ออยู่กับ <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"การจัดการอุปกรณ์"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"การตรวจสอบโปรไฟล์"</string>
<string name="monitoring_title" msgid="169206259253048106">"การตรวจสอบเครือข่าย"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"ปิดใช้ VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"ยกเลิกการเชื่อมต่อ VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"ดูนโยบาย"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"อุปกรณ์นี้จัดการโดย <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\n\nผู้ดูแลระบบสามารถตรวจสอบและจัดการการตั้งค่า การเข้าถึงของบริษัท แอป ข้อมูลที่เชื่อมโยงกับอุปกรณ์ และข้อมูลตำแหน่งของอุปกรณ์\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้แลระบบ"</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"อุปกรณ์นี้จัดการโดยองค์กรของคุณ\n\nผู้ดูแลระบบสามารถตรวจสอบและจัดการการตั้งค่า การเข้าถึงของบริษัท แอป ข้อมูลที่เชื่อมโยงกับอุปกรณ์ และข้อมูลตำแหน่งของอุปกรณ์\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้แลระบบ"</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"องค์กรของคุณติดตั้งผู้ออกใบรับรองในอุปกรณ์นี้ อาจมีการตรวจสอบหรือแก้ไขการจราจรของข้อมูลในเครือข่ายที่ปลอดภัยของคุณ"</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"องค์กรของคุณติดตั้งผู้ออกใบรับรองในโปรไฟล์งาน อาจมีการตรวจสอบหรือแก้ไขการจราจรของข้อมูลในเครือข่ายที่ปลอดภัยของคุณ"</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"มีการติดตั้งผู้ออกใบรับรองในอุปกรณ์นี้ อาจมีการตรวจสอบหรือแก้ไขการจราจรของข้อมูลในเครือข่ายที่ปลอดภัยของคุณ"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"ผู้ดูแลระบบได้เปิดการบันทึกเครือข่าย ซึ่งจะตรวจสอบการจราจรของข้อมูลในอุปกรณ์ของคุณ"</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"คุณเชื่อมต่ออยู่กับ <xliff:g id="VPN_APP">%1$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ รวมถึงอีเมล แอป และเว็บไซต์"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"คุณเชื่อมต่ออยู่กับ <xliff:g id="VPN_APP_0">%1$s</xliff:g> และ <xliff:g id="VPN_APP_1">%2$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ รวมถึงอีเมล แอป และเว็บไซต์"</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"โปรไฟล์งานของคุณเชื่อมต่ออยู่กับ <xliff:g id="VPN_APP">%1$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ รวมถึงอีเมล แอป และเว็บไซต์"</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"โปรไฟล์ส่วนตัวของคุณเชื่อมต่ออยู่กับ <xliff:g id="VPN_APP">%1$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ รวมถึงอีเมล แอป และเว็บไซต์"</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"อุปกรณ์ของคุณได้รับการจัดการโดย <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>"</string>
@@ -569,12 +559,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> และอีก <xliff:g id="NUMBER_5">%3$d</xliff:g> ช่องทาง</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> และอีก <xliff:g id="NUMBER_2">%3$d</xliff:g> ช่องทาง</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"ส่วนควบคุมการแจ้งเตือนของ <xliff:g id="APP_NAME">%1$s</xliff:g> เปิดอยู่"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"ส่วนควบคุมการแจ้งเตือนของ <xliff:g id="APP_NAME">%1$s</xliff:g> ปิดอยู่"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"อนุญาตการแจ้งเตือนจากช่องนี้"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"ทุกหมวดหมู่"</string>
<string name="notification_more_settings" msgid="816306283396553571">"การตั้งค่าเพิ่มเติม"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"ปรับแต่ง: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> การแจ้งเตือน: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"แอปอาจใช้ไม่ได้กับโหมดแยกหน้าจอ"</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"แอปไม่สนับสนุนการแยกหน้าจอ"</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"แอปอาจไม่ทำงานในจอแสดงผลรอง"</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"แอปไม่รองรับการเรียกใช้ในจอแสดงผลรอง"</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"เปิดการตั้งค่า"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"เปิดการตั้งค่าด่วน"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"ปิดการตั้งค่าด่วน"</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"เมนูการแสดงผลหลายแหล่งพร้อมกัน"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ใช้การแสดงผลหลายแหล่งพร้อมกัน"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้คุณลักษณะนี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดคุณลักษณะ"</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"เล่น"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"หยุดชั่วคราว"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"ข้ามไปรายการถัดไป"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"ข้ามไปรายการก่อนหน้า"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"โทรศัพท์ปิดไปเพราะร้อนมาก"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"ขณะนี้โทรศัพท์ทำงานเป็นปกติ"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"โทรศัพท์ร้อนเกินไปจึงปิดเครื่องเพื่อให้เย็นลง ขณะนี้โทรศัพท์ทำงานเป็นปกติ\n\nโทรศัพท์อาจร้อนเกินไปหากคุณ\n • ใช้แอปที่ใช้ทรัพยากรมาก (เช่น เกม วิดีโอ หรือแอปการนำทาง)\n • ดาวน์โหลดหรืออัปโหลดไฟล์ขนาดใหญ่\n • ใช้โทรศัพท์ในอุณหภูมิที่สูง"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant App"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Instant Apps ไม่ต้องใช้การติดตั้ง"</string>
<string name="app_info" msgid="6856026610594615344">"ข้อมูลแอป"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"ไปที่เว็บ"</string>
<string name="mobile_data" msgid="7094582042819250762">"ข้อมูลมือถือ"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi ปิดอยู่"</string>
<string name="bt_is_off" msgid="2640685272289706392">"บลูทูธปิดอยู่"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 51d382f..6442a75 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -152,14 +152,12 @@
<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">"Walang SIM."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"Mobile Data"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Naka-on ang Mobile Data"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"Naka-off ang Mobile Data"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Pag-tether ng Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Mode na eroplano."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"Naka-on ang VPN."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Walang SIM card."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Nagpapalit ng carrier network."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Buksan ang mga detalye ng baterya"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Nagcha-charge"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Naka-pause ang 2G-3G data"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Naka-pause ang 4G data"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Naka-pause ang mobile data"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Naka-pause ang data"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Naabot na ang itinakda mong limitasyon sa data. Hindi ka na gumagamit ng mobile data.\n\nKung magpapatuloy ka, maaaring may mga singil sa paggamit ng data."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Ipagpatuloy"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Walang koneksyon sa Internet"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"nakakonekta ang Wi-Fi"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Mga Notification"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Flashlight"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobile data"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Paggamit ng data"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Natitirang data"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Lumampas sa limitasyon"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Nakakonekta sa <xliff:g id="VPN_APP">%1$s</xliff:g> ang profile sa trabaho"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Nakakonekta ang personal na profile sa <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Nakakonekta ang device sa <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Pamamahala ng device"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Pagsubaybay sa Profile"</string>
<string name="monitoring_title" msgid="169206259253048106">"Pagsubaybay sa network"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"I-disable ang VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Idiskonekta ang VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Tingnan ang Mga Patakaran"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Pinamamahalaan ng <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ang iyong device.\n\nMaaaring subaybayan at pamahalaan ng admin mo ang mga setting, pangkumpanyang access, app, data na nauugnay sa iyong device, at ang impormasyon ng lokasyon ng device mo.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong admin."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Pinamamahalaan ng iyong organisasyon ang device mo.\n\nMaaaring subaybayan at pamahalaan ng iyong admin ang mga setting, pangkumpanyang access, app, data na nauugnay sa device mo, at ang impormasyon ng lokasyon ng iyong device.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa admin mo."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Nag-install ang iyong organisasyon ng awtoridad sa certificate sa device na ito. Maaaring subaybayan o baguhin ang iyong ligtas na trapiko sa network."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Nag-install ang iyong organisasyon ng awtoridad sa certificate sa iyong profile sa trabaho. Maaaring subaybayan o baguhin ang iyong ligtas na trapiko sa network."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"May naka-install sa device na ito na isang awtoridad sa certificate. Maaaring subaybayan o baguhin ang iyong ligtas na trapiko sa network."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Na-on ng iyong admin ang pag-log sa network, na sumusubaybay sa trapiko sa device mo."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Nakakonekta ka sa <xliff:g id="VPN_APP">%1$s</xliff:g>, na maaaring sumubaybay sa iyong aktibidad sa network, kabilang ang mga email, app, at website."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Nakakonekta ka sa <xliff:g id="VPN_APP_0">%1$s</xliff:g> at <xliff:g id="VPN_APP_1">%2$s</xliff:g>, na maaaring sumubaybay sa iyong aktibidad sa network, kabilang ang mga email, app, at website."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Nakakonekta sa <xliff:g id="VPN_APP">%1$s</xliff:g> ang iyong profile sa trabaho, na maaaring sumubaybay sa aktibidad sa iyong network, kasama ang mga email, app, at website."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Nakakonekta sa <xliff:g id="VPN_APP">%1$s</xliff:g> ang iyong personal na profile, na maaaring sumubaybay sa aktibidad mo sa network, kasama ang mga email, app at website."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Pinamamahalaan ng <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> ang iyong device."</string>
@@ -569,12 +559,9 @@
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, at <xliff:g id="NUMBER_5">%3$d</xliff:g> pang iba</item>
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, at <xliff:g id="NUMBER_5">%3$d</xliff:g> pang iba</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Binuksan ang mga kontrol sa notification para sa <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"Isinara ang mga kontrol sa notification para sa <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Payagan ang mga notification mula sa channel na ito"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"Lahat ng Kategorya"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Higit pang mga setting"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"I-customize: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Notification sa <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Maaaring hindi gumana ang app sa split-screen."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Hindi sinusuportahan ng app ang split-screen."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Maaaring hindi gumana ang app sa pangalawang display."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Hindi sinusuportahan ng app ang paglulunsad sa mga pangalawang display."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Buksan ang mga setting."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Buksan ang mga mabilisang setting."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Isara ang mga mabilisang setting."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"Menu ng picture in picture"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"Nasa picture-in-picture ang <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Kung ayaw mong gamitin ng <xliff:g id="NAME">%s</xliff:g> ang feature na ito, i-tap upang buksan ang mga setting at i-off ito."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"I-play"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"I-pause"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"Lumaktaw sa susunod"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"Lumaktaw sa nakaraan"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"Na-off ang telepono dahil sa init"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"Maayos na ngayong gumagana ang iyong telepono"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"Napakainit ng telepono, kaya nag-off ito para lumamig. Maayos na itong gumagana.\n\nMaaaring lubos na uminit ang telepono kapag:\n • Gumamit ka ng resource-intensive na app (gaya ng app para sa gaming, video, o navigation)\n • Nag-download o nag-upload ka ng malaking file\n • Ginamit mo ito sa mainit na lugar"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Hindi kailangang i-install ang mga instant na app."</string>
<string name="app_info" msgid="6856026610594615344">"Impormasyon ng app"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Pumunta sa web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Data ng mobile"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Naka-off ang Wi-Fi"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Naka-off ang Bluetooth"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 6af09e3..65b6d1b 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -152,14 +152,12 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Kablosuz"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"SIM kart yok."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"Mobil Veri"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Mobil Veri Açık"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobil Veri Kapalı"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth tethering"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Uçak modu."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN açık."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM kart yok."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Operatör şebekesi değişiyor."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Pil ayrıntılarını aç"</string>
@@ -200,13 +198,13 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Uçak modu açık."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Uçak modu kapatıldı."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Uçak modu açıldı."</string>
- <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Rahatsız etmeyin ayarı açık, yalnızca öncelikliler."</string>
- <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Rahatsız etmeyin ayarı açık, tamamen sessiz."</string>
- <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Rahatsız etmeyin ayarı açık, yalnızca alarmlar."</string>
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Rahatsız etme ayarı açık, yalnızca öncelikliler."</string>
+ <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Rahatsız etme ayarı açık, tamamen sessiz."</string>
+ <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Rahatsız etme ayarı açık, yalnızca alarmlar."</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Rahatsız etmeyin."</string>
- <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\"Rahatsız etmeyin\" ayarı kapalı."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\"Rahatsız etmeyin\" ayarı kapalı."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\"Rahatsız etmeyin\" ayarı açık."</string>
+ <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\"Rahatsız etme\" ayarı kapalı."</string>
+ <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\"Rahatsız etme\" ayarı kapalı."</string>
+ <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\"Rahatsız etme\" ayarı açık."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="6341675755803320038">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"Bluetooth kapalı."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"Bluetooth açık."</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Şarj oluyor"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G veri kullanımı duraklatıldı"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G veri kullanımı duraklatıldı"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Mobil veri duraklatıldı"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Veri kullanımı duraklatıldı"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Ayarladığınız veri limitine ulaşıldı. Artık mobil veri kullanmıyorsunuz.\n\nDevam ettirirseniz veri kullanımı için sizden ödeme alınabilir."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Devam ettir"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"İnternet bağlantısı yok"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Kablosuz bağlandı"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Bildirimler"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Fener"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobil veri"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Veri kullanımı"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Kalan veri"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Sınır aşıldı"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"İş profiliniz <xliff:g id="VPN_APP">%1$s</xliff:g> uygulamasına bağlı"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Kişisel profil <xliff:g id="VPN_APP">%1$s</xliff:g> uygulamasına bağlı"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Cihaz <xliff:g id="VPN_APP">%1$s</xliff:g> uygulamasına bağlı"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Cihaz yönetimi"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profil izleme"</string>
<string name="monitoring_title" msgid="169206259253048106">"Ağ izleme"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<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_button_view_policies" msgid="100913612638514424">"Politikaları Göster"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Cihazınız <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> tarafından yönetiliyor.\n\nYöneticiniz ayarları, şirket erişimini, uygulamaları, cihazınızla ilişkili verileri ve cihazınızın konum bilgilerini izleyebilir ve yönetebilir.\n\nDaha fazla bilgi için yöneticinize başvurun."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Cihazınız kuruluşunuz tarafından yönetiliyor.\n\nYöneticiniz ayarları, şirket erişimini, uygulamaları, cihazınızla ilişkili verileri ve cihazınızın konum bilgilerini izleyebilir ve yönetebilir.\n\nDaha fazla bilgi için yöneticinize başvurun."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Kuruluşunuz bu cihaza bir sertifika yetkilisi yükledi. Güvenli ağ trafiğiniz izlenebilir veya değiştirilebilir."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Kuruluşunuz iş profilinize bir sertifika yetkilisi yükledi. Güvenli ağ trafiğiniz izlenebilir veya değiştirilebilir."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Bu cihazda bir sertifika yetkilisi yüklü. Güvenli ağ trafiğiniz izlenebilir veya değiştirilebilir."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Yöneticiniz,cihazınızdaki trafiği izleyen ağ günlük kaydını açtı."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"E-postalarınız, uygulamalarınız ve web siteleriniz de dahil olmak üzere ağ etkinliğinizi takip edebilen <xliff:g id="VPN_APP">%1$s</xliff:g> ağına bağlısınız."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"E-postalar, uygulamalar ve web siteleri de dahil olmak üzere ağ etkinliğinizi izleyebilen <xliff:g id="VPN_APP_0">%1$s</xliff:g> ve <xliff:g id="VPN_APP_1">%2$s</xliff:g> uygulamalarına bağlısınız."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"İş profiliniz, e-postalar, uygulamalar ve web siteleri dahil olmak üzere ağ etkinliğinizi izleyebilen <xliff:g id="VPN_APP">%1$s</xliff:g> uygulamasına bağlı."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Kişisel profiliniz; e-postalar, uygulamalar ve web siteleri de dahil olmak üzere ağ etkinliğinizi izleyebilen <xliff:g id="VPN_APP">%1$s</xliff:g> uygulamasına bağlı."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Cihazınız <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> tarafından yönetiliyor."</string>
@@ -503,9 +493,9 @@
<string name="stream_bluetooth_sco" msgid="2055645746402746292">"Bluetooth"</string>
<string name="stream_dtmf" msgid="2447177903892477915">"Çift ton çoklu frekans"</string>
<string name="stream_accessibility" msgid="301136219144385106">"Erişilebilirlik"</string>
- <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Sesi açmak için hafifçe dokunun."</string>
- <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Titreşime ayarlamak için hafifçe dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir."</string>
- <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Sesi kapatmak için hafifçe dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir."</string>
+ <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Sesi açmak için dokunun."</string>
+ <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Titreşime ayarlamak için dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir."</string>
+ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Sesi kapatmak için dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Titreşime ayarlamak için dokunun."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Sesi kapatmak için dokunun."</string>
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ses denetimleri gösteriliyor. Kapatmak için hızlıca yukarı kaydırın."</string>
@@ -569,12 +559,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> ve diğer <xliff:g id="NUMBER_5">%3$d</xliff:g></item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> ve <xliff:g id="NUMBER_2">%3$d</xliff:g> tane daha</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> için bildirim kontrolleri açıldı"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> için bildirim kontrolleri kapatıldı"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Bu kanaldan bildirimlere izin verir"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"Tüm Kategoriler"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Diğer ayarlar"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"Özelleştir: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -700,9 +687,9 @@
<string name="accessibility_action_divider_top_50" msgid="6385859741925078668">"Üstte %50"</string>
<string name="accessibility_action_divider_top_30" msgid="6201455163864841205">"Üstte %30"</string>
<string name="accessibility_action_divider_bottom_full" msgid="301433196679548001">"Altta tam ekran"</string>
- <string name="accessibility_qs_edit_tile_label" msgid="8374924053307764245">"<xliff:g id="POSITION">%1$d</xliff:g>. konum, <xliff:g id="TILE_NAME">%2$s</xliff:g>. Düzenlemek için iki kez hafifçe dokunun."</string>
- <string name="accessibility_qs_edit_add_tile_label" msgid="8133209638023882667">"<xliff:g id="TILE_NAME">%1$s</xliff:g>. Eklemek için iki kez hafifçe dokunun."</string>
- <string name="accessibility_qs_edit_position_label" msgid="5055306305919289819">"<xliff:g id="POSITION">%1$d</xliff:g>. konum. Seçmek için iki kez hafifçe dokunun."</string>
+ <string name="accessibility_qs_edit_tile_label" msgid="8374924053307764245">"<xliff:g id="POSITION">%1$d</xliff:g>. konum, <xliff:g id="TILE_NAME">%2$s</xliff:g>. Düzenlemek için iki kez dokunun."</string>
+ <string name="accessibility_qs_edit_add_tile_label" msgid="8133209638023882667">"<xliff:g id="TILE_NAME">%1$s</xliff:g>. Eklemek için iki kez dokunun."</string>
+ <string name="accessibility_qs_edit_position_label" msgid="5055306305919289819">"<xliff:g id="POSITION">%1$d</xliff:g>. konum. Seçmek için iki kez dokunun."</string>
<string name="accessibility_qs_edit_move_tile" msgid="2461819993780159542">"<xliff:g id="TILE_NAME">%1$s</xliff:g> kutusunu taşı"</string>
<string name="accessibility_qs_edit_remove_tile" msgid="7484493384665907197">"<xliff:g id="TILE_NAME">%1$s</xliff:g> kutusunu kaldır"</string>
<string name="accessibility_qs_edit_tile_added" msgid="8050200862063548309">"<xliff:g id="TILE_NAME">%1$s</xliff:g> kutusu <xliff:g id="POSITION">%2$d</xliff:g>. konuma eklendi"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> bildirimi: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Uygulama bölünmüş ekranda çalışmayabilir."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Uygulama bölünmüş ekranı desteklemiyor."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Uygulama ikincil ekranda çalışmayabilir."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Uygulama ikincil ekranlarda başlatılmayı desteklemiyor."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Ayarları aç."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Hızlı ayarları aç."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Hızlı ayarları kapat."</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"Ekran içinde ekran menüsü"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g>, ekran içinde ekran özelliğini kullanıyor"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> uygulamasının bu özelliği kullanmasını istemiyorsanız dokunarak ayarları açın ve özelliği kapatın."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"Oynat"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"Duraklat"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"Sonrakine atla"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"Öncekine atla"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"Telefon ısındığından kapatıldı"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"Telefonunuz şu anda normal bir şekilde çalışıyor"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"Telefonunuz çok ısındığından soğuması için kapatıldı ve şu anda normal bir şekilde çalışıyor.\n\nTelefon şu koşullarda çok ısınabilir:\n • Yoğun kaynak gerektiren uygulamalar (oyun, video veya gezinme uygulamaları gibi) kullanma\n • Büyük dosyalar indirme veya yükleme\n • Telefonu sıcak yerlerde kullanma"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Hazır Uygulamalar"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Hazır uygulamaların yüklenmesi gerekmez."</string>
<string name="app_info" msgid="6856026610594615344">"Uygulama bilgileri"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Web\'e git"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobil veriler"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Kablosuz bağlantı kapalı"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth kapalı"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index dcf8d4f..ffe9070 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -159,6 +159,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Мобільне передавання даних вимкнено"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Прив’язка Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Режим польоту."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"Мережу VPN увімкнено."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Немає SIM-карти."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Змінення мережі оператора."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Відкрити деталі акумулятора"</string>
@@ -433,8 +434,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Робочий профіль під’єднано до додатка <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Особистий профіль під’єднано до додатка <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Пристрій під’єднано до додатка <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Керування пристроями"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Відстеження профілю"</string>
<string name="monitoring_title" msgid="169206259253048106">"Відстеження дій у мережі"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"Мережа VPN"</string>
@@ -443,18 +443,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Вимкнути VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Від’єднатися від мережі VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Переглянути правила"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Вашим пристроєм керує адміністратор організації \"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>\".\n\nВін може відстежувати та контролювати налаштування, корпоративний доступ, додатки, дані пристрою й інформацію про його місцезнаходження.\n\nЩоб дізнатися більше, зв’яжіться з адміністратором."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Вашим пристроєм керує адміністратор організації.\n\nВін може відстежувати та контролювати налаштування, корпоративний доступ, додатки, дані пристрою й інформацію про його місцезнаходження.\n\nЩоб дізнатися більше, зв’яжіться з адміністратором."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Адміністратор організації встановив центр сертифікації на цьому пристрої. Захищений мережевий трафік може відстежуватися або змінюватися."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Адміністратор організації встановив центр сертифікації у вашому робочому профілі. Захищений мережевий трафік може відстежуватися або змінюватися."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"На цьому пристрої встановлено центр сертифікації. Захищений мережевий трафік може відстежуватися або змінюватися."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Ваш адміністратор увімкнув реєстрацію в мережі, під час якої на вашому пристрої відстежується трафік."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Під’єднано додаток <xliff:g id="VPN_APP">%1$s</xliff:g>, який може відстежувати вашу активність у мережі, як-от відкривання електронних листів, додатків і веб-сайтів."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Під’єднано додатки <xliff:g id="VPN_APP_1">%2$s</xliff:g> та <xliff:g id="VPN_APP_0">%1$s</xliff:g>, які можуть відстежувати вашу активність у мережі, як-от відкривання електронних листів, додатків і веб-сайтів."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Ваш робочий профіль під’єднано до додатка <xliff:g id="VPN_APP">%1$s</xliff:g>, який може відстежувати вашу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Ваш особистий профіль під’єднано до додатка <xliff:g id="VPN_APP">%1$s</xliff:g>, який може відстежувати вашу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Вашим пристроєм керує додаток <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -667,7 +663,7 @@
</string-array>
<string name="menu_ime" msgid="4998010205321292416">"Вибір клавіатури"</string>
<string name="save" msgid="2311877285724540644">"Зберегти"</string>
- <string name="reset" msgid="2448168080964209908">"Віднов."</string>
+ <string name="reset" msgid="2448168080964209908">"Скинути"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"Змінити ширину кнопки"</string>
<string name="clipboard" msgid="1313879395099896312">"Буфер обміну"</string>
<string name="accessibility_key" msgid="5701989859305675896">"Спеціальна кнопка навігації"</string>
@@ -713,6 +709,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Сповіщення <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Додаток може не працювати в режимі розділеного екрана."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Додаток не підтримує розділення екрана."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Додаток може не працювати на додатковому дисплеї."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Додаток не підтримує запуск на додаткових дисплеях."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Відкрити налаштування."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Відкрити швидкі налаштування."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Закрити швидкі налаштування."</string>
@@ -762,8 +760,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Додатки з миттєвим запуском"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Додатки з миттєвим запуском не потрібно встановлювати."</string>
<string name="app_info" msgid="6856026610594615344">"Про додаток"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Перейти на веб-сайт"</string>
<string name="mobile_data" msgid="7094582042819250762">"Мобільний трафік"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi вимкнено"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth вимкнено"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 525054e..f3069ba 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -152,14 +152,12 @@
<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>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"بلوٹوتھ مربوط کرنا۔"</string>
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"موبائل ڈیٹا"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"موبائل ڈیٹا آن ہے"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"موبائل ڈیٹا آف ہے"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"بلوٹوتھ ٹیتھرنگ۔"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ہوائی جہاز وضع۔"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN آن ہے۔"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"کوئی SIM کارڈ نہیں ہے۔"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"کیریئر نیٹ ورک تبدیل ہو رہا ہے۔"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"بیٹری کی تفصیلات کھولیں"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"چارج ہو رہا ہے"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ڈیٹا موقوف کر دیا گیا"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ڈیٹا موقوف کر دیا گیا"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"موبائل ڈیٹا موقوف کر دیا گیا ہے"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"ڈیٹا موقوف کر دیا گیا"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"ڈیٹا کا استعمال آپ کی مقرر کردہ حد کو پہنچ چکا ہے۔ اب آپ موبائل ڈیٹا کا استعمال نہیں کر رہے ہیں۔\n\nاگر آپ دوبارہ شروع کرتے ہیں تو ڈیٹا استعمال کیلئے چارجز لاگو ہو سکتے ہیں۔"</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"دوبارہ شروع کریں"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"کوئی انٹرنیٹ کنکشن نہیں"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi مربوط ہے"</string>
@@ -309,18 +305,17 @@
<string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"کوئی آلات دستیاب نہیں ہیں"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"چمکیلا پن"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"خودکار"</string>
- <string name="quick_settings_inversion_label" msgid="8790919884718619648">"رنگ تبدیل کریں"</string>
+ <string name="quick_settings_inversion_label" msgid="8790919884718619648">"رنگ پلٹیں"</string>
<string name="quick_settings_color_space_label" msgid="853443689745584770">"رنگ کی اصلاح کی وضع"</string>
<string name="quick_settings_more_settings" msgid="326112621462813682">"مزید ترتیبات"</string>
<string name="quick_settings_done" msgid="3402999958839153376">"ہو گیا"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"مربوط"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"مربوط ہو رہا ہے…"</string>
- <string name="quick_settings_tethering_label" msgid="7153452060448575549">"مربوط کرنا"</string>
+ <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ٹیتھرنگ"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ہاٹ اسپاٹ"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"اطلاعات"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"فلیش لائٹ"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"موبائل ڈیٹا"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ڈیٹا کا استعمال"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"باقی ڈیٹا"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"حد سے زیادہ"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"دفتری پروفائل <xliff:g id="VPN_APP">%1$s</xliff:g> سے منسلک ہے"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"ذاتی پروفائل <xliff:g id="VPN_APP">%1$s</xliff:g> سے منسلک ہے"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"آلہ <xliff:g id="VPN_APP">%1$s</xliff:g> سے منسلک ہے"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"آلے کا نظم و نسق"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"پروفائل کو مانیٹر کرنا"</string>
<string name="monitoring_title" msgid="169206259253048106">"نیٹ ورک کو مانیٹر کرنا"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"VPN کو غیر فعال کریں"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN کو غیر منسلک کریں"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"پالیسیاں دیکھیں"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"آپ کا آلہ <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> کے زیر انتظام ہے۔\n\nآپ کا منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلہ سے وابستہ ڈیٹا اور آپ کے آلہ کے مقام کی معلومات کو مانیٹر اور ان کا نظم کر سکتا ہے۔\n\nمزید معلومات کیلئے اپنے منتظم سے رابطہ کریں۔"</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"آپ کا آلہ آپ کی تنظیم کے زیر انتظام ہے۔\n\nآپ کا منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلہ سے وابستہ ڈیٹا اور آپ کے آلہ کے مقام کی معلومات کو مانیٹر اور ان کا نظم کر سکتا ہے۔\n\nمزید معلومات کیلئے اپنے منتظم سے رابطہ کریں۔"</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"آپ کی تنظیم نے اس آلے پر ایک سرٹیفکیٹ کی اتھارٹی کو انسٹال کیا ہے۔ آپ کا محفوظ نیٹ ورک ٹریفک مانیٹر ہو سکتا ہے یا اس میں ترمیم کی جا سکتی ہے۔"</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"آپ کی تنظیم نے آپ کے دفتری پروفائل میں ایک سرٹیفکیٹ کی اتھارٹی کو انسٹال کیا ہے۔ آپ کا محفوظ نیٹ ورک ٹریفک مانیٹر ہو سکتا ہے یا اس میں ترمیم کی جا سکتی ہے۔"</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"ایک سرٹیفکیٹ کی اتھارٹی اس آلہ پر انسٹال ہے۔ آپ کا محفوظ نیٹ ورک ٹریفک مانیٹر ہو سکتا ہے یا اس میں ترمیم کی جا سکتی ہے۔"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"آپ کے منتظم نے نیٹ ورک لاگنگ کو آن کر دیا ہے، جو آپ کے آلے پر ٹریفک مانیٹر کرتی ہے۔"</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"آپ <xliff:g id="VPN_APP">%1$s</xliff:g> سے منسلک ہیں جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"آپ <xliff:g id="VPN_APP_0">%1$s</xliff:g> اور <xliff:g id="VPN_APP_1">%2$s</xliff:g> سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہیں۔"</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"آپ کا دفتری پروفائل <xliff:g id="VPN_APP">%1$s</xliff:g> سے منسلک ہے، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔"</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"آپ کا ذاتی پروفائل <xliff:g id="VPN_APP">%1$s</xliff:g> سے منسلک ہے جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔"</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"آپ کا آلہ <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> کے زیر انتظام ہے۔"</string>
@@ -569,12 +559,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>، <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> اور <xliff:g id="NUMBER_5">%3$d</xliff:g> دیگر</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>، <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> اور <xliff:g id="NUMBER_2">%3$d</xliff:g> دیگر</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> کیلئے اطلاعی کنٹرولز کھلے ہیں"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> کیلئے اطلاعی کنٹرولز بند کر دئے گئے ہیں"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"اس چینل سے اطلاعات کی اجازت دیں"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"سبھی زمرے"</string>
<string name="notification_more_settings" msgid="816306283396553571">"مزید ترتیبات"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"حسب ضرورت بنائیں: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> اطلاع: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"ممکن ہے کہ ایپ سپلٹ اسکرین کے ساتھ کام نہ کرے۔"</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"ایپ سپلٹ اسکرین کو سپورٹ نہیں کرتی۔"</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"یہ ایپ شاید ثانوی ڈسپلے پر کام نہ کرے۔"</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"یہ ایپ ثانوی ڈسپلیز پر شروعات کا تعاون نہیں کرتی ہے۔"</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"ترتیبات کھولیں۔"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"فوری ترتیبات کھولیں۔"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"فوری ترتیبات بند کریں۔"</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"تصویر کے مینو میں تصویر"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> تصویر میں تصویر میں ہے"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"اگر آپ نہیں چاہتے ہیں کہ <xliff:g id="NAME">%s</xliff:g> اس خصوصیت کا استعمال کرے تو ترتیبات کھولنے کیلئے تھپتھپائیں اور اسے آف کر دیں۔"</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"چلائیں"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"موقوف کریں"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"نظرانداز کرکے اگلے پر جائیں"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"نظرانداز کرکے پچھلے پر جائیں"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"حرارت کی وجہ سے فون آف ہو گیا"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"آپ کا فون اب حسب معمول کام کر رہا ہے"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"آپ کا فون کافی گرم ہو گيا تھا، اس لئے سرد ہونے کیلئے یہ آف ہو گیا۔ اب آپ کا فون حسب معمول کام کر رہا ہے۔\n\nمندرجہ ذیل چیزیں کرنے پر آپ کا فون کافی گرم ہو سکتا ہے:\n • ماخذ کا زیادہ استعمال کرنے والی ایپس (جیسے کہ گیمنگ، ویڈیو، یا نیویگیشن ایپس) کا استعمال کرنا\n • بڑی فائلز ڈاؤن لوڈ یا اپ لوڈ کرنا\n • اعلی درجہ حرارت میں فون کا استعمال کرنا"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"فوری ایپس"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"فوری ایپس کو انسٹالیشن کی ضرورت نہیں ہے۔"</string>
<string name="app_info" msgid="6856026610594615344">"ایپ کی معلومات"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"ویب پر جائیں"</string>
<string name="mobile_data" msgid="7094582042819250762">"موبائل ڈیٹا"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi آف ہے"</string>
<string name="bt_is_off" msgid="2640685272289706392">"بلوٹوتھ آف ہے"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index fd5eeb2..f6b4e69 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -157,6 +157,7 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Mobil internet o‘chiq"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth modem"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Parvoz rejimi"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN yoniq."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM karta yo‘q."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Mobil tarmoqni o‘zgartirish"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Batareya quvvati sarfi haqida ma’lumot"</string>
@@ -243,7 +244,7 @@
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G internet to‘xtatib qo‘yildi"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Mobil internet pauza qilingan"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Internetdan foydalanish to‘xtatib qo‘yildi"</string>
- <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"O‘rnatilgan trafik sarflab bo‘lindi. Endi mobil internetdan foydalana olmaysiz.\n\nDavom ettiradigan bo‘lsangiz, trafik uchun to‘lov olinishi mumkin."</string>
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Belgilangan trafik sarflab bo‘lindi. Endi mobil internetdan foydalana olmaysiz.\n\nDavom ettiradigan bo‘lsangiz, trafik uchun to‘lov olinishi mumkin."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Davom etish"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Internetga ulanmagan"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi ulandi"</string>
@@ -429,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Ishchi profilda <xliff:g id="VPN_APP">%1$s</xliff:g> ilovasi ishga tushirilgan"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Shaxsiy profilda <xliff:g id="VPN_APP">%1$s</xliff:g> ilovasi ishga tushirilgan"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Qurilmada <xliff:g id="VPN_APP">%1$s</xliff:g> ilovasi ishga tushirilgan"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Qurilmalar boshqaruvi"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profilni kuzatish"</string>
<string name="monitoring_title" msgid="169206259253048106">"Tarmoqlarni kuzatish"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -439,18 +439,14 @@
<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_button_view_policies" msgid="100913612638514424">"Siyosatlarni ko‘rish"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Qurilmangiz <xliff:g id="ORGANIZATION_NAME">%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.\n\nBatafsil axborot olish uchun administratoringiz bilan bog‘laning."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Qurilmangiz tashkilot 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.\n\nBatafsil axborot olish uchun administratoringiz bilan bog‘laning."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Tashkilotingiz bu qurilmada CA sertifikatini o‘rnatdi. U himoyalangan tarmoq trafigini nazorat qilishi va o‘zgartirishi mumkin."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Tashkilotingiz ishchi profilingizga CA sertifikatini o‘rnatdi. U himoyalangan tarmoq trafigini nazorat qilishi va o‘zgartirishi mumkin."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Qurilmada CA sertifikati o‘rnatilgan. U himoyalangan tarmoq trafigini nazorat qilishi va o‘zgartirishi mumkin."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Administrator qurilmangizdagi trafikni nazorat qiluvchi tarmoq jurnalini yoqdi."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"<xliff:g id="VPN_APP">%1$s</xliff:g> ilovasi ishga tushirilgan. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"<xliff:g id="VPN_APP_0">%1$s</xliff:g> va <xliff:g id="VPN_APP_1">%2$s</xliff:g> ilovalari ishga tushirilgan. Ular tarmoqdagi, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Ishchi profilingizda tarmoqdagi, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin bo‘lgan <xliff:g id="VPN_APP">%1$s</xliff:g> ilovasi ishga tushirilgan."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Shaxsiy profilingizda tarmoqdagi, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin bo‘lgan <xliff:g id="VPN_APP">%1$s</xliff:g> ilovasi ishga tushirilgan."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Qurilmangiz <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> tomonidan boshqariladi."</string>
@@ -565,9 +561,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> va yana <xliff:g id="NUMBER_5">%3$d</xliff:g> ta</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> va yana <xliff:g id="NUMBER_2">%3$d</xliff:g> ta</item>
</plurals>
- <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun bildirishnomalarni boshqarish ochildi"</string>
- <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun bildirishnomalarni boshqarish yopildi"</string>
- <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Ushbu kanaldan keladigan bildirishnomalarga ruxsat berish"</string>
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun bildirishnoma sozlamalari ochildi"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun bildirishnoma sozlamalari yopildi"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Bu kanaldan keladigan bildirishnomalarga ruxsat berish"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"Barcha turkumlar"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Boshqa sozlamalar"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"<xliff:g id="SUB_CATEGORY">%1$s</xliff:g>: sozlash"</string>
@@ -705,6 +701,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> bildirishnomasi: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Ilova ekranni ikkiga bo‘lish rejimini qo‘llab-quvvatlamaydi."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Bu ilova ekranni bo‘lish xususiyatini qo‘llab-quvvatlamaydi."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Bu ilova qo‘shimcha ekranda ishlamasligi mumkin."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Bu ilova qo‘shimcha ekranlarda ishlamaydi."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Sozlamalarni ochish."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Tezkor sozlamalarni ochish."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Tezkor sozlamalarni yopish."</string>
@@ -726,7 +724,7 @@
<string name="pip_play" msgid="1417176722760265888">"Ijro"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pauza"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Keyingisiga o‘tish"</string>
- <string name="pip_skip_to_prev" msgid="1955311326688637914">"Avvalgisiga o‘tish"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"Avvalgisiga qaytish"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"Qizigani uchun o‘chirildi"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"Telefoningiz hozir normal holatda ishlayapti"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"Telefon qizib ketganligi sababli sovitish uchun o‘chirib qo‘yilgan. Endi telefoningiz normal holatda ishlayapti.\n\nTelefon bu hollarda qizib ketishi mumkin:\n • Resurstalab ilovalar ishlatilganda (masalan, o‘yin, video yoki navigatsiya ilovalari)\n • Katta faylni yuklab olishda yoki yuklashda\n • Telefondan yuqori haroratda foydalanganda"</string>
@@ -754,8 +752,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Darhol ochiladigan ilovalar"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Darhol ochiladigan ilovalarni o‘rnatish shart emas."</string>
<string name="app_info" msgid="6856026610594615344">"Ilova haqida"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Brauzerga o‘tish"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobil internet"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi o‘chiq"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth o‘chiq"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 5460d28..8d1cd04 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -152,14 +152,12 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Cạnh"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"Không có SIM nào."</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"Dữ liệu di động"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Dữ liệu di động đang bật"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"Dữ liệu di động đang tắt"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Truy cập Internet qua Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Chế độ trên máy bay."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN đang bật."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Không có thẻ SIM nào."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Thay đổi mạng của nhà cung cấp dịch vụ."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Mở chi tiết về pin"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Đang sạc"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Đã tạm dừng dữ liệu 2G-3G"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Đã tạm dừng dữ liệu 4G"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"Dữ liệu di động bị tạm dừng"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"Đã tạm dừng dữ liệu"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"Đã đạt đến giới hạn dữ liệu mà bạn đặt. Bạn hiện không còn sử dụng dữ liệu di động.\n\nNếu tiếp tục, bạn có thể phải trả phí sử dụng dữ liệu."</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"Tiếp tục"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Ko có k.nối Internet"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Đã kết nối Wi-Fi"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Điểm phát sóng"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Thông báo"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Đèn pin"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Dữ liệu di động"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Sử dụng dữ liệu"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Dữ liệu còn lại"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Vượt quá giới hạn"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Hồ sơ công việc được kết nối với <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Hồ sơ cá nhân được kết nối với <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Thiết bị được kết nối với <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Quản lý thiết bị"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Giám sát hồ sơ"</string>
<string name="monitoring_title" msgid="169206259253048106">"Giám sát mạng"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<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_button_view_policies" msgid="100913612638514424">"Xem chính sách"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Thiết bị của bạn do <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> quản lý.\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 vào dữ liệu công ty, ứng dụng, dữ liệu được liên kết với thiết bị và thông tin vị trí thiết bị của bạn.\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_management" msgid="4573721970278370790">"Thiết bị của bạn do tổ chức của bạn quản lý.\n\nQuản trị viên có thể giám sát và quản lý cài đặt, quyền truy cập vào dữ liệu công ty, ứng dụng, dữ liệu được liên kết với thiết bị và thông tin vị trí thiết bị của bạn.\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_management_ca_certificate" msgid="5202023784131001751">"Tổ chức của bạn đã cài đặt một tổ chức phát hành chứng chỉ trên thiết bị này. Lưu lượng truy cập mạng bảo mật của bạn có thể được giám sát hoặc sửa đổi."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Tổ chức của bạn đã cài đặt một tổ chức phát hành chứng chỉ trong hồ cơ công việc của bạn. Lưu lượng truy cập mạng bảo mật của bạn có thể được giám sát hoặc sửa đổi."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Một tổ chức phát hành chứng chỉ được cài đặt trên thiết bị này. Lưu lượng truy cập mạng bảo mật của bạn có thể được giám sát hoặc sửa đổi."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Quản trị viên của bạn đã bật tính năng ghi nhật ký mạng. Tính năng này giám sát lưu lượng truy cập trên thiết bị của bạn."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Bạn đang kết nối với <xliff:g id="VPN_APP">%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_two_named_vpns" msgid="4198511413729213802">"Bạn đang kết nối với <xliff:g id="VPN_APP_0">%1$s</xliff:g> và <xliff:g id="VPN_APP_1">%2$s</xliff:g>. Các ứ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_managed_profile_named_vpn" msgid="1427905889862420559">"Hồ sơ công việc của bạn được kết nối với <xliff:g id="VPN_APP">%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_personal_profile_named_vpn" msgid="3133980926929069283">"Hồ sơ cá nhân của bạn được kết nối với <xliff:g id="VPN_APP">%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_do_header_generic" msgid="96588491028288691">"Thiết bị của bạn do <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> quản lý."</string>
@@ -571,12 +561,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> và <xliff:g id="NUMBER_5">%3$d</xliff:g> kênh khác</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> và <xliff:g id="NUMBER_2">%3$d</xliff:g> kênh khác</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Đã mở điều khiển thông báo đối với <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"Đã đóng điều khiển thông báo đối với <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"Cho phép thông báo từ kênh này"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"Tất cả danh mục"</string>
<string name="notification_more_settings" msgid="816306283396553571">"Cài đặt khác"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"Tùy chỉnh: <xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -714,6 +701,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"Thông báo của <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Ứng dụng có thể không hoạt động với tính năng chia đôi màn hình."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Ứng dụng không hỗ trợ chia đôi màn hình."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Ứng dụng có thể không hoạt động trên màn hình phụ."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Ứng dụng không hỗ trợ khởi chạy trên màn hình phụ."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Mở cài đặt."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Mở cài đặt nhanh."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Đóng cài đặt nhanh."</string>
@@ -732,14 +721,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"Menu ảnh trong ảnh"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> đang ở chế độ ảnh trong ảnh"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Nếu bạn không muốn <xliff:g id="NAME">%s</xliff:g> sử dụng tính năng này, hãy nhấn để mở cài đặt và tắt tính năng này."</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"Phát"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"Tạm dừng"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"Chuyển tới mục tiếp theo"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"Chuyển về mục trước"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"Điện thoại đã tắt do nhiệt"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"Điện thoại của bạn hiện đang chạy bình thường"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"Do quá nóng nên điện thoại đã tắt để hạ nhiệt. Hiện điện thoại của bạn đang chạy bình thường.\n\nĐiện thoại có thể bị quá nóng nếu bạn:\n • Dùng các ứng dụng tốn nhiều tài nguyên (như ứng dụng trò chơi, video hoặc điều hướng)\n • Tải xuống hoặc tải lên tệp có dung lượng lớn\n • Dùng điện thoại ở nhiệt độ cao"</string>
@@ -767,8 +752,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Ứng dụng tức thì"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Ứng dụng tức thì không yêu cầu cài đặt."</string>
<string name="app_info" msgid="6856026610594615344">"Thông tin ứng dụng"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Truy cập web"</string>
<string name="mobile_data" msgid="7094582042819250762">"Dữ liệu di động"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi tắt"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth tắt"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 38850d4..70f189b 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -152,14 +152,12 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"EDGE"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"WLAN"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"无 SIM 卡。"</string>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"移动数据"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"移动数据已开启"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"移动数据已关闭"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"蓝牙网络共享。"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"飞行模式。"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN 已开启。"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"没有 SIM 卡。"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"运营商网络正在更改。"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"打开电量详情"</string>
@@ -200,8 +198,8 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"飞行模式开启。"</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"飞行模式已关闭。"</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"飞行模式已开启。"</string>
- <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"勿扰模式已开启,仅限优先打扰。"</string>
- <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"勿扰模式已开启,完全静音。"</string>
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"勿扰模式已开启,仅允许指定的优先事项打扰。"</string>
+ <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"勿扰模式已开启,阻止全部通知。"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"勿扰模式已开启,仅限闹钟。"</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"勿扰。"</string>
<string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"勿扰模式关闭。"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"正在充电"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G 数据网络已暂停使用"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G 数据网络已暂停使用"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"移动数据已暂停使用"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"数据网络已暂停使用"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"您的数据用量已达到所设置的用量上限,因此系统已停用移动数据。\n\n如果您要继续使用移动数据,则可能需要支付相应的数据流量费用。"</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"恢复"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"未连接互联网"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"已连接到WLAN网络"</string>
@@ -271,7 +267,7 @@
<string name="start_dreams" msgid="5640361424498338327">"屏保"</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">"蓝牙"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"热点"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"通知"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"手电筒"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"移动数据"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"流量使用情况"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"剩余流量"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"超出上限"</string>
@@ -370,9 +365,9 @@
<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_with_warning" msgid="5114872171614161084">"完全静音。此模式也会将屏幕阅读器静音。"</string>
+ <string name="interruption_level_none_with_warning" msgid="5114872171614161084">"完全阻止。此模式也会将屏幕阅读器静音。"</string>
<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>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"工作资料已连接到“<xliff:g id="VPN_APP">%1$s</xliff:g>”"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"个人资料已连接到“<xliff:g id="VPN_APP">%1$s</xliff:g>”"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"设备已连接到“<xliff:g id="VPN_APP">%1$s</xliff:g>”"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"设备管理"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"资料监控"</string>
<string name="monitoring_title" msgid="169206259253048106">"网络监控"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"关闭VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"断开VPN连接"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"查看政策"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"您的设备由“<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>”负责管理。\n\n您的管理员能够监控和管理与您的设备相关的设置、企业权限、应用、数据,以及您设备的位置信息。\n\n要了解详情,请与您的管理员联系。"</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"您的设备由贵单位负责管理。\n\n您的管理员能够监控和管理与您的设备相关的设置、企业权限、应用、数据,以及您设备的位置信息。\n\n要了解详情,请与您的管理员联系。"</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"您所在的单位已在此设备上安装证书授权中心。您的安全网络流量可能会受到监控或修改。"</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"您所在的单位已为您的工作资料安装证书授权中心。您的安全网络流量可能会受到监控或修改。"</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"此设备上已安装证书授权中心。您的安全网络流量可能会受到监控或修改。"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"您的管理员已开启网络日志功能(该功能会监控您设备上的流量)。"</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"您已连接到“<xliff:g id="VPN_APP">%1$s</xliff:g>”(该应用能够监控您的网络活动,其中包括收发电子邮件、使用应用和浏览网站)。"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"您已连接到“<xliff:g id="VPN_APP_0">%1$s</xliff:g>”和“<xliff:g id="VPN_APP_1">%2$s</xliff:g>”(这两个应用能够监控您的网络活动,其中包括收发电子邮件、使用应用和浏览网站)。"</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"您的工作资料已连接到“<xliff:g id="VPN_APP">%1$s</xliff:g>”(该应用能够监控您的网络活动,其中包括收发电子邮件、使用应用和浏览网站)。"</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"您的个人资料已连接到“<xliff:g id="VPN_APP">%1$s</xliff:g>”(该应用能够监控您的网络活动,其中包括收发电子邮件、使用应用和浏览网站)。"</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"您的设备由<xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>管理。"</string>
@@ -569,12 +559,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>、<xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>以及另外 <xliff:g id="NUMBER_5">%3$d</xliff:g> 项</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>、<xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g>以及另外 <xliff:g id="NUMBER_2">%3$d</xliff:g> 项</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"<xliff:g id="APP_NAME">%1$s</xliff:g>的通知控件已打开"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"<xliff:g id="APP_NAME">%1$s</xliff:g>的通知控件已关闭"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"允许接收来自此频道的通知"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"所有类别"</string>
<string name="notification_more_settings" msgid="816306283396553571">"更多设置"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"自定义:<xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g>通知:<xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"应用可能无法在分屏模式下正常运行。"</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"应用不支持分屏。"</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"应用可能无法在辅助显示屏上正常运行。"</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"应用不支持在辅助显示屏上启动。"</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"打开设置。"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"开启快捷设置。"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"关闭快捷设置。"</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"画中画菜单"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g>目前位于“画中画”中"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"如果您不想让<xliff:g id="NAME">%s</xliff:g>使用此功能,请点按以打开设置,然后关闭此功能。"</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"播放"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"暂停"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"跳到下一个"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"跳到上一个"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"手机因严重发热而自动关机"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"现在,您的手机已恢复正常运行"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"由于发热严重,因此您的手机执行了自动关机以降温。现在,您的手机已恢复正常运行。\n\n以下情况可能会导致您的手机严重发热:\n • 使用占用大量资源的应用(例如游戏、视频或导航应用)\n • 下载或上传大型文件\n • 在高温环境下使用手机"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"免安装应用"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"免安装应用无需安装就能使用。"</string>
<string name="app_info" msgid="6856026610594615344">"应用信息"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"转到网页版"</string>
<string name="mobile_data" msgid="7094582042819250762">"移动数据"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"WLAN 已关闭"</string>
<string name="bt_is_off" msgid="2640685272289706392">"蓝牙已关闭"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 19957bf..ae05c22 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -152,14 +152,12 @@
<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>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"流動數據"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"開咗流動數據"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"閂咗流動數據"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"藍牙網絡共享。"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"飛航模式。"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"開咗 VPN。"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"沒有 SIM 卡。"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"流動網絡供應商網絡正在變更。"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"開啟電池詳細資料"</string>
@@ -244,11 +242,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"正在充電"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"已暫停 2G-3G 數據"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"已暫停 4G 數據"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"已暫停使用流動數據"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"已暫停使用數據"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"您的數據用量已達到所設定的上限,因此系統已停用流動數據連線。\n\n如果您恢復使用流動數據連線,可能需要支付數據用量費用。"</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"恢復"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"沒有互聯網連線"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi 已連線"</string>
@@ -321,8 +317,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"熱點"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"通知"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"手電筒"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"流動數據"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"數據用量"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"剩餘資料"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"超過上限"</string>
@@ -435,8 +430,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"工作設定檔已連結至「<xliff:g id="VPN_APP">%1$s</xliff:g>」"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"個人設定檔已連結至「<xliff:g id="VPN_APP">%1$s</xliff:g>」"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"裝置已連結至「<xliff:g id="VPN_APP">%1$s</xliff:g>」"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"裝置管理"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"個人檔案監控"</string>
<string name="monitoring_title" msgid="169206259253048106">"網絡監控"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -445,18 +439,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"停用 VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"中斷 VPN 連線"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"查看政策"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"您的裝置由<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>管理。\n\n您的管理員可以監控和管理與您裝置相關的設定、公司存取權、應用程式、資料和位置。\n\n如需瞭解詳情,請聯絡您的管理員。"</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"您的裝置由您的機構管理。\n\n您的管理員可以監控和管理與您裝置相關的設定、公司存取權、應用程式、資料和位置。\n\n如需瞭解詳情,請聯絡您的管理員。"</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"您的機構已在此裝置中安裝憑證授權單位。您的安全網絡流量可能會受監控或修改。"</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"您的機構已在您的工作設定檔中安裝憑證授權單位。您的安全網絡流量可能會受監控或修改。"</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"此裝置已安裝憑證授權單位。您的安全網絡流量可能會受監控或修改。"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"您的管理員已開啟網絡記錄功能,以監控您裝置上的流量。"</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"您已連接至「<xliff:g id="VPN_APP">%1$s</xliff:g>」,此應用程式可以監控您的網絡活動,包括電郵、應用程式及網站。"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"您已連接至「<xliff:g id="VPN_APP_0">%1$s</xliff:g>」和「<xliff:g id="VPN_APP_1">%2$s</xliff:g>」,這些應用程式可以監控您的網絡活動,包括電郵、應用程式及網站。"</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"您的工作設定檔已連結至「<xliff:g id="VPN_APP">%1$s</xliff:g>」,此應用程式可以監控您的網絡活動,包括電郵、應用程式及網站。"</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"您的個人設定檔已連結至「<xliff:g id="VPN_APP">%1$s</xliff:g>」,此應用程式可以監控您的網絡活動,包括電郵、應用程式及網站。"</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"您的裝置由「<xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>」管理。"</string>
@@ -571,12 +561,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>、<xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>和另外 <xliff:g id="NUMBER_5">%3$d</xliff:g> 個頻道</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>、<xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g>和另外 <xliff:g id="NUMBER_2">%3$d</xliff:g> 個頻道</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"開咗「<xliff:g id="APP_NAME">%1$s</xliff:g>」嘅通知控制項"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"閂咗「<xliff:g id="APP_NAME">%1$s</xliff:g>」嘅通知控制項"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"允許收到呢個頻道嘅通知"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"所有類別"</string>
<string name="notification_more_settings" msgid="816306283396553571">"更多設定"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"自訂:<xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -714,6 +701,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> 通知:<xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"應用程式可能無法在分割畫面中運作。"</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"應用程式不支援分割畫面。"</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"應用程式可能無法在次要顯示屏上運作。"</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"應用程式不支援在次要顯示屏上啟動。"</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"開啟設定。"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"開啟快速設定。"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"關閉快速設定。"</string>
@@ -732,14 +721,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"畫中畫選單"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"「<xliff:g id="NAME">%s</xliff:g>」目前在畫中畫模式"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"如果您不想「<xliff:g id="NAME">%s</xliff:g>」使用此功能,請輕按以開啟設定,然後停用此功能。"</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"播放"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"暫停"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"跳到下一個"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"跳到上一個"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"手機因過熱而關上"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"您的手機現已正常運作"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"您的手機之前因過熱而關上降溫。手機現已正常運作。\n\n以下情況可能會導致手機過熱:\n • 使用耗用大量資源的應用程式 (例如遊戲、影片或導航應用程式)\n • 下載或上載大型檔案\n • 在高溫環境下使用手機"</string>
@@ -767,8 +752,7 @@
<string name="instant_apps" msgid="6647570248119804907">"即時應用程式"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"即時應用程式無需安裝即可使用。"</string>
<string name="app_info" msgid="6856026610594615344">"應用程式資料"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"前往網頁版"</string>
<string name="mobile_data" msgid="7094582042819250762">"流動數據"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi 已關閉"</string>
<string name="bt_is_off" msgid="2640685272289706392">"藍牙已關閉"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 4c2505f..ce5e180 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -23,7 +23,7 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"從清單中移除"</string>
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"應用程式資訊"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"您最近的螢幕會顯示在這裡"</string>
+ <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"你最近的螢幕會顯示在這裡"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"關閉最近使用的應用程式"</string>
<plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
<item quantity="other">總覽中有 %d 個畫面</item>
@@ -152,14 +152,12 @@
<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>
- <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
- <skip />
- <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
- <skip />
+ <string name="accessibility_cell_data" msgid="5326139158682385073">"行動數據"</string>
+ <string name="accessibility_cell_data_on" msgid="5927098403452994422">"行動數據已開啟"</string>
+ <string name="accessibility_cell_data_off" msgid="443267573897409704">"行動數據已關閉"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"藍牙網路共用"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"飛行模式。"</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN 已開啟。"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"沒有 SIM 卡。"</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"電信業者網路正在變更。"</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"開啟電量詳細資料"</string>
@@ -242,11 +240,9 @@
<string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"充電中"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"已暫停 2G-3G 數據連線"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"已暫停 4G 數據連線"</string>
- <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
- <skip />
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="6801382439018099779">"行動數據已暫停使用"</string>
<string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"已暫停數據連線"</string>
- <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
- <skip />
+ <string name="data_usage_disabled_dialog" msgid="4919541636934603816">"你的數據用量已達設定的用量上限,因此系統已停止使用行動數據連線。\n\n如果你繼續使用行動數據連線,可能需要支付相關的數據傳輸費用。"</string>
<string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"恢復連線"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"沒有網際網路連線"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi 已連線"</string>
@@ -319,8 +315,7 @@
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"無線基地台"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"通知"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"手電筒"</string>
- <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
- <skip />
+ <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"行動數據"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"數據用量"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"剩餘資料"</string>
<string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"超過上限"</string>
@@ -333,7 +328,7 @@
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 已停用"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 已啟用"</string>
<string name="recents_empty_message" msgid="808480104164008572">"最近沒有任何項目"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"您已清除所有工作"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"你已清除所有工作"</string>
<string name="recents_app_info_button_label" msgid="2890317189376000030">"應用程式資訊"</string>
<string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"螢幕固定"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"搜尋"</string>
@@ -357,9 +352,9 @@
<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_voice" msgid="2284540992298200729">"這會封鎖「所有」聲音和震動干擾,包括鬧鐘、音樂、影片和遊戲在內。您仍可以撥打電話。"</string>
+ <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"這會封鎖「所有」聲音和震動干擾,包括鬧鐘、音樂、影片和遊戲在內,但你仍然可以撥打電話。"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"這會封鎖「所有」聲音和震動干擾,包括鬧鐘、音樂、影片和遊戲在內。"</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>
@@ -392,8 +387,8 @@
<string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"移除訪客?"</string>
<string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"這個工作階段中的所有應用程式和資料都會遭到刪除。"</string>
<string name="guest_exit_guest_dialog_remove" msgid="7402231963862520531">"移除"</string>
- <string name="guest_wipe_session_title" msgid="6419439912885956132">"訪客您好,歡迎回來!"</string>
- <string name="guest_wipe_session_message" msgid="8476238178270112811">"您要繼續這個工作階段嗎?"</string>
+ <string name="guest_wipe_session_title" msgid="6419439912885956132">"訪客你好,歡迎回來!"</string>
+ <string name="guest_wipe_session_message" msgid="8476238178270112811">"你要繼續這個工作階段嗎?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"重新開始"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"是,請繼續"</string>
<string name="guest_notification_title" msgid="1585278533840603063">"訪客使用者"</string>
@@ -410,7 +405,7 @@
<string name="battery_saver_notification_title" msgid="237918726750955859">"節約耗電量模式已啟用"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"降低效能並限制背景數據傳輸"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"關閉節約耗電量模式"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> 將開始擷取您的螢幕上顯示的內容。"</string>
+ <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> 將開始擷取你的螢幕上顯示的內容。"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"不要再顯示"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"全部清除"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"立即開始"</string>
@@ -433,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Work 設定檔已連結至「<xliff:g id="VPN_APP">%1$s</xliff:g>」"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"個人設定檔已連結至「<xliff:g id="VPN_APP">%1$s</xliff:g>」"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"裝置已連結至「<xliff:g id="VPN_APP">%1$s</xliff:g>」"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"裝置管理"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"設定檔監控"</string>
<string name="monitoring_title" msgid="169206259253048106">"網路監控"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"VPN"</string>
@@ -443,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"停用 VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"中斷 VPN 連線"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"查看政策"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"你的裝置是由「<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>」所管理。\n\n你的管理員可以監控及管理與裝置相關聯的設定、公司系統權限、應用程式和資料,以及裝置的位置資訊。\n\n如要瞭解詳情,請與你的管理員聯絡。"</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"你的裝置是由貴機構所管理。\n\n你的管理員可以監控及管理與裝置相關聯的設定、公司系統權限、應用程式和資料,以及裝置的位置資訊。\n\n如要瞭解詳情,請與你的管理員聯絡。"</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"貴機構已為這個裝置安裝憑證授權單位憑證。你的安全網路流量可能會受到監控或修改。"</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"貴機構已為你的 Work 設定檔安裝憑證授權單位憑證。你的安全網路流量可能會受到監控或修改。"</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"這個裝置已安裝憑證授權單位憑證。你的安全網路流量可能會受到監控或修改。"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"你的管理員已啟用網路紀錄功能,可監控你裝置的流量。"</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"由於你已連結至「<xliff:g id="VPN_APP">%1$s</xliff:g>」,因此你的網路活動 (包括收發電子郵件、使用應用程式及瀏覽網站) 可能會受到這個應用程式監控。"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"由於你已連結至「<xliff:g id="VPN_APP_0">%1$s</xliff:g>」和「<xliff:g id="VPN_APP_1">%2$s</xliff:g>」,因此你的網路活動 (包括收發電子郵件、使用應用程式及瀏覽網站) 可能會受到這兩個應用程式監控。"</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"由於你的 Work 設定檔已連結至「<xliff:g id="VPN_APP">%1$s</xliff:g>」,因此你的網路活動 (包括收發電子郵件、使用應用程式及瀏覽網站) 可能會受到這個應用程式監控。"</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"由於你的個人設定檔已連結至「<xliff:g id="VPN_APP">%1$s</xliff:g>」,因此你的網路活動 (包括收發電子郵件、使用應用程式及瀏覽網站) 可能會受到這個應用程式監控。"</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"你的裝置是由「<xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>」所管理。"</string>
@@ -468,15 +458,15 @@
<string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string>
<string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"開啟信任的憑證"</string>
<string name="monitoring_description_network_logging" msgid="7223505523384076027">"你的管理員已啟用網路紀錄功能,可監控你裝置的流量。\n\n如需詳細資訊,請與你的管理員聯絡。"</string>
- <string name="monitoring_description_vpn" msgid="4445150119515393526">"您已授權一個應用程式設定 VPN 連線。\n\n這個應用程式可以監控您的裝置和網路活動,包括收發電子郵件、使用應用程式和瀏覽網站。"</string>
+ <string name="monitoring_description_vpn" msgid="4445150119515393526">"你已授權一個應用程式設定 VPN 連線。\n\n這個應用程式可以監控你的裝置和網路活動,包括收發電子郵件、使用應用程式和瀏覽網站。"</string>
<string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"你的 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="1828472472674709532">"由於你已連結至「<xliff:g id="APPLICATION">%1$s</xliff:g>」,因此你的網路活動 (包括收發電子郵件、使用應用程式和瀏覽網站) 可能會受到這個應用程式監控。"</string>
- <string name="monitoring_description_app_personal" msgid="484599052118316268">"由於您已連線至 <xliff:g id="APPLICATION">%1$s</xliff:g>,您的個人網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。"</string>
+ <string name="monitoring_description_app_personal" msgid="484599052118316268">"由於你已連線至 <xliff:g id="APPLICATION">%1$s</xliff:g>,你的個人網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。"</string>
<string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"由於你已連結至「<xliff:g id="APPLICATION">%1$s</xliff:g>」,你的個人網路活動 (包括收發電子郵件、使用應用程式及瀏覽網站) 可能會受到這個應用程式監控。"</string>
<string name="monitoring_description_app_work" msgid="4612997849787922906">"你的 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="5664165460056859391">"你的 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="keyguard_indication_trust_disabled" msgid="7412534203633528135">"在您手動解鎖前,裝置將保持鎖定狀態"</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>
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"不用了,謝謝"</string>
@@ -493,7 +483,7 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"隱藏<xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"只要在設定頁面中重新啟用,就能再次看到快捷設定選項。"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"隱藏"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"您正在使用 Work 設定檔"</string>
+ <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"你正在使用 Work 設定檔"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"通話"</string>
<string name="stream_system" msgid="7493299064422163147">"系統"</string>
<string name="stream_ring" msgid="8213049469184048338">"鈴響"</string>
@@ -525,28 +515,28 @@
<string name="status_bar_airplane" msgid="7057575501472249002">"飛航模式"</string>
<string name="add_tile" msgid="2995389510240786221">"新增圖塊"</string>
<string name="broadcast_tile" msgid="3894036511763289383">"播送圖塊"</string>
- <string name="zen_alarm_warning_indef" msgid="3482966345578319605">"您不會聽到下一個<xliff:g id="WHEN">%1$s</xliff:g> 的鬧鐘,除非您預先關閉這項功能"</string>
- <string name="zen_alarm_warning" msgid="444533119582244293">"您不會聽到下一個<xliff:g id="WHEN">%1$s</xliff:g> 的鬧鐘"</string>
+ <string name="zen_alarm_warning_indef" msgid="3482966345578319605">"你不會聽到下一個<xliff:g id="WHEN">%1$s</xliff:g> 的鬧鐘,除非你預先關閉這項功能"</string>
+ <string name="zen_alarm_warning" msgid="444533119582244293">"你不會聽到下一個<xliff:g id="WHEN">%1$s</xliff:g> 的鬧鐘"</string>
<string name="alarm_template" msgid="3980063409350522735">"於<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template_far" msgid="4242179982586714810">"於<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"快速設定,<xliff:g id="TITLE">%s</xliff:g>。"</string>
<string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"無線基地台"</string>
<string name="accessibility_managed_profile" msgid="6613641363112584120">"Work 設定檔"</string>
<string name="tuner_warning_title" msgid="7094689930793031682">"有趣與否,見仁見智"</string>
- <string name="tuner_warning" msgid="8730648121973575701">"系統使用者介面調整精靈可讓您透過其他方式,調整及自訂 Android 使用者介面。這些實驗性功能隨著版本更新可能會變更、損壞或消失,執行時請務必謹慎。"</string>
+ <string name="tuner_warning" msgid="8730648121973575701">"系統使用者介面調整精靈可讓你透過其他方式,調整及自訂 Android 使用者介面。這些實驗性功能隨著版本更新可能會變更、損壞或消失,執行時請務必謹慎。"</string>
<string name="tuner_persistent_warning" msgid="8597333795565621795">"這些實驗性功能隨著版本更新可能會變更、損壞或消失,執行時請務必謹慎。"</string>
<string name="got_it" msgid="2239653834387972602">"知道了"</string>
<string name="tuner_toast" msgid="603429811084428439">"恭喜!系統使用者介面調整精靈已新增到設定中"</string>
<string name="remove_from_settings" msgid="8389591916603406378">"從設定中移除"</string>
<string name="remove_from_settings_prompt" msgid="6069085993355887748">"要將系統使用者介面調整精靈從設定中移除,並停止使用所有相關功能嗎?"</string>
- <string name="activity_not_found" msgid="348423244327799974">"您的裝置未安裝這個應用程式"</string>
+ <string name="activity_not_found" msgid="348423244327799974">"你的裝置未安裝這個應用程式"</string>
<string name="clock_seconds" msgid="7689554147579179507">"顯示時鐘秒數"</string>
<string name="clock_seconds_desc" msgid="6282693067130470675">"在狀態列中顯示時鐘秒數。這可能會影響電池續航力。"</string>
<string name="qs_rearrange" msgid="8060918697551068765">"重新排列快速設定"</string>
<string name="show_brightness" msgid="6613930842805942519">"在快速設定中顯示亮度"</string>
<string name="experimental" msgid="6198182315536726162">"實驗性"</string>
<string name="enable_bluetooth_title" msgid="5027037706500635269">"要開啟藍牙功能嗎?"</string>
- <string name="enable_bluetooth_message" msgid="9106595990708985385">"如要將鍵盤連線到平板電腦,您必須先開啟藍牙。"</string>
+ <string name="enable_bluetooth_message" msgid="9106595990708985385">"如要將鍵盤連線到平板電腦,你必須先開啟藍牙。"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"開啟"</string>
<string name="show_silently" msgid="6841966539811264192">"顯示通知,但不發出任何音效"</string>
<string name="block" msgid="2734508760962682611">"封鎖所有通知"</string>
@@ -555,7 +545,7 @@
<string name="tuner_full_importance_settings" msgid="3207312268609236827">"電源通知控制項"</string>
<string name="tuner_full_importance_settings_on" msgid="7545060756610299966">"開啟"</string>
<string name="tuner_full_importance_settings_off" msgid="8208165412614935229">"關閉"</string>
- <string name="power_notification_controls_description" msgid="4372459941671353358">"只要使用電源通知控制項,您就能為應用程式通知設定從 0 到 5 的重要性等級。\n\n"<b>"等級 5"</b>" \n- 顯示在通知清單頂端 \n- 允許全螢幕通知 \n- 一律允許短暫顯示通知 \n\n"<b>"等級 4"</b>" \n- 禁止全螢幕通知 \n- 一律允許短暫顯示通知 \n\n"<b>"等級 3"</b>" \n- 禁止全螢幕通知 \n- 一律不允許短暫顯示通知 \n\n"<b>"等級 2"</b>" \n- 禁止全螢幕通知 \n- 一律不允許短暫顯示通知 \n- 一律不發出音效或震動 \n\n"<b>"等級 1"</b>" \n- 禁止全螢幕通知 \n- 一律不允許短暫顯示通知 \n- 一律不發出音效或震動 \n- 在鎖定畫面和狀態列中隱藏 \n- 顯示在通知清單底端 \n\n"<b>"等級 0"</b>" \n- 封鎖應用程式的所有通知"</string>
+ <string name="power_notification_controls_description" msgid="4372459941671353358">"只要使用電源通知控制項,你就能為應用程式通知設定從 0 到 5 的重要性等級。\n\n"<b>"等級 5"</b>" \n- 顯示在通知清單頂端 \n- 允許全螢幕通知 \n- 一律允許短暫顯示通知 \n\n"<b>"等級 4"</b>" \n- 禁止全螢幕通知 \n- 一律允許短暫顯示通知 \n\n"<b>"等級 3"</b>" \n- 禁止全螢幕通知 \n- 一律不允許短暫顯示通知 \n\n"<b>"等級 2"</b>" \n- 禁止全螢幕通知 \n- 一律不允許短暫顯示通知 \n- 一律不發出音效或震動 \n\n"<b>"等級 1"</b>" \n- 禁止全螢幕通知 \n- 一律不允許短暫顯示通知 \n- 一律不發出音效或震動 \n- 在鎖定畫面和狀態列中隱藏 \n- 顯示在通知清單底端 \n\n"<b>"等級 0"</b>" \n- 封鎖應用程式的所有通知"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"通知"</string>
<string name="notification_channel_disabled" msgid="5805874247999578073">"你不會再收到這類通知。"</string>
<string name="notification_num_channels" msgid="2048144408999179471">"<xliff:g id="NUMBER">%d</xliff:g> 個通知類別"</string>
@@ -569,12 +559,9 @@
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>、<xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>和另外 <xliff:g id="NUMBER_5">%3$d</xliff:g> 個管道</item>
<item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>、<xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g>和另外 <xliff:g id="NUMBER_2">%3$d</xliff:g> 個管道</item>
</plurals>
- <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
- <skip />
- <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
- <skip />
- <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
- <skip />
+ <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」的通知控制項已開啟"</string>
+ <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」的通知控制項已關閉"</string>
+ <string name="notification_channel_switch_accessibility" msgid="3420796005601900717">"允許來自這個頻道的通知"</string>
<string name="notification_all_categories" msgid="5407190218055113282">"所有類別"</string>
<string name="notification_more_settings" msgid="816306283396553571">"更多設定"</string>
<string name="notification_app_settings" msgid="3743278649182392015">"自訂:<xliff:g id="SUB_CATEGORY">%1$s</xliff:g>"</string>
@@ -712,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> 通知:<xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"應用程式可能無法在分割畫面中運作。"</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"這個應用程式不支援分割畫面。"</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"應用程式可能無法在第二個顯示器上運作。"</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"應用程式不支援在第二個顯示器上啟動。"</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"開啟設定。"</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"開啟快速設定。"</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"關閉快速設定。"</string>
@@ -730,14 +719,10 @@
<string name="pip_menu_title" msgid="3328510504196964712">"子母畫面選單"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"「<xliff:g id="NAME">%s</xliff:g>」目前在子母畫面中"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"如果你不想讓「<xliff:g id="NAME">%s</xliff:g>」使用這項功能,請輕觸開啟設定頁面,然後停用此功能。"</string>
- <!-- no translation found for pip_play (1417176722760265888) -->
- <skip />
- <!-- no translation found for pip_pause (8881063404466476571) -->
- <skip />
- <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
- <skip />
- <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
- <skip />
+ <string name="pip_play" msgid="1417176722760265888">"播放"</string>
+ <string name="pip_pause" msgid="8881063404466476571">"暫停"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"跳到下一個"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"跳到上一個"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"手機先前過熱,因此關閉電源"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"手機現在已恢復正常運作"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"手機先前的溫度過高,因此關閉了電源以進行降溫。手機現在已恢復正常運作。\n\n以下情況可能會導致你的手機溫度過高:\n • 使用需要密集處理資料的應用程式 (例如遊戲、影片或導航應用程式)\n • 下載或上傳大型檔案\n • 在高溫環境下使用手機"</string>
@@ -765,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"免安裝應用程式"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"免安裝應用程式不必安裝就能使用。"</string>
<string name="app_info" msgid="6856026610594615344">"應用程式資訊"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"前往網頁版"</string>
<string name="mobile_data" msgid="7094582042819250762">"行動數據"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi 已關閉"</string>
<string name="bt_is_off" msgid="2640685272289706392">"藍牙已關閉"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings_car.xml b/packages/SystemUI/res/values-zh-rTW/strings_car.xml
index 5e18309..e420fe7 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings_car.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings_car.xml
@@ -20,5 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_lockscreen_disclaimer_title" msgid="7997539137376896441">"安全駕駛"</string>
- <string name="car_lockscreen_disclaimer_text" msgid="3061224684092952864">"請隨時注意周遭路況並遵守交通規則。系統所提供的路線可能有誤、不完整,或包含危險、不合適、禁止通行或管制區域的路段;此外,商家資訊也可能有誤或不完整。路況資料並非即時更新,也無法保證定位資訊必然準確無誤。駕駛時請勿操作您的行動裝置,或使用不適用於 Android Auto 的應用程式。"</string>
+ <string name="car_lockscreen_disclaimer_text" msgid="3061224684092952864">"請隨時注意周遭路況並遵守交通規則。系統所提供的路線可能有誤、不完整,或包含危險、不合適、禁止通行或管制區域的路段;此外,商家資訊也可能有誤或不完整。路況資料並非即時更新,也無法保證定位資訊必然準確無誤。駕駛時請勿操作你的行動裝置,或使用不適用於 Android Auto 的應用程式。"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index d1f6493..22e907c 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -102,11 +102,11 @@
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Sondeza kancane esikrinini esikhudlwana"</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth ixhunyiwe"</string>
<string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"i-Bluetooth ayixhunywanga."</string>
- <string name="accessibility_no_battery" msgid="358343022352820946">"Ayikho ibhetri."</string>
- <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"Ibha eyodwa yebhetri"</string>
- <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"Amabha amabili ebhetri"</string>
- <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"Amabha amathathu ebhetri"</string>
- <string name="accessibility_battery_full" msgid="8909122401720158582">"Ibhetri igcwele."</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"Ayikho ibhethri."</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"Ibha eyodwa yebhethri"</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"Amabha amabili ebhethri"</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"Amabha amathathu ebhethri"</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"Ibhethri igcwele."</string>
<string name="accessibility_no_phone" msgid="4894708937052611281">"Ayikho ifoni."</string>
<string name="accessibility_phone_one_bar" msgid="687699278132664115">"Ibha eyodwa yefoni"</string>
<string name="accessibility_phone_two_bars" msgid="8384905382804815201">"Amabha amabilil efoni."</string>
@@ -157,10 +157,11 @@
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Idatha yeselula ivaliwe"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Imodemu nge-Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Imodi yendiza."</string>
+ <string name="accessibility_vpn_on" msgid="5993385083262856059">"I-VPN ivuliwe."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"Alikho ikhadi le-SIM."</string>
<string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Iguqula inethiwekhi yenkampani yenethiwekhi."</string>
<string name="accessibility_battery_details" msgid="7645516654955025422">"Vula imininingwane yebhethri"</string>
- <string name="accessibility_battery_level" msgid="7451474187113371965">"Iphesenti <xliff:g id="NUMBER">%d</xliff:g> lebhetri"</string>
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"Iphesenti <xliff:g id="NUMBER">%d</xliff:g> lebhethri"</string>
<string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Ibhethri liyashaja, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> iphesenti."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Izilungiselelo zesistimu"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Izaziso"</string>
@@ -427,8 +428,7 @@
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Iphrofayela yomsebenzi ixhumeke ku-<xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Iphrofayela yomuntu siqu ixhumeke ku-<xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Idivayisi ixhumeke ku-<xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
- <skip />
+ <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Ukuphathwa kwedivayisi"</string>
<string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Ukuqapha iphrofayela"</string>
<string name="monitoring_title" msgid="169206259253048106">"Ukuqashwa kwenethiwekhi"</string>
<string name="monitoring_subtitle_vpn" msgid="876537538087857300">"I-VPN"</string>
@@ -437,18 +437,14 @@
<string name="disable_vpn" msgid="4435534311510272506">"Khubaza i-VPN"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"Nqamula i-VPN"</string>
<string name="monitoring_button_view_policies" msgid="100913612638514424">"Buka izinqubomgomo"</string>
- <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
- <skip />
- <!-- no translation found for monitoring_description_management (4573721970278370790) -->
- <skip />
+ <string name="monitoring_description_named_management" msgid="5281789135578986303">"Idivayisi yakho iphethwe yi-<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>.\n\nUmlawuli wakho angaqaphela aphinde aphathe izilungiselelo, ukufinyelela kwezinkampani, izinhlelo zokusebenza, idatha ehlotshaniswa nedivayisi yakho, kanye nolwazi lwendawo yedivayisi yakho.\n\nUkuze uthole olunye ulwazi, xhumana nomlawuli wakho."</string>
+ <string name="monitoring_description_management" msgid="4573721970278370790">"Idivayisi yakho iphethwe inhlangano yakho.\n\nUmlawuli wakho angaqapha aphinde aphathe izilungiselelo, ukufinyelela kwezinkampani, izinhlelo zokusebenza, idatha ehlotshaniswa nedivayisi yakho, kanye nolwazi lwendawo yedivayisi yakho.\n\nUkuze uthole olunye ulwazi, xhumana nomlawuli wakho."</string>
<string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"Inhlangano yakho ifake ukugunyazwa kwesitifiketi kule divayisi. Ithrafikhi yenethiwekhi yakho evikelekile kungenzeka iqashelwe noma ilungiswe."</string>
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"Inhlangano yakho ifake ukugunyaza kwesitifiketi kuphrofayela yakho yomsebenzi. Ithrafikhi yenethiwekhi yakho evikelekile ingaqashwa noma ilungiswe."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Ukugunyaza kwesitifiketi kufakwe kule divayisi. Ithrafikhi yenethiwekhi yakho evikelekile ingaqashelwa noma ilungiswe."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Umlawuli wakho uvule ukungena kwedivayisi yakho, okuqapha ithrafikhi kudivayisi yakho."</string>
- <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
- <skip />
- <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
- <skip />
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Uxhumeke ku-<xliff:g id="VPN_APP">%1$s</xliff:g>, engaqapha umsebenzi wenethiwekhi yakho, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Uxhumeke ku-<xliff:g id="VPN_APP_0">%1$s</xliff:g> naku-<xliff:g id="VPN_APP_1">%2$s</xliff:g>, okungaqaphela umsebenzi wakho wenethiwekhi, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Iphrofayela yakho yomsebenzi ixhumeke ku-<xliff:g id="VPN_APP">%1$s</xliff:g>, engaqapha umsebenzi wenethiwekhi yakho, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Iphrofayela yakho siqu ixhumeke ku-<xliff:g id="VPN_APP">%1$s</xliff:g>, engaqapha umsebenzi wakho wenethiwekhi, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Idivayisi yakho iphethwe yi-<xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
@@ -703,6 +699,8 @@
<string name="accessibility_desc_notification_icon" msgid="8352414185263916335">"<xliff:g id="ID_1">%1$s</xliff:g> isaziso: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="dock_forced_resizable" msgid="5914261505436217520">"Izinhlelo zokusebenza kungenzeka zingasebenzi ngesikrini esihlukanisiwe."</string>
<string name="dock_non_resizeble_failed_to_dock_text" msgid="3871617304250207291">"Uhlelo lokusebenza alusekeli isikrini esihlukanisiwe."</string>
+ <string name="forced_resizable_secondary_display" msgid="4230857851756391925">"Uhlelo lokusebenza kungenzeka lungasebenzi kusibonisi sesibili."</string>
+ <string name="activity_launch_on_secondary_display_failed_text" msgid="7793821742158306742">"Uhlelo lokusebenza alusekeli ukuqalisa kuzibonisi zesibili."</string>
<string name="accessibility_quick_settings_settings" msgid="6132460890024942157">"Vula izilungiselelo."</string>
<string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"Vula izilungiselelo ezisheshayo."</string>
<string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"Vala izilungiselelo ezisheshayo."</string>
@@ -752,8 +750,7 @@
<string name="instant_apps" msgid="6647570248119804907">"Izinhlelo zokusebenza ezisheshayo"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Izinhlelo zokusebenza ezisheshayo azidingi ukufakwa."</string>
<string name="app_info" msgid="6856026610594615344">"Ulwazi lohlelo lokusebenza"</string>
- <!-- no translation found for go_to_web (1106022723459948514) -->
- <skip />
+ <string name="go_to_web" msgid="1106022723459948514">"Iya kuwebhu"</string>
<string name="mobile_data" msgid="7094582042819250762">"Idatha yeselula"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"I-Wi-Fi ivaliwe"</string>
<string name="bt_is_off" msgid="2640685272289706392">"I-Bluetooth ivaliwe"</string>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 9fb884e..bf70c5a 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1861,10 +1861,6 @@
not appear on production builds ever. -->
<string name="tuner_doze" translatable="false">Ambient Display</string>
- <!-- Ambient display, Sensors wake up device of the tuner. Non-translatable since it should
- not appear on production builds ever. -->
- <string name="tuner_doze_sensors_wake_up_fully" translatable="false">Wake up device on double tap or lift</string>
-
<!-- Ambient display always-on of the tuner. Non-translatable since it should
not appear on production builds ever. -->
<string name="tuner_doze_always_on" translatable="false">Always on</string>
@@ -1902,6 +1898,12 @@
<!-- PiP minimize description. [CHAR LIMIT=NONE] -->
<string name="pip_minimize_description" translatable="false">Drag or fling the PIP to the edges of the screen to minimize it.</string>
+ <!-- PiP fling to dismiss title. [CHAR LIMIT=NONE]-->
+ <string name="pip_fling_dismiss_title" translatable="false">Fling to dismiss</string>
+
+ <!-- PiP fling to dismiss description. [CHAR LIMIT=NONE] -->
+ <string name="pip_fling_dismiss_description" translatable="false">Fling from anywhere on the screen to the bottom of the screen to dismiss the PIP.</string>
+
<!-- Button to play the current media on picture-in-picture (PIP) [CHAR LIMIT=30] -->
<string name="pip_play">Play</string>
@@ -2028,4 +2030,10 @@
<!-- Do Not Disturb button to change the current settings [CHAR LIMIT=20] -->
<string name="qs_dnd_replace">Replace</string>
+ <!-- Title of the "running foreground services" dialog. [CHAR LIMIT=NONE] -->
+ <string name="running_foreground_services_title">Apps running in background</string>
+
+ <!-- Title of the "running foreground services" dialog. [CHAR LIMIT=NONE] -->
+ <string name="running_foreground_services_msg">Tap for details on battery and data usage</string>
+
</resources>
diff --git a/packages/SystemUI/res/xml/tuner_prefs.xml b/packages/SystemUI/res/xml/tuner_prefs.xml
index a685c79..24f29c8 100644
--- a/packages/SystemUI/res/xml/tuner_prefs.xml
+++ b/packages/SystemUI/res/xml/tuner_prefs.xml
@@ -131,6 +131,12 @@
android:summary="@string/pip_minimize_description"
sysui:defValue="false" />
+ <com.android.systemui.tuner.TunerSwitch
+ android:key="pip_fling_dismiss"
+ android:title="@string/pip_fling_dismiss_title"
+ android:summary="@string/pip_fling_dismiss_description"
+ sysui:defValue="false" />
+
</PreferenceScreen>
<PreferenceScreen
@@ -142,11 +148,6 @@
android:title="@string/tuner_doze_always_on"
sysui:defValue="false" />
- <com.android.systemui.tuner.TunerSwitch
- android:key="doze_sensors_wake_up_fully"
- android:title="@string/tuner_doze_sensors_wake_up_fully"
- sysui:defValue="false" />
-
</PreferenceScreen>
<Preference
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockAccessibilityDelegate.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockAccessibilityDelegate.java
new file mode 100644
index 0000000..80509a6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockAccessibilityDelegate.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.keyguard;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.widget.TextView;
+
+/**
+ * Replaces fancy colons with regular colons. Only works on TextViews.
+ */
+class KeyguardClockAccessibilityDelegate extends View.AccessibilityDelegate {
+ private final String mFancyColon;
+
+ public KeyguardClockAccessibilityDelegate(Context context) {
+ mFancyColon = context.getString(R.string.keyguard_fancy_colon);
+ }
+
+ @Override
+ public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
+ super.onInitializeAccessibilityEvent(host, event);
+ CharSequence text = event.getContentDescription();
+ if (!TextUtils.isEmpty(text)) {
+ event.setContentDescription(replaceFancyColon(text));
+ }
+ }
+
+ @Override
+ public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
+ CharSequence text = ((TextView) host).getText();
+ if (!TextUtils.isEmpty(text)) {
+ event.getText().add(replaceFancyColon(text));
+ }
+ }
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+ if (!TextUtils.isEmpty(info.getText())) {
+ info.setText(replaceFancyColon(info.getText()));
+ }
+ if (!TextUtils.isEmpty(info.getContentDescription())) {
+ info.setContentDescription(replaceFancyColon(info.getContentDescription()));
+ }
+ }
+
+ private CharSequence replaceFancyColon(CharSequence text) {
+ return text.toString().replace(mFancyColon, ":");
+ }
+}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index 162faa5..d4d69ff 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -38,7 +38,6 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.ChargingView;
-import java.util.Arrays;
import java.util.Locale;
public class KeyguardStatusView extends GridLayout {
@@ -121,6 +120,7 @@
mClockView = findViewById(R.id.clock_view);
mDateView.setShowCurrentUserTime(true);
mClockView.setShowCurrentUserTime(true);
+ mClockView.setAccessibilityDelegate(new KeyguardClockAccessibilityDelegate(mContext));
mOwnerInfo = findViewById(R.id.owner_info);
mBatteryDoze = findViewById(R.id.battery_doze);
mVisibleInDoze = new View[]{mBatteryDoze, mClockView};
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 7a6ac57..67a2989 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -197,6 +197,11 @@
private int mFingerprintRunningState = FINGERPRINT_STATE_STOPPED;
private LockPatternUtils mLockPatternUtils;
+ // If FP daemon dies, keyguard should retry after a short delay
+ private int mHardwareUnavailableRetryCount = 0;
+ private static final int HW_UNAVAILABLE_TIMEOUT = 3000; // ms
+ private static final int HW_UNAVAILABLE_RETRY_MAX = 3;
+
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
@@ -471,6 +476,15 @@
}
}
+ private Runnable mRetryFingerprintAuthentication = new Runnable() {
+ @Override
+ public void run() {
+ Log.w(TAG, "Retrying fingerprint after HW unavailable, attempt " +
+ mHardwareUnavailableRetryCount);
+ updateFingerprintListeningState();
+ }
+ };
+
private void handleFingerprintError(int msgId, String errString) {
if (msgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED
&& mFingerprintRunningState == FINGERPRINT_STATE_CANCELLING_RESTARTING) {
@@ -479,6 +493,15 @@
} else {
setFingerprintRunningState(FINGERPRINT_STATE_STOPPED);
}
+
+ if (msgId == FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE) {
+ if (mHardwareUnavailableRetryCount < HW_UNAVAILABLE_RETRY_MAX) {
+ mHardwareUnavailableRetryCount++;
+ mHandler.removeCallbacks(mRetryFingerprintAuthentication);
+ mHandler.postDelayed(mRetryFingerprintAuthentication, HW_UNAVAILABLE_TIMEOUT);
+ }
+ }
+
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -940,6 +963,7 @@
}
private void handleScreenTurnedOff() {
+ mHardwareUnavailableRetryCount = 0;
final int count = mCallbacks.size();
for (int i = 0; i < count; i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
@@ -1072,6 +1096,7 @@
}
private void updateFingerprintListeningState() {
+ mHandler.removeCallbacks(mRetryFingerprintAuthentication);
boolean shouldListenForFingerprint = shouldListenForFingerprint();
if (mFingerprintRunningState == FINGERPRINT_STATE_RUNNING && !shouldListenForFingerprint) {
stopListeningForFingerprint();
diff --git a/packages/SystemUI/src/com/android/systemui/ForegroundServicesDialog.java b/packages/SystemUI/src/com/android/systemui/ForegroundServicesDialog.java
new file mode 100644
index 0000000..086e5e5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/ForegroundServicesDialog.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.android.internal.app.AlertActivity;
+import com.android.internal.app.AlertController;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto;
+
+import com.android.systemui.R;
+
+import java.util.ArrayList;
+
+/**
+ * Show a list of currently running foreground services (supplied by the caller)
+ * that the user can tap through to their application details.
+ */
+public final class ForegroundServicesDialog extends AlertActivity implements
+ AdapterView.OnItemSelectedListener, DialogInterface.OnClickListener,
+ AlertController.AlertParams.OnPrepareListViewListener {
+
+ private static final String TAG = "ForegroundServicesDialog";
+
+ LayoutInflater mInflater;
+
+ private MetricsLogger mMetricsLogger;
+
+ private String[] mPackages;
+ private PackageItemAdapter mAdapter;
+
+ private DialogInterface.OnClickListener mAppClickListener =
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ String pkg = mPackages[which];
+ Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+ intent.setData(Uri.fromParts("package", pkg, null));
+ startActivity(intent);
+ finish();
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Dependency.initDependencies(getApplicationContext());
+
+ mMetricsLogger = Dependency.get(MetricsLogger.class);
+
+ mInflater = LayoutInflater.from(this);
+
+ mAdapter = new PackageItemAdapter(this);
+
+ final AlertController.AlertParams p = mAlertParams;
+ p.mAdapter = mAdapter;
+ p.mOnClickListener = mAppClickListener;
+ p.mCustomTitleView = mInflater.inflate(R.layout.foreground_service_title, null);
+ p.mIsSingleChoice = true;
+ p.mOnItemSelectedListener = this;
+ p.mPositiveButtonText = getString(com.android.internal.R.string.done_label);
+ p.mPositiveButtonListener = this;
+ p.mOnPrepareListViewListener = this;
+
+ updateApps(getIntent());
+ if (mPackages == null) {
+ Log.w(TAG, "No packages supplied");
+ finish();
+ return;
+ }
+
+ setupAlert();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mMetricsLogger.visible(MetricsProto.MetricsEvent.RUNNING_BACKGROUND_APPS_DIALOG);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ mMetricsLogger.hidden(MetricsProto.MetricsEvent.RUNNING_BACKGROUND_APPS_DIALOG);
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ updateApps(intent);
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+
+ // This is a transient dialog, if the user leaves it then it goes away,
+ // they can return back to it from the notification.
+ if (!isChangingConfigurations()) {
+ finish();
+ }
+ }
+
+ void updateApps(Intent intent) {
+ mPackages = intent.getStringArrayExtra("packages");
+ if (mPackages != null) {
+ mAdapter.setPackages(mPackages);
+ }
+ }
+
+ public void onPrepareListView(ListView listView) {
+ }
+
+ /*
+ * On click of Ok/Cancel buttons
+ */
+ public void onClick(DialogInterface dialog, int which) {
+ finish();
+ }
+
+ public void onItemSelected(AdapterView parent, View view, int position, long id) {
+ }
+
+ public void onNothingSelected(AdapterView parent) {
+ }
+
+ static private class PackageItemAdapter extends ArrayAdapter<ApplicationInfo> {
+ final PackageManager mPm;
+ final LayoutInflater mInflater;
+
+ public PackageItemAdapter(Context context) {
+ super(context, R.layout.foreground_service_item);
+ mPm = context.getPackageManager();
+ mInflater = LayoutInflater.from(context);
+ }
+
+ public void setPackages(String[] packages) {
+ clear();
+
+ ArrayList<ApplicationInfo> apps = new ArrayList<>();
+ for (int i = 0; i < packages.length; i++) {
+ try {
+ apps.add(mPm.getApplicationInfo(packages[i],
+ PackageManager.MATCH_KNOWN_PACKAGES));
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+ }
+
+ apps.sort(new ApplicationInfo.DisplayNameComparator(mPm));
+ addAll(apps);
+ }
+
+ public @NonNull
+ View getView(int position, @Nullable View convertView,
+ @NonNull ViewGroup parent) {
+ final View view;
+ if (convertView == null) {
+ view = mInflater.inflate(R.layout.foreground_service_item, parent, false);
+ } else {
+ view = convertView;
+ }
+
+ ImageView icon = view.findViewById(R.id.app_icon);
+ icon.setImageDrawable(getItem(position).loadIcon(mPm));
+
+ TextView label = view.findViewById(R.id.app_name);
+ label.setText(getItem(position).loadLabel(mPm));
+
+ return view;
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
index 8c4159a..9c03ea6 100644
--- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
@@ -51,7 +51,7 @@
public static final int X = 0;
public static final int Y = 1;
- private float SWIPE_ESCAPE_VELOCITY = 100f; // dp/sec
+ private float SWIPE_ESCAPE_VELOCITY = 500f; // dp/sec
private int DEFAULT_ESCAPE_ANIMATION_DURATION = 200; // ms
private int MAX_ESCAPE_ANIMATION_DURATION = 400; // ms
private int MAX_DISMISS_VELOCITY = 4000; // dp/sec
@@ -59,6 +59,9 @@
static final float SWIPE_PROGRESS_FADE_END = 0.5f; // fraction of thumbnail width
// beyond which swipe progress->0
+ public static final float SWIPED_FAR_ENOUGH_SIZE_FRACTION = 0.6f;
+ static final float MAX_SCROLL_SIZE_FRACTION = 0.3f;
+
private float mMinSwipeProgress = 0f;
private float mMaxSwipeProgress = 1f;
@@ -363,9 +366,8 @@
// if the language is rtl we prefer swiping to the left
boolean animateLeftForRtl = velocity == 0 && (getTranslation(animView) == 0 || isDismissAll)
&& isLayoutRtl;
- boolean animateLeft = velocity < 0
- || (velocity == 0 && getTranslation(animView) < 0 && !isDismissAll);
-
+ boolean animateLeft = (Math.abs(velocity) > getEscapeVelocity() && velocity < 0) ||
+ (getTranslation(animView) < 0 && !isDismissAll);
if (animateLeft || animateLeftForRtl || animateUpForMenu) {
newPos = -getSize(animView);
} else {
@@ -584,7 +586,7 @@
// maxScrollDistance
if (CONSTRAIN_SWIPE && !mCallback.canChildBeDismissed(mCurrView)) {
float size = getSize(mCurrView);
- float maxScrollDistance = 0.25f * size;
+ float maxScrollDistance = MAX_SCROLL_SIZE_FRACTION * size;
if (absDelta >= size) {
delta = delta > 0 ? maxScrollDistance : -maxScrollDistance;
} else {
@@ -646,7 +648,8 @@
protected boolean swipedFarEnough() {
float translation = getTranslation(mCurrView);
- return DISMISS_IF_SWIPED_FAR_ENOUGH && Math.abs(translation) > 0.4 * getSize(mCurrView);
+ return DISMISS_IF_SWIPED_FAR_ENOUGH
+ && Math.abs(translation) > SWIPED_FAR_ENOUGH_SIZE_FRACTION * getSize(mCurrView);
}
public boolean isDismissGesture(MotionEvent ev) {
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index ea55c5f..2096956 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -99,11 +99,7 @@
}
private void onSensor(int pulseReason, boolean sensorPerformedProxCheck) {
- if (mDozeParameters.getSensorsWakeUpFully()) {
- mMachine.wakeUp();
- } else {
- requestPulse(pulseReason, sensorPerformedProxCheck);
- }
+ requestPulse(pulseReason, sensorPerformedProxCheck);
if (pulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP) {
final long timeSinceNotification =
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipDismissViewController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipDismissViewController.java
index 4b3cdfb..afb62fc 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipDismissViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipDismissViewController.java
@@ -69,6 +69,8 @@
// Create a new view for the dismiss target
LayoutInflater inflater = LayoutInflater.from(mContext);
mDismissView = inflater.inflate(R.layout.pip_dismiss_view, null);
+ mDismissView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
+ mDismissView.forceHasOverlappingRendering(false);
// Adjust bottom margins of the text
View text = mDismissView.findViewById(R.id.pip_dismiss_text);
@@ -77,14 +79,16 @@
// Add the target to the window
LayoutParams lp = new LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT, gradientHeight,
+ LayoutParams.MATCH_PARENT, gradientHeight,
0, windowSize.y - gradientHeight,
- LayoutParams.TYPE_SYSTEM_DIALOG,
+ LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
LayoutParams.FLAG_LAYOUT_IN_SCREEN
- | LayoutParams.FLAG_LAYOUT_NO_LIMITS
| LayoutParams.FLAG_NOT_TOUCHABLE
- | LayoutParams.FLAG_NOT_FOCUSABLE,
+ | LayoutParams.FLAG_NOT_FOCUSABLE
+ | LayoutParams.FLAG_HARDWARE_ACCELERATED,
PixelFormat.TRANSLUCENT);
+ lp.setTitle("pip-dismiss-overlay");
+ lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
lp.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
mWindowManager.addView(mDismissView, lp);
}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
index 28bd23c..df03fdc 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
@@ -103,6 +103,7 @@
// Re-enable touches after the animation completes
mTouchHandler.setTouchEnabled(true);
mTouchHandler.onPinnedStackAnimationEnded();
+ mMenuController.onPinnedStackAnimationEnded();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
index 79ac816..65f24cf 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
@@ -80,6 +80,7 @@
public static final int MESSAGE_HIDE_MENU = 3;
public static final int MESSAGE_UPDATE_ACTIONS = 4;
public static final int MESSAGE_UPDATE_DISMISS_FRACTION = 5;
+ public static final int MESSAGE_ANIMATION_ENDED = 6;
private static final long INITIAL_DISMISS_DELAY = 3500;
private static final long POST_INTERACTION_DISMISS_DELAY = 2000;
@@ -92,6 +93,7 @@
private int mMenuState;
private boolean mAllowMenuTimeout = true;
+ private boolean mAllowTouches = true;
private final List<RemoteAction> mActions = new ArrayList<>();
@@ -149,6 +151,10 @@
updateDismissFraction(data.getFloat(EXTRA_DISMISS_FRACTION));
break;
}
+ case MESSAGE_ANIMATION_ENDED: {
+ mAllowTouches = true;
+ break;
+ }
}
}
});
@@ -245,6 +251,10 @@
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
+ if (!mAllowTouches) {
+ return super.dispatchTouchEvent(ev);
+ }
+
// On the first action outside the window, hide the menu
switch (ev.getAction()) {
case MotionEvent.ACTION_OUTSIDE:
@@ -284,6 +294,9 @@
boolean allowMenuTimeout) {
mAllowMenuTimeout = allowMenuTimeout;
if (mMenuState != menuState) {
+ boolean deferTouchesUntilAnimationEnds = (mMenuState == MENU_STATE_FULL) ||
+ (menuState == MENU_STATE_FULL);
+ mAllowTouches = !deferTouchesUntilAnimationEnds;
cancelDelayedFinish();
updateActionViews(stackBounds);
if (mMenuContainerAnimator != null) {
@@ -447,8 +460,8 @@
});
} else {
actionView.setAlpha(DISABLED_ACTION_ALPHA);
- actionView.setEnabled(false);
}
+ actionView.setEnabled(action.isEnabled());
// Update the margin between actions
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
index c41f898..d5cf1dd 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
@@ -197,6 +197,19 @@
}
}
+ public void onPinnedStackAnimationEnded() {
+ // Note: Only active menu activities care about this event
+ if (mToActivityMessenger != null) {
+ Message m = Message.obtain();
+ m.what = PipMenuActivity.MESSAGE_ANIMATION_ENDED;
+ try {
+ mToActivityMessenger.send(m);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not notify menu pinned animation ended", e);
+ }
+ }
+ }
+
/**
* Adds a new menu activity listener.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
index 67255d3..fc52a2e 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
@@ -465,6 +465,26 @@
}
/**
+ * @return whether the gesture it towards the dismiss area based on the velocity when
+ * dismissing.
+ */
+ public boolean isGestureToDismissArea(Rect pipBounds, float velX, float velY,
+ boolean isFling) {
+ Point endpoint = getDismissEndPoint(pipBounds, velX, velY, isFling);
+ // Center the point
+ endpoint.x += pipBounds.width() / 2;
+ endpoint.y += pipBounds.height() / 2;
+
+ // The dismiss area is the middle third of the screen, half the PIP's height from the bottom
+ Point size = new Point();
+ mContext.getDisplay().getRealSize(size);
+ final int left = size.x / 3;
+ Rect dismissArea = new Rect(left, size.y - (pipBounds.height() / 2), left * 2,
+ size.y + pipBounds.height());
+ return dismissArea.contains(endpoint.x, endpoint.y);
+ }
+
+ /**
* @return the distance between points {@param p1} and {@param p2}.
*/
private float distanceBetweenRectOffsets(Rect r1, Rect r2) {
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
index 3223f9f..9c7e3986 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
@@ -58,6 +58,7 @@
private static final String TAG = "PipTouchHandler";
private static final String TUNER_KEY_MINIMIZE = "pip_minimize";
+ private static final String TUNER_KEY_FLING_DISMISS = "pip_fling_dismiss";
// These values are used for metrics and should never change
private static final int METRIC_VALUE_DISMISSED_BY_TAP = 0;
@@ -114,6 +115,8 @@
// Allow the PIP to be dragged to the edge of the screen to be minimized.
private boolean mEnableMinimize = false;
+ // Allow the PIP to be flung from anywhere on the screen to the bottom to be dismissed.
+ private boolean mEnableFlingToDismiss = false;
// Behaviour states
private int mMenuState;
@@ -195,6 +198,7 @@
// Register any tuner settings changes
Dependency.get(TunerService.class).addTunable(this, TUNER_KEY_MINIMIZE);
+ Dependency.get(TunerService.class).addTunable(this, TUNER_KEY_FLING_DISMISS);
// Register the listener for input consumer touch events
inputConsumerController.setTouchListener(this::handleTouchEvent);
@@ -221,7 +225,7 @@
if (mIsMinimized) {
setMinimizedStateInternal(false);
}
- mDismissViewController.destroyDismissTarget();
+ cleanUpDismissTarget();
mShowPipMenuOnAnimationEnd = true;
}
@@ -238,14 +242,12 @@
@Override
public void onTuningChanged(String key, String newValue) {
- if (newValue == null) {
- // Reset back to default
- mEnableMinimize = false;
- return;
- }
switch (key) {
case TUNER_KEY_MINIMIZE:
- mEnableMinimize = Integer.parseInt(newValue) != 0;
+ mEnableMinimize = newValue == null ? false : Integer.parseInt(newValue) != 0;
+ break;
+ case TUNER_KEY_FLING_DISMISS:
+ mEnableFlingToDismiss = newValue == null ? false : Integer.parseInt(newValue) != 0;
break;
}
}
@@ -332,6 +334,12 @@
mAccessibilityManager.setPictureInPictureActionReplacingConnection(isRegistered
? new PipAccessibilityInteractionConnection(mMotionHelper,
this::onAccessibilityShowMenu, mHandler) : null);
+
+ if (!isRegistered && mTouchState.isUserInteracting()) {
+ // If the input consumer is unregistered while the user is interacting, then we may not
+ // get the final TOUCH_UP event, so clean up the dismiss target as well
+ cleanUpDismissTarget();
+ }
}
private void onAccessibilityShowMenu() {
@@ -576,11 +584,11 @@
if (touchState.startedDragging()) {
mSavedSnapFraction = -1f;
- }
- if (touchState.startedDragging() && ENABLE_DISMISS_DRAG_TO_EDGE) {
- mHandler.removeCallbacks(mShowDismissAffordance);
- mDismissViewController.showDismissTarget();
+ if (ENABLE_DISMISS_DRAG_TO_EDGE) {
+ mHandler.removeCallbacks(mShowDismissAffordance);
+ mDismissViewController.showDismissTarget();
+ }
}
if (touchState.isDragging()) {
@@ -623,6 +631,12 @@
@Override
public boolean onUp(PipTouchState touchState) {
+ if (ENABLE_DISMISS_DRAG_TO_EDGE) {
+ // Clean up the dismiss target regardless of the touch state in case the touch
+ // enabled state changes while the user is interacting
+ cleanUpDismissTarget();
+ }
+
if (!touchState.isUserInteracting()) {
return false;
}
@@ -631,21 +645,21 @@
final boolean isHorizontal = Math.abs(vel.x) > Math.abs(vel.y);
final float velocity = PointF.length(vel.x, vel.y);
final boolean isFling = velocity > mFlingAnimationUtils.getMinVelocityPxPerSecond();
- final boolean isFlingToBot = isFling
- && !isHorizontal && mMovementWithinDismiss && vel.y > 0;
+ final boolean isUpWithinDimiss = mEnableFlingToDismiss
+ && touchState.getLastTouchPosition().y >= mMovementBounds.bottom
+ && mMotionHelper.isGestureToDismissArea(mMotionHelper.getBounds(), vel.x,
+ vel.y, isFling);
+ final boolean isFlingToBot = isFling && vel.y > 0 && !isHorizontal
+ && (mMovementWithinDismiss || isUpWithinDimiss);
if (ENABLE_DISMISS_DRAG_TO_EDGE) {
- try {
- mHandler.removeCallbacks(mShowDismissAffordance);
- if (mMotionHelper.shouldDismissPip() || isFlingToBot) {
- mMotionHelper.animateDismiss(mMotionHelper.getBounds(), vel.x,
- vel.y, mUpdateScrimListener);
- MetricsLogger.action(mContext,
- MetricsEvent.ACTION_PICTURE_IN_PICTURE_DISMISSED,
- METRIC_VALUE_DISMISSED_BY_DRAG);
- return true;
- }
- } finally {
- mDismissViewController.destroyDismissTarget();
+ // Check if the user dragged or flung the PiP offscreen to dismiss it
+ if (mMotionHelper.shouldDismissPip() || isFlingToBot) {
+ mMotionHelper.animateDismiss(mMotionHelper.getBounds(), vel.x,
+ vel.y, mUpdateScrimListener);
+ MetricsLogger.action(mContext,
+ MetricsEvent.ACTION_PICTURE_IN_PICTURE_DISMISSED,
+ METRIC_VALUE_DISMISSED_BY_DRAG);
+ return true;
}
}
@@ -722,6 +736,14 @@
: mNormalMovementBounds;
}
+ /**
+ * Removes the dismiss target and cancels any pending callbacks to show it.
+ */
+ private void cleanUpDismissTarget() {
+ mHandler.removeCallbacks(mShowDismissAffordance);
+ mDismissViewController.destroyDismissTarget();
+ }
+
public void dump(PrintWriter pw, String prefix) {
final String innerPrefix = prefix + " ";
pw.println(prefix + TAG);
diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginInstanceManager.java b/packages/SystemUI/src/com/android/systemui/plugins/PluginInstanceManager.java
index a8daed5..f663315 100644
--- a/packages/SystemUI/src/com/android/systemui/plugins/PluginInstanceManager.java
+++ b/packages/SystemUI/src/com/android/systemui/plugins/PluginInstanceManager.java
@@ -155,10 +155,6 @@
new ComponentName(info.mPackage, info.mClass),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
- final String pkg = info.mPackage;
- final Intent intent = new Intent(PluginManager.PLUGIN_CHANGED,
- pkg != null ? Uri.fromParts("package", pkg, null) : null);
- mContext.sendBroadcast(intent);
}
public <T> boolean dependsOn(Plugin p, Class<T> cls) {
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
index daf0622..6b3daa3 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
@@ -36,6 +36,7 @@
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
+import android.support.annotation.VisibleForTesting;
import android.util.Slog;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
@@ -71,6 +72,10 @@
private static final String ACTION_DISMISSED_WARNING = "PNW.dismissedWarning";
private static final String ACTION_CLICKED_TEMP_WARNING = "PNW.clickedTempWarning";
private static final String ACTION_DISMISSED_TEMP_WARNING = "PNW.dismissedTempWarning";
+ private static final String ACTION_CLICKED_THERMAL_SHUTDOWN_WARNING =
+ "PNW.clickedThermalShutdownWarning";
+ private static final String ACTION_DISMISSED_THERMAL_SHUTDOWN_WARNING =
+ "PNW.dismissedThermalShutdownWarning";
private static final AudioAttributes AUDIO_ATTRIBUTES = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
@@ -95,8 +100,9 @@
private boolean mPlaySound;
private boolean mInvalidCharger;
private SystemUIDialog mSaverConfirmation;
- private boolean mTempWarning;
+ private boolean mHighTempWarning;
private SystemUIDialog mHighTempDialog;
+ private SystemUIDialog mThermalShutdownDialog;
public PowerNotificationWarnings(Context context, NotificationManager notificationManager,
StatusBar statusBar) {
@@ -113,8 +119,10 @@
pw.print("mInvalidCharger="); pw.println(mInvalidCharger);
pw.print("mShowing="); pw.println(SHOWING_STRINGS[mShowing]);
pw.print("mSaverConfirmation="); pw.println(mSaverConfirmation != null ? "not null" : null);
- pw.print("mTempWarning="); pw.println(mTempWarning);
+ pw.print("mHighTempWarning="); pw.println(mHighTempWarning);
pw.print("mHighTempDialog="); pw.println(mHighTempDialog != null ? "not null" : null);
+ pw.print("mThermalShutdownDialog=");
+ pw.println(mThermalShutdownDialog != null ? "not null" : null);
}
@Override
@@ -212,29 +220,29 @@
}
@Override
- public void dismissTemperatureWarning() {
- if (!mTempWarning) {
+ public void dismissHighTemperatureWarning() {
+ if (!mHighTempWarning) {
return;
}
- mTempWarning = false;
- dismissTemperatureWarningInternal();
+ mHighTempWarning = false;
+ dismissHighTemperatureWarningInternal();
}
/**
- * Internal only version of {@link #dismissTemperatureWarning()} that simply dismisses
+ * Internal only version of {@link #dismissHighTemperatureWarning()} that simply dismisses
* the notification. As such, the notification will not show again until
- * {@link #dismissTemperatureWarning()} is called.
+ * {@link #dismissHighTemperatureWarning()} is called.
*/
- private void dismissTemperatureWarningInternal() {
+ private void dismissHighTemperatureWarningInternal() {
mNoMan.cancelAsUser(TAG_TEMPERATURE, SystemMessage.NOTE_HIGH_TEMP, UserHandle.ALL);
}
@Override
- public void showTemperatureWarning() {
- if (mTempWarning) {
+ public void showHighTemperatureWarning() {
+ if (mHighTempWarning) {
return;
}
- mTempWarning = true;
+ mHighTempWarning = true;
final Notification.Builder nb =
new Notification.Builder(mContext, NotificationChannels.ALERTS)
.setSmallIcon(R.drawable.ic_device_thermostat_24)
@@ -249,10 +257,9 @@
SystemUI.overrideNotificationAppName(mContext, nb);
final Notification n = nb.build();
mNoMan.notifyAsUser(TAG_TEMPERATURE, SystemMessage.NOTE_HIGH_TEMP, n, UserHandle.ALL);
-
}
- private void showTemperatureDialog() {
+ private void showHighTemperatureDialog() {
if (mHighTempDialog != null) return;
final SystemUIDialog d = new SystemUIDialog(mContext);
d.setIconAttribute(android.R.attr.alertDialogIcon);
@@ -265,6 +272,44 @@
mHighTempDialog = d;
}
+ @VisibleForTesting
+ void dismissThermalShutdownWarning() {
+ mNoMan.cancelAsUser(TAG_TEMPERATURE, SystemMessage.NOTE_THERMAL_SHUTDOWN, UserHandle.ALL);
+ }
+
+ private void showThermalShutdownDialog() {
+ if (mThermalShutdownDialog != null) return;
+ final SystemUIDialog d = new SystemUIDialog(mContext);
+ d.setIconAttribute(android.R.attr.alertDialogIcon);
+ d.setTitle(R.string.thermal_shutdown_title);
+ d.setMessage(R.string.thermal_shutdown_dialog_message);
+ d.setPositiveButton(com.android.internal.R.string.ok, null);
+ d.setShowForAllUsers(true);
+ d.setOnDismissListener(dialog -> mThermalShutdownDialog = null);
+ d.show();
+ mThermalShutdownDialog = d;
+ }
+
+ @Override
+ public void showThermalShutdownWarning() {
+ final Notification.Builder nb =
+ new Notification.Builder(mContext, NotificationChannels.ALERTS)
+ .setSmallIcon(R.drawable.ic_device_thermostat_24)
+ .setWhen(0)
+ .setShowWhen(false)
+ .setContentTitle(mContext.getString(R.string.thermal_shutdown_title))
+ .setContentText(mContext.getString(R.string.thermal_shutdown_message))
+ .setVisibility(Notification.VISIBILITY_PUBLIC)
+ .setContentIntent(pendingBroadcast(ACTION_CLICKED_THERMAL_SHUTDOWN_WARNING))
+ .setDeleteIntent(
+ pendingBroadcast(ACTION_DISMISSED_THERMAL_SHUTDOWN_WARNING))
+ .setColor(Utils.getColorAttr(mContext, android.R.attr.colorError));
+ SystemUI.overrideNotificationAppName(mContext, nb);
+ final Notification n = nb.build();
+ mNoMan.notifyAsUser(
+ TAG_TEMPERATURE, SystemMessage.NOTE_THERMAL_SHUTDOWN, n, UserHandle.ALL);
+ }
+
@Override
public void updateLowBatteryWarning() {
updateNotification();
@@ -380,6 +425,8 @@
filter.addAction(ACTION_DISMISSED_WARNING);
filter.addAction(ACTION_CLICKED_TEMP_WARNING);
filter.addAction(ACTION_DISMISSED_TEMP_WARNING);
+ filter.addAction(ACTION_CLICKED_THERMAL_SHUTDOWN_WARNING);
+ filter.addAction(ACTION_DISMISSED_THERMAL_SHUTDOWN_WARNING);
mContext.registerReceiverAsUser(this, UserHandle.ALL, filter,
android.Manifest.permission.STATUS_BAR_SERVICE, mHandler);
}
@@ -397,10 +444,15 @@
} else if (action.equals(ACTION_DISMISSED_WARNING)) {
dismissLowBatteryWarning();
} else if (ACTION_CLICKED_TEMP_WARNING.equals(action)) {
- dismissTemperatureWarningInternal();
- showTemperatureDialog();
+ dismissHighTemperatureWarningInternal();
+ showHighTemperatureDialog();
} else if (ACTION_DISMISSED_TEMP_WARNING.equals(action)) {
- dismissTemperatureWarningInternal();
+ dismissHighTemperatureWarningInternal();
+ } else if (ACTION_CLICKED_THERMAL_SHUTDOWN_WARNING.equals(action)) {
+ dismissThermalShutdownWarning();
+ showThermalShutdownDialog();
+ } else if (ACTION_DISMISSED_THERMAL_SHUTDOWN_WARNING.equals(action)) {
+ dismissThermalShutdownWarning();
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
index 471c3ae..a642077 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
@@ -31,6 +31,7 @@
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
+import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.Log;
import android.util.Slog;
@@ -93,6 +94,10 @@
updateBatteryWarningLevels();
mReceiver.init();
+ // Check to see if we need to let the user know that the phone previously shut down due
+ // to the temperature being too high.
+ showThermalShutdownDialog();
+
initTemperatureWarning();
}
@@ -256,6 +261,13 @@
updateTemperatureWarning();
}
+ private void showThermalShutdownDialog() {
+ if (mPowerManager.getLastShutdownReason()
+ == PowerManager.SHUTDOWN_REASON_THERMAL_SHUTDOWN) {
+ mWarnings.showThermalShutdownWarning();
+ }
+ }
+
private void updateTemperatureWarning() {
float[] temps = mHardwarePropertiesManager.getDeviceTemperatures(
HardwarePropertiesManager.DEVICE_TEMPERATURE_SKIN,
@@ -268,9 +280,9 @@
if (statusBar != null && !statusBar.isDeviceInVrMode()
&& temp >= mThresholdTemp) {
logAtTemperatureThreshold(temp);
- mWarnings.showTemperatureWarning();
+ mWarnings.showHighTemperatureWarning();
} else {
- mWarnings.dismissTemperatureWarning();
+ mWarnings.dismissHighTemperatureWarning();
}
}
@@ -369,8 +381,9 @@
void showInvalidChargerWarning();
void updateLowBatteryWarning();
boolean isInvalidChargerWarningShowing();
- void dismissTemperatureWarning();
- void showTemperatureWarning();
+ void dismissHighTemperatureWarning();
+ void showHighTemperatureWarning();
+ void showThermalShutdownWarning();
void dump(PrintWriter pw);
void userSwitched();
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index e457d72..7518527 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -77,9 +77,6 @@
BatteryMeterView battery = findViewById(R.id.battery);
battery.setForceShowPercent(true);
- // Don't show the Wi-Fi indicator here, because it is shown just below in the tile.
- SignalClusterView signalCluster = findViewById(R.id.signal_cluster);
- signalCluster.setForceBlockWifi();
mActivityStarter = Dependency.get(ActivityStarter.class);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
index b5c1bd9..dc9176f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
@@ -240,7 +240,7 @@
i.setPackage(mComponent.getPackageName());
i = resolveIntent(i);
if (i != null) {
- i.putExtra(TileService.EXTRA_COMPONENT, mComponent);
+ i.putExtra(Intent.EXTRA_COMPONENT_NAME, mComponent);
i.putExtra(TileService.EXTRA_STATE, mTile.getState());
return i;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
index d9c3cc3..d2f3bb6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
@@ -313,7 +313,7 @@
public void onReceive(Context context, Intent intent) {
if (TileService.ACTION_REQUEST_LISTENING.equals(intent.getAction())) {
requestListening(
- (ComponentName) intent.getParcelableExtra(TileService.EXTRA_COMPONENT));
+ (ComponentName) intent.getParcelableExtra(Intent.EXTRA_COMPONENT_NAME));
}
}
};
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 d74e3ac..92ff17a1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -128,7 +128,7 @@
state.value = mDataController.isMobileDataSupported()
&& mDataController.isMobileDataEnabled();
state.icon = ResourceIcon.get(R.drawable.ic_data_unavailable);
- state.state = cb.airplaneModeEnabled || !cb.enabled || cb.noSim ? Tile.STATE_UNAVAILABLE
+ state.state = cb.airplaneModeEnabled || !cb.enabled ? Tile.STATE_UNAVAILABLE
: state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
if (state.state == Tile.STATE_ACTIVE) {
state.icon = ResourceIcon.get(R.drawable.ic_data_on);
@@ -161,27 +161,44 @@
private static final class CallbackInfo {
boolean enabled;
+ boolean wifiEnabled;
boolean airplaneModeEnabled;
+ String signalContentDescription;
+ int dataTypeIconId;
+ String dataContentDescription;
boolean activityIn;
boolean activityOut;
+ String enabledDesc;
boolean noSim;
+ boolean isDataTypeIconWide;
boolean roaming;
}
private final class CellSignalCallback implements SignalCallback {
private final CallbackInfo mInfo = new CallbackInfo();
+ @Override
+ public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
+ boolean activityIn, boolean activityOut, String description, boolean isTransient) {
+ mInfo.wifiEnabled = enabled;
+ refreshState(mInfo);
+ }
@Override
- public void setMobileDataIndicators(IconState statusIcon, int statusType,
- boolean activityIn, boolean activityOut, String typeContentDescription,
- int subId, boolean roaming, boolean isEmergency) {
- if (statusIcon == null) {
+ public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
+ int qsType, boolean activityIn, boolean activityOut, String typeContentDescription,
+ String description, boolean isWide, int subId, boolean roaming) {
+ if (qsIcon == null) {
// Not data sim, don't display.
return;
}
- mInfo.enabled = statusIcon.visible;
+ mInfo.enabled = qsIcon.visible;
+ mInfo.signalContentDescription = qsIcon.contentDescription;
+ mInfo.dataTypeIconId = qsType;
+ mInfo.dataContentDescription = typeContentDescription;
mInfo.activityIn = activityIn;
mInfo.activityOut = activityOut;
+ mInfo.enabledDesc = description;
+ mInfo.isDataTypeIconWide = qsType != 0 && isWide;
mInfo.roaming = roaming;
refreshState(mInfo);
}
@@ -189,6 +206,15 @@
@Override
public void setNoSims(boolean show) {
mInfo.noSim = show;
+ if (mInfo.noSim) {
+ // Make sure signal gets cleared out when no sims.
+ mInfo.dataTypeIconId = 0;
+ // Show a No SIMs description to avoid emergency calls message.
+ mInfo.enabled = true;
+ mInfo.enabledDesc = mContext.getString(
+ R.string.keyguard_missing_sim_message_short);
+ mInfo.signalContentDescription = mInfo.enabledDesc;
+ }
refreshState(mInfo);
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index 143d934..7bc591f 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -192,8 +192,9 @@
// and the old last stack active time, they were not visible and in the
// TaskStack so we don't need to remove any associated TaskViews but we do
// need to load the task id's from the system
- RecentsTaskLoadPlan loadPlan = Recents.getTaskLoader().createLoadPlan(ctx);
- loadPlan.preloadRawTasks(false /* includeFrontMostExcludedTask */);
+ RecentsTaskLoader loader = Recents.getTaskLoader();
+ RecentsTaskLoadPlan loadPlan = loader.createLoadPlan(ctx);
+ loader.preloadRawTasks(loadPlan, false /* includeFrontMostExcludedTask */);
List<ActivityManager.RecentTaskInfo> tasks = loadPlan.getRawTasks();
for (int i = tasks.size() - 1; i >= 0; i--) {
ActivityManager.RecentTaskInfo task = tasks.get(i);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
index 164138e..53a9eae 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
@@ -108,36 +108,39 @@
* task stacks and update recents accordingly.
*/
class TaskStackListenerImpl extends TaskStackListener {
+
@Override
- public void onTaskStackChanged() {
+ public void onTaskStackChangedBackground() {
// Preloads the next task
RecentsConfiguration config = Recents.getConfiguration();
if (config.svelteLevel == RecentsConfiguration.SVELTE_NONE) {
- RecentsTaskLoader loader = Recents.getTaskLoader();
- SystemServicesProxy ssp = Recents.getSystemServices();
- ActivityManager.RunningTaskInfo runningTaskInfo = ssp.getRunningTask();
// Load the next task only if we aren't svelte
+ SystemServicesProxy ssp = Recents.getSystemServices();
+ ActivityManager.RunningTaskInfo runningTaskInfo = ssp.getRunningTask();
+ RecentsTaskLoader loader = Recents.getTaskLoader();
RecentsTaskLoadPlan plan = loader.createLoadPlan(mContext);
loader.preloadTasks(plan, -1, false /* includeFrontMostExcludedTask */);
- RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options();
+
// This callback is made when a new activity is launched and the old one is paused
// so ignore the current activity and try and preload the thumbnail for the
// previous one.
- if (runningTaskInfo != null) {
- launchOpts.runningTaskId = runningTaskInfo.id;
+ VisibilityReport visibilityReport;
+ synchronized (mDummyStackView) {
+ mDummyStackView.setTasks(plan.getTaskStack(), false /* allowNotify */);
+ updateDummyStackViewLayout(plan.getTaskStack(),
+ getWindowRect(null /* windowRectOverride */));
+
+ // Launched from app is always the worst case (in terms of how many
+ // thumbnails/tasks visible)
+ RecentsActivityLaunchState launchState = new RecentsActivityLaunchState();
+ launchState.launchedFromApp = true;
+ mDummyStackView.updateLayoutAlgorithm(true /* boundScroll */, launchState);
+ visibilityReport = mDummyStackView.computeStackVisibilityReport();
}
- mDummyStackView.setTasks(plan.getTaskStack(), false /* allowNotify */);
- updateDummyStackViewLayout(plan.getTaskStack(),
- getWindowRect(null /* windowRectOverride */));
- // Launched from app is always the worst case (in terms of how many thumbnails/tasks
- // visible)
- RecentsActivityLaunchState launchState = new RecentsActivityLaunchState();
- launchState.launchedFromApp = true;
- mDummyStackView.updateLayoutAlgorithm(true /* boundScroll */, launchState);
-
- VisibilityReport visibilityReport = mDummyStackView.computeStackVisibilityReport();
+ RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options();
+ launchOpts.runningTaskId = runningTaskInfo != null ? runningTaskInfo.id : -1;
launchOpts.numVisibleTasks = visibilityReport.numVisibleTasks;
launchOpts.numVisibleTaskThumbnails = visibilityReport.numVisibleThumbnails;
launchOpts.onlyLoadForCache = true;
@@ -221,9 +224,10 @@
}
public void onConfigurationChanged() {
- Resources res = mContext.getResources();
reloadResources();
- mDummyStackView.reloadOnConfigurationChange();
+ synchronized (mDummyStackView) {
+ mDummyStackView.reloadOnConfigurationChange();
+ }
}
/**
@@ -393,7 +397,6 @@
RecentsTaskLoader loader = Recents.getTaskLoader();
sInstanceLoadPlan = loader.createLoadPlan(mContext);
- sInstanceLoadPlan.preloadRawTasks(!isHomeStackVisible.value);
loader.preloadTasks(sInstanceLoadPlan, runningTask.id, !isHomeStackVisible.value);
TaskStack stack = sInstanceLoadPlan.getTaskStack();
if (stack.getTaskCount() > 0) {
@@ -633,16 +636,18 @@
calculateWindowStableInsets(systemInsets, windowRect);
windowRect.offsetTo(0, 0);
- TaskStackLayoutAlgorithm stackLayout = mDummyStackView.getStackAlgorithm();
+ synchronized (mDummyStackView) {
+ TaskStackLayoutAlgorithm stackLayout = mDummyStackView.getStackAlgorithm();
- // Rebind the header bar and draw it for the transition
- stackLayout.setSystemInsets(systemInsets);
- if (stack != null) {
- stackLayout.getTaskStackBounds(displayRect, windowRect, systemInsets.top,
- systemInsets.left, systemInsets.right, mTaskStackBounds);
- stackLayout.reset();
- stackLayout.initialize(displayRect, windowRect, mTaskStackBounds,
- TaskStackLayoutAlgorithm.StackState.getStackStateForStack(stack));
+ // Rebind the header bar and draw it for the transition
+ stackLayout.setSystemInsets(systemInsets);
+ if (stack != null) {
+ stackLayout.getTaskStackBounds(displayRect, windowRect, systemInsets.top,
+ systemInsets.left, systemInsets.right, mTaskStackBounds);
+ stackLayout.reset();
+ stackLayout.initialize(displayRect, windowRect, mTaskStackBounds,
+ TaskStackLayoutAlgorithm.StackState.getStackStateForStack(stack));
+ }
}
}
@@ -663,47 +668,52 @@
*/
private void updateHeaderBarLayout(TaskStack stack, Rect windowRectOverride) {
Rect windowRect = getWindowRect(windowRectOverride);
- updateDummyStackViewLayout(stack, windowRect);
- if (stack != null) {
- TaskStackLayoutAlgorithm stackLayout = mDummyStackView.getStackAlgorithm();
- mDummyStackView.setTasks(stack, false /* allowNotifyStackChanges */);
- // Get the width of a task view so that we know how wide to draw the header bar.
- int taskViewWidth = 0;
- if (mDummyStackView.useGridLayout()) {
- TaskGridLayoutAlgorithm gridLayout = mDummyStackView.getGridAlgorithm();
- gridLayout.initialize(windowRect);
- taskViewWidth = (int) gridLayout.getTransform(0 /* taskIndex */,
- stack.getTaskCount(), new TaskViewTransform(), stackLayout).rect.width();
- } else {
- Rect taskViewBounds = stackLayout.getUntransformedTaskViewBounds();
- if (!taskViewBounds.isEmpty()) {
- taskViewWidth = taskViewBounds.width();
+ int taskViewWidth = 0;
+ boolean useGridLayout = false;
+ synchronized (mDummyStackView) {
+ useGridLayout = mDummyStackView.useGridLayout();
+ updateDummyStackViewLayout(stack, windowRect);
+ if (stack != null) {
+ TaskStackLayoutAlgorithm stackLayout = mDummyStackView.getStackAlgorithm();
+ mDummyStackView.setTasks(stack, false /* allowNotifyStackChanges */);
+ // Get the width of a task view so that we know how wide to draw the header bar.
+ if (useGridLayout) {
+ TaskGridLayoutAlgorithm gridLayout = mDummyStackView.getGridAlgorithm();
+ gridLayout.initialize(windowRect);
+ taskViewWidth = (int) gridLayout.getTransform(0 /* taskIndex */,
+ stack.getTaskCount(), new TaskViewTransform(),
+ stackLayout).rect.width();
+ } else {
+ Rect taskViewBounds = stackLayout.getUntransformedTaskViewBounds();
+ if (!taskViewBounds.isEmpty()) {
+ taskViewWidth = taskViewBounds.width();
+ }
}
}
+ }
- if (taskViewWidth > 0) {
- synchronized (mHeaderBarLock) {
- if (mHeaderBar.getMeasuredWidth() != taskViewWidth ||
- mHeaderBar.getMeasuredHeight() != mTaskBarHeight) {
- if (mDummyStackView.useGridLayout()) {
- mHeaderBar.setShouldDarkenBackgroundColor(true);
- mHeaderBar.setNoUserInteractionState();
- }
- mHeaderBar.forceLayout();
- mHeaderBar.measure(
- MeasureSpec.makeMeasureSpec(taskViewWidth, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(mTaskBarHeight, MeasureSpec.EXACTLY));
+ if (stack != null && taskViewWidth > 0) {
+ synchronized (mHeaderBarLock) {
+ if (mHeaderBar.getMeasuredWidth() != taskViewWidth ||
+ mHeaderBar.getMeasuredHeight() != mTaskBarHeight) {
+ if (useGridLayout) {
+ mHeaderBar.setShouldDarkenBackgroundColor(true);
+ mHeaderBar.setNoUserInteractionState();
}
- mHeaderBar.layout(0, 0, taskViewWidth, mTaskBarHeight);
+ mHeaderBar.forceLayout();
+ mHeaderBar.measure(
+ MeasureSpec.makeMeasureSpec(taskViewWidth, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(mTaskBarHeight, MeasureSpec.EXACTLY));
}
+ mHeaderBar.layout(0, 0, taskViewWidth, mTaskBarHeight);
+ }
- // Update the transition bitmap to match the new header bar height
- if (mThumbTransitionBitmapCache == null ||
- (mThumbTransitionBitmapCache.getWidth() != taskViewWidth) ||
- (mThumbTransitionBitmapCache.getHeight() != mTaskBarHeight)) {
- mThumbTransitionBitmapCache = Bitmap.createBitmap(taskViewWidth,
- mTaskBarHeight, Bitmap.Config.ARGB_8888);
- }
+ // Update the transition bitmap to match the new header bar height
+ if (mThumbTransitionBitmapCache == null ||
+ (mThumbTransitionBitmapCache.getWidth() != taskViewWidth) ||
+ (mThumbTransitionBitmapCache.getHeight() != mTaskBarHeight)) {
+ mThumbTransitionBitmapCache = Bitmap.createBitmap(taskViewWidth,
+ mTaskBarHeight, Bitmap.Config.ARGB_8888);
}
}
}
@@ -764,16 +774,21 @@
* Creates the activity options for an app->recents transition.
*/
private ActivityOptions getThumbnailTransitionActivityOptions(
- ActivityManager.RunningTaskInfo runningTask, TaskStackView stackView,
- Rect windowOverrideRect) {
+ ActivityManager.RunningTaskInfo runningTask, Rect windowOverrideRect) {
if (runningTask != null && runningTask.stackId == FREEFORM_WORKSPACE_STACK_ID) {
ArrayList<AppTransitionAnimationSpec> specs = new ArrayList<>();
- ArrayList<Task> tasks = stackView.getStack().getStackTasks();
- TaskStackLayoutAlgorithm stackLayout = stackView.getStackAlgorithm();
- TaskStackViewScroller stackScroller = stackView.getScroller();
+ ArrayList<Task> tasks;
+ TaskStackLayoutAlgorithm stackLayout;
+ TaskStackViewScroller stackScroller;
- stackView.updateLayoutAlgorithm(true /* boundScroll */);
- stackView.updateToInitialState();
+ synchronized (mDummyStackView) {
+ tasks = mDummyStackView.getStack().getStackTasks();
+ stackLayout = mDummyStackView.getStackAlgorithm();
+ stackScroller = mDummyStackView.getScroller();
+
+ mDummyStackView.updateLayoutAlgorithm(true /* boundScroll */);
+ mDummyStackView.updateToInitialState();
+ }
for (int i = tasks.size() - 1; i >= 0; i--) {
Task task = tasks.get(i);
@@ -795,7 +810,7 @@
} else {
// Update the destination rect
Task toTask = new Task();
- TaskViewTransform toTransform = getThumbnailTransitionTransform(stackView, toTask,
+ TaskViewTransform toTransform = getThumbnailTransitionTransform(mDummyStackView, toTask,
windowOverrideRect);
Bitmap thumbnail = drawThumbnailTransitionBitmap(toTask, toTransform,
mThumbTransitionBitmapCache);
@@ -919,8 +934,10 @@
updateHeaderBarLayout(stack, windowOverrideRect);
// Prepare the dummy stack for the transition
- TaskStackLayoutAlgorithm.VisibilityReport stackVr =
- mDummyStackView.computeStackVisibilityReport();
+ TaskStackLayoutAlgorithm.VisibilityReport stackVr;
+ synchronized (mDummyStackView) {
+ stackVr = mDummyStackView.computeStackVisibilityReport();
+ }
// Update the remaining launch state
launchState.launchedNumVisibleTasks = stackVr.numVisibleTasks;
@@ -936,8 +953,7 @@
opts = getUnknownTransitionActivityOptions();
} else if (useThumbnailTransition) {
// Try starting with a thumbnail transition
- opts = getThumbnailTransitionActivityOptions(runningTask, mDummyStackView,
- windowOverrideRect);
+ opts = getThumbnailTransitionActivityOptions(runningTask, windowOverrideRect);
} else {
// If there is no thumbnail transition, but is launching from home into recents, then
// use a quick home transition
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
index 2f12282..a9e1f61 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
@@ -61,6 +61,7 @@
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.SystemProperties;
+import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
@@ -149,6 +150,10 @@
* to reduce IPC calls from system services. These callbacks will be called on the main thread.
*/
public abstract static class TaskStackListener {
+ /**
+ * NOTE: This call is made of the thread that the binder call comes in on.
+ */
+ public void onTaskStackChangedBackground() { }
public void onTaskStackChanged() { }
public void onTaskSnapshotChanged(int taskId, TaskSnapshot snapshot) { }
public void onActivityPinned(String packageName) { }
@@ -187,8 +192,20 @@
* This simply passes callbacks to listeners through {@link H}.
* */
private android.app.TaskStackListener mTaskStackListener = new android.app.TaskStackListener() {
+
+ private final List<SystemServicesProxy.TaskStackListener> mTmpListeners = new ArrayList<>();
+
@Override
public void onTaskStackChanged() throws RemoteException {
+ // Call the task changed callback for the non-ui thread listeners first
+ synchronized (mTaskStackListeners) {
+ mTmpListeners.clear();
+ mTmpListeners.addAll(mTaskStackListeners);
+ }
+ for (int i = mTmpListeners.size() - 1; i >= 0; i--) {
+ mTmpListeners.get(i).onTaskStackChangedBackground();
+ }
+
mHandler.removeMessages(H.ON_TASK_STACK_CHANGED);
mHandler.sendEmptyMessage(H.ON_TASK_STACK_CHANGED);
}
@@ -309,10 +326,7 @@
* Returns the single instance of the {@link SystemServicesProxy}.
* This should only be called on the main thread.
*/
- public static SystemServicesProxy getInstance(Context context) {
- if (!Looper.getMainLooper().isCurrentThread()) {
- throw new RuntimeException("Must be called on the UI thread");
- }
+ public static synchronized SystemServicesProxy getInstance(Context context) {
if (sSystemServicesProxy == null) {
sSystemServicesProxy = new SystemServicesProxy(context);
}
@@ -1136,13 +1150,15 @@
public void registerTaskStackListener(TaskStackListener listener) {
if (mIam == null) return;
- mTaskStackListeners.add(listener);
- if (mTaskStackListeners.size() == 1) {
- // Register mTaskStackListener to IActivityManager only once if needed.
- try {
- mIam.registerTaskStackListener(mTaskStackListener);
- } catch (Exception e) {
- Log.w(TAG, "Failed to call registerTaskStackListener", e);
+ synchronized (mTaskStackListeners) {
+ mTaskStackListeners.add(listener);
+ if (mTaskStackListeners.size() == 1) {
+ // Register mTaskStackListener to IActivityManager only once if needed.
+ try {
+ mIam.registerTaskStackListener(mTaskStackListener);
+ } catch (Exception e) {
+ Log.w(TAG, "Failed to call registerTaskStackListener", e);
+ }
}
}
}
@@ -1245,74 +1261,80 @@
@Override
public void handleMessage(Message msg) {
- switch (msg.what) {
- case ON_TASK_STACK_CHANGED: {
- for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
- mTaskStackListeners.get(i).onTaskStackChanged();
+ synchronized (mTaskStackListeners) {
+ switch (msg.what) {
+ case ON_TASK_STACK_CHANGED: {
+ Trace.beginSection("onTaskStackChanged");
+ for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
+ mTaskStackListeners.get(i).onTaskStackChanged();
+ }
+ Trace.endSection();
+ break;
}
- break;
- }
- case ON_TASK_SNAPSHOT_CHANGED: {
- for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
- mTaskStackListeners.get(i).onTaskSnapshotChanged(msg.arg1,
- (TaskSnapshot) msg.obj);
+ case ON_TASK_SNAPSHOT_CHANGED: {
+ Trace.beginSection("onTaskSnapshotChanged");
+ for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
+ mTaskStackListeners.get(i).onTaskSnapshotChanged(msg.arg1,
+ (TaskSnapshot) msg.obj);
+ }
+ Trace.endSection();
+ break;
}
- break;
- }
- case ON_ACTIVITY_PINNED: {
- for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
- mTaskStackListeners.get(i).onActivityPinned((String) msg.obj);
+ case ON_ACTIVITY_PINNED: {
+ for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
+ mTaskStackListeners.get(i).onActivityPinned((String) msg.obj);
+ }
+ break;
}
- break;
- }
- case ON_ACTIVITY_UNPINNED: {
- for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
- mTaskStackListeners.get(i).onActivityUnpinned();
+ case ON_ACTIVITY_UNPINNED: {
+ for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
+ mTaskStackListeners.get(i).onActivityUnpinned();
+ }
+ break;
}
- break;
- }
- case ON_PINNED_ACTIVITY_RESTART_ATTEMPT: {
- for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
- mTaskStackListeners.get(i).onPinnedActivityRestartAttempt();
+ case ON_PINNED_ACTIVITY_RESTART_ATTEMPT: {
+ for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
+ mTaskStackListeners.get(i).onPinnedActivityRestartAttempt();
+ }
+ break;
}
- break;
- }
- case ON_PINNED_STACK_ANIMATION_STARTED: {
- for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
- mTaskStackListeners.get(i).onPinnedStackAnimationStarted();
+ case ON_PINNED_STACK_ANIMATION_STARTED: {
+ for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
+ mTaskStackListeners.get(i).onPinnedStackAnimationStarted();
+ }
+ break;
}
- break;
- }
- case ON_PINNED_STACK_ANIMATION_ENDED: {
- for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
- mTaskStackListeners.get(i).onPinnedStackAnimationEnded();
+ case ON_PINNED_STACK_ANIMATION_ENDED: {
+ for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
+ mTaskStackListeners.get(i).onPinnedStackAnimationEnded();
+ }
+ break;
}
- break;
- }
- case ON_ACTIVITY_FORCED_RESIZABLE: {
- for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
- mTaskStackListeners.get(i).onActivityForcedResizable(
- (String) msg.obj, msg.arg1, msg.arg2);
+ case ON_ACTIVITY_FORCED_RESIZABLE: {
+ for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
+ mTaskStackListeners.get(i).onActivityForcedResizable(
+ (String) msg.obj, msg.arg1, msg.arg2);
+ }
+ break;
}
- break;
- }
- case ON_ACTIVITY_DISMISSING_DOCKED_STACK: {
- for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
- mTaskStackListeners.get(i).onActivityDismissingDockedStack();
+ case ON_ACTIVITY_DISMISSING_DOCKED_STACK: {
+ for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
+ mTaskStackListeners.get(i).onActivityDismissingDockedStack();
+ }
+ break;
}
- break;
- }
- case ON_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_FAILED: {
- for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
- mTaskStackListeners.get(i).onActivityLaunchOnSecondaryDisplayFailed();
+ case ON_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_FAILED: {
+ for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
+ mTaskStackListeners.get(i).onActivityLaunchOnSecondaryDisplayFailed();
+ }
+ break;
}
- break;
- }
- case ON_TASK_PROFILE_LOCKED: {
- for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
- mTaskStackListeners.get(i).onTaskProfileLocked(msg.arg1, msg.arg2);
+ case ON_TASK_PROFILE_LOCKED: {
+ for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
+ mTaskStackListeners.get(i).onTaskProfileLocked(msg.arg1, msg.arg2);
+ }
+ break;
}
- break;
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
index 78c71a1..4b53cd1 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
@@ -103,8 +103,10 @@
/**
* An optimization to preload the raw list of tasks. The raw tasks are saved in least-recent
* to most-recent order.
+ *
+ * Note: Do not lock, callers should synchronize on the loader before making this call.
*/
- public synchronized void preloadRawTasks(boolean includeFrontMostExcludedTask) {
+ void preloadRawTasks(boolean includeFrontMostExcludedTask) {
int currentUserId = UserHandle.USER_CURRENT;
updateCurrentQuietProfilesCache(currentUserId);
SystemServicesProxy ssp = Recents.getSystemServices();
@@ -123,8 +125,11 @@
* The tasks will be ordered by:
* - least-recent to most-recent stack tasks
* - least-recent to most-recent freeform tasks
+ *
+ * Note: Do not lock, since this can be calling back to the loader, which separately also drives
+ * this call (callers should synchronize on the loader before making this call).
*/
- public synchronized void preloadPlan(RecentsTaskLoader loader, int runningTaskId,
+ void preloadPlan(RecentsTaskLoader loader, int runningTaskId,
boolean includeFrontMostExcludedTask) {
Resources res = mContext.getResources();
ArrayList<Task> allTasks = new ArrayList<>();
@@ -223,8 +228,11 @@
/**
* Called to apply the actual loading based on the specified conditions.
+ *
+ * Note: Do not lock, since this can be calling back to the loader, which separately also drives
+ * this call (callers should synchronize on the loader before making this call).
*/
- public synchronized void executePlan(Options opts, RecentsTaskLoader loader) {
+ void executePlan(Options opts, RecentsTaskLoader loader) {
Resources res = mContext.getResources();
// Iterate through each of the tasks and load them according to the load conditions.
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
index 5e78b61..802cb831 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
@@ -31,6 +31,7 @@
import android.util.Log;
import android.util.LruCache;
+import com.android.internal.annotations.GuardedBy;
import com.android.systemui.R;
import com.android.systemui.recents.Recents;
import com.android.systemui.recents.RecentsConfiguration;
@@ -160,50 +161,7 @@
// If we've stopped the loader, then fall through to the above logic to wait on
// the load thread
if (ssp != null) {
- // Load the next item from the queue
- final Task t = mLoadQueue.nextTask();
- if (t != null) {
- Drawable cachedIcon = mIconCache.get(t.key);
-
- // Load the icon if it is stale or we haven't cached one yet
- if (cachedIcon == null) {
- cachedIcon = ssp.getBadgedTaskDescriptionIcon(t.taskDescription,
- t.key.userId, mContext.getResources());
-
- if (cachedIcon == null) {
- ActivityInfo info = ssp.getActivityInfo(
- t.key.getComponent(), t.key.userId);
- if (info != null) {
- if (DEBUG) Log.d(TAG, "Loading icon: " + t.key);
- cachedIcon = ssp.getBadgedActivityIcon(info, t.key.userId);
- }
- }
-
- if (cachedIcon == null) {
- cachedIcon = mDefaultIcon;
- }
-
- // At this point, even if we can't load the icon, we will set the
- // default icon.
- mIconCache.put(t.key, cachedIcon);
- }
-
- if (DEBUG) Log.d(TAG, "Loading thumbnail: " + t.key);
- ThumbnailData cachedThumbnailData = ssp.getTaskThumbnail(t.key.id,
- true /* reducedResolution */);
-
- if (cachedThumbnailData.thumbnail == null) {
- cachedThumbnailData.thumbnail = mDefaultThumbnail;
- }
-
- if (!mCancelled) {
- // Notify that the task data has changed
- final Drawable newIcon = cachedIcon;
- final ThumbnailData newThumbnailData = cachedThumbnailData;
- mMainThreadHandler.post(
- () -> t.notifyTaskDataLoaded(newThumbnailData, newIcon));
- }
- }
+ processLoadQueueItem(ssp);
}
// If there are no other items in the list, then just wait until something is added
@@ -221,6 +179,57 @@
}
}
}
+
+ /**
+ * This needs to be in a separate method to work around an surprising interpreter behavior:
+ * The register will keep the local reference to cachedThumbnailData even if it falls out of
+ * scope. Putting it into a method fixes this issue.
+ */
+ private void processLoadQueueItem(SystemServicesProxy ssp) {
+ // Load the next item from the queue
+ final Task t = mLoadQueue.nextTask();
+ if (t != null) {
+ Drawable cachedIcon = mIconCache.get(t.key);
+
+ // Load the icon if it is stale or we haven't cached one yet
+ if (cachedIcon == null) {
+ cachedIcon = ssp.getBadgedTaskDescriptionIcon(t.taskDescription,
+ t.key.userId, mContext.getResources());
+
+ if (cachedIcon == null) {
+ ActivityInfo info = ssp.getActivityInfo(
+ t.key.getComponent(), t.key.userId);
+ if (info != null) {
+ if (DEBUG) Log.d(TAG, "Loading icon: " + t.key);
+ cachedIcon = ssp.getBadgedActivityIcon(info, t.key.userId);
+ }
+ }
+
+ if (cachedIcon == null) {
+ cachedIcon = mDefaultIcon;
+ }
+
+ // At this point, even if we can't load the icon, we will set the
+ // default icon.
+ mIconCache.put(t.key, cachedIcon);
+ }
+
+ if (DEBUG) Log.d(TAG, "Loading thumbnail: " + t.key);
+ final ThumbnailData cachedThumbnailData = ssp.getTaskThumbnail(t.key.id,
+ true /* reducedResolution */);
+
+ if (cachedThumbnailData.thumbnail == null) {
+ cachedThumbnailData.thumbnail = mDefaultThumbnail;
+ }
+
+ if (!mCancelled) {
+ // Notify that the task data has changed
+ final Drawable finalIcon = cachedIcon;
+ mMainThreadHandler.post(
+ () -> t.notifyTaskDataLoaded(cachedThumbnailData, finalIcon));
+ }
+ }
+ }
}
/**
@@ -243,7 +252,9 @@
private final TaskResourceLoadQueue mLoadQueue;
private final BackgroundTaskLoader mLoader;
private final HighResThumbnailLoader mHighResThumbnailLoader;
+ @GuardedBy("this")
private final TaskKeyStrongCache<ThumbnailData> mThumbnailCache = new TaskKeyStrongCache<>();
+ @GuardedBy("this")
private final TaskKeyStrongCache<ThumbnailData> mTempCache = new TaskKeyStrongCache<>();
private final int mMaxThumbnailCacheSize;
private final int mMaxIconCacheSize;
@@ -318,14 +329,20 @@
return plan;
}
+ /** Preloads raw recents tasks using the specified plan to store the output. */
+ public synchronized void preloadRawTasks(RecentsTaskLoadPlan plan,
+ boolean includeFrontMostExcludedTask) {
+ plan.preloadRawTasks(includeFrontMostExcludedTask);
+ }
+
/** Preloads recents tasks using the specified plan to store the output. */
- public void preloadTasks(RecentsTaskLoadPlan plan, int runningTaskId,
+ public synchronized void preloadTasks(RecentsTaskLoadPlan plan, int runningTaskId,
boolean includeFrontMostExcludedTask) {
plan.preloadPlan(this, runningTaskId, includeFrontMostExcludedTask);
}
/** Begins loading the heavy task data according to the specified options. */
- public void loadTasks(Context context, RecentsTaskLoadPlan plan,
+ public synchronized void loadTasks(Context context, RecentsTaskLoadPlan plan,
RecentsTaskLoadPlan.Options opts) {
if (opts == null) {
throw new RuntimeException("Requires load options");
@@ -380,8 +397,7 @@
* Handles signals from the system, trimming memory when requested to prevent us from running
* out of memory.
*/
- public void onTrimMemory(int level) {
- RecentsConfiguration config = Recents.getConfiguration();
+ public synchronized void onTrimMemory(int level) {
switch (level) {
case ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN:
// Stop the loader immediately when the UI is no longer visible
@@ -516,7 +532,7 @@
/**
* Returns the cached thumbnail if the task key is not expired, updating the cache if it is.
*/
- ThumbnailData getAndUpdateThumbnail(Task.TaskKey taskKey, boolean loadIfNotCached,
+ synchronized ThumbnailData getAndUpdateThumbnail(Task.TaskKey taskKey, boolean loadIfNotCached,
boolean storeInCache) {
SystemServicesProxy ssp = Recents.getSystemServices();
@@ -616,12 +632,15 @@
}
}
- public void dump(String prefix, PrintWriter writer) {
+ public synchronized void dump(String prefix, PrintWriter writer) {
String innerPrefix = prefix + " ";
writer.print(prefix); writer.println(TAG);
writer.print(prefix); writer.println("Icon Cache");
mIconCache.dump(innerPrefix, writer);
+ writer.print(prefix); writer.println("Thumbnail Cache");
mThumbnailCache.dump(innerPrefix, writer);
+ writer.print(prefix); writer.println("Temp Thumbnail Cache");
+ mTempCache.dump(innerPrefix, writer);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
index 32e3df6..18a9bab 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
@@ -1711,6 +1711,13 @@
}
}
+ private void clearPrefetchingTask() {
+ if (mPrefetchingTask != null) {
+ Recents.getTaskLoader().unloadTaskData(mPrefetchingTask);
+ }
+ mPrefetchingTask = null;
+ }
+
/**** TaskViewCallbacks Implementation ****/
@Override
@@ -2201,6 +2208,13 @@
if (!event.visible && mTaskViewFocusFrame != null) {
mTaskViewFocusFrame.moveGridTaskViewFocus(null);
}
+ if (!event.visible) {
+ List<TaskView> taskViews = new ArrayList<>(getTaskViews());
+ for (int i = 0; i < taskViews.size(); i++) {
+ mViewPool.returnViewToPool(taskViews.get(i));
+ }
+ clearPrefetchingTask();
+ }
}
public void reloadOnConfigurationChange() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
index 469f3ad..d7eab97 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
@@ -172,6 +172,11 @@
private int mOverrideTint;
private float mOverrideAmount;
private boolean mShadowHidden;
+ private boolean mWasActivatedOnDown;
+ /**
+ * Similar to mDimmed but is also true if it's not dimmable but should be
+ */
+ private boolean mNeedsDimming;
public ActivatableNotificationView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -223,7 +228,7 @@
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
- if (mDimmed && !mActivated && ev.getActionMasked() == MotionEvent.ACTION_DOWN
+ if (mNeedsDimming && !mActivated && ev.getActionMasked() == MotionEvent.ACTION_DOWN
&& disallowSingleClick(ev) && !isTouchExplorationEnabled()) {
return true;
}
@@ -245,7 +250,10 @@
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean result;
- if (mDimmed && !isTouchExplorationEnabled() && isInteractive()) {
+ if (event.getAction() == MotionEvent.ACTION_DOWN) {
+ mWasActivatedOnDown = mActivated;
+ }
+ if ((mNeedsDimming && !mActivated) && !isTouchExplorationEnabled() && isInteractive()) {
boolean wasActivated = mActivated;
result = handleTouchEventDimmed(event);
if (wasActivated && result && event.getAction() == MotionEvent.ACTION_UP) {
@@ -282,9 +290,21 @@
}
private boolean handleTouchEventDimmed(MotionEvent event) {
+ if (mNeedsDimming && !mDimmed) {
+ // We're actually dimmed, but our content isn't dimmable, let's ensure we have a ripple
+ super.onTouchEvent(event);
+ }
return mDoubleTapHelper.onTouchEvent(event, getActualHeight());
}
+ @Override
+ public boolean performClick() {
+ if (mWasActivatedOnDown || !mNeedsDimming) {
+ return super.performClick();
+ }
+ return false;
+ }
+
private void makeActive() {
mFalsingManager.onNotificationActive();
startActivateAnimation(false /* reverse */);
@@ -298,6 +318,9 @@
if (!isAttachedToWindow()) {
return;
}
+ if (!isDimmable()) {
+ return;
+ }
int widthHalf = mBackgroundNormal.getWidth()/2;
int heightHalf = mBackgroundNormal.getActualHeight()/2;
float radius = (float) Math.sqrt(widthHalf*widthHalf + heightHalf*heightHalf);
@@ -371,6 +394,8 @@
}
public void setDimmed(boolean dimmed, boolean fade) {
+ mNeedsDimming = dimmed;
+ dimmed &= isDimmable();
if (mDimmed != dimmed) {
mDimmed = dimmed;
resetBackgroundAlpha();
@@ -382,6 +407,10 @@
}
}
+ public boolean isDimmable() {
+ return true;
+ }
+
public void setDark(boolean dark, boolean fade, long delay) {
super.setDark(dark, fade, delay);
if (mDark == dark) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index dff09bd..8c1b334 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -16,7 +16,7 @@
package com.android.systemui.statusbar;
-import static com.android.systemui.statusbar.notification.NotificationInflater.InflationExceptionHandler;
+import static com.android.systemui.statusbar.notification.NotificationInflater.InflationCallback;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -47,6 +47,7 @@
import android.widget.ImageView;
import android.widget.RemoteViews;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.NotificationColorUtil;
@@ -61,7 +62,6 @@
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem;
import com.android.systemui.statusbar.NotificationGuts.GutsContent;
import com.android.systemui.statusbar.notification.HybridNotificationView;
-import com.android.systemui.statusbar.notification.InflationException;
import com.android.systemui.statusbar.notification.NotificationInflater;
import com.android.systemui.statusbar.notification.NotificationUtils;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
@@ -314,14 +314,13 @@
}
}
- public void updateNotification(NotificationData.Entry entry) throws InflationException {
+ public void updateNotification(NotificationData.Entry entry) {
mEntry = entry;
mStatusBarNotification = entry.notification;
mNotificationInflater.inflateNotificationViews();
- onNotificationUpdated();
}
- private void onNotificationUpdated() {
+ public void onNotificationUpdated() {
for (NotificationContentView l : mLayouts) {
l.onNotificationUpdated(mEntry);
}
@@ -361,6 +360,14 @@
expandedIcon.setStaticDrawableColor(color);
}
+ @Override
+ public boolean isDimmable() {
+ if (!getShowingLayout().isDimmable()) {
+ return false;
+ }
+ return super.isDimmable();
+ }
+
private void updateLimits() {
for (NotificationContentView l : mLayouts) {
updateLimitsForView(l);
@@ -482,9 +489,7 @@
boolean childInGroup = StatusBar.ENABLE_CHILD_NOTIFICATIONS && isChildInGroup;
mNotificationParent = childInGroup ? parent : null;
mPrivateLayout.setIsChildInGroup(childInGroup);
- if (mNotificationInflater.setIsChildInGroup(childInGroup)) {
- onNotificationUpdated();
- }
+ mNotificationInflater.setIsChildInGroup(childInGroup);
resetBackgroundAlpha();
updateBackgroundForGroupState();
updateClickAndFocus();
@@ -1111,14 +1116,19 @@
mNotificationInflater.setRemoteViewClickHandler(remoteViewClickHandler);
}
- public void setInflateExceptionHandler(InflationExceptionHandler inflateExceptionHandler) {
- mNotificationInflater.setInflateExceptionHandler(inflateExceptionHandler);
+ public void setInflationCallback(InflationCallback callback) {
+ mNotificationInflater.setInflationCallback(callback);
}
public void setNeedsRedaction(boolean needsRedaction) {
mNotificationInflater.setRedactAmbient(needsRedaction);
}
+ @VisibleForTesting
+ public NotificationInflater getNotificationInflater() {
+ return mNotificationInflater;
+ }
+
public interface ExpansionLogger {
public void logNotificationExpansion(String key, boolean userAction, boolean expanded);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
index 6098565..e7bf983 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
@@ -1363,4 +1363,11 @@
public void setIsLowPriority(boolean isLowPriority) {
mIsLowPriority = isLowPriority;
}
+
+ public boolean isDimmable() {
+ if (!mContractedWrapper.isDimmable()) {
+ return false;
+ }
+ return true;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index 90e908b..540c391 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -24,6 +24,7 @@
import android.content.pm.PackageManager;
import android.content.Context;
import android.graphics.drawable.Icon;
+import android.os.AsyncTask;
import android.os.RemoteException;
import android.os.SystemClock;
import android.service.notification.NotificationListenerService;
@@ -32,6 +33,7 @@
import android.service.notification.SnoozeCriterion;
import android.service.notification.StatusBarNotification;
import android.util.ArrayMap;
+import android.util.ArraySet;
import android.view.View;
import android.widget.ImageView;
import android.widget.RemoteViews;
@@ -41,6 +43,7 @@
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.util.NotificationColorUtil;
import com.android.systemui.statusbar.notification.InflationException;
+import com.android.systemui.statusbar.notification.NotificationInflater;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.HeadsUpManager;
@@ -83,6 +86,7 @@
public List<SnoozeCriterion> snoozeCriteria;
private int mCachedContrastColor = COLOR_INVALID;
private int mCachedContrastColorIsFor = COLOR_INVALID;
+ private ArraySet<AsyncTask> mRunningTasks = new ArraySet();
public Entry(StatusBarNotification n) {
this.key = n.getKey();
@@ -210,6 +214,29 @@
mCachedContrastColor = contrasted;
return mCachedContrastColor;
}
+
+ /**
+ * Abort all existing inflation tasks
+ */
+ public void abortInflation() {
+ for (AsyncTask task : mRunningTasks) {
+ task.cancel(true /* mayInterruptIfRunning */);
+ }
+ mRunningTasks.clear();
+ }
+
+ public void addInflationTask(AsyncTask asyncInflationTask) {
+ mRunningTasks.add(asyncInflationTask);
+ }
+
+ public void onInflationTaskFinished(AsyncTask asyncInflationTask) {
+ mRunningTasks.remove(asyncInflationTask);
+ }
+
+ @VisibleForTesting
+ public ArraySet<AsyncTask> getRunningTasks() {
+ return mRunningTasks;
+ }
}
private final ArrayMap<String, Entry> mEntries = new ArrayMap<>();
@@ -302,12 +329,12 @@
return mEntries.get(key);
}
- public void add(Entry entry, RankingMap ranking) {
+ public void add(Entry entry) {
synchronized (mEntries) {
mEntries.put(entry.notification.getKey(), entry);
}
mGroupManager.onEntryAdded(entry);
- updateRankingAndSort(ranking);
+ updateRankingAndSort(mRankingMap);
}
public Entry remove(String key, RankingMap ranking) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
index 4dec6c7..2cf06c2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
@@ -262,17 +262,15 @@
private boolean hasImportanceChanged() {
return mSingleNotificationChannel != null &&
+ mChannelEnabledSwitch != null &&
mStartingUserImportance != getSelectedImportance();
}
private void saveImportance() {
- if (mSingleNotificationChannel == null) {
+ if (!hasImportanceChanged()) {
return;
}
- int selectedImportance = getSelectedImportance();
- if (selectedImportance == mStartingUserImportance) {
- return;
- }
+ final int selectedImportance = getSelectedImportance();
MetricsLogger.action(mContext, MetricsEvent.ACTION_SAVE_IMPORTANCE,
selectedImportance - mStartingUserImportance);
mSingleNotificationChannel.setImportance(selectedImportance);
@@ -386,7 +384,7 @@
@Override
public boolean willBeRemoved() {
- return !mChannelEnabledSwitch.isChecked();
+ return mChannelEnabledSwitch != null && !mChannelEnabledSwitch.isChecked();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java
index 7563fd1..4305bdef 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java
@@ -16,13 +16,13 @@
package com.android.systemui.statusbar;
+import static com.android.systemui.SwipeHelper.SWIPED_FAR_ENOUGH_SIZE_FRACTION;
+
import java.util.ArrayList;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
-import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem;
-import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.OnMenuEventListener;
import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper;
import com.android.systemui.statusbar.NotificationGuts.GutsContent;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
@@ -46,10 +46,21 @@
public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnClickListener {
+ private static final boolean DEBUG = false;
+ private static final String TAG = "swipe";
+
private static final int ICON_ALPHA_ANIM_DURATION = 200;
private static final long SHOW_MENU_DELAY = 60;
private static final long SWIPE_MENU_TIMING = 200;
+ // Notification must be swiped at least this fraction of a single menu item to show menu
+ private static final float SWIPED_FAR_ENOUGH_MENU_FRACTION = 0.25f;
+ private static final float SWIPED_FAR_ENOUGH_MENU_UNCLEARABLE_FRACTION = 0.15f;
+
+ // When the menu is displayed, the notification must be swiped within this fraction of a single
+ // menu item to snap back to menu (else it will cover the menu or it'll be dismissed)
+ private static final float SWIPED_BACK_ENOUGH_TO_COVER_FRACTION = 0.2f;
+
private ExpandableNotificationRow mParent;
private Context mContext;
@@ -78,6 +89,7 @@
private int mIconPadding;
private float mAlpha = 0f;
+ private float mPrevX;
private CheckForDrag mCheckForDrag;
private Handler mHandler;
@@ -203,14 +215,14 @@
}
mHandler.removeCallbacks(mCheckForDrag);
mCheckForDrag = null;
+ mPrevX = ev.getRawX();
break;
case MotionEvent.ACTION_MOVE:
mSnapping = false;
- // If the menu is visible and the movement is towards it it's not a location change.
- boolean locationChange = isTowardsMenu(mTranslation)
- ? false : isMenuLocationChange();
- if (locationChange) {
+ float diffX = ev.getRawX() - mPrevX;
+ mPrevX = ev.getRawX();
+ if (!isTowardsMenu(diffX) && isMenuLocationChange()) {
// Don't consider it "snapped" if location has changed.
mMenuSnappedTo = false;
@@ -262,36 +274,53 @@
final double timeForGesture = ev.getEventTime() - ev.getDownTime();
final boolean showMenuForSlowOnGoing = !mParent.canViewBeDismissed()
&& timeForGesture >= SWIPE_MENU_TIMING;
+ final float menuSnapTarget = mOnLeft ? getSpaceForMenu() : -getSpaceForMenu();
- final float targetLeft = mOnLeft ? getSpaceForMenu() : -getSpaceForMenu();
- if (mMenuSnappedTo && isMenuVisible()) {
- if (mMenuSnappedOnLeft == mOnLeft) {
- boolean coveringMenu = Math.abs(mTranslation) <= getSpaceForMenu() * 0.6f;
- if (gestureTowardsMenu || coveringMenu) {
- // Gesture is towards or covering the menu or a dismiss
- snapBack(animView, 0);
- } else if (mSwipeHelper.isDismissGesture(ev)) {
- dismiss(animView, velocity);
- } else {
- // Didn't move enough to dismiss or cover, snap to the menu
- showMenu(animView, targetLeft, velocity);
- }
- } else if ((!gestureFastEnough && swipedEnoughToShowMenu())
- || (gestureTowardsMenu && !gestureFarEnough)) {
- // The menu has been snapped to previously, however, the menu is now on the
- // other side. If gesture is towards menu and not too far snap to the menu.
- showMenu(animView, targetLeft, velocity);
- } else if (mSwipeHelper.isDismissGesture(ev)) {
+ if (DEBUG) {
+ Log.d(TAG, "mTranslation= " + mTranslation
+ + " mAlpha= " + mAlpha
+ + " velocity= " + velocity
+ + " mMenuSnappedTo= " + mMenuSnappedTo
+ + " mMenuSnappedOnLeft= " + mMenuSnappedOnLeft
+ + " mOnLeft= " + mOnLeft
+ + " minDismissVel= " + mSwipeHelper.getMinDismissVelocity()
+ + " isDismissGesture= " + mSwipeHelper.isDismissGesture(ev)
+ + " gestureTowardsMenu= " + gestureTowardsMenu
+ + " gestureFastEnough= " + gestureFastEnough
+ + " gestureFarEnough= " + gestureFarEnough);
+ }
+
+ if (mMenuSnappedTo && isMenuVisible() && mMenuSnappedOnLeft == mOnLeft) {
+ // Menu was snapped to previously and we're on the same side, figure out if
+ // we should stick to the menu, snap back into place, or dismiss
+ final float maximumSwipeDistance = mHorizSpaceForIcon
+ * SWIPED_BACK_ENOUGH_TO_COVER_FRACTION;
+ final float targetLeft = getSpaceForMenu() - maximumSwipeDistance;
+ final float targetRight = mParent.getWidth() * SWIPED_FAR_ENOUGH_SIZE_FRACTION;
+ boolean withinSnapMenuThreshold = mOnLeft
+ ? mTranslation > targetLeft && mTranslation < targetRight
+ : mTranslation < -targetLeft && mTranslation > -targetRight;
+ boolean shouldSnapTo = mOnLeft ? mTranslation < targetLeft : mTranslation > -targetLeft;
+ if (DEBUG) {
+ Log.d(TAG, " withinSnapMenuThreshold= " + withinSnapMenuThreshold
+ + " shouldSnapTo= " + shouldSnapTo
+ + " targetLeft= " + targetLeft
+ + " targetRight= " + targetRight);
+ }
+ if (withinSnapMenuThreshold && !mSwipeHelper.isDismissGesture(ev)) {
+ // Haven't moved enough to unsnap from the menu
+ showMenu(animView, menuSnapTarget, velocity);
+ } else if (mSwipeHelper.isDismissGesture(ev) && !shouldSnapTo) {
+ // Only dismiss if we're not moving towards the menu
dismiss(animView, velocity);
} else {
snapBack(animView, velocity);
}
- } else if (((!gestureFastEnough || showMenuForSlowOnGoing)
- && swipedEnoughToShowMenu())
- || gestureTowardsMenu) {
+ } else if ((swipedEnoughToShowMenu() && (!gestureFastEnough || showMenuForSlowOnGoing))
+ || (gestureTowardsMenu && !mSwipeHelper.isDismissGesture(ev))) {
// Menu has not been snapped to previously and this is menu revealing gesture
- showMenu(animView, targetLeft, velocity);
- } else if (mSwipeHelper.isDismissGesture(ev)) {
+ showMenu(animView, menuSnapTarget, velocity);
+ } else if (mSwipeHelper.isDismissGesture(ev) && !gestureTowardsMenu) {
dismiss(animView, velocity);
} else {
snapBack(animView, velocity);
@@ -326,14 +355,18 @@
mSwipeHelper.dismiss(animView, velocity);
}
+ /**
+ * @return whether the notification has been translated enough to show the menu and not enough
+ * to be dismissed.
+ */
private boolean swipedEnoughToShowMenu() {
- // If the notification can't be dismissed then how far it can move is
- // restricted -- reduce the distance it needs to move in this case.
- final float multiplier = mParent.canViewBeDismissed() ? 0.4f : 0.2f;
- final float snapBackThreshold = getSpaceForMenu() * multiplier;
- return !mSwipeHelper.swipedFarEnough(0, 0) && isMenuVisible() && (mOnLeft
- ? mTranslation > snapBackThreshold
- : mTranslation < -snapBackThreshold);
+ final float multiplier = mParent.canViewBeDismissed()
+ ? SWIPED_FAR_ENOUGH_MENU_FRACTION
+ : SWIPED_FAR_ENOUGH_MENU_UNCLEARABLE_FRACTION;
+ final float minimumSwipeDistance = mHorizSpaceForIcon * multiplier;
+ return !mSwipeHelper.swipedFarEnough(0, 0) && isMenuVisible()
+ && (mOnLeft ? mTranslation > minimumSwipeDistance
+ : mTranslation < -minimumSwipeDistance);
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index b01d9cc..dc254f9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -24,6 +24,8 @@
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Rect;
+import android.graphics.drawable.Animatable;
+import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.telephony.SubscriptionInfo;
@@ -118,7 +120,6 @@
private boolean mBlockWifi;
private boolean mBlockEthernet;
private boolean mActivityEnabled;
- private boolean mForceBlockWifi;
public SignalClusterView(Context context) {
this(context, null);
@@ -150,16 +151,6 @@
updateActivityEnabled();
}
- public void setForceBlockWifi() {
- mForceBlockWifi = true;
- mBlockWifi = true;
- if (isAttachedToWindow()) {
- // Re-register to get new callbacks.
- mNetworkController.removeCallback(this);
- mNetworkController.addCallback(this);
- }
- }
-
@Override
public void onTuningChanged(String key, String newValue) {
if (!StatusBarIconController.ICON_BLACKLIST.equals(key)) {
@@ -176,7 +167,7 @@
mBlockAirplane = blockAirplane;
mBlockMobile = blockMobile;
mBlockEthernet = blockEthernet;
- mBlockWifi = blockWifi || mForceBlockWifi;
+ mBlockWifi = blockWifi;
// Re-register to get new callbacks.
mNetworkController.removeCallback(this);
mNetworkController.addCallback(this);
@@ -297,9 +288,9 @@
}
@Override
- public void setMobileDataIndicators(IconState statusIcon, int statusType,
- boolean activityIn, boolean activityOut, String typeContentDescription,
- int subId, boolean roaming, boolean isEmergency) {
+ public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
+ int qsType, boolean activityIn, boolean activityOut, String typeContentDescription,
+ String description, boolean isWide, int subId, boolean roaming) {
PhoneState state = getState(subId);
if (state == null) {
return;
@@ -309,6 +300,7 @@
state.mMobileTypeId = statusType;
state.mMobileDescription = statusIcon.contentDescription;
state.mMobileTypeDescription = typeContentDescription;
+ state.mIsMobileTypeIconWide = statusType != 0 && isWide;
state.mRoaming = roaming;
state.mActivityIn = activityIn && mActivityEnabled;
state.mActivityOut = activityOut && mActivityEnabled;
@@ -533,7 +525,7 @@
mWifiAirplaneSpacer.setVisibility(View.GONE);
}
- if (((anyMobileVisible && firstMobileTypeId == 0) || mNoSimsVisible) && mWifiVisible) {
+ if (((anyMobileVisible && firstMobileTypeId != 0) || mNoSimsVisible) && mWifiVisible) {
mWifiSignalSpacer.setVisibility(View.VISIBLE);
} else {
mWifiSignalSpacer.setVisibility(View.GONE);
@@ -644,6 +636,7 @@
private int mMobileStrengthId = 0, mMobileTypeId = 0;
private int mLastMobileStrengthId = -1;
private int mLastMobileTypeId = -1;
+ private boolean mIsMobileTypeIconWide;
private String mMobileDescription, mMobileTypeDescription;
private ViewGroup mMobileGroup;
@@ -699,8 +692,12 @@
// When this isn't next to wifi, give it some extra padding between the signals.
mMobileGroup.setPaddingRelative(isSecondaryIcon ? mSecondaryTelephonyPadding : 0,
0, 0, 0);
- mMobile.setPaddingRelative(mMobileDataIconStartPadding, 0, 0, 0);
- mMobileDark.setPaddingRelative(mMobileDataIconStartPadding, 0, 0, 0);
+ mMobile.setPaddingRelative(
+ mIsMobileTypeIconWide ? mWideTypeIconStartPadding : mMobileDataIconStartPadding,
+ 0, 0, 0);
+ mMobileDark.setPaddingRelative(
+ mIsMobileTypeIconWide ? mWideTypeIconStartPadding : mMobileDataIconStartPadding,
+ 0, 0, 0);
if (DEBUG) Log.d(TAG, String.format("mobile: %s sig=%d typ=%d",
(mMobileVisible ? "VISIBLE" : "GONE"), mMobileStrengthId, mMobileTypeId));
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ImageGradientColorizer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ImageGradientColorizer.java
new file mode 100644
index 0000000..82910b8
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ImageGradientColorizer.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.notification;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorMatrix;
+import android.graphics.ColorMatrixColorFilter;
+import android.graphics.LinearGradient;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Shader;
+import android.graphics.Xfermode;
+import android.graphics.drawable.Drawable;
+
+/**
+ * A utility class to colorize bitmaps with a color gradient and a special blending mode
+ */
+public class ImageGradientColorizer {
+ public Bitmap colorize(Drawable drawable, int backgroundColor) {
+ int width = drawable.getIntrinsicWidth();
+ int height = drawable.getIntrinsicHeight();
+ int size = Math.min(width, height);
+ int widthInset = (width - size) / 2;
+ int heightInset = (height - size) / 2;
+ drawable = drawable.mutate();
+ drawable.setBounds(- widthInset, - heightInset, width - widthInset, height - heightInset);
+ Bitmap newBitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(newBitmap);
+
+ // Values to calculate the luminance of a color
+ float lr = 0.2126f;
+ float lg = 0.7152f;
+ float lb = 0.0722f;
+
+ // Extract the red, green, blue components of the color extraction color in
+ // float and int form
+ int tri = Color.red(backgroundColor);
+ int tgi = Color.green(backgroundColor);
+ int tbi = Color.blue(backgroundColor);
+
+ float tr = tri / 255f;
+ float tg = tgi / 255f;
+ float tb = tbi / 255f;
+
+ // Calculate the luminance of the color extraction color
+ float cLum = (tr * lr + tg * lg + tb * lb) * 255;
+
+ ColorMatrix m = new ColorMatrix(new float[] {
+ lr, lg, lb, 0, tri - cLum,
+ lr, lg, lb, 0, tgi - cLum,
+ lr, lg, lb, 0, tbi - cLum,
+ 0, 0, 0, 1, 0,
+ });
+
+ drawable.setColorFilter(new ColorMatrixColorFilter(m));
+ drawable.draw(canvas);
+ Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ LinearGradient linearGradient = new LinearGradient(0, 0, size, 0,
+ new int[] {0, Color.argb(0.5f, 1, 1, 1), Color.BLACK},
+ new float[] {0.0f, 0.4f, 1.0f}, Shader.TileMode.CLAMP);
+ paint.setShader(linearGradient);
+ Bitmap fadeIn = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
+ Canvas fadeInCanvas = new Canvas(fadeIn);
+ drawable.clearColorFilter();
+ drawable.draw(fadeInCanvas);
+ paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
+ fadeInCanvas.drawPaint(paint);
+ canvas.drawBitmap(fadeIn, 0, 0, null);
+
+ linearGradient = new LinearGradient(0, 0, size, 0,
+ new int[] {backgroundColor, Color.argb(0.5f, tr, tg, tb), 0},
+ new float[] {0.0f, 0.6f, 1.0f}, Shader.TileMode.CLAMP);
+ paint.setShader(linearGradient);
+ paint.setXfermode(null);
+ canvas.drawPaint(paint);
+ return newBitmap;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java
new file mode 100644
index 0000000..cef225b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java
@@ -0,0 +1,259 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.notification;
+
+import android.app.Notification;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+import android.support.v4.graphics.ColorUtils;
+import android.support.v7.graphics.Palette;
+
+import com.android.systemui.R;
+
+import java.util.List;
+
+/**
+ * A class the processes media notifications and extracts the right text and background colors.
+ */
+public class MediaNotificationProcessor {
+
+ /**
+ * The fraction below which we select the vibrant instead of the light/dark vibrant color
+ */
+ private static final float POPULATION_FRACTION_FOR_MORE_VIBRANT = 0.75f;
+ private static final float POPULATION_FRACTION_FOR_WHITE_OR_BLACK = 2.5f;
+ private static final float BLACK_MAX_LIGHTNESS = 0.08f;
+ private static final float WHITE_MIN_LIGHTNESS = 0.92f;
+ private static final int RESIZE_BITMAP_AREA = 150 * 150;
+ private final ImageGradientColorizer mColorizer;
+ private final Context mContext;
+ private float[] mFilteredBackgroundHsl = null;
+ private Palette.Filter mBlackWhiteFilter = (rgb, hsl) -> !isWhiteOrBlack(hsl);
+
+ /**
+ * The context of the notification. This is the app context of the package posting the
+ * notification.
+ */
+ private final Context mPackageContext;
+ private boolean mIsLowPriority;
+
+ public MediaNotificationProcessor(Context context, Context packageContext) {
+ mContext = context;
+ mPackageContext = packageContext;
+ mColorizer = new ImageGradientColorizer();
+ }
+
+ /**
+ * Processes a builder of a media notification and calculates the appropriate colors that should
+ * be used.
+ *
+ * @param notification the notification that is being processed
+ * @param builder the recovered builder for the notification. this will be modified
+ */
+ public void processNotification(Notification notification, Notification.Builder builder) {
+ Icon largeIcon = notification.getLargeIcon();
+ Bitmap bitmap = null;
+ Drawable drawable = null;
+ if (largeIcon != null) {
+ drawable = largeIcon.loadDrawable(mPackageContext);
+ int backgroundColor = 0;
+ if (notification.isColorizedMedia()) {
+ int width = drawable.getIntrinsicWidth();
+ int height = drawable.getIntrinsicHeight();
+ int area = width * height;
+ if (area > RESIZE_BITMAP_AREA) {
+ double factor = Math.sqrt((float) RESIZE_BITMAP_AREA / area);
+ width = (int) (factor * width);
+ height = (int) (factor * height);
+ }
+ bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(bitmap);
+ drawable.setBounds(0, 0, width, height);
+ drawable.draw(canvas);
+
+ // for the background we only take the left side of the image to ensure
+ // a smooth transition
+ Palette.Builder paletteBuilder = Palette.from(bitmap)
+ .setRegion(0, 0, bitmap.getWidth() / 2, bitmap.getHeight())
+ .clearFilters() // we want all colors, red / white / black ones too!
+ .resizeBitmapArea(RESIZE_BITMAP_AREA);
+ Palette palette = paletteBuilder.generate();
+ backgroundColor = findBackgroundColorAndFilter(palette);
+ // we want the full region again
+ paletteBuilder.setRegion(0, 0, bitmap.getWidth(), bitmap.getHeight());
+ if (mFilteredBackgroundHsl != null) {
+ paletteBuilder.addFilter((rgb, hsl) -> {
+ // at least 10 degrees hue difference
+ float diff = Math.abs(hsl[0] - mFilteredBackgroundHsl[0]);
+ return diff > 10 && diff < 350;
+ });
+ }
+ paletteBuilder.addFilter(mBlackWhiteFilter);
+ palette = paletteBuilder.generate();
+ int foregroundColor;
+ if (ColorUtils.calculateLuminance(backgroundColor) > 0.5) {
+ Palette.Swatch first = palette.getDarkVibrantSwatch();
+ Palette.Swatch second = palette.getVibrantSwatch();
+ if (first != null && second != null) {
+ int firstPopulation = first.getPopulation();
+ int secondPopulation = second.getPopulation();
+ if (firstPopulation / secondPopulation
+ < POPULATION_FRACTION_FOR_MORE_VIBRANT) {
+ foregroundColor = second.getRgb();
+ } else {
+ foregroundColor = first.getRgb();
+ }
+ } else if (first != null) {
+ foregroundColor = first.getRgb();
+ } else if (second != null) {
+ foregroundColor = second.getRgb();
+ } else {
+ first = palette.getMutedSwatch();
+ second = palette.getDarkMutedSwatch();
+ if (first != null && second != null) {
+ float firstSaturation = first.getHsl()[1];
+ float secondSaturation = second.getHsl()[1];
+ if (firstSaturation > secondSaturation) {
+ foregroundColor = first.getRgb();
+ } else {
+ foregroundColor = second.getRgb();
+ }
+ } else if (first != null) {
+ foregroundColor = first.getRgb();
+ } else if (second != null) {
+ foregroundColor = second.getRgb();
+ } else {
+ foregroundColor = Color.BLACK;
+ }
+ }
+ } else {
+ Palette.Swatch first = palette.getLightVibrantSwatch();
+ Palette.Swatch second = palette.getVibrantSwatch();
+ if (first != null && second != null) {
+ int firstPopulation = first.getPopulation();
+ int secondPopulation = second.getPopulation();
+ if (firstPopulation / secondPopulation
+ < POPULATION_FRACTION_FOR_MORE_VIBRANT) {
+ foregroundColor = second.getRgb();
+ } else {
+ foregroundColor = first.getRgb();
+ }
+ } else if (first != null) {
+ foregroundColor = first.getRgb();
+ } else if (second != null) {
+ foregroundColor = second.getRgb();
+ } else {
+ first = palette.getMutedSwatch();
+ second = palette.getLightMutedSwatch();
+ if (first != null && second != null) {
+ float firstSaturation = first.getHsl()[1];
+ float secondSaturation = second.getHsl()[1];
+ if (firstSaturation > secondSaturation) {
+ foregroundColor = first.getRgb();
+ } else {
+ foregroundColor = second.getRgb();
+ }
+ } else if (first != null) {
+ foregroundColor = first.getRgb();
+ } else if (second != null) {
+ foregroundColor = second.getRgb();
+ } else {
+ foregroundColor = Color.WHITE;
+ }
+ }
+ }
+ builder.setColorPalette(backgroundColor, foregroundColor);
+ } else {
+ int id = mIsLowPriority
+ ? R.color.notification_material_background_low_priority_color
+ : R.color.notification_material_background_color;
+ backgroundColor = mContext.getColor(id);
+ }
+ Bitmap colorized = mColorizer.colorize(drawable, backgroundColor);
+ builder.setLargeIcon(Icon.createWithBitmap(colorized));
+ }
+ }
+
+ private int findBackgroundColorAndFilter(Palette palette) {
+ // by default we use the dominant palette
+ Palette.Swatch dominantSwatch = palette.getDominantSwatch();
+ if (dominantSwatch == null) {
+ // We're not filtering on white or black
+ mFilteredBackgroundHsl = null;
+ return Color.WHITE;
+ }
+
+ if (!isWhiteOrBlack(dominantSwatch.getHsl())) {
+ mFilteredBackgroundHsl = dominantSwatch.getHsl();
+ return dominantSwatch.getRgb();
+ }
+ // Oh well, we selected black or white. Lets look at the second color!
+ List<Palette.Swatch> swatches = palette.getSwatches();
+ float highestNonWhitePopulation = -1;
+ Palette.Swatch second = null;
+ for (Palette.Swatch swatch: swatches) {
+ if (swatch != dominantSwatch
+ && swatch.getPopulation() > highestNonWhitePopulation
+ && !isWhiteOrBlack(swatch.getHsl())) {
+ second = swatch;
+ highestNonWhitePopulation = swatch.getPopulation();
+ }
+ }
+ if (second == null) {
+ // We're not filtering on white or black
+ mFilteredBackgroundHsl = null;
+ return dominantSwatch.getRgb();
+ }
+ if (dominantSwatch.getPopulation() / highestNonWhitePopulation
+ > POPULATION_FRACTION_FOR_WHITE_OR_BLACK) {
+ // The dominant swatch is very dominant, lets take it!
+ // We're not filtering on white or black
+ mFilteredBackgroundHsl = null;
+ return dominantSwatch.getRgb();
+ } else {
+ mFilteredBackgroundHsl = second.getHsl();
+ return second.getRgb();
+ }
+ }
+
+ private boolean isWhiteOrBlack(float[] hsl) {
+ return isBlack(hsl) || isWhite(hsl);
+ }
+
+
+ /**
+ * @return true if the color represents a color which is close to black.
+ */
+ private boolean isBlack(float[] hslColor) {
+ return hslColor[2] <= BLACK_MAX_LIGHTNESS;
+ }
+
+ /**
+ * @return true if the color represents a color which is close to white.
+ */
+ private boolean isWhite(float[] hslColor) {
+ return hslColor[2] >= WHITE_MIN_LIGHTNESS;
+ }
+
+ public void setIsLowPriority(boolean isLowPriority) {
+ mIsLowPriority = isLowPriority;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
index 2e34f24..7cfc767 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
@@ -18,11 +18,10 @@
import android.app.Notification;
import android.content.Context;
+import android.os.AsyncTask;
import android.service.notification.StatusBarNotification;
import android.util.Log;
import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewParent;
import android.widget.RemoteViews;
import com.android.internal.annotations.VisibleForTesting;
@@ -39,7 +38,8 @@
@VisibleForTesting
static final int FLAG_REINFLATE_ALL = ~0;
private static final int FLAG_REINFLATE_CONTENT_VIEW = 1<<0;
- private static final int FLAG_REINFLATE_EXPANDED_VIEW = 1<<1;
+ @VisibleForTesting
+ static final int FLAG_REINFLATE_EXPANDED_VIEW = 1<<1;
private static final int FLAG_REINFLATE_HEADS_UP_VIEW = 1<<2;
private static final int FLAG_REINFLATE_PUBLIC_VIEW = 1<<3;
private static final int FLAG_REINFLATE_AMBIENT_VIEW = 1<<4;
@@ -50,7 +50,7 @@
private boolean mUsesIncreasedHeadsUpHeight;
private RemoteViews.OnClickHandler mRemoteViewClickHandler;
private boolean mIsChildInGroup;
- private InflationExceptionHandler mInflateExceptionHandler;
+ private InflationCallback mCallback;
private boolean mRedactAmbient;
public NotificationInflater(ExpandableNotificationRow row) {
@@ -66,21 +66,14 @@
*
* @return whether the view was re-inflated
*/
- public boolean setIsChildInGroup(boolean childInGroup) {
+ public void setIsChildInGroup(boolean childInGroup) {
if (childInGroup != mIsChildInGroup) {
mIsChildInGroup = childInGroup;
if (mIsLowPriority) {
- try {
- int flags = FLAG_REINFLATE_CONTENT_VIEW | FLAG_REINFLATE_EXPANDED_VIEW;
- inflateNotificationViews(flags);
- } catch (InflationException e) {
- mInflateExceptionHandler.handleInflationException(
- mRow.getStatusBarNotification(), e);
- }
+ int flags = FLAG_REINFLATE_CONTENT_VIEW | FLAG_REINFLATE_EXPANDED_VIEW;
+ inflateNotificationViews(flags);
}
- return true;
- }
- return false;
+ } ;
}
public void setUsesIncreasedHeight(boolean usesIncreasedHeight) {
@@ -101,39 +94,29 @@
if (mRow.getEntry() == null) {
return;
}
- try {
- inflateNotificationViews(FLAG_REINFLATE_AMBIENT_VIEW);
- } catch (InflationException e) {
- mInflateExceptionHandler.handleInflationException(
- mRow.getStatusBarNotification(), e);
- }
+ inflateNotificationViews(FLAG_REINFLATE_AMBIENT_VIEW);
}
}
- public void inflateNotificationViews() throws InflationException {
+ /**
+ * Inflate all views of this notification on a background thread. This is asynchronous and will
+ * notify the callback once it's finished.
+ */
+ public void inflateNotificationViews() {
inflateNotificationViews(FLAG_REINFLATE_ALL);
}
/**
- * reinflate all views for the specified flags
+ * Reinflate all views for the specified flags on a background thread. This is asynchronous and
+ * will notify the callback once it's finished.
+ *
* @param reInflateFlags flags which views should be reinflated. Use {@link #FLAG_REINFLATE_ALL}
* to reinflate all of views.
- * @throws InflationException
*/
- private void inflateNotificationViews(int reInflateFlags)
- throws InflationException {
+ @VisibleForTesting
+ void inflateNotificationViews(int reInflateFlags) {
StatusBarNotification sbn = mRow.getEntry().notification;
- try {
- final Notification.Builder recoveredBuilder
- = Notification.Builder.recoverBuilder(mRow.getContext(), sbn.getNotification());
- Context packageContext = sbn.getPackageContext(mRow.getContext());
- inflateNotificationViews(reInflateFlags, recoveredBuilder, packageContext);
-
- } catch (RuntimeException e) {
- final String ident = sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId());
- Log.e(StatusBar.TAG, "couldn't inflate view for notification " + ident, e);
- throw new InflationException("Couldn't inflate contentViews");
- }
+ new AsyncInflationTask(mRow.getContext(), sbn, reInflateFlags).execute();
}
@VisibleForTesting
@@ -284,12 +267,13 @@
&& a.getLayoutId() == b.getLayoutId());
}
- public void setInflateExceptionHandler(InflationExceptionHandler inflateExceptionHandler) {
- mInflateExceptionHandler = inflateExceptionHandler;
+ public void setInflationCallback(InflationCallback callback) {
+ mCallback = callback;
}
- public interface InflationExceptionHandler {
+ public interface InflationCallback {
void handleInflationException(StatusBarNotification notification, InflationException e);
+ void onAsyncInflationFinished(NotificationData.Entry entry);
}
public void onDensityOrFontScaleChanged() {
@@ -299,12 +283,75 @@
entry.cachedContentView = null;
entry.cachedHeadsUpContentView = null;
entry.cachedPublicContentView = null;
- try {
- inflateNotificationViews();
- } catch (InflationException e) {
- mInflateExceptionHandler.handleInflationException(
- mRow.getStatusBarNotification(), e);
+ inflateNotificationViews();
+ }
+
+ private class AsyncInflationTask extends AsyncTask<Void, Void, Notification.Builder> {
+
+ private final StatusBarNotification mSbn;
+ private final Context mContext;
+ private final int mReInflateFlags;
+ private Context mPackageContext = null;
+ private Exception mError;
+
+ private AsyncInflationTask(Context context, StatusBarNotification notification,
+ int reInflateFlags) {
+ mSbn = notification;
+ mContext = context;
+ mReInflateFlags = reInflateFlags;
+ mRow.getEntry().addInflationTask(this);
+ }
+
+ @Override
+ protected Notification.Builder doInBackground(Void... params) {
+ try {
+ final Notification.Builder recoveredBuilder
+ = Notification.Builder.recoverBuilder(mContext,
+ mSbn.getNotification());
+ mPackageContext = mSbn.getPackageContext(mContext);
+ Notification notification = mSbn.getNotification();
+ if (notification.isMediaNotification()) {
+ MediaNotificationProcessor processor = new MediaNotificationProcessor(mContext,
+ mPackageContext);
+ processor.setIsLowPriority(mIsLowPriority);
+ processor.processNotification(notification, recoveredBuilder);
+ }
+ return recoveredBuilder;
+ } catch (Exception e) {
+ mError = e;
+ return null;
+ }
+ }
+
+ @Override
+ protected void onPostExecute(Notification.Builder builder) {
+ mRow.getEntry().onInflationTaskFinished(this);
+ if (mError == null) {
+ finishInflation(mReInflateFlags, builder, mPackageContext);
+ } else {
+ handleError(mError);
+ }
}
}
+ private void finishInflation(int reinflationFlags, Notification.Builder builder,
+ Context context) {
+ try {
+ inflateNotificationViews(reinflationFlags, builder, context);
+ } catch (RuntimeException e){
+ handleError(e);
+ return;
+ }
+ mRow.onNotificationUpdated();
+ mCallback.onAsyncInflationFinished(mRow.getEntry());
+ }
+
+ private void handleError(Exception e) {
+ StatusBarNotification sbn = mRow.getStatusBarNotification();
+ final String ident = sbn.getPackageName() + "/0x"
+ + Integer.toHexString(sbn.getId());
+ Log.e(StatusBar.TAG, "couldn't inflate view for notification " + ident, e);
+ mCallback.handleInflationException(sbn,
+ new InflationException("Couldn't inflate contentViews" + e));
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationMediaTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationMediaTemplateViewWrapper.java
index ef5a25c..8596cb3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationMediaTemplateViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationMediaTemplateViewWrapper.java
@@ -56,4 +56,9 @@
mActions);
}
}
+
+ @Override
+ public boolean isDimmable() {
+ return false;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java
index f4db9a1..5cc39cc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java
@@ -178,4 +178,8 @@
public void setIsChildInGroup(boolean isChildInGroup) {
}
+
+ public boolean isDimmable() {
+ return true;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
index 40776ea..e1ca929 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
@@ -59,9 +59,6 @@
pw.print(" getPickupVibrationThreshold(): "); pw.println(getPickupVibrationThreshold());
pw.print(" getPickupSubtypePerformsProxCheck(): ");pw.println(
dumpPickupSubtypePerformsProxCheck());
- if (mAmbientDisplayConfiguration.alwaysOnAvailable()) {
- pw.print(" getSensorsWakeUpFully(): "); pw.println(getSensorsWakeUpFully());
- }
}
private String dumpPickupSubtypePerformsProxCheck() {
@@ -122,12 +119,6 @@
return mAmbientDisplayConfiguration.alwaysOnEnabled(UserHandle.USER_CURRENT);
}
- public boolean getSensorsWakeUpFully() {
- return mAmbientDisplayConfiguration.alwaysOnAvailable()
- && Settings.Secure.getIntForUser(mContext.getContentResolver(),
- DOZE_SENSORS_WAKE_UP_FULLY, 0, UserHandle.USER_CURRENT) != 0;
- }
-
private boolean getBoolean(String propName, int resId) {
return SystemProperties.getBoolean(propName, mContext.getResources().getBoolean(resId));
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
index dee15d8..14c1606 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
@@ -87,6 +87,7 @@
return mAnimationFilter;
}
}.setDuration(200).setDelay(50);
+ public static final int MAX_VISIBLE_ICONS_WHEN_DARK = 5;
private boolean mShowAllIcons = true;
private final HashMap<View, IconState> mIconStates = new HashMap<>();
@@ -243,6 +244,7 @@
float translationX = getActualPaddingStart();
int firstOverflowIndex = -1;
int childCount = getChildCount();
+ int maxVisibleIcons = mDark ? MAX_VISIBLE_ICONS_WHEN_DARK : childCount;
float layoutEnd = getLayoutEnd();
float overflowStart = layoutEnd - mIconSize * (2 + OVERFLOW_EARLY_AMOUNT);
boolean hasAmbient = mSpeedBumpIndex != -1 && mSpeedBumpIndex < getChildCount();
@@ -251,21 +253,21 @@
View view = getChildAt(i);
IconState iconState = mIconStates.get(view);
iconState.xTranslation = translationX;
- boolean isAmbient = mSpeedBumpIndex != -1 && i >= mSpeedBumpIndex
- && iconState.iconAppearAmount > 0.0f;
+ boolean forceOverflow = mSpeedBumpIndex != -1 && i >= mSpeedBumpIndex
+ && iconState.iconAppearAmount > 0.0f || i >= maxVisibleIcons;
boolean noOverflowAfter = i == childCount - 1;
if (mOpenedAmount != 0.0f) {
- noOverflowAfter = noOverflowAfter && !hasAmbient;
+ noOverflowAfter = noOverflowAfter && !hasAmbient && !forceOverflow;
}
iconState.visibleState = StatusBarIconView.STATE_ICON;
- if (firstOverflowIndex == -1 && (isAmbient
+ if (firstOverflowIndex == -1 && (forceOverflow
|| (translationX >= (noOverflowAfter ? layoutEnd - mIconSize : overflowStart)))) {
- firstOverflowIndex = noOverflowAfter && !isAmbient ? i - 1 : i;
+ firstOverflowIndex = noOverflowAfter && !forceOverflow ? i - 1 : i;
int totalDotLength = mStaticDotRadius * 6 + 2 * mDotPadding;
visualOverflowStart = overflowStart + mIconSize * (1 + OVERFLOW_EARLY_AMOUNT)
- totalDotLength / 2
- mIconSize * 0.5f + mStaticDotRadius;
- if (isAmbient) {
+ if (forceOverflow) {
visualOverflowStart = Math.min(translationX, visualOverflowStart
+ mStaticDotRadius * 2 + mDotPadding);
} else {
@@ -318,6 +320,12 @@
boolean center = mDark;
if (center && translationX < getLayoutEnd()) {
float delta = (getLayoutEnd() - translationX) / 2;
+ if (firstOverflowIndex != -1) {
+ // If we have an overflow, only count those half for centering because the dots
+ // don't have a lot of visual weight.
+ float deltaIgnoringOverflow = (getLayoutEnd() - visualOverflowStart) / 2;
+ delta = (deltaIgnoringOverflow + delta) / 2;
+ }
for (int i = 0; i < childCount; i++) {
View view = getChildAt(i);
IconState iconState = mIconStates.get(view);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java
index 6361eb6..a9eb20b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java
@@ -57,12 +57,12 @@
private static final int LEVEL_MASK = 0xff;
private static final int NUM_LEVEL_SHIFT = 8;
private static final int NUM_LEVEL_MASK = 0xff << NUM_LEVEL_SHIFT;
- public static final int STATE_SHIFT = 16;
- public static final int STATE_MASK = 0xff << STATE_SHIFT;
- public static final int STATE_NONE = 0;
- public static final int STATE_EMPTY = 1;
- public static final int STATE_CUT = 2;
- public static final int STATE_CARRIER_CHANGE = 3;
+ private static final int STATE_SHIFT = 16;
+ private static final int STATE_MASK = 0xff << STATE_SHIFT;
+ private static final int STATE_NONE = 0;
+ private static final int STATE_EMPTY = 1;
+ private static final int STATE_CUT = 2;
+ private static final int STATE_CARRIER_CHANGE = 3;
private static final long DOT_DELAY = 1000;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 46d6415..c1859fe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -22,7 +22,7 @@
import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
import static android.app.StatusBarManager.windowStateToString;
-import static com.android.systemui.statusbar.notification.NotificationInflater.InflationExceptionHandler;
+import static com.android.systemui.statusbar.notification.NotificationInflater.InflationCallback;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
@@ -257,7 +257,7 @@
OnHeadsUpChangedListener, VisualStabilityManager.Callback, CommandQueue.Callbacks,
ActivatableNotificationView.OnActivatedListener,
ExpandableNotificationRow.ExpansionLogger, NotificationData.Environment,
- ExpandableNotificationRow.OnExpandClickListener {
+ ExpandableNotificationRow.OnExpandClickListener, InflationCallback {
public static final boolean MULTIUSER_DEBUG = false;
public static final boolean ENABLE_REMOTE_INPUT =
@@ -713,8 +713,8 @@
private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger();
private NotificationIconAreaController mNotificationIconAreaController;
private ConfigurationListener mConfigurationListener;
- private InflationExceptionHandler mInflationExceptionHandler = this::handleInflationException;
private boolean mReinflateNotificationsOnUserSwitched;
+ private HashMap<String, Entry> mPendingNotifications = new HashMap<>();
private void recycleAllVisibilityObjects(ArraySet<NotificationVisibility> array) {
final int N = array.size();
@@ -1544,29 +1544,24 @@
return new UserHandle(mCurrentUserId);
}
- public void addNotification(StatusBarNotification notification, RankingMap ranking,
- Entry oldEntry) throws InflationException {
- if (DEBUG) Log.d(TAG, "addNotification key=" + notification.getKey());
+ public void addNotification(StatusBarNotification notification, RankingMap ranking)
+ throws InflationException {
+ String key = notification.getKey();
+ if (DEBUG) Log.d(TAG, "addNotification key=" + key);
mNotificationData.updateRanking(ranking);
Entry shadeEntry = createNotificationViews(notification);
boolean isHeadsUped = shouldPeek(shadeEntry);
- if (isHeadsUped) {
- mHeadsUpManager.showNotification(shadeEntry);
- // Mark as seen immediately
- setNotificationShown(notification);
- }
-
if (!isHeadsUped && notification.getNotification().fullScreenIntent != null) {
- if (shouldSuppressFullScreenIntent(notification.getKey())) {
+ if (shouldSuppressFullScreenIntent(key)) {
if (DEBUG) {
- Log.d(TAG, "No Fullscreen intent: suppressed by DND: " + notification.getKey());
+ Log.d(TAG, "No Fullscreen intent: suppressed by DND: " + key);
}
- } else if (mNotificationData.getImportance(notification.getKey())
+ } else if (mNotificationData.getImportance(key)
< NotificationManager.IMPORTANCE_HIGH) {
if (DEBUG) {
Log.d(TAG, "No Fullscreen intent: not important enough: "
- + notification.getKey());
+ + key);
}
} else {
// Stop screensaver if the notification has a full-screen intent.
@@ -1578,7 +1573,7 @@
Log.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent");
try {
EventLog.writeEvent(EventLogTags.SYSUI_FULLSCREEN_NOTIFICATION,
- notification.getKey());
+ key);
notification.getNotification().fullScreenIntent.send();
shadeEntry.notifyFullScreenIntentLaunched();
mMetricsLogger.count("note_fullscreen", 1);
@@ -1586,15 +1581,47 @@
}
}
}
- addNotificationViews(shadeEntry, ranking);
+ abortExistingInflation(key);
+ mPendingNotifications.put(key, shadeEntry);
+ }
+
+ private void abortExistingInflation(String key) {
+ if (mPendingNotifications.containsKey(key)) {
+ Entry entry = mPendingNotifications.get(key);
+ entry.abortInflation();
+ mPendingNotifications.remove(key);
+ }
+ Entry addedEntry = mNotificationData.get(key);
+ if (addedEntry != null) {
+ addedEntry.abortInflation();
+ }
+ }
+
+ private void addEntry(Entry shadeEntry) {
+ boolean isHeadsUped = shouldPeek(shadeEntry);
+ if (isHeadsUped) {
+ mHeadsUpManager.showNotification(shadeEntry);
+ // Mark as seen immediately
+ setNotificationShown(shadeEntry.notification);
+ }
+ addNotificationViews(shadeEntry);
// Recalculate the position of the sliding windows and the titles.
setAreThereNotifications();
}
+ @Override
public void handleInflationException(StatusBarNotification notification, InflationException e) {
handleNotificationError(notification, e.getMessage());
}
+ @Override
+ public void onAsyncInflationFinished(Entry entry) {
+ mPendingNotifications.remove(entry.key);
+ if (mNotificationData.get(entry.key) == null) {
+ addEntry(entry);
+ }
+ }
+
private boolean shouldSuppressFullScreenIntent(String key) {
if (isDeviceInVrMode()) {
return true;
@@ -1614,6 +1641,7 @@
public void removeNotification(String key, RankingMap ranking) {
boolean deferRemoval = false;
+ abortExistingInflation(key);
if (mHeadsUpManager.isHeadsUp(key)) {
// A cancel() in repsonse to a remote input shouldn't be delayed, as it makes the
// sending look longer than it takes.
@@ -3295,6 +3323,14 @@
+ " scroll " + mStackScroller.getScrollX()
+ "," + mStackScroller.getScrollY());
}
+ pw.print(" mPendingNotifications=");
+ if (mPendingNotifications.size() == 0) {
+ pw.println("null");
+ } else {
+ for (Entry entry : mPendingNotifications.values()) {
+ pw.println(entry.notification);
+ }
+ }
pw.print(" mInteractingWindows="); pw.println(mInteractingWindows);
pw.print(" mStatusBarWindowState=");
@@ -5531,7 +5567,7 @@
public void run() {
for (StatusBarNotification sbn : notifications) {
try {
- addNotification(sbn, currentRanking, null /* oldEntry */);
+ addNotification(sbn, currentRanking);
} catch (InflationException e) {
handleInflationException(sbn, e);
}
@@ -5574,7 +5610,7 @@
if (isUpdate) {
updateNotification(sbn, rankingMap);
} else {
- addNotification(sbn, rankingMap, null /* oldEntry */);
+ addNotification(sbn, rankingMap);
}
} catch (InflationException e) {
handleInflationException(sbn, e);
@@ -6132,8 +6168,7 @@
}
}
- protected void inflateViews(Entry entry, ViewGroup parent) throws
- InflationException {
+ protected void inflateViews(Entry entry, ViewGroup parent) {
PackageManager pmUser = getPackageManagerForUser(mContext,
entry.notification.getUser().getIdentifier());
@@ -6154,7 +6189,7 @@
row.setRemoteInputController(mRemoteInputController);
row.setOnExpandClickListener(this);
row.setRemoteViewClickHandler(mOnClickHandler);
- row.setInflateExceptionHandler(mInflationExceptionHandler);
+ row.setInflationCallback(this);
// Get the app name.
// Note that Notification.Builder#bindHeaderAppName has similar logic
@@ -6552,12 +6587,12 @@
return entry;
}
- protected void addNotificationViews(Entry entry, RankingMap ranking) {
+ protected void addNotificationViews(Entry entry) {
if (entry == null) {
return;
}
// Add the expanded view and icon.
- mNotificationData.add(entry, ranking);
+ mNotificationData.add(entry);
updateNotifications();
}
@@ -6675,6 +6710,7 @@
if (DEBUG) Log.d(TAG, "updateNotification(" + notification + ")");
final String key = notification.getKey();
+ abortExistingInflation(key);
Entry entry = mNotificationData.get(key);
if (entry == null) {
return;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessibilityManagerWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessibilityManagerWrapper.java
index dfa5cbd..6a573f5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessibilityManagerWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessibilityManagerWrapper.java
@@ -19,7 +19,7 @@
import android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener;
/**
- * For mocking because AccessibilyManager is final for some reason...
+ * For mocking because AccessibilityManager is final for some reason...
*/
public class AccessibilityManagerWrapper implements
CallbackController<AccessibilityServicesStateChangeListener> {
@@ -32,7 +32,7 @@
@Override
public void addCallback(AccessibilityServicesStateChangeListener listener) {
- mAccessibilityManager.addAccessibilityServicesStateChangeListener(listener);
+ mAccessibilityManager.addAccessibilityServicesStateChangeListener(listener, null);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java
index e98dc98..a456786 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java
@@ -110,24 +110,30 @@
public void setWifiIndicators(final boolean enabled, final IconState statusIcon,
final IconState qsIcon, final boolean activityIn, final boolean activityOut,
final String description, boolean isTransient) {
- post(() -> {
- for (SignalCallback callback : mSignalCallbacks) {
- callback.setWifiIndicators(enabled, statusIcon, qsIcon, activityIn, activityOut,
- description, isTransient);
+ post(new Runnable() {
+ @Override
+ public void run() {
+ for (SignalCallback callback : mSignalCallbacks) {
+ callback.setWifiIndicators(enabled, statusIcon, qsIcon, activityIn, activityOut,
+ description, isTransient);
+ }
}
});
}
@Override
- public void setMobileDataIndicators(final IconState statusIcon,
- final int statusType, final boolean activityIn,
+ public void setMobileDataIndicators(final IconState statusIcon, final IconState qsIcon,
+ final int statusType, final int qsType,final boolean activityIn,
final boolean activityOut, final String typeContentDescription,
- final int subId, boolean roaming, boolean isEmergency) {
- post(() -> {
- for (SignalCallback signalCluster : mSignalCallbacks) {
- signalCluster.setMobileDataIndicators(statusIcon, statusType,
- activityIn, activityOut, typeContentDescription,
- subId, roaming, isEmergency);
+ final String description, final boolean isWide, final int subId, boolean roaming) {
+ post(new Runnable() {
+ @Override
+ public void run() {
+ for (SignalCallback signalCluster : mSignalCallbacks) {
+ signalCluster.setMobileDataIndicators(statusIcon, qsIcon, statusType, qsType,
+ activityIn, activityOut, typeContentDescription, description, isWide,
+ subId, roaming);
+ }
}
});
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
index 4421a6a..67b5596 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
@@ -244,8 +244,7 @@
return SignalDrawable.getCarrierChangeState(getNumLevels());
} else if (mCurrentState.connected) {
return SignalDrawable.getState(mCurrentState.level, getNumLevels(),
- mCurrentState.inetCondition == 0 ||
- (mCurrentState.dataDisabled && mCurrentState.userSetup));
+ mCurrentState.inetCondition == 0);
} else if (mCurrentState.enabled) {
return SignalDrawable.getEmptyState(getNumLevels());
} else {
@@ -264,14 +263,24 @@
String contentDescription = getStringIfExists(getContentDescription());
String dataContentDescription = getStringIfExists(icons.mDataContentDescription);
- final boolean dataDisabled = mCurrentState.dataDisabled
+ final boolean dataDisabled = mCurrentState.iconGroup == TelephonyIcons.DATA_DISABLED
&& mCurrentState.userSetup;
// Show icon in QS when we are connected or data is disabled.
- boolean showDataIcon = mCurrentState.dataConnected;
+ boolean showDataIcon = mCurrentState.dataConnected || dataDisabled;
IconState statusIcon = new IconState(mCurrentState.enabled && !mCurrentState.airplaneMode,
getCurrentIconId(), contentDescription);
+ int qsTypeIcon = 0;
+ IconState qsIcon = null;
+ String description = null;
+ // Only send data sim callbacks to QS.
+ if (mCurrentState.dataSim) {
+ qsTypeIcon = showDataIcon ? icons.mQsDataType : 0;
+ qsIcon = new IconState(mCurrentState.enabled
+ && !mCurrentState.isEmergency, getQsCurrentIconId(), contentDescription);
+ description = mCurrentState.isEmergency ? null : mCurrentState.networkName;
+ }
boolean activityIn = mCurrentState.dataConnected
&& !mCurrentState.carrierNetworkChangeMode
&& mCurrentState.activityIn;
@@ -280,10 +289,9 @@
&& mCurrentState.activityOut;
showDataIcon &= mCurrentState.isDefault || dataDisabled;
int typeIcon = showDataIcon ? icons.mDataType : 0;
- callback.setMobileDataIndicators(statusIcon, typeIcon,
- activityIn, activityOut, dataContentDescription,
- mSubscriptionInfo.getSubscriptionId(), mCurrentState.roaming,
- mCurrentState.isEmergency);
+ callback.setMobileDataIndicators(statusIcon, qsIcon, typeIcon, qsTypeIcon,
+ activityIn, activityOut, dataContentDescription, description, icons.mIsWide,
+ mSubscriptionInfo.getSubscriptionId(), mCurrentState.roaming);
}
@Override
@@ -430,14 +438,14 @@
} else {
mCurrentState.iconGroup = mDefaultIcons;
}
- mCurrentState.dataDisabled = isDataDisabled();
mCurrentState.dataConnected = mCurrentState.connected
- && mDataState == TelephonyManager.DATA_CONNECTED
- && !mCurrentState.dataDisabled;
+ && mDataState == TelephonyManager.DATA_CONNECTED;
mCurrentState.roaming = isRoaming();
if (isCarrierNetworkChangeActive()) {
mCurrentState.iconGroup = TelephonyIcons.CARRIER_NETWORK_CHANGE;
+ } else if (isDataDisabled()) {
+ mCurrentState.iconGroup = TelephonyIcons.DATA_DISABLED;
}
if (isEmergencyOnly() != mCurrentState.isEmergency) {
mCurrentState.isEmergency = isEmergencyOnly();
@@ -569,7 +577,6 @@
boolean isDefault;
boolean userSetup;
boolean roaming;
- boolean dataDisabled;
@Override
public void copyFrom(State s) {
@@ -585,7 +592,6 @@
carrierNetworkChangeMode = state.carrierNetworkChangeMode;
userSetup = state.userSetup;
roaming = state.roaming;
- dataDisabled = state.dataDisabled;
}
@Override
@@ -603,7 +609,6 @@
builder.append("carrierNetworkChangeMode=").append(carrierNetworkChangeMode)
.append(',');
builder.append("userSetup=").append(userSetup);
- builder.append("dataDisabled=").append(dataDisabled);
}
@Override
@@ -618,7 +623,6 @@
&& ((MobileState) o).carrierNetworkChangeMode == carrierNetworkChangeMode
&& ((MobileState) o).userSetup == userSetup
&& ((MobileState) o).isDefault == isDefault
- && ((MobileState) o).dataDisabled == dataDisabled
&& ((MobileState) o).roaming == roaming;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index ab4a8f2..c02ce0e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -48,9 +48,9 @@
default void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
boolean activityIn, boolean activityOut, String description, boolean isTransient) {}
- default void setMobileDataIndicators(IconState statusIcon, int statusType,
- boolean activityIn, boolean activityOut, String typeContentDescription,
- int subId, boolean roaming, boolean isEmergency) {}
+ default void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
+ int qsType, boolean activityIn, boolean activityOut, String typeContentDescription,
+ String description, boolean isWide, int subId, boolean roaming) {}
default void setSubs(List<SubscriptionInfo> subs) {}
default void setNoSims(boolean show) {}
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 60f4ab8..c21f444 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -867,6 +867,7 @@
datatype.equals("h") ? TelephonyIcons.H :
datatype.equals("lte") ? TelephonyIcons.LTE :
datatype.equals("lte+") ? TelephonyIcons.LTE_PLUS :
+ datatype.equals("dis") ? TelephonyIcons.DATA_DISABLED :
TelephonyIcons.UNKNOWN;
}
if (args.containsKey("roam")) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
index ec7e557..aaa0568 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
@@ -44,6 +44,10 @@
static final int ICON_4G_PLUS = R.drawable.stat_sys_data_fully_connected_4g_plus;
static final int ICON_1X = R.drawable.stat_sys_data_fully_connected_1x;
+ static final int ICON_DATA_DISABLED = R.drawable.stat_sys_data_disabled;
+
+ static final int QS_ICON_DATA_DISABLED = R.drawable.ic_qs_data_disabled;
+
static final MobileIconGroup CARRIER_NETWORK_CHANGE = new MobileIconGroup(
"CARRIER_NETWORK_CHANGE",
null,
@@ -217,5 +221,20 @@
true,
TelephonyIcons.QS_DATA_LTE_PLUS
);
+
+ static final MobileIconGroup DATA_DISABLED = new MobileIconGroup(
+ "DataDisabled",
+ null,
+ null,
+ AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
+ 0, 0,
+ 0,
+ 0,
+ AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
+ R.string.accessibility_cell_data_off,
+ TelephonyIcons.ICON_DATA_DISABLED,
+ false,
+ TelephonyIcons.QS_ICON_DATA_DISABLED
+ );
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java
index dfc3591..374408d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java
@@ -47,7 +47,6 @@
static final int QS_WIFI_NO_NETWORK = R.drawable.ic_qs_wifi_no_network;
static final int WIFI_NO_NETWORK = R.drawable.stat_sys_wifi_signal_null;
- static final int WIFI_DISCONNECTED = R.drawable.stat_sys_wifi_signal_disconnected;
static final int WIFI_LEVEL_COUNT = WIFI_SIGNAL_STRENGTH[0].length;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
index a773acf..2104cb1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
@@ -80,7 +80,7 @@
AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH,
WifiIcons.WIFI_NO_NETWORK,
WifiIcons.QS_WIFI_NO_NETWORK,
- WifiIcons.WIFI_DISCONNECTED,
+ WifiIcons.WIFI_NO_NETWORK,
WifiIcons.QS_WIFI_NO_NETWORK,
AccessibilityContentDescriptions.WIFI_NO_CONNECTION
);
@@ -133,7 +133,8 @@
@Override
public void notifyListeners(SignalCallback callback) {
// only show wifi in the cluster if connected or if wifi-only
- boolean wifiVisible = true;
+ boolean wifiVisible = mCurrentState.enabled
+ && (mCurrentState.connected || !mHasMobileData);
String wifiDesc = wifiVisible ? mCurrentState.ssid : null;
boolean ssidPresent = wifiVisible && mCurrentState.ssid != null;
String contentDescription = getStringIfExists(getContentDescription());
diff --git a/packages/SystemUI/src/com/android/systemui/util/Assert.java b/packages/SystemUI/src/com/android/systemui/util/Assert.java
index af447f3..0f7c9a4 100644
--- a/packages/SystemUI/src/com/android/systemui/util/Assert.java
+++ b/packages/SystemUI/src/com/android/systemui/util/Assert.java
@@ -28,4 +28,10 @@
throw new IllegalStateException("should be called from the main thread.");
}
}
+
+ public static void isNotMainThread() {
+ if (Looper.getMainLooper().isCurrentThread()) {
+ throw new IllegalStateException("should not be called from the main thread.");
+ }
+ }
}
diff --git a/packages/SystemUI/tests/Android.mk b/packages/SystemUI/tests/Android.mk
index 8eedf31..5e8b3f9 100644
--- a/packages/SystemUI/tests/Android.mk
+++ b/packages/SystemUI/tests/Android.mk
@@ -42,6 +42,7 @@
android-support-v7-preference \
android-support-v7-appcompat \
android-support-v7-mediarouter \
+ android-support-v7-palette \
android-support-v14-preference \
android-support-v17-leanback
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
new file mode 100644
index 0000000..1c9f813
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.keyguard;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.text.TextUtils;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.widget.TextView;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+public class KeyguardClockAccessibilityDelegateTest {
+
+ private Context mContext;
+ private TextView mView;
+
+ @Before
+ public void setUp() throws Exception {
+ mContext = InstrumentationRegistry.getContext();
+ mView = new TextView(mContext);
+ mView.setText(R.string.keyguard_widget_12_hours_format);
+ mView.setContentDescription(mContext.getString(R.string.keyguard_widget_12_hours_format));
+ mView.setAccessibilityDelegate(new KeyguardClockAccessibilityDelegate(mContext));
+ }
+
+ @Test
+ public void onInitializeAccessibilityEvent_producesNonEmptyAsciiContentDesc() throws Exception {
+ AccessibilityEvent ev = AccessibilityEvent.obtain();
+ mView.onInitializeAccessibilityEvent(ev);
+
+ assertFalse(TextUtils.isEmpty(ev.getContentDescription()));
+ assertTrue(isAscii(ev.getContentDescription()));
+ }
+
+ @Test
+ public void onPopulateAccessibilityEvent_producesNonEmptyAsciiText() throws Exception {
+ AccessibilityEvent ev = AccessibilityEvent.obtain();
+ mView.onPopulateAccessibilityEvent(ev);
+
+ assertFalse(isEmpty(ev.getText()));
+ assertTrue(isAscii(ev.getText()));
+ }
+
+ @Test
+ public void onInitializeAccessibilityNodeInfo_producesNonEmptyAsciiText() throws Exception {
+ AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain();
+ // Usually done in View.onInitializeAccessibilityNodeInfoInternal, but only when attached.
+ info.setContentDescription(mView.getContentDescription());
+ mView.onInitializeAccessibilityNodeInfo(info);
+
+ assertFalse(TextUtils.isEmpty(info.getText()));
+ assertTrue(isAscii(info.getText()));
+
+ assertFalse(TextUtils.isEmpty(info.getContentDescription()));
+ assertTrue(isAscii(info.getContentDescription()));
+ }
+
+ private boolean isAscii(CharSequence text) {
+ return text.chars().allMatch((i) -> i < 128);
+ }
+
+ private boolean isAscii(List<CharSequence> texts) {
+ return texts.stream().allMatch(this::isAscii);
+ }
+
+ private boolean isEmpty(List<CharSequence> texts) {
+ return texts.stream().allMatch(TextUtils::isEmpty);
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ExpandHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/ExpandHelperTest.java
index 1b5d4a4..aa840989 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ExpandHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ExpandHelperTest.java
@@ -43,12 +43,13 @@
private ExpandHelper.Callback mCallback;
@Before
- @UiThreadTest
- public void setUp() {
+ public void setUp() throws Exception {
Context context = getContext();
mRow = new NotificationTestHelper(context).createRow();
mCallback = mock(ExpandHelper.Callback.class);
- mExpandHelper = new ExpandHelper(context, mCallback, 10, 100);
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(
+ () -> mExpandHelper = new ExpandHelper(context, mCallback, 10, 100));
+
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java
index 048936b..bbe324d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java
@@ -47,9 +47,8 @@
return;
}
- mContext.getSettingsProvider().acquireOverridesBuilder()
- .addSetting("secure", Settings.Secure.DOZE_ALWAYS_ON, null)
- .build();
+ Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.DOZE_ALWAYS_ON,
+ null);
assertFalse(mDozeConfig.alwaysOnEnabled(UserHandle.USER_CURRENT));
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java
index 3aef247..62d80ac 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java
@@ -33,7 +33,6 @@
DozeParameters params = mock(DozeParameters.class, noDefaultAnswer(doneHolder));
when(params.getPulseOnSigMotion()).thenReturn(false);
- when(params.getSensorsWakeUpFully()).thenReturn(false);
when(params.getPickupVibrationThreshold()).thenReturn(0);
when(params.getProxCheckBeforePulse()).thenReturn(true);
when(params.getPickupSubtypePerformsProxCheck(anyInt())).thenReturn(true);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java b/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java
index 34cfa7b..eb59a34 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java
@@ -24,7 +24,6 @@
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
@@ -129,17 +128,32 @@
}
@Test
- public void testShowTemperatureWarning_NotifyAsUser() {
- mPowerNotificationWarnings.showTemperatureWarning();
+ public void testShowHighTemperatureWarning_NotifyAsUser() {
+ mPowerNotificationWarnings.showHighTemperatureWarning();
verify(mMockNotificationManager, times(1))
.notifyAsUser(anyString(), eq(SystemMessage.NOTE_HIGH_TEMP), any(), any());
}
@Test
- public void testDismissTemperatureWarning_CancelAsUser() {
- mPowerNotificationWarnings.showTemperatureWarning();
- mPowerNotificationWarnings.dismissTemperatureWarning();
+ public void testDismissHighTemperatureWarning_CancelAsUser() {
+ mPowerNotificationWarnings.showHighTemperatureWarning();
+ mPowerNotificationWarnings.dismissHighTemperatureWarning();
verify(mMockNotificationManager, times(1)).cancelAsUser(anyString(),
eq(SystemMessage.NOTE_HIGH_TEMP), any());
}
+
+ @Test
+ public void testShowThermalShutdownWarning_NotifyAsUser() {
+ mPowerNotificationWarnings.showThermalShutdownWarning();
+ verify(mMockNotificationManager, times(1))
+ .notifyAsUser(anyString(), eq(SystemMessage.NOTE_THERMAL_SHUTDOWN), any(), any());
+ }
+
+ @Test
+ public void testDismissThermalShutdownWarning_CancelAsUser() {
+ mPowerNotificationWarnings.showThermalShutdownWarning();
+ mPowerNotificationWarnings.dismissThermalShutdownWarning();
+ verify(mMockNotificationManager, times(1)).cancelAsUser(anyString(),
+ eq(SystemMessage.NOTE_THERMAL_SHUTDOWN), any());
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
index 673ffc5..d81224e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
@@ -32,6 +32,7 @@
import com.android.systemui.SysuiBaseFragmentTest;
import com.android.systemui.statusbar.phone.StatusBarIconController;
+import com.android.systemui.statusbar.policy.Clock;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import android.testing.LayoutInflaterBuilder;
import android.testing.TestableLooper;
@@ -64,6 +65,7 @@
FrameLayout.class)
.replace("TextClock", View.class)
.replace(CarrierText.class, View.class)
+ .replace(Clock.class, View.class)
.build());
mDependency.injectTestDependency(Dependency.BG_LOOPER,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
index 3db2440..5cd092b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
@@ -39,8 +39,7 @@
private NotificationTestHelper mNotificationTestHelper;
@Before
- @UiThreadTest
- public void setUp() {
+ public void setUp() throws Exception {
mContext = InstrumentationRegistry.getTargetContext();
mNotificationTestHelper = new NotificationTestHelper(mContext);
mGroup = mNotificationTestHelper.createGroup();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
index 08ac9a9..18c5756 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
@@ -24,16 +24,20 @@
import android.Manifest;
import android.app.Notification;
+import android.app.NotificationChannel;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.os.Bundle;
+import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.support.test.annotation.UiThreadTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.phone.NotificationGroupManager;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -49,6 +53,8 @@
mock(StatusBarNotification.class);
private final IPackageManager mMockPackageManager = mock(IPackageManager.class);
+ private NotificationData mNotificationData;
+ private ExpandableNotificationRow mRow;
@Before
public void setUp() throws Exception {
@@ -62,6 +68,12 @@
eq(Manifest.permission.NOTIFICATION_DURING_SETUP),
eq(UID_ALLOW_DURING_SETUP)))
.thenReturn(PackageManager.PERMISSION_GRANTED);
+
+ NotificationData.Environment mock = mock(NotificationData.Environment.class);
+ when(mock.getGroupManager()).thenReturn(new NotificationGroupManager());
+ mNotificationData = new TestableNotificationData(mock);
+ mNotificationData.updateRanking(mock(NotificationListenerService.RankingMap.class));
+ mRow = new NotificationTestHelper(getContext()).createRow();
}
@Test
@@ -99,6 +111,12 @@
mMockStatusBarNotification));
}
+ @Test
+ public void testChannelSetWhenAdded() {
+ mNotificationData.add(mRow.getEntry());
+ Assert.assertTrue(mRow.getEntry().channel != null);
+ }
+
private void initStatusBarNotification(boolean allowDuringSetup) {
Bundle bundle = new Bundle();
bundle.putBoolean(Notification.EXTRA_ALLOW_DURING_SETUP, allowDuringSetup);
@@ -107,4 +125,15 @@
.build();
when(mMockStatusBarNotification.getNotification()).thenReturn(notification);
}
+
+ private class TestableNotificationData extends NotificationData {
+ public TestableNotificationData(Environment environment) {
+ super(environment);
+ }
+
+ @Override
+ public NotificationChannel getChannel(String key) {
+ return new NotificationChannel(null, null, 0);
+ }
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
index 907928f..2b14b31 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
@@ -778,4 +778,9 @@
enabledSwitch.setChecked(true);
assertEquals(View.VISIBLE, settingsLink.getVisibility());
}
+
+ @Test
+ public void testWillBeRemovedReturnsFalseBeforeBind() throws Exception {
+ assertFalse(mNotificationInfo.willBeRemoved());
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
index c91b269..cb238dd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
@@ -17,15 +17,18 @@
package com.android.systemui.statusbar;
import android.app.ActivityManager;
+import android.app.Instrumentation;
import android.app.Notification;
import android.content.Context;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
+import android.support.test.InstrumentationRegistry;
import android.view.LayoutInflater;
import android.widget.RemoteViews;
import com.android.systemui.R;
import com.android.systemui.statusbar.notification.InflationException;
+import com.android.systemui.statusbar.notification.NotificationInflaterTest;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
/**
@@ -34,14 +37,18 @@
public class NotificationTestHelper {
private final Context mContext;
+ private final Instrumentation mInstrumentation;
private int mId;
private final NotificationGroupManager mGroupManager = new NotificationGroupManager();
+ private ExpandableNotificationRow mRow;
+ private InflationException mException;
public NotificationTestHelper(Context context) {
mContext = context;
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
}
- public ExpandableNotificationRow createRow() {
+ public ExpandableNotificationRow createRow() throws Exception {
Notification publicVersion = new Notification.Builder(mContext).setSmallIcon(
R.drawable.ic_person)
.setCustomContentView(new RemoteViews(mContext.getPackageName(),
@@ -56,12 +63,15 @@
return createRow(notification);
}
- public ExpandableNotificationRow createRow(Notification notification) {
+ public ExpandableNotificationRow createRow(Notification notification) throws Exception {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
mContext.LAYOUT_INFLATER_SERVICE);
- ExpandableNotificationRow row = (ExpandableNotificationRow) inflater.inflate(
- R.layout.status_bar_notification_row,
- null, false);
+ mInstrumentation.runOnMainSync(() -> {
+ mRow = (ExpandableNotificationRow) inflater.inflate(
+ R.layout.status_bar_notification_row,
+ null, false);
+ });
+ ExpandableNotificationRow row = mRow;
row.setGroupManager(mGroupManager);
UserHandle mUser = UserHandle.of(ActivityManager.getCurrentUser());
StatusBarNotification sbn = new StatusBarNotification("com.android.systemui",
@@ -69,16 +79,13 @@
2000, notification, mUser, null, System.currentTimeMillis());
NotificationData.Entry entry = new NotificationData.Entry(sbn);
entry.row = row;
- try {
- entry.createIcons(mContext, sbn);
- row.updateNotification(entry);
- } catch (InflationException e) {
- throw new RuntimeException(e.getMessage());
- }
+ entry.createIcons(mContext, sbn);
+ NotificationInflaterTest.runThenWaitForInflation(() -> row.updateNotification(entry),
+ row.getNotificationInflater());
return row;
}
- public ExpandableNotificationRow createGroup() {
+ public ExpandableNotificationRow createGroup() throws Exception {
ExpandableNotificationRow row = createRow();
row.addChildNotification(createRow());
row.addChildNotification(createRow());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java
new file mode 100644
index 0000000..fbb25e5
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.notification;
+
+import static com.android.systemui.statusbar.notification.NotificationInflater.FLAG_REINFLATE_ALL;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.app.Notification;
+import android.content.Context;
+import android.service.notification.StatusBarNotification;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.widget.RemoteViews;
+
+import com.android.systemui.R;
+import com.android.systemui.statusbar.ExpandableNotificationRow;
+import com.android.systemui.statusbar.NotificationData;
+import com.android.systemui.statusbar.NotificationTestHelper;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.function.Function;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class NotificationInflaterTest {
+
+ private Context mContext;
+ private NotificationInflater mNotificationInflater;
+ private Notification.Builder mBuilder;
+ private ExpandableNotificationRow mRow;
+
+ @Before
+ public void setUp() throws Exception {
+ mContext = InstrumentationRegistry.getTargetContext();
+ mBuilder = new Notification.Builder(mContext).setSmallIcon(
+ R.drawable.ic_person)
+ .setContentTitle("Title")
+ .setContentText("Text")
+ .setStyle(new Notification.BigTextStyle().bigText("big text"));
+ ExpandableNotificationRow row = new NotificationTestHelper(mContext).createRow(
+ mBuilder.build());
+ mRow = spy(row);
+ mNotificationInflater = new NotificationInflater(mRow);
+ mNotificationInflater.setInflationCallback(new NotificationInflater.InflationCallback() {
+ @Override
+ public void handleInflationException(StatusBarNotification notification,
+ InflationException e) {
+ }
+
+ @Override
+ public void onAsyncInflationFinished(NotificationData.Entry entry) {
+ }
+ });
+ }
+
+ @Test
+ public void testIncreasedHeadsUpBeingUsed() {
+ mNotificationInflater.setUsesIncreasedHeadsUpHeight(true);
+ Notification.Builder builder = spy(mBuilder);
+ mNotificationInflater.inflateNotificationViews(FLAG_REINFLATE_ALL, builder, mContext);
+ verify(builder).createHeadsUpContentView(true);
+ }
+
+ @Test
+ public void testIncreasedHeightBeingUsed() {
+ mNotificationInflater.setUsesIncreasedHeight(true);
+ Notification.Builder builder = spy(mBuilder);
+ mNotificationInflater.inflateNotificationViews(FLAG_REINFLATE_ALL, builder, mContext);
+ verify(builder).createContentView(true);
+ }
+
+ @Test
+ public void testInflationCallsUpdated() throws Exception {
+ runThenWaitForInflation(() -> mNotificationInflater.inflateNotificationViews(),
+ mNotificationInflater);
+ verify(mRow).onNotificationUpdated();
+ }
+
+ @Test
+ public void testInflationCallsOnlyRightMethod() throws Exception {
+ mRow.getPrivateLayout().removeAllViews();
+ mRow.getEntry().cachedBigContentView = null;
+ runThenWaitForInflation(() -> mNotificationInflater.inflateNotificationViews(
+ NotificationInflater.FLAG_REINFLATE_EXPANDED_VIEW), mNotificationInflater);
+ Assert.assertTrue(mRow.getPrivateLayout().getChildCount() == 1);
+ Assert.assertTrue(mRow.getPrivateLayout().getChildAt(0)
+ == mRow.getPrivateLayout().getExpandedChild());
+ verify(mRow).onNotificationUpdated();
+ }
+
+ @Test
+ public void testInflationThrowsErrorDoesntCallUpdated() throws Exception {
+ mRow.getPrivateLayout().removeAllViews();
+ mRow.getStatusBarNotification().getNotification().contentView
+ = new RemoteViews(mContext.getPackageName(), R.layout.status_bar);
+ runThenWaitForInflation(() -> mNotificationInflater.inflateNotificationViews(),
+ true /* expectingException */, mNotificationInflater);
+ Assert.assertTrue(mRow.getPrivateLayout().getChildCount() == 0);
+ verify(mRow, times(0)).onNotificationUpdated();
+ }
+
+ @Test
+ public void testAsyncTaskRemoved() throws Exception {
+ mRow.getEntry().abortInflation();
+ runThenWaitForInflation(() -> mNotificationInflater.inflateNotificationViews(),
+ mNotificationInflater);
+ Assert.assertTrue(mRow.getEntry().getRunningTasks().size() == 0);
+ }
+
+ public static void runThenWaitForInflation(Runnable block,
+ NotificationInflater inflater) throws Exception {
+ runThenWaitForInflation(block, false /* expectingException */, inflater);
+ }
+
+ private static void runThenWaitForInflation(Runnable block, boolean expectingException,
+ NotificationInflater inflater) throws Exception {
+ com.android.systemui.util.Assert.isNotMainThread();
+ CountDownLatch countDownLatch = new CountDownLatch(1);
+ final ExceptionHolder exceptionHolder = new ExceptionHolder();
+ inflater.setInflationCallback(new NotificationInflater.InflationCallback() {
+ @Override
+ public void handleInflationException(StatusBarNotification notification,
+ InflationException e) {
+ if (!expectingException) {
+ exceptionHolder.setException(e);
+ }
+ countDownLatch.countDown();
+ }
+
+ @Override
+ public void onAsyncInflationFinished(NotificationData.Entry entry) {
+ if (expectingException) {
+ exceptionHolder.setException(new RuntimeException(
+ "Inflation finished even though there should be an error"));
+ }
+ countDownLatch.countDown();
+ }
+ });
+ block.run();
+ countDownLatch.await(5, java.util.concurrent.TimeUnit.SECONDS);
+ if (exceptionHolder.mException != null) {
+ throw exceptionHolder.mException;
+ }
+ }
+
+ private static class ExceptionHolder {
+ private Exception mException;
+
+ public void setException(Exception exception) {
+ mException = exception;
+ }
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationinflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationinflaterTest.java
deleted file mode 100644
index 0ec9c10..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationinflaterTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.systemui.statusbar.notification;
-
-import static com.android.systemui.statusbar.notification.NotificationInflater.FLAG_REINFLATE_ALL;
-
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.app.Notification;
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import com.android.systemui.R;
-import com.android.systemui.statusbar.ExpandableNotificationRow;
-import com.android.systemui.statusbar.NotificationTestHelper;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class NotificationinflaterTest {
-
- private Context mContext;
- private NotificationInflater mNotificationInflater;
- private Notification.Builder mBuilder;
-
- @Before
- @UiThreadTest
- public void setUp() {
- mContext = InstrumentationRegistry.getTargetContext();
- mBuilder = new Notification.Builder(mContext).setSmallIcon(
- R.drawable.ic_person)
- .setContentTitle("Title")
- .setContentText("Text");
- ExpandableNotificationRow row = new NotificationTestHelper(mContext).createRow(
- mBuilder.build());
- mNotificationInflater = new NotificationInflater(row);
- }
-
- @Test
- public void testIncreasedHeadsUpBeingUsed() {
- mNotificationInflater.setUsesIncreasedHeadsUpHeight(true);
- Notification.Builder builder = spy(mBuilder);
- mNotificationInflater.inflateNotificationViews(FLAG_REINFLATE_ALL, builder, mContext);
- verify(builder).createHeadsUpContentView(true);
- }
-
- @Test
- public void testIncreasedHeightBeingUsed() {
- mNotificationInflater.setUsesIncreasedHeight(true);
- Notification.Builder builder = spy(mBuilder);
- mNotificationInflater.inflateNotificationViews(FLAG_REINFLATE_ALL, builder, mContext);
- verify(builder).createContentView(true);
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
index 8808988..f516d74 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
@@ -20,7 +20,9 @@
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothProfile;
+import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import android.testing.TestableLooper.RunWithLooper;
import com.android.settingslib.bluetooth.BluetoothEventManager;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
@@ -31,10 +33,13 @@
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.List;
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
public class BluetoothControllerImplTest extends SysuiTestCase {
private LocalBluetoothManager mMockBluetoothManager;
@@ -47,7 +52,7 @@
@Before
public void setup() throws Exception {
- mTestableLooper = new TestableLooper();
+ mTestableLooper = TestableLooper.get(this);
mMockBluetoothManager = mDependency.injectMockDependency(LocalBluetoothManager.class);
mDevices = new ArrayList<>();
mMockDeviceManager = mock(CachedBluetoothDeviceManager.class);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
index f6c75a8..3ed1681 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
@@ -114,26 +114,33 @@
boolean wide = true;
int subId = 5;
boolean roaming = true;
- boolean isEmergency = true;
- mHandler.setMobileDataIndicators(status, type, in, out, typeDescription,
- subId, roaming, isEmergency);
+ mHandler.setMobileDataIndicators(status, qs, type, qsType, in, out, typeDescription,
+ description, wide, subId, roaming);
waitForCallbacks();
ArgumentCaptor<IconState> statusArg = ArgumentCaptor.forClass(IconState.class);
+ ArgumentCaptor<IconState> qsArg = ArgumentCaptor.forClass(IconState.class);
ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class);
+ ArgumentCaptor<Integer> qsTypeIconArg = ArgumentCaptor.forClass(Integer.class);
ArgumentCaptor<Boolean> inArg = ArgumentCaptor.forClass(Boolean.class);
ArgumentCaptor<Boolean> outArg = ArgumentCaptor.forClass(Boolean.class);
ArgumentCaptor<String> typeContentArg = ArgumentCaptor.forClass(String.class);
+ ArgumentCaptor<String> descArg = ArgumentCaptor.forClass(String.class);
+ ArgumentCaptor<Boolean> wideArg = ArgumentCaptor.forClass(Boolean.class);
ArgumentCaptor<Integer> subIdArg = ArgumentCaptor.forClass(Integer.class);
Mockito.verify(mSignalCallback).setMobileDataIndicators(statusArg.capture(),
- typeIconArg.capture(), inArg.capture(),
- outArg.capture(), typeContentArg.capture(),
- subIdArg.capture(), eq(roaming), eq(isEmergency));
+ qsArg.capture(), typeIconArg.capture(), qsTypeIconArg.capture(), inArg.capture(),
+ outArg.capture(), typeContentArg.capture(), descArg.capture(), wideArg.capture(),
+ subIdArg.capture(), eq(roaming));
assertEquals(status, statusArg.getValue());
+ assertEquals(qs, qsArg.getValue());
assertEquals(type, (int) typeIconArg.getValue());
+ assertEquals(qsType, (int) qsTypeIconArg.getValue());
assertEquals(in, (boolean) inArg.getValue());
assertEquals(out, (boolean) outArg.getValue());
assertEquals(typeDescription, typeContentArg.getValue());
+ assertEquals(description, descArg.getValue());
+ assertEquals(wide, (boolean) wideArg.getValue());
assertEquals(subId, (int) subIdArg.getValue());
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
index b39171e..505e1d8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
@@ -29,7 +29,6 @@
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.Log;
-
import com.android.internal.telephony.cdma.EriInfo;
import com.android.settingslib.net.DataUsageController;
import com.android.systemui.statusbar.phone.SignalDrawable;
@@ -46,6 +45,8 @@
import org.junit.runner.Description;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -69,7 +70,7 @@
protected static final int DEFAULT_SIGNAL_STRENGTH = DEFAULT_LEVEL;
protected static final int DEFAULT_QS_SIGNAL_STRENGTH = DEFAULT_LEVEL;
protected static final int DEFAULT_ICON = TelephonyIcons.ICON_3G;
- protected static final int DEFAULT_QS_ICON = DEFAULT_ICON;
+ protected static final int DEFAULT_QS_ICON = TelephonyIcons.QS_DATA_3G;
protected NetworkControllerImpl mNetworkController;
protected MobileSignalController mMobileSignalController;
@@ -116,7 +117,7 @@
when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(true);
when(mMockCm.getDefaultNetworkCapabilitiesForUser(0)).thenReturn(
- new NetworkCapabilities[]{mNetCapabilities});
+ new NetworkCapabilities[] { mNetCapabilities });
mSignalStrength = mock(SignalStrength.class);
mServiceState = mock(ServiceState.class);
@@ -174,17 +175,17 @@
}
protected NetworkControllerImpl setUpNoMobileData() {
- when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(false);
- NetworkControllerImpl networkControllerNoMobile
- = new NetworkControllerImpl(mContext, mMockCm, mMockNetworkScoreManager, mMockTm,
- mMockWm, mMockSm, mConfig, mContext.getMainLooper(), mCallbackHandler,
- mock(AccessPointControllerImpl.class),
- mock(DataUsageController.class), mMockSubDefaults,
- mock(DeviceProvisionedController.class));
+ when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(false);
+ NetworkControllerImpl networkControllerNoMobile
+ = new NetworkControllerImpl(mContext, mMockCm, mMockNetworkScoreManager, mMockTm,
+ mMockWm, mMockSm, mConfig, mContext.getMainLooper(), mCallbackHandler,
+ mock(AccessPointControllerImpl.class),
+ mock(DataUsageController.class), mMockSubDefaults,
+ mock(DeviceProvisionedController.class));
- setupNetworkController();
+ setupNetworkController();
- return networkControllerNoMobile;
+ return networkControllerNoMobile;
}
@@ -307,10 +308,11 @@
ArgumentCaptor<Boolean> dataOutArg = ArgumentCaptor.forClass(Boolean.class);
Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators(
- iconArg.capture(),
- typeIconArg.capture(),
- dataInArg.capture(), dataOutArg.capture(),
- anyString(), anyInt(), anyBoolean(), anyBoolean());
+ any(),
+ iconArg.capture(),
+ anyInt(),
+ typeIconArg.capture(), dataInArg.capture(), dataOutArg.capture(),
+ anyString(), anyString(), anyBoolean(), anyInt(), anyBoolean());
IconState iconState = iconArg.getValue();
int state = SignalDrawable.getState(icon, SignalStrength.NUM_SIGNAL_STRENGTH_BINS,
false);
@@ -333,16 +335,17 @@
}
protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon,
- boolean roaming, boolean inet) {
+ boolean roaming, boolean inet) {
ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class);
// TODO: Verify all fields.
Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators(
iconArg.capture(),
+ any(),
typeIconArg.capture(),
- anyBoolean(), anyBoolean(), anyString(),
- anyInt(), eq(roaming), anyBoolean());
+ anyInt(), anyBoolean(), anyBoolean(), anyString(), anyString(), anyBoolean(),
+ anyInt(), eq(roaming));
IconState iconState = iconArg.getValue();
int state = icon == -1 ? 0
@@ -353,18 +356,22 @@
}
protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon,
- boolean qsVisible, boolean dataIn, boolean dataOut) {
+ boolean qsVisible, int qsIcon, int qsTypeIcon, boolean dataIn, boolean dataOut) {
ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class);
+ ArgumentCaptor<IconState> qsIconArg = ArgumentCaptor.forClass(IconState.class);
+ ArgumentCaptor<Integer> qsTypeIconArg = ArgumentCaptor.forClass(Integer.class);
ArgumentCaptor<Boolean> dataInArg = ArgumentCaptor.forClass(Boolean.class);
ArgumentCaptor<Boolean> dataOutArg = ArgumentCaptor.forClass(Boolean.class);
Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators(
iconArg.capture(),
+ qsIconArg.capture(),
typeIconArg.capture(),
+ qsTypeIconArg.capture(),
dataInArg.capture(),
dataOutArg.capture(),
- anyString(), anyInt(), anyBoolean(), anyBoolean());
+ anyString(), anyString(), anyBoolean(), anyInt(), anyBoolean());
IconState iconState = iconArg.getValue();
@@ -374,15 +381,17 @@
assertEquals("Signal icon in status bar", state, iconState.icon);
assertEquals("Visibility in status bar", visible, iconState.visible);
+ iconState = qsIconArg.getValue();
assertEquals("Visibility in quick settings", qsVisible, iconState.visible);
assertEquals("Signal icon in quick settings", state, iconState.icon);
+ assertEquals("Data icon in quick settings", qsTypeIcon, (int) qsTypeIconArg.getValue());
assertEquals("Data direction in in quick settings", dataIn,
(boolean) dataInArg.getValue());
assertEquals("Data direction out in quick settings", dataOut,
(boolean) dataOutArg.getValue());
}
- protected void assertNetworkNameEquals(String expected) {
- assertEquals("Network name", expected, mMobileSignalController.getState().networkName);
- }
+ protected void assertNetworkNameEquals(String expected) {
+ assertEquals("Network name", expected, mMobileSignalController.getState().networkName);
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
index 6470c11..dfe00f9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
@@ -1,9 +1,5 @@
package com.android.systemui.statusbar.policy;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -15,14 +11,10 @@
import android.test.suitebuilder.annotation.SmallTest;
import com.android.settingslib.net.DataUsageController;
-import com.android.systemui.statusbar.phone.SignalDrawable;
-import com.android.systemui.statusbar.policy.NetworkController.IconState;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mockito;
@SmallTest
@RunWith(AndroidJUnit4.class)
@@ -124,11 +116,8 @@
updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, 0);
setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
- ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
- Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators(
- iconArg.capture(), anyInt(), anyBoolean(), anyBoolean(), any(), anyInt(),
- anyBoolean(), anyBoolean());
- assertEquals(SignalDrawable.STATE_CUT, SignalDrawable.getState(iconArg.getValue().icon));
+ verifyDataIndicators(TelephonyIcons.ICON_DATA_DISABLED,
+ TelephonyIcons.QS_ICON_DATA_DISABLED);
}
@Test
@@ -140,14 +129,9 @@
setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
when(mMockProvisionController.isUserSetup(anyInt())).thenReturn(false);
mUserCallback.onUserSetupChanged();
- waitForIdleSync();
// Don't show the X until the device is setup.
- ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
- Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators(
- iconArg.capture(), anyInt(), anyBoolean(), anyBoolean(), any(), anyInt(),
- anyBoolean(), anyBoolean());
- assertNotEquals(SignalDrawable.STATE_CUT, SignalDrawable.getState(iconArg.getValue().icon));
+ verifyDataIndicators(0, 0);
}
@Test
@@ -197,12 +181,12 @@
updateDataActivity(direction);
verifyLastMobileDataIndicators(true, DEFAULT_SIGNAL_STRENGTH, DEFAULT_ICON, true,
- in, out);
+ DEFAULT_QS_SIGNAL_STRENGTH, DEFAULT_QS_ICON, in, out);
}
private void verifyDataIndicators(int dataIcon, int qsDataIcon) {
verifyLastMobileDataIndicators(true, DEFAULT_SIGNAL_STRENGTH, dataIcon,
- true, false,
+ true, DEFAULT_QS_SIGNAL_STRENGTH, qsDataIcon, false,
false);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
index e542c37..1627925 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
@@ -214,7 +214,7 @@
verifyLastQsMobileDataIndicators(true,
testStrength,
- TelephonyIcons.ICON_1X, false, false);
+ TelephonyIcons.QS_DATA_1X, false, false);
}
}
@@ -434,7 +434,7 @@
verifyLastQsMobileDataIndicators(true /* visible */,
DEFAULT_LEVEL /* icon */,
- DEFAULT_ICON /* typeIcon */,
+ DEFAULT_QS_ICON /* typeIcon */,
false /* dataIn */,
true /* dataOut */);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
index edfa326..dbaa2c5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
@@ -18,7 +18,6 @@
import com.android.settingslib.Utils;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
-import android.testing.TestableSettings.SettingOverrider;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -62,7 +61,7 @@
public void testWifiIcon() {
String testSsid = "Test SSID";
setWifiEnabled(true);
- verifyLastWifiIcon(true, WifiIcons.WIFI_DISCONNECTED);
+ verifyLastWifiIcon(false, WifiIcons.WIFI_NO_NETWORK);
setWifiState(true, testSsid);
verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[0][0]);
@@ -92,11 +91,10 @@
attr);
// Must set the Settings value before instantiating the NetworkControllerImpl due to bugs in
- // TestableSettings.
- SettingOverrider settingsOverrider =
- mContext.getSettingsProvider().acquireOverridesBuilder()
- .addSetting("global", Settings.Global.NETWORK_SCORING_UI_ENABLED, "1")
- .build();
+ // TestableSettingsProvider.
+ Settings.Global.putString(mContext.getContentResolver(),
+ Settings.Global.NETWORK_SCORING_UI_ENABLED,
+ "1");
super.setUp(); // re-instantiate NetworkControllImpl now that setting has been updated
setupNetworkScoreManager();
@@ -131,8 +129,6 @@
assertEquals("SD Badge is set",
Utils.getWifiBadgeResource(NetworkBadging.BADGING_SD),
iconState.iconOverlay);
-
- settingsOverrider.release();
}
private void setupNetworkScoreManager() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
index dbe0de4..f051f30 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
@@ -42,8 +42,7 @@
private NotificationTestHelper mNotificationTestHelper;
@Before
- @UiThreadTest
- public void setUp() {
+ public void setUp() throws Exception {
mContext = InstrumentationRegistry.getTargetContext();
mNotificationTestHelper = new NotificationTestHelper(mContext);
mGroup = mNotificationTestHelper.createGroup();
diff --git a/packages/VpnDialogs/res/values-sw/strings.xml b/packages/VpnDialogs/res/values-sw/strings.xml
index a0fb7c3..e48210c 100644
--- a/packages/VpnDialogs/res/values-sw/strings.xml
+++ b/packages/VpnDialogs/res/values-sw/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="prompt" msgid="3183836924226407828">"Ombi la muunganisho"</string>
- <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> inataka kusanidi muunganisho wa VPN utakaoiruhusu kufuatilia trafiki ya mtandao. Kubali ikiwa tu unakiamini chanzo. <br /> <br /> <img src=vpn_icon /> huonekana sehemu ya juu ya skrini yako VPN inapofanya kazi."</string>
+ <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> inataka kusanidi muunganisho wa VPN utakaoiruhusu kufuatilia shughuli kwenye mtandao. Kubali ikiwa tu unakiamini chanzo. <br /> <br /> <img src=vpn_icon /> huonekana sehemu ya juu ya skrini yako VPN inapofanya kazi."</string>
<string name="legacy_title" msgid="192936250066580964">"VPN imeunganishwa"</string>
<string name="configure" msgid="4905518375574791375">"Sanidi"</string>
<string name="disconnect" msgid="971412338304200056">"Tenganisha"</string>
diff --git a/packages/VpnDialogs/res/values-zh-rTW/strings.xml b/packages/VpnDialogs/res/values-zh-rTW/strings.xml
index 1a7ab35..6b35993 100644
--- a/packages/VpnDialogs/res/values-zh-rTW/strings.xml
+++ b/packages/VpnDialogs/res/values-zh-rTW/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="prompt" msgid="3183836924226407828">"連線要求"</string>
- <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> 要求設定 VPN 連線,允許此要求即開放該來源監控網路流量。除非您信任該來源,否則請勿任意接受要求。<br /> <br />VPN 啟用時,畫面頂端會顯示 <img src=vpn_icon />。"</string>
+ <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> 要求設定 VPN 連線,允許此要求即開放該來源監控網路流量。除非你信任該來源,否則請勿任意接受要求。<br /> <br />VPN 啟用時,畫面頂端會顯示 <img src=vpn_icon />。"</string>
<string name="legacy_title" msgid="192936250066580964">"VPN 已連線"</string>
<string name="configure" msgid="4905518375574791375">"設定"</string>
<string name="disconnect" msgid="971412338304200056">"中斷連線"</string>
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index fc70b2b..ff99b19 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -3636,7 +3636,7 @@
// OS: N
ACTION_GET_CONTACT = 864;
- // This values should never appear in log outputs - it is reserved for
+ // This value should never appear in log outputs - it is reserved for
// internal platform metrics use.
RESERVED_FOR_LOGBUILDER_PID = 865;
@@ -3923,6 +3923,40 @@
// OS: O
ACTION_TEXT_SELECTION_MENU_ITEM_ASSIST = 937;
+ // OPEN: Settings > Security > Managed Device Info > Apps installed
+ // CATEGORY: SETTINGS
+ // OS: O
+ ENTERPRISE_PRIVACY_INSTALLED_APPS = 938;
+
+ // OPEN: Settings > Security > Managed Device Info > nnn permissions
+ // CATEGORY: SETTINGS
+ // OS: O
+ ENTERPRISE_PRIVACY_PERMISSIONS = 939;
+
+ // OPEN: Settings > Security > Managed Device Info > Default apps
+ // CATEGORY: SETTINGS
+ // OS: O
+ ENTERPRISE_PRIVACY_DEFAULT_APPS = 940;
+
+ // OPEN: Settings > Notifications > An app > A channel > Importance
+ // CATEGORY: SETTINGS
+ // OS: O
+ NOTIFICATION_CHANNEL_IMPORTANCE = 941;
+
+ // OPEN: Settings > Notifications > An app > A channel > On the lock screen
+ // CATEGORY: SETTINGS
+ // OS: O
+ NOTIFICATION_CHANNEL_LOCK_SCREEN_VIS = 942;
+
+ // This value should never appear in log outputs - it is reserved for
+ // internal platform metrics use.
+ RESERVED_FOR_LOGBUILDER_UID = 943;
+
+ // OPEN: Running background apps notification > List of background apps
+ // CATEGORY: GLOBAL_SYSTEM_UI
+ // OS: O
+ RUNNING_BACKGROUND_APPS_DIALOG = 944;
+
// ---- End O Constants, all O constants go above this line ----
// Add new aosp constants above this line.
diff --git a/proto/src/system_messages.proto b/proto/src/system_messages.proto
index 65cc17e..53b3fe9 100644
--- a/proto/src/system_messages.proto
+++ b/proto/src/system_messages.proto
@@ -176,6 +176,10 @@
// Inform the user their phone recently shut down due to high temperature
NOTE_THERMAL_SHUTDOWN = 39;
+ // Tell the user about currently running foreground services
+ // Package: android
+ NOTE_FOREGROUND_SERVICES = 40;
+
// ADD_NEW_IDS_ABOVE_THIS_LINE
// Legacy IDs with arbitrary values appear below
// Legacy IDs existed as stable non-conflicting constants prior to the O release
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 0003941..fa78f10 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -775,7 +775,6 @@
if ((flags & UiAutomation.FLAG_DONT_SUPPRESS_ACCESSIBILITY_SERVICES) == 0) {
// Set the temporary state, and use it instead of settings
userState.mIsTouchExplorationEnabled = false;
- userState.mIsEnhancedWebAccessibilityEnabled = false;
userState.mIsDisplayMagnificationEnabled = false;
userState.mIsNavBarMagnificationEnabled = false;
userState.mIsAutoclickEnabled = false;
@@ -826,7 +825,6 @@
}
userState.mIsTouchExplorationEnabled = touchExplorationEnabled;
- userState.mIsEnhancedWebAccessibilityEnabled = false;
userState.mIsDisplayMagnificationEnabled = false;
userState.mIsNavBarMagnificationEnabled = false;
userState.mIsAutoclickEnabled = false;
@@ -1727,7 +1725,6 @@
updateFilterKeyEventsLocked(userState);
updateTouchExplorationLocked(userState);
updatePerformGesturesLocked(userState);
- updateEnhancedWebAccessibilityLocked(userState);
updateDisplayDaltonizerLocked(userState);
updateDisplayInversionLocked(userState);
updateMagnificationLocked(userState);
@@ -1846,7 +1843,6 @@
somethingChanged |= readTouchExplorationGrantedAccessibilityServicesLocked(userState);
somethingChanged |= readTouchExplorationEnabledSettingLocked(userState);
somethingChanged |= readHighTextContrastEnabledSettingLocked(userState);
- somethingChanged |= readEnhancedWebAccessibilityEnabledChangedLocked(userState);
somethingChanged |= readMagnificationEnabledSettingsLocked(userState);
somethingChanged |= readAutoclickEnabledSettingLocked(userState);
somethingChanged |= readAccessibilityShortcutSettingLocked(userState);
@@ -1907,17 +1903,6 @@
return false;
}
- private boolean readEnhancedWebAccessibilityEnabledChangedLocked(UserState userState) {
- final boolean enhancedWeAccessibilityEnabled = Settings.Secure.getIntForUser(
- mContext.getContentResolver(), Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION,
- 0, userState.mUserId) == 1;
- if (enhancedWeAccessibilityEnabled != userState.mIsEnhancedWebAccessibilityEnabled) {
- userState.mIsEnhancedWebAccessibilityEnabled = enhancedWeAccessibilityEnabled;
- return true;
- }
- return false;
- }
-
private boolean readHighTextContrastEnabledSettingLocked(UserState userState) {
final boolean highTextContrastEnabled = Settings.Secure.getIntForUser(
mContext.getContentResolver(),
@@ -2084,40 +2069,6 @@
return false;
}
- private void updateEnhancedWebAccessibilityLocked(UserState userState) {
- boolean enabled = false;
- final int serviceCount = userState.mBoundServices.size();
- for (int i = 0; i < serviceCount; i++) {
- Service service = userState.mBoundServices.get(i);
- if (canRequestAndRequestsEnhancedWebAccessibilityLocked(service)) {
- enabled = true;
- break;
- }
- }
- if (enabled != userState.mIsEnhancedWebAccessibilityEnabled) {
- userState.mIsEnhancedWebAccessibilityEnabled = enabled;
- final long identity = Binder.clearCallingIdentity();
- try {
- Settings.Secure.putIntForUser(mContext.getContentResolver(),
- Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION, enabled ? 1 : 0,
- userState.mUserId);
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
- }
-
- private boolean canRequestAndRequestsEnhancedWebAccessibilityLocked(Service service) {
- if (!service.canReceiveEventsLocked() || !service.mRequestEnhancedWebAccessibility ) {
- return false;
- }
- if (service.mIsAutomation || (service.mAccessibilityServiceInfo.getCapabilities()
- & AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY) != 0) {
- return true;
- }
- return false;
- }
-
private void updateDisplayDaltonizerLocked(UserState userState) {
DisplayAdjustmentUtils.applyDaltonizerSetting(mContext, userState.mUserId);
}
@@ -2697,8 +2648,6 @@
boolean mRequestTouchExplorationMode;
- boolean mRequestEnhancedWebAccessibility;
-
boolean mRequestFilterKeyEvents;
boolean mRetrieveInteractiveWindows;
@@ -2854,14 +2803,12 @@
mRequestTouchExplorationMode = (info.flags
& AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE) != 0;
- mRequestEnhancedWebAccessibility = (info.flags
- & AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY) != 0;
mRequestFilterKeyEvents = (info.flags
& AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS) != 0;
mRetrieveInteractiveWindows = (info.flags
& AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS) != 0;
mCaptureFingerprintGestures = (info.flags
- & AccessibilityServiceInfo.FLAG_CAPTURE_FINGERPRINT_GESTURES) != 0;
+ & AccessibilityServiceInfo.FLAG_REQUEST_FINGERPRINT_GESTURES) != 0;
mRequestAccessibilityButton = (info.flags
& AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0;
}
@@ -4774,7 +4721,7 @@
public boolean canCaptureFingerprintGestures(Service service) {
return (service.mAccessibilityServiceInfo.getCapabilities()
- & AccessibilityServiceInfo.CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES) != 0;
+ & AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES) != 0;
}
private int resolveProfileParentLocked(int userId) {
@@ -4933,7 +4880,6 @@
public boolean mIsTouchExplorationEnabled;
public boolean mIsTextHighContrastEnabled;
- public boolean mIsEnhancedWebAccessibilityEnabled;
public boolean mIsDisplayMagnificationEnabled;
public boolean mIsNavBarMagnificationEnabled;
public boolean mIsAutoclickEnabled;
@@ -5002,7 +4948,6 @@
mEnabledServices.clear();
mTouchExplorationGrantedServices.clear();
mIsTouchExplorationEnabled = false;
- mIsEnhancedWebAccessibilityEnabled = false;
mIsDisplayMagnificationEnabled = false;
mIsNavBarMagnificationEnabled = false;
mServiceAssignedToAccessibilityButton = null;
@@ -5051,9 +4996,6 @@
private final Uri mTouchExplorationGrantedAccessibilityServicesUri = Settings.Secure
.getUriFor(Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES);
- private final Uri mEnhancedWebAccessibilityUri = Settings.Secure
- .getUriFor(Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION);
-
private final Uri mDisplayInversionEnabledUri = Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED);
@@ -5093,8 +5035,6 @@
contentResolver.registerContentObserver(
mTouchExplorationGrantedAccessibilityServicesUri,
false, this, UserHandle.USER_ALL);
- contentResolver.registerContentObserver(mEnhancedWebAccessibilityUri,
- false, this, UserHandle.USER_ALL);
contentResolver.registerContentObserver(
mDisplayInversionEnabledUri, false, this, UserHandle.USER_ALL);
contentResolver.registerContentObserver(
@@ -5144,10 +5084,6 @@
if (readTouchExplorationGrantedAccessibilityServicesLocked(userState)) {
onUserStateChangedLocked(userState);
}
- } else if (mEnhancedWebAccessibilityUri.equals(uri)) {
- if (readEnhancedWebAccessibilityEnabledChangedLocked(userState)) {
- onUserStateChangedLocked(userState);
- }
} else if (mDisplayDaltonizerEnabledUri.equals(uri)
|| mDisplayDaltonizerUri.equals(uri)) {
updateDisplayDaltonizerLocked(userState);
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index 1b5b2c6..2358ec5 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -19,15 +19,16 @@
import static android.Manifest.permission.MANAGE_AUTO_FILL;
import static android.content.Context.AUTOFILL_MANAGER_SERVICE;
-import static com.android.server.autofill.Helper.DEBUG;
-import static com.android.server.autofill.Helper.VERBOSE;
+import static com.android.server.autofill.Helper.sDebug;
+import static com.android.server.autofill.Helper.sVerbose;
import static com.android.server.autofill.Helper.bundleToString;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
-import android.app.ActivityManagerInternal;
+import android.app.ActivityThread;
import android.content.BroadcastReceiver;
+import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
@@ -38,6 +39,7 @@
import android.graphics.Rect;
import android.net.Uri;
import android.os.Binder;
+import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
@@ -50,16 +52,17 @@
import android.provider.Settings;
import android.service.autofill.FillEventHistory;
import android.util.LocalLog;
-import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.view.autofill.AutofillId;
+import android.view.autofill.AutofillManager;
import android.view.autofill.AutofillValue;
import android.view.autofill.IAutoFillManager;
import android.view.autofill.IAutoFillManagerClient;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.content.PackageMonitor;
import com.android.internal.os.BackgroundThread;
import com.android.internal.os.IResultReceiver;
import com.android.internal.util.DumpUtils;
@@ -73,6 +76,7 @@
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
/**
* Entry point service for autofill management.
@@ -81,7 +85,6 @@
* {@link AutofillManagerServiceImpl} per user; the real work is done by
* {@link AutofillManagerServiceImpl} itself.
*/
-// TODO(b/33197203): Handle removing of packages
public final class AutofillManagerService extends SystemService {
private static final String TAG = "AutofillManagerService";
@@ -109,18 +112,12 @@
@GuardedBy("mLock")
private final SparseBooleanArray mDisabledUsers = new SparseBooleanArray();
- // TODO(b/33197203): set a different max (or disable it) on low-memory devices.
private final LocalLog mRequestsHistory = new LocalLog(20);
- // TODO(b/33197203): is this still needed?
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {
- final String reason = intent.getStringExtra("reason");
- if (VERBOSE) {
- Slog.v(TAG, "close system dialogs: " + reason);
- }
mUi.hideAll();
}
}
@@ -129,7 +126,11 @@
public AutofillManagerService(Context context) {
super(context);
mContext = context;
- mUi = new AutoFillUI(mContext);
+ mUi = new AutoFillUI(ActivityThread.currentActivityThread().getSystemUiContext());
+
+ final boolean debug = Build.IS_DEBUGGABLE;
+ Slog.i(TAG, "Setting debug to " + debug);
+ setDebugLocked(debug);
final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
@@ -153,7 +154,7 @@
final boolean disabledBefore = mDisabledUsers.get(userId);
if (disabledBefore == disabledNow) {
// Nothing changed, do nothing.
- if (DEBUG) {
+ if (sDebug) {
Slog.d(TAG, "Restriction not changed for user " + userId + ": "
+ bundleToString(newRestrictions));
return;
@@ -163,6 +164,84 @@
updateCachedServiceLocked(userId, disabledNow);
}
});
+ startTrackingPackageChanges();
+ }
+
+
+ private void startTrackingPackageChanges() {
+ PackageMonitor monitor = new PackageMonitor() {
+ @Override
+ public void onSomePackagesChanged() {
+ synchronized (mLock) {
+ updateCachedServiceLocked(getChangingUserId());
+ }
+ }
+
+ @Override
+ public void onPackageUpdateFinished(String packageName, int uid) {
+ synchronized (mLock) {
+ final String activePackageName = getActiveAutofillServicePackageName();
+ if (packageName.equals(activePackageName)) {
+ removeCachedServiceLocked(getChangingUserId());
+ }
+ }
+ }
+
+ @Override
+ public void onPackageRemoved(String packageName, int uid) {
+ synchronized (mLock) {
+ final int userId = getChangingUserId();
+ final AutofillManagerServiceImpl userState = peekServiceForUserLocked(userId);
+ if (userState != null) {
+ final ComponentName componentName = userState.getServiceComponentName();
+ if (componentName != null) {
+ if (packageName.equals(componentName.getPackageName())) {
+ handleActiveAutofillServiceRemoved(userId);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean onHandleForceStop(Intent intent, String[] packages,
+ int uid, boolean doit) {
+ synchronized (mLock) {
+ final String activePackageName = getActiveAutofillServicePackageName();
+ for (String pkg : packages) {
+ if (pkg.equals(activePackageName)) {
+ if (!doit) {
+ return true;
+ }
+ handleActiveAutofillServiceRemoved(getChangingUserId());
+ }
+ }
+ }
+ return false;
+ }
+
+ private void handleActiveAutofillServiceRemoved(int userId) {
+ removeCachedServiceLocked(userId);
+ Settings.Secure.putStringForUser(mContext.getContentResolver(),
+ Settings.Secure.AUTOFILL_SERVICE, null, userId);
+ }
+
+ private String getActiveAutofillServicePackageName() {
+ final int userId = getChangingUserId();
+ final AutofillManagerServiceImpl userState = peekServiceForUserLocked(userId);
+ if (userState == null) {
+ return null;
+ }
+ final ComponentName serviceComponent = userState.getServiceComponentName();
+ if (serviceComponent == null) {
+ return null;
+ }
+ return serviceComponent.getPackageName();
+ }
+ };
+
+ // package changes
+ monitor.register(mContext, null, UserHandle.ALL, true);
}
@Override
@@ -222,24 +301,6 @@
}
// Called by Shell command.
- void requestSaveForUser(int userId) {
- Slog.i(TAG, "requestSaveForUser(): " + userId);
- mContext.enforceCallingPermission(MANAGE_AUTO_FILL, TAG);
- final IBinder activityToken = getTopActivityForUser();
- if (activityToken != null) {
- synchronized (mLock) {
- final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
- if (service == null) {
- Log.w(TAG, "handleSaveForUser(): no cached service for userId " + userId);
- return;
- }
-
- service.requestSaveForUserLocked(activityToken);
- }
- }
- }
-
- // Called by Shell command.
void destroySessions(int userId, IResultReceiver receiver) {
Slog.i(TAG, "destroySessions() for userId " + userId);
mContext.enforceCallingPermission(MANAGE_AUTO_FILL, TAG);
@@ -307,6 +368,42 @@
}
}
+ // Called by Shell command.
+ void setLogLevel(int level) {
+ Slog.i(TAG, "setLogLevel(): " + level);
+ boolean debug = false;
+ boolean verbose = false;
+ if (level == AutofillManager.FLAG_ADD_CLIENT_VERBOSE) {
+ debug = verbose = true;
+ } else if (level == AutofillManager.FLAG_ADD_CLIENT_DEBUG) {
+ debug = true;
+ }
+ synchronized (mLock) {
+ setDebugLocked(debug);
+ setVerboseLocked(verbose);
+ }
+ }
+
+ // Called by Shell command.
+ int getLogLevel() {
+ synchronized (mLock) {
+ if (sVerbose) return AutofillManager.FLAG_ADD_CLIENT_VERBOSE;
+ if (sDebug) return AutofillManager.FLAG_ADD_CLIENT_DEBUG;
+ return 0;
+ }
+ }
+
+ private void setDebugLocked(boolean debug) {
+ com.android.server.autofill.Helper.sDebug = debug;
+ android.view.autofill.Helper.sDebug = debug;
+ }
+
+
+ private void setVerboseLocked(boolean verbose) {
+ com.android.server.autofill.Helper.sVerbose = verbose;
+ android.view.autofill.Helper.sVerbose = verbose;
+ }
+
/**
* Removes a cached service for a given user.
*/
@@ -329,30 +426,30 @@
* Updates a cached service for a given user.
*/
private void updateCachedServiceLocked(int userId, boolean disabled) {
- AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
+ AutofillManagerServiceImpl service = getServiceForUserLocked(userId);
if (service != null) {
service.updateLocked(disabled);
+ if (!service.isEnabled()) {
+ removeCachedServiceLocked(userId);
+ }
}
}
- private IBinder getTopActivityForUser() {
- final List<IBinder> topActivities = LocalServices
- .getService(ActivityManagerInternal.class).getTopVisibleActivities();
- if (VERBOSE) {
- Slog.v(TAG, "Top activities (" + topActivities.size() + "): " + topActivities);
- }
- if (topActivities.isEmpty()) {
- Slog.w(TAG, "Could not get top activity");
- return null;
- }
- return topActivities.get(0);
- }
-
final class AutoFillManagerServiceStub extends IAutoFillManager.Stub {
@Override
- public boolean addClient(IAutoFillManagerClient client, int userId) {
+ public int addClient(IAutoFillManagerClient client, int userId) {
synchronized (mLock) {
- return getServiceForUserLocked(userId).addClientLocked(client);
+ int flags = 0;
+ if (getServiceForUserLocked(userId).addClientLocked(client)) {
+ flags |= AutofillManager.FLAG_ADD_CLIENT_ENABLED;
+ }
+ if (sDebug) {
+ flags |= AutofillManager.FLAG_ADD_CLIENT_DEBUG;
+ }
+ if (sVerbose) {
+ flags |= AutofillManager.FLAG_ADD_CLIENT_VERBOSE;
+ }
+ return flags;
}
}
@@ -376,7 +473,6 @@
public int startSession(IBinder activityToken, IBinder windowToken, IBinder appCallback,
AutofillId autofillId, Rect bounds, AutofillValue value, int userId,
boolean hasCallback, int flags, String packageName) {
- // TODO(b/33197203): make sure it's called by resumed / focused activity
activityToken = Preconditions.checkNotNull(activityToken, "activityToken");
appCallback = Preconditions.checkNotNull(appCallback, "appCallback");
@@ -446,12 +542,12 @@
@Override
public void updateSession(int sessionId, AutofillId id, Rect bounds,
- AutofillValue value, int flags, int userId) {
+ AutofillValue value, int action, int flags, int userId) {
synchronized (mLock) {
final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
if (service != null) {
service.updateSessionLocked(sessionId, getCallingUid(), id, bounds, value,
- flags);
+ action, flags);
}
}
}
@@ -487,26 +583,56 @@
}
@Override
+ public boolean isServiceSupported(int userId) {
+ synchronized (mLock) {
+ return !mDisabledUsers.get(userId);
+ }
+ }
+
+ @Override
+ public boolean isServiceEnabled(int userId, String packageName) {
+ synchronized (mLock) {
+ final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
+ if (service == null) return false;
+ return Objects.equals(packageName, service.getPackageName());
+ }
+ }
+
+ @Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
- synchronized (mLock) {
- pw.print("Disabled users: "); pw.println(mDisabledUsers);
- final int size = mServicesCache.size();
- pw.print("Cached services: ");
- if (size == 0) {
- pw.println("none");
- } else {
- pw.println(size);
- for (int i = 0; i < size; i++) {
- pw.print("\nService at index "); pw.println(i);
- final AutofillManagerServiceImpl impl = mServicesCache.valueAt(i);
- impl.dumpLocked(" ", pw);
+
+ boolean oldDebug = sDebug;
+ boolean oldVerbose = sVerbose;
+ try {
+ synchronized (mLock) {
+ oldDebug = sDebug;
+ oldVerbose = sVerbose;
+ setDebugLocked(true);
+ setVerboseLocked(true);
+ pw.print("Debug mode: "); pw.println(oldDebug);
+ pw.print("Verbose mode: "); pw.println(oldVerbose);
+ pw.print("Disabled users: "); pw.println(mDisabledUsers);
+ final int size = mServicesCache.size();
+ pw.print("Cached services: ");
+ if (size == 0) {
+ pw.println("none");
+ } else {
+ pw.println(size);
+ for (int i = 0; i < size; i++) {
+ pw.print("\nService at index "); pw.println(i);
+ final AutofillManagerServiceImpl impl = mServicesCache.valueAt(i);
+ impl.dumpLocked(" ", pw);
+ }
}
+ mUi.dump(pw);
}
- mUi.dump(pw);
+ pw.println("Requests history:");
+ mRequestsHistory.reverseDump(fd, pw, args);
+ } finally {
+ setDebugLocked(oldDebug);
+ setVerboseLocked(oldVerbose);
}
- pw.println("Requests history:");
- mRequestsHistory.reverseDump(fd, pw, args);
}
@Override
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 85fc580..4507eae 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -16,21 +16,14 @@
package com.android.server.autofill;
-import static android.service.autofill.AutofillService.EXTRA_SESSION_ID;
-import static android.service.voice.VoiceInteractionSession.KEY_RECEIVER_EXTRAS;
-import static android.service.voice.VoiceInteractionSession.KEY_STRUCTURE;
-import static android.view.autofill.AutofillManager.FLAG_START_SESSION;
+import static android.view.autofill.AutofillManager.ACTION_START_SESSION;
import static android.view.autofill.AutofillManager.NO_SESSION;
-import static com.android.server.autofill.Helper.DEBUG;
-import static com.android.server.autofill.Helper.VERBOSE;
+import static com.android.server.autofill.Helper.sVerbose;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.app.Activity;
-import android.app.ActivityManager;
import android.app.AppGlobals;
-import android.app.assist.AssistStructure;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ApplicationInfo;
@@ -50,13 +43,10 @@
import android.service.autofill.AutofillServiceInfo;
import android.service.autofill.FillEventHistory;
import android.service.autofill.FillEventHistory.Event;
-import android.service.autofill.FillRequest;
import android.service.autofill.FillResponse;
import android.service.autofill.IAutoFillService;
import android.text.TextUtils;
import android.util.LocalLog;
-import android.util.Log;
-import android.util.PrintWriterPrinter;
import android.util.Slog;
import android.util.SparseArray;
import android.view.autofill.AutofillId;
@@ -66,7 +56,6 @@
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.HandlerCaller;
-import com.android.internal.os.IResultReceiver;
import com.android.server.autofill.ui.AutoFillUI;
import java.io.PrintWriter;
@@ -120,8 +109,6 @@
* <p>They're kept until the {@link AutofillService} finished handling a request, an error
* occurs, or the session times out.
*/
- // TODO(b/33197203): need to make sure service is bound while callback is pending and/or
- // use WeakReference
@GuardedBy("mLock")
private final SparseArray<Session> mSessions = new SparseArray<>();
@@ -129,59 +116,6 @@
@GuardedBy("mLock")
private FillEventHistory mEventHistory;
- /**
- * Receiver of assist data from the app's {@link Activity}.
- */
- private final IResultReceiver mAssistReceiver = new IResultReceiver.Stub() {
- @Override
- public void send(int resultCode, Bundle resultData) throws RemoteException {
- if (VERBOSE) {
- Slog.v(TAG, "resultCode on mAssistReceiver: " + resultCode);
- }
-
- final AssistStructure structure = resultData.getParcelable(KEY_STRUCTURE);
- if (structure == null) {
- Slog.wtf(TAG, "no assist structure for id " + resultCode);
- return;
- }
-
- final Bundle receiverExtras = resultData.getBundle(KEY_RECEIVER_EXTRAS);
- if (receiverExtras == null) {
- Slog.wtf(TAG, "No " + KEY_RECEIVER_EXTRAS + " on receiver");
- return;
- }
-
- final int sessionId = receiverExtras.getInt(EXTRA_SESSION_ID);
- final Session session;
- synchronized (mLock) {
- session = mSessions.get(sessionId);
- if (session == null) {
- Slog.w(TAG, "no server session for " + sessionId);
- return;
- }
- // TODO(b/33197203): since service is fetching the data (to use for save later),
- // we should optimize what's sent (for example, remove layout containers,
- // color / font info, etc...)
- session.setStructureLocked(structure);
- }
-
-
- // TODO(b/33197203, b/33269702): Must fetch the data so it's available later on
- // handleSave(), even if if the activity is gone by then, but structure.ensureData()
- // gives a ONE_WAY warning because system_service could block on app calls.
- // We need to change AssistStructure so it provides a "one-way" writeToParcel()
- // method that sends all the data
- structure.ensureData();
-
- // Sanitize structure before it's sent to service.
- structure.sanitizeForParceling(true);
-
- // TODO(b/33197203): Need to pipe the bundle
- FillRequest request = new FillRequest(structure, null, session.mFlags);
- session.mRemoteFillService.onFillRequest(request);
- }
- };
-
AutofillManagerServiceImpl(Context context, Object lock, LocalLog requestsHistory,
int userId, AutoFillUI ui, boolean disabled) {
mContext = context;
@@ -193,11 +127,10 @@
}
CharSequence getServiceName() {
- if (mInfo == null) {
+ final String packageName = getPackageName();
+ if (packageName == null) {
return null;
}
- final ComponentName serviceComponent = mInfo.getServiceInfo().getComponentName();
- final String packageName = serviceComponent.getPackageName();
try {
final PackageManager pm = mContext.getPackageManager();
@@ -209,6 +142,23 @@
}
}
+ String getPackageName() {
+ final ComponentName serviceComponent = getServiceComponentName();
+ if (serviceComponent != null) {
+ return serviceComponent.getPackageName();
+ }
+ return null;
+ }
+
+ ComponentName getServiceComponentName() {
+ synchronized (mLock) {
+ if (mInfo == null) {
+ return null;
+ }
+ return mInfo.getServiceInfo().getComponentName();
+ }
+ }
+
private String getComponentNameFromSettings() {
return Settings.Secure.getStringForUser(
mContext.getContentResolver(), Settings.Secure.AUTOFILL_SERVICE, mUserId);
@@ -245,10 +195,10 @@
session.removeSelfLocked();
}
}
- sendStateToClients();
+ sendStateToClients(false);
}
- } catch (PackageManager.NameNotFoundException e) {
- Slog.e(TAG, "Bad autofill service name " + componentName + ": " + e);
+ } catch (Exception e) {
+ Slog.e(TAG, "Bad AutofillService '" + componentName + "': " + e);
}
}
@@ -296,7 +246,9 @@
}
final Session session = mSessions.get(sessionId);
if (session != null && uid == session.uid) {
- session.setHasCallback(hasIt);
+ synchronized (mLock) {
+ session.setHasCallbackLocked(hasIt);
+ }
}
}
@@ -320,7 +272,7 @@
hasCallback + " f=" + flags;
mRequestsHistory.log(historyItem);
- newSession.updateLocked(autofillId, virtualBounds, value, FLAG_START_SESSION);
+ newSession.updateLocked(autofillId, virtualBounds, value, ACTION_START_SESSION, flags);
return newSession.id;
}
@@ -332,16 +284,17 @@
final Session session = mSessions.get(sessionId);
if (session == null || uid != session.uid) {
- Slog.w(TAG, "finishSessionLocked(): no session for " + sessionId + "(" + uid + ")");
+ if (sVerbose) {
+ Slog.v(TAG, "finishSessionLocked(): no session for " + sessionId + "(" + uid + ")");
+ }
return;
}
final boolean finished = session.showSaveLocked();
- if (DEBUG) {
- Log.d(TAG, "finishSessionLocked(): session finished on save? " + finished);
- }
+ if (sVerbose) Slog.v(TAG, "finishSessionLocked(): session finished on save? " + finished);
+
if (finished) {
- session.removeSelf();
+ session.removeSelfLocked();
}
}
@@ -386,7 +339,7 @@
do {
tries++;
if (tries > MAX_SESSION_ID_CREATE_TRIES) {
- Log.w(TAG, "Cannot create session in " + MAX_SESSION_ID_CREATE_TRIES + " tries");
+ Slog.w(TAG, "Cannot create session in " + MAX_SESSION_ID_CREATE_TRIES + " tries");
return null;
}
@@ -394,32 +347,10 @@
} while (sessionId == NO_SESSION || mSessions.indexOfKey(sessionId) >= 0);
final Session newSession = new Session(this, mUi, mContext, mHandlerCaller, mUserId, mLock,
- sessionId, uid, activityToken, windowToken, appCallbackToken, hasCallback, flags,
+ sessionId, uid, activityToken, windowToken, appCallbackToken, hasCallback,
mInfo.getServiceInfo().getComponentName(), packageName);
mSessions.put(newSession.id, newSession);
- /*
- * TODO(b/33197203): apply security checks below:
- * - checks if disabled by secure settings / device policy
- * - log operation using noteOp()
- * - check flags
- * - display disclosure if needed
- */
- try {
- final Bundle receiverExtras = new Bundle();
- receiverExtras.putInt(EXTRA_SESSION_ID, sessionId);
- final long identity = Binder.clearCallingIdentity();
- try {
- if (!ActivityManager.getService().requestAutofillData(mAssistReceiver,
- receiverExtras, activityToken)) {
- Slog.w(TAG, "failed to request autofill data for " + activityToken);
- }
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- } catch (RemoteException e) {
- // Should not happen, it's a local call.
- }
return newSession;
}
@@ -462,17 +393,17 @@
}
void updateSessionLocked(int sessionId, int uid, AutofillId autofillId, Rect virtualBounds,
- AutofillValue value, int flags) {
+ AutofillValue value, int action, int flags) {
final Session session = mSessions.get(sessionId);
if (session == null || session.uid != uid) {
- if (VERBOSE) {
+ if (sVerbose) {
Slog.v(TAG, "updateSessionLocked(): session gone for " + sessionId + "(" + uid
+ ")");
}
return;
}
- session.updateLocked(autofillId, virtualBounds, value, flags);
+ session.updateLocked(autofillId, virtualBounds, value, action, flags);
}
void removeSessionLocked(int sessionId) {
@@ -492,15 +423,15 @@
}
void destroyLocked() {
- if (VERBOSE) {
- Slog.v(TAG, "destroyLocked()");
- }
+ if (sVerbose) Slog.v(TAG, "destroyLocked()");
final int numSessions = mSessions.size();
for (int i = 0; i < numSessions; i++) {
mSessions.valueAt(i).destroyLocked();
}
mSessions.clear();
+
+ sendStateToClients(true);
}
CharSequence getServiceLabel() {
@@ -583,12 +514,6 @@
pw.println(mContext.getString(R.string.config_defaultAutofillService));
pw.print(prefix); pw.print("Disabled: "); pw.println(mDisabled);
- if (VERBOSE && mInfo != null) {
- // ServiceInfo dump is too noisy and redundant (it can be obtained through other dumps)
- pw.print(prefix); pw.println("ServiceInfo:");
- mInfo.getServiceInfo().dump(new PrintWriterPrinter(pw), prefix + prefix);
- }
-
final int size = mSessions.size();
if (size == 0) {
pw.print(prefix); pw.println("No sessions");
@@ -618,7 +543,7 @@
void destroySessionsLocked() {
while (mSessions.size() > 0) {
- mSessions.valueAt(0).removeSelf();
+ mSessions.valueAt(0).removeSelfLocked();
}
}
@@ -630,7 +555,7 @@
}
}
- private void sendStateToClients() {
+ private void sendStateToClients(boolean resetClient) {
final RemoteCallbackList<IAutoFillManagerClient> clients;
final int userClientCount;
synchronized (mLock) {
@@ -644,7 +569,11 @@
for (int i = 0; i < userClientCount; i++) {
final IAutoFillManagerClient client = clients.getBroadcastItem(i);
try {
- client.setState(isEnabled());
+ final boolean resetSession;
+ synchronized (mLock) {
+ resetSession = resetClient || isClientSessionDestroyedLocked(client);
+ }
+ client.setState(isEnabled(), resetSession, resetClient);
} catch (RemoteException re) {
/* ignore */
}
@@ -654,7 +583,18 @@
}
}
- private boolean isEnabled() {
+ private boolean isClientSessionDestroyedLocked(IAutoFillManagerClient client) {
+ final int sessionCount = mSessions.size();
+ for (int i = 0; i < sessionCount; i++) {
+ final Session session = mSessions.valueAt(i);
+ if (session.getClient().equals(client)) {
+ return session.isDestroyed();
+ }
+ }
+ return true;
+ }
+
+ boolean isEnabled() {
return mInfo != null && !mDisabled;
}
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java
index 6debc2f..1b9c86e 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java
@@ -18,10 +18,10 @@
import static com.android.server.autofill.AutofillManagerService.RECEIVER_BUNDLE_EXTRA_SESSIONS;
-import android.app.ActivityManager;
import android.os.Bundle;
import android.os.ShellCommand;
import android.os.UserHandle;
+import android.view.autofill.AutofillManager;
import com.android.internal.os.IResultReceiver;
@@ -45,14 +45,16 @@
}
final PrintWriter pw = getOutPrintWriter();
switch (cmd) {
- case "save":
- return requestSave();
case "list":
return requestList(pw);
case "destroy":
return requestDestroy(pw);
case "reset":
return requestReset();
+ case "get":
+ return requestGet(pw);
+ case "set":
+ return requestSet(pw);
default:
return handleDefaultCommands(cmd);
}
@@ -65,25 +67,64 @@
pw.println(" help");
pw.println(" Prints this help text.");
pw.println("");
+ pw.println(" get log_level ");
+ pw.println(" Gets the Autofill log level (off | debug | verbose).");
+ pw.println("");
+ pw.println(" set log_level [off | debug | verbose]");
+ pw.println(" Sets the Autofill log level.");
+ pw.println("");
pw.println(" list sessions [--user USER_ID]");
pw.println(" List all pending sessions.");
pw.println("");
pw.println(" destroy sessions [--user USER_ID]");
pw.println(" Destroy all pending sessions.");
pw.println("");
- pw.println(" save [--user USER_ID]");
- pw.println(" Request provider to save contents of the top activity.");
- pw.println("");
pw.println(" reset");
pw.println(" Reset all pending sessions and cached service connections.");
pw.println("");
}
}
- private int requestSave() {
- final int userId = getUserIdFromArgsOrCurrentUser();
- mService.requestSaveForUser(userId);
- return 0;
+ private int requestGet(PrintWriter pw) {
+ if (!isNextArgLogLevel(pw, "get")) {
+ return -1;
+ }
+ final int logLevel = mService.getLogLevel();
+ switch (logLevel) {
+ case AutofillManager.FLAG_ADD_CLIENT_VERBOSE:
+ pw.println("verbose");
+ return 0;
+ case AutofillManager.FLAG_ADD_CLIENT_DEBUG:
+ pw.println("debug");
+ return 0;
+ case 0:
+ pw.println("off");
+ return 0;
+ default:
+ pw.println("unknow (" + logLevel + ")");
+ return 0;
+ }
+ }
+
+ private int requestSet(PrintWriter pw) {
+ if (!isNextArgLogLevel(pw, "set")) {
+ return -1;
+ }
+ final String logLevel = getNextArg();
+ switch (logLevel.toLowerCase()) {
+ case "verbose":
+ mService.setLogLevel(AutofillManager.FLAG_ADD_CLIENT_VERBOSE);
+ return 0;
+ case "debug":
+ mService.setLogLevel(AutofillManager.FLAG_ADD_CLIENT_DEBUG);
+ return 0;
+ case "off":
+ mService.setLogLevel(0);
+ return 0;
+ default:
+ pw.println("Invalid level: " + logLevel);
+ return -1;
+ }
}
private int requestDestroy(PrintWriter pw) {
@@ -132,6 +173,15 @@
return true;
}
+ private boolean isNextArgLogLevel(PrintWriter pw, String cmd) {
+ final String type = getNextArgRequired();
+ if (!type.equals("log_level")) {
+ pw.println("Error: invalid " + cmd + " type: " + type);
+ return false;
+ }
+ return true;
+ }
+
private int requestSessionCommon(PrintWriter pw, CountDownLatch latch,
Runnable command) {
command.run();
@@ -155,13 +205,6 @@
return 0;
}
- private int getUserIdFromArgsOrCurrentUser() {
- if ("--user".equals(getNextArg())) {
- return UserHandle.parseUserArg(getNextArgRequired());
- }
- return ActivityManager.getCurrentUser();
- }
-
private int getUserIdFromArgsOrAllUsers() {
if ("--user".equals(getNextArg())) {
return UserHandle.parseUserArg(getNextArgRequired());
diff --git a/services/autofill/java/com/android/server/autofill/Helper.java b/services/autofill/java/com/android/server/autofill/Helper.java
index 70e97c4..68ade63 100644
--- a/services/autofill/java/com/android/server/autofill/Helper.java
+++ b/services/autofill/java/com/android/server/autofill/Helper.java
@@ -16,19 +16,32 @@
package com.android.server.autofill;
+import android.annotation.NonNull;
+import android.app.assist.AssistStructure;
+import android.app.assist.AssistStructure.ViewNode;
import android.os.Bundle;
+import android.view.autofill.AutofillId;
import java.util.Arrays;
import java.util.Objects;
import java.util.Set;
-final class Helper {
+public final class Helper {
- static final boolean DEBUG = true; // TODO(b/33197203): set to false when stable
- static final boolean VERBOSE = false;
+ /**
+ * Defines a logging flag that can be dynamically changed at runtime using
+ * {@code cmd autofill debug [on|off]}.
+ */
+ public static boolean sDebug = false;
+
+ /**
+ * Defines a logging flag that can be dynamically changed at runtime using
+ * {@code cmd autofill verbose [on|off]}.
+ */
+ public static boolean sVerbose = false;
static void append(StringBuilder builder, Bundle bundle) {
- if (bundle == null || !DEBUG) {
+ if (bundle == null || !sVerbose) {
builder.append("null");
return;
}
@@ -52,4 +65,37 @@
private Helper() {
throw new UnsupportedOperationException("contains static members only");
}
+
+ static ViewNode findViewNodeById(@NonNull AssistStructure structure, @NonNull AutofillId id) {
+ final int size = structure.getWindowNodeCount();
+ for (int i = 0; i < size; i++) {
+ final AssistStructure.WindowNode window = structure.getWindowNodeAt(i);
+ final ViewNode root = window.getRootViewNode();
+ if (id.equals(root.getAutofillId())) {
+ return root;
+ }
+ final ViewNode child = findViewNodeById(root, id);
+ if (child != null) {
+ return child;
+ }
+ }
+ return null;
+ }
+
+ static ViewNode findViewNodeById(@NonNull ViewNode parent, @NonNull AutofillId id) {
+ final int childrenSize = parent.getChildCount();
+ if (childrenSize > 0) {
+ for (int i = 0; i < childrenSize; i++) {
+ final ViewNode child = parent.getChildAt(i);
+ if (id.equals(child.getAutofillId())) {
+ return child;
+ }
+ final ViewNode grandChild = findViewNodeById(child, id);
+ if (grandChild != null && id.equals(grandChild.getAutofillId())) {
+ return grandChild;
+ }
+ }
+ }
+ return null;
+ }
}
diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
index 4d0f380..a12ebb2 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
@@ -16,7 +16,10 @@
package com.android.server.autofill;
-import static com.android.server.autofill.Helper.DEBUG;
+import static android.service.autofill.FillRequest.INVALID_REQUEST_ID;
+
+import static com.android.server.autofill.Helper.sDebug;
+import static com.android.server.autofill.Helper.sVerbose;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -87,8 +90,8 @@
private PendingRequest mPendingRequest;
public interface FillServiceCallbacks {
- void onFillRequestSuccess(@Nullable FillResponse response, int serviceUid,
- @NonNull String servicePackageName, int requestId);
+ void onFillRequestSuccess(int requestFlags, @Nullable FillResponse response, int serviceUid,
+ @NonNull String servicePackageName);
void onFillRequestFailure(@Nullable CharSequence message,
@NonNull String servicePackageName);
void onSaveRequestSuccess(@NonNull String servicePackageName);
@@ -134,6 +137,33 @@
mCallbacks.onServiceDied(this);
}
+ /**
+ * Cancel the currently pending request.
+ *
+ * <p>This can be used when the request is unnecessary or will be superceeded by a request that
+ * will soon be queued.
+ *
+ * @return the id of the canceled request, or {@link FillRequest#INVALID_REQUEST_ID} if no
+ * {@link PendingFillRequest} was canceled.
+ */
+ public int cancelCurrentRequest() {
+ if (mDestroyed) {
+ return INVALID_REQUEST_ID;
+ }
+
+ int requestId = INVALID_REQUEST_ID;
+ if (mPendingRequest != null) {
+ if (mPendingRequest instanceof PendingFillRequest) {
+ requestId = ((PendingFillRequest) mPendingRequest).mRequest.getId();
+ }
+
+ mPendingRequest.cancel();
+ mPendingRequest = null;
+ }
+
+ return requestId;
+ }
+
public void onFillRequest(@NonNull FillRequest request) {
cancelScheduledUnbind();
final PendingFillRequest pendingRequest = new PendingFillRequest(request, this);
@@ -190,9 +220,7 @@
mPendingRequest = pendingRequest;
ensureBound();
} else {
- if (DEBUG) {
- Slog.d(LOG_TAG, "[user: " + mUserId + "] handlePendingRequest()");
- }
+ if (sVerbose) Slog.v(LOG_TAG, "[user: " + mUserId + "] handlePendingRequest()");
pendingRequest.run();
if (pendingRequest.isFinal()) {
mCompleted = true;
@@ -208,9 +236,7 @@
if (isBound() || mBinding) {
return;
}
- if (DEBUG) {
- Slog.d(LOG_TAG, "[user: " + mUserId + "] ensureBound()");
- }
+ if (sVerbose) Slog.v(LOG_TAG, "[user: " + mUserId + "] ensureBound()");
mBinding = true;
boolean willBind = mContext.bindServiceAsUser(mIntent, mServiceConnection,
@@ -218,9 +244,7 @@
new UserHandle(mUserId));
if (!willBind) {
- if (DEBUG) {
- Slog.d(LOG_TAG, "[user: " + mUserId + "] could not bind to " + mIntent);
- }
+ if (sDebug) Slog.d(LOG_TAG, "[user: " + mUserId + "] could not bind to " + mIntent);
mBinding = false;
if (!mServiceDied) {
@@ -233,9 +257,7 @@
if (!isBound() && !mBinding) {
return;
}
- if (DEBUG) {
- Slog.d(LOG_TAG, "[user: " + mUserId + "] ensureUnbound()");
- }
+ if (sVerbose) Slog.v(LOG_TAG, "[user: " + mUserId + "] ensureUnbound()");
mBinding = false;
if (isBound()) {
try {
@@ -252,11 +274,11 @@
}
private void dispatchOnFillRequestSuccess(PendingRequest pendingRequest,
- int callingUid, FillResponse response, int requestId) {
+ int callingUid, int requestFlags, FillResponse response) {
mHandler.getHandler().post(() -> {
if (handleResponseCallbackCommon(pendingRequest)) {
- mCallbacks.onFillRequestSuccess(response, callingUid,
- mComponentName.getPackageName(), requestId);
+ mCallbacks.onFillRequestSuccess(requestFlags, response, callingUid,
+ mComponentName.getPackageName());
}
});
}
@@ -420,11 +442,11 @@
}
@Override
- public void onSuccess(FillResponse response, int requestId) {
+ public void onSuccess(FillResponse response) {
RemoteFillService remoteService = mWeakService.get();
if (remoteService != null) {
- remoteService.dispatchOnFillRequestSuccess(
- PendingFillRequest.this, getCallingUid(), response, requestId);
+ remoteService.dispatchOnFillRequestSuccess(PendingFillRequest.this,
+ getCallingUid(), request.getFlags(), response);
}
}
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 4bc3872..c85ce43 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -14,30 +14,35 @@
* limitations under the License.
*/
-
package com.android.server.autofill;
import static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST;
-import static android.view.autofill.AutofillManager.FLAG_START_SESSION;
-import static android.view.autofill.AutofillManager.FLAG_VALUE_CHANGED;
-import static android.view.autofill.AutofillManager.FLAG_VIEW_ENTERED;
-import static android.view.autofill.AutofillManager.FLAG_VIEW_EXITED;
+import static android.service.autofill.FillRequest.INVALID_REQUEST_ID;
+import static android.service.voice.VoiceInteractionSession.KEY_RECEIVER_EXTRAS;
+import static android.service.voice.VoiceInteractionSession.KEY_STRUCTURE;
+import static android.view.autofill.AutofillManager.ACTION_START_SESSION;
+import static android.view.autofill.AutofillManager.ACTION_VALUE_CHANGED;
+import static android.view.autofill.AutofillManager.ACTION_VIEW_ENTERED;
+import static android.view.autofill.AutofillManager.ACTION_VIEW_EXITED;
-import static com.android.server.autofill.Helper.DEBUG;
-import static com.android.server.autofill.Helper.VERBOSE;
+import static com.android.server.autofill.Helper.sDebug;
+import static com.android.server.autofill.Helper.sVerbose;
+import static com.android.server.autofill.Helper.findViewNodeById;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.Activity;
+import android.app.ActivityManager;
import android.app.assist.AssistStructure;
import android.app.assist.AssistStructure.AutofillOverlay;
import android.app.assist.AssistStructure.ViewNode;
-import android.app.assist.AssistStructure.WindowNode;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.graphics.Rect;
import android.metrics.LogMaker;
+import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Parcelable;
@@ -64,14 +69,16 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.os.HandlerCaller;
+import com.android.internal.os.IResultReceiver;
+import com.android.internal.util.ArrayUtils;
import com.android.server.autofill.ui.AutoFillUI;
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.concurrent.atomic.AtomicInteger;
/**
* A session for a given activity.
@@ -85,14 +92,12 @@
* to fill the activity but it requires authentication first, that response need to be held
* until the user authenticates or it times out.
*/
-// TODO(b/33197203): make sure sessions are removed (and tested by CTS):
-// - On all authentication scenarios.
-// - When user does not interact back after a while.
-// - When service is unbound.
final class Session implements RemoteFillService.FillServiceCallbacks, ViewState.Listener,
AutoFillUI.AutoFillUiCallback {
private static final String TAG = "AutofillSession";
+ private static final String EXTRA_REQUEST_ID = "android.service.autofill.extra.REQUEST_ID";
+
private final AutofillManagerServiceImpl mService;
private final HandlerCaller mHandlerCaller;
private final Object mLock;
@@ -100,6 +105,8 @@
private final MetricsLogger mMetricsLogger = new MetricsLogger();
+ private static AtomicInteger sIdCounter = new AtomicInteger();
+
/** Id of the session */
public final int id;
@@ -127,8 +134,7 @@
@GuardedBy("mLock")
private IAutoFillManagerClient mClient;
- @GuardedBy("mLock")
- RemoteFillService mRemoteFillService;
+ private final RemoteFillService mRemoteFillService;
@GuardedBy("mLock")
private SparseArray<FillResponse> mResponses;
@@ -146,11 +152,11 @@
private Dataset mDatasetWaitingAuth;
/**
- * Assist structure sent by the app; it will be updated (sanitized, change values for save)
- * before sent to {@link AutofillService}.
+ * Contexts read from the app; they will be updated (sanitized, change values for save) before
+ * sent to {@link AutofillService}. Ordered by the time they we read.
*/
@GuardedBy("mLock")
- private AssistStructure mStructure;
+ private ArrayList<FillContext> mContexts;
/**
* Whether the client has an {@link android.view.autofill.AutofillManager.AutofillCallback}.
@@ -164,16 +170,163 @@
@GuardedBy("mLock")
private Bundle mClientState;
+ @GuardedBy("mLock")
+ private boolean mDestroyed;
+
/**
- * Flags used to start the session.
+ * Receiver of assist data from the app's {@link Activity}.
*/
- int mFlags;
+ private final IResultReceiver mAssistReceiver = new IResultReceiver.Stub() {
+ @Override
+ public void send(int resultCode, Bundle resultData) throws RemoteException {
+ final AssistStructure structure = resultData.getParcelable(KEY_STRUCTURE);
+ if (structure == null) {
+ Slog.wtf(TAG, "no assist structure");
+ return;
+ }
+
+ final Bundle receiverExtras = resultData.getBundle(KEY_RECEIVER_EXTRAS);
+ if (receiverExtras == null) {
+ Slog.wtf(TAG, "No " + KEY_RECEIVER_EXTRAS + " on receiver");
+ return;
+ }
+
+ final int requestId = receiverExtras.getInt(EXTRA_REQUEST_ID);
+
+ if (sVerbose) {
+ Slog.v(TAG, "New structure for requestId " + requestId + ": " + structure);
+ }
+
+ final FillRequest request;
+ synchronized (mLock) {
+ // TODO(b/35708678): Must fetch the data so it's available later on handleSave(),
+ // even if if the activity is gone by then, but structure .ensureData() gives a
+ // ONE_WAY warning because system_service could block on app calls. We need to
+ // change AssistStructure so it provides a "one-way" writeToParcel() method that
+ // sends all the data
+ structure.ensureData();
+
+ // Sanitize structure before it's sent to service.
+ structure.sanitizeForParceling(true);
+
+ // Flags used to start the session.
+ final int flags = structure.getFlags();
+
+ if (mContexts == null) {
+ mContexts = new ArrayList<>(1);
+ }
+ mContexts.add(new FillContext(requestId, structure));
+
+ cancelCurrentRequestLocked();
+
+ final int numContexts = mContexts.size();
+ for (int i = 0; i < numContexts; i++) {
+ fillStructureWithAllowedValues(mContexts.get(i).getStructure());
+ }
+
+ request = new FillRequest(requestId, mContexts, mClientState, flags);
+ }
+
+ mRemoteFillService.onFillRequest(request);
+ }
+ };
+
+ /**
+ * Updates values of the nodes in the structure so that:
+ * - proper node is focused
+ * - autofillValue is sent back to service when it was previously autofilled
+ *
+ * @param structure The structure to be filled
+ */
+ private void fillStructureWithAllowedValues(@NonNull AssistStructure structure) {
+ final int numViewStates = mViewStates.size();
+ for (int i = 0; i < numViewStates; i++) {
+ final ViewState viewState = mViewStates.valueAt(i);
+
+ final ViewNode node = findViewNodeById(structure, viewState.id);
+ if (node == null) {
+ Slog.w(TAG, "fillStructureWithAllowedValues(): no node for " + viewState.id);
+ continue;
+ }
+
+ final AutofillValue initialValue = viewState.getInitialValue();
+ final AutofillValue filledValue = viewState.getAutofilledValue();
+ final AutofillOverlay overlay = new AutofillOverlay();
+ if (filledValue != null && !filledValue.equals(initialValue)) {
+ overlay.value = filledValue;
+ }
+ if (mCurrentViewId != null) {
+ overlay.focused = mCurrentViewId.equals(viewState.id);
+ }
+
+ node.setAutofillOverlay(overlay);
+ }
+ }
+
+ /**
+ * Cancels the last request sent to the {@link #mRemoteFillService}.
+ */
+ private void cancelCurrentRequestLocked() {
+ int canceledRequest = mRemoteFillService.cancelCurrentRequest();
+
+ // Remove the FillContext as there will never be a response for the service
+ if (canceledRequest != INVALID_REQUEST_ID && mContexts != null) {
+ int numContexts = mContexts.size();
+
+ // It is most likely the last context, hence search backwards
+ for (int i = numContexts - 1; i >= 0; i--) {
+ if (mContexts.get(i).getRequestId() == canceledRequest) {
+ mContexts.remove(i);
+ break;
+ }
+ }
+ }
+
+ }
+
+ /**
+ * Reads a new structure and then request a new fill response from the fill service.
+ */
+ private void requestNewFillResponseLocked(int flags) {
+ int requestId;
+
+ do {
+ requestId = sIdCounter.getAndIncrement();
+ } while (requestId == INVALID_REQUEST_ID);
+
+ if (sVerbose) {
+ Slog.v(TAG, "Requesting structure for requestId=" + requestId + ", flags=" + flags);
+ }
+
+ // If the focus changes very quickly before the first request is returned each focus change
+ // triggers a new partition and we end up with many duplicate partitions. This is
+ // enhanced as the focus change can be much faster than the taking of the assist structure.
+ // Hence remove the currently queued request and replace it with the one queued after the
+ // structure is taken. This causes only one fill request per bust of focus changes.
+ cancelCurrentRequestLocked();
+
+ try {
+ final Bundle receiverExtras = new Bundle();
+ receiverExtras.putInt(EXTRA_REQUEST_ID, requestId);
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ if (!ActivityManager.getService().requestAutofillData(mAssistReceiver,
+ receiverExtras, mActivityToken, flags)) {
+ Slog.w(TAG, "failed to request autofill data for " + mActivityToken);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ } catch (RemoteException e) {
+ // Should not happen, it's a local call.
+ }
+ }
Session(@NonNull AutofillManagerServiceImpl service, @NonNull AutoFillUI ui,
@NonNull Context context, @NonNull HandlerCaller handlerCaller, int userId,
@NonNull Object lock, int sessionId, int uid, @NonNull IBinder activityToken,
@Nullable IBinder windowToken, @NonNull IBinder client, boolean hasCallback,
- int flags, @NonNull ComponentName componentName, @NonNull String packageName) {
+ @NonNull ComponentName componentName, @NonNull String packageName) {
id = sessionId;
this.uid = uid;
mService = service;
@@ -185,7 +338,6 @@
mWindowToken = windowToken;
mHasCallback = hasCallback;
mPackageName = packageName;
- mFlags = flags;
mClient = IAutoFillManagerClient.Stub.asInterface(client);
mMetricsLogger.action(MetricsEvent.AUTOFILL_SESSION_STARTED, mPackageName);
@@ -196,7 +348,7 @@
*
* @return The activity token
*/
- public IBinder getActivityTokenLocked() {
+ IBinder getActivityTokenLocked() {
return mActivityToken;
}
@@ -208,6 +360,11 @@
*/
void switchWindow(@NonNull IBinder newWindow) {
synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#switchWindow() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
mWindowToken = newWindow;
}
}
@@ -220,6 +377,11 @@
*/
void switchActivity(@NonNull IBinder newActivity, @NonNull IBinder newClient) {
synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#switchActivity() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
mActivityToken = newActivity;
mClient = IAutoFillManagerClient.Stub.asInterface(newClient);
@@ -230,10 +392,17 @@
// FillServiceCallbacks
@Override
- public void onFillRequestSuccess(@Nullable FillResponse response, int serviceUid,
- @NonNull String servicePackageName, int requestId) {
+ public void onFillRequestSuccess(int requestFlags, @Nullable FillResponse response,
+ int serviceUid, @NonNull String servicePackageName) {
+ synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#onFillRequestSuccess() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
+ }
if (response == null) {
- if ((mFlags & FLAG_MANUAL_REQUEST) != 0) {
+ if ((requestFlags & FLAG_MANUAL_REQUEST) != 0) {
getUiForShowing().showError(R.string.autofill_error_cannot_autofill);
}
// Nothing to be done, but need to notify client.
@@ -251,10 +420,10 @@
}
synchronized (mLock) {
if (response.getAuthentication() != null) {
- // TODO(b/33197203 , b/35707731): make sure it's ignored if there is one already
+ // TODO(b/37424539): proper implementation
mResponseWaitingAuth = response;
}
- processResponseLocked(response, requestId);
+ processResponseLocked(response);
}
final LogMaker log = (new LogMaker(MetricsEvent.AUTOFILL_REQUEST))
@@ -271,6 +440,13 @@
@Override
public void onFillRequestFailure(@Nullable CharSequence message,
@NonNull String servicePackageName) {
+ synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#onFillRequestFailure() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
+ }
LogMaker log = (new LogMaker(MetricsEvent.AUTOFILL_REQUEST))
.setType(MetricsEvent.TYPE_FAILURE)
.setPackageName(mPackageName)
@@ -284,6 +460,13 @@
// FillServiceCallbacks
@Override
public void onSaveRequestSuccess(@NonNull String servicePackageName) {
+ synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#onSaveRequestSuccess() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
+ }
LogMaker log = (new LogMaker(
MetricsEvent.AUTOFILL_DATA_SAVE_REQUEST))
.setType(MetricsEvent.TYPE_SUCCESS)
@@ -299,6 +482,13 @@
@Override
public void onSaveRequestFailure(@Nullable CharSequence message,
@NonNull String servicePackageName) {
+ synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#onSaveRequestFailure() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
+ }
LogMaker log = (new LogMaker(
MetricsEvent.AUTOFILL_DATA_SAVE_REQUEST))
.setType(MetricsEvent.TYPE_FAILURE)
@@ -310,12 +500,44 @@
removeSelf();
}
+ /**
+ * Gets the {@link FillContext} for a request.
+ *
+ * @param requestId The id of the request
+ *
+ * @return The context or {@code null} if there is no context
+ */
+ @Nullable private FillContext getFillContextByRequestIdLocked(int requestId) {
+ if (mContexts == null) {
+ return null;
+ }
+
+ int numContexts = mContexts.size();
+ for (int i = 0; i < numContexts; i++) {
+ FillContext context = mContexts.get(i);
+
+ if (context.getRequestId() == requestId) {
+ return context;
+ }
+ }
+
+ return null;
+ }
+
// FillServiceCallbacks
@Override
- public void authenticate(IntentSender intent, Bundle extras) {
+ public void authenticate(int requestId, IntentSender intent, Bundle extras) {
final Intent fillInIntent;
synchronized (mLock) {
- fillInIntent = createAuthFillInIntent(mStructure, extras);
+ synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#authenticate() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
+ }
+ fillInIntent = createAuthFillInIntent(
+ getFillContextByRequestIdLocked(requestId).getStructure(), extras);
}
mService.setAuthenticationSelected();
@@ -326,18 +548,32 @@
// FillServiceCallbacks
@Override
public void onServiceDied(RemoteFillService service) {
- // TODO(b/33197203): implement
+ // TODO(b/337565347): implement
}
// AutoFillUiCallback
@Override
- public void fill(Dataset dataset) {
- mHandlerCaller.getHandler().post(() -> autoFill(dataset));
+ public void fill(int requestId, Dataset dataset) {
+ synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#fill() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
+ }
+ mHandlerCaller.getHandler().post(() -> autoFill(requestId, dataset));
}
// AutoFillUiCallback
@Override
public void save() {
+ synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#save() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
+ }
mHandlerCaller.getHandler()
.obtainMessage(AutofillManagerServiceImpl.MSG_SERVICE_SAVE, id, 0)
.sendToTarget();
@@ -346,6 +582,13 @@
// AutoFillUiCallback
@Override
public void cancelSave() {
+ synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#cancelSave() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
+ }
mHandlerCaller.getHandler().post(() -> removeSelf());
}
@@ -354,6 +597,11 @@
public void requestShowFillUi(AutofillId id, int width, int height,
IAutofillWindowPresenter presenter) {
synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#requestShowFillUi() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
if (id.equals(mCurrentViewId)) {
try {
final ViewState view = mViewStates.get(id);
@@ -363,7 +611,7 @@
Slog.e(TAG, "Error requesting to show fill UI", e);
}
} else {
- if (DEBUG) {
+ if (sDebug) {
Slog.d(TAG, "Do not show full UI on " + id + " as it is not the current view ("
+ mCurrentViewId + ") anymore");
}
@@ -375,6 +623,8 @@
@Override
public void requestHideFillUi(AutofillId id) {
synchronized (mLock) {
+ // NOTE: We allow this call in a destroyed state as the UI is
+ // asked to go away after we get destroyed, so let it do that.
try {
mClient.requestHideFillUi(this.id, mWindowToken, id);
} catch (RemoteException e) {
@@ -387,6 +637,11 @@
@Override
public void startIntentSender(IntentSender intentSender) {
synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#startIntentSender() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
removeSelfLocked();
}
mHandlerCaller.getHandler().post(() -> {
@@ -400,19 +655,26 @@
});
}
- public void setAuthenticationResultLocked(Bundle data) {
+ void setAuthenticationResultLocked(Bundle data) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#setAuthenticationResultLocked() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
if ((mResponseWaitingAuth == null && mDatasetWaitingAuth == null) || data == null) {
removeSelf();
} else {
final Parcelable result = data.getParcelable(
AutofillManager.EXTRA_AUTHENTICATION_RESULT);
if (result instanceof FillResponse) {
+ FillResponse response = (FillResponse) result;
+
mMetricsLogger.action(MetricsEvent.AUTOFILL_AUTHENTICATED, mPackageName);
final int requestIndex = mResponses.indexOfValue(mResponseWaitingAuth);
mResponseWaitingAuth = null;
if (requestIndex >= 0) {
- final int requestId = mResponses.keyAt(requestIndex);
- processResponseLocked((FillResponse) result, requestId);
+ response.setRequestId(mResponses.keyAt(requestIndex));
+ processResponseLocked(response);
} else {
Slog.e(TAG, "Error cannot find id for auth response");
}
@@ -424,7 +686,7 @@
if (index >= 0) {
response.getDatasets().set(index, dataset);
mDatasetWaitingAuth = null;
- autoFill(dataset);
+ autoFill(mResponses.keyAt(i), dataset);
resetViewStatesLocked(dataset, ViewState.STATE_WAITING_DATASET_AUTH);
return;
}
@@ -433,44 +695,50 @@
}
}
- public void setHasCallback(boolean hasIt) {
+ void setHasCallbackLocked(boolean hasIt) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#setHasCallbackLocked() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
mHasCallback = hasIt;
}
- public void setStructureLocked(AssistStructure structure) {
- mStructure = structure;
- }
-
/**
* Shows the save UI, when session can be saved.
*
* @return {@code true} if session is done, or {@code false} if it's pending user action.
*/
public boolean showSaveLocked() {
- if (mStructure == null) {
- Slog.d(TAG, "showSaveLocked(): no mStructure");
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#showSaveLocked() rejected - session: "
+ + id + " destroyed");
+ return false;
+ }
+ if (mContexts == null) {
+ Slog.d(TAG, "showSaveLocked(): no contexts");
return true;
}
if (mResponses == null) {
// Happens when the activity / session was finished before the service replied, or
// when the service cannot autofill it (and returned a null response).
- if (DEBUG) {
- Slog.d(TAG, "showSaveLocked(): no responses on session");
+ if (sVerbose) {
+ Slog.v(TAG, "showSaveLocked(): no responses on session");
}
return true;
}
final int lastResponseIdx = getLastResponseIndex();
if (lastResponseIdx < 0) {
- Slog.d(TAG, "showSaveLocked(): mResponses=" + mResponses
+ Slog.w(TAG, "showSaveLocked(): did not get last response. mResponses=" + mResponses
+ ", mViewStates=" + mViewStates);
return true;
}
final FillResponse response = mResponses.valueAt(lastResponseIdx);
final SaveInfo saveInfo = response.getSaveInfo();
- if (DEBUG) {
- Slog.d(TAG, "showSaveLocked(): mResponses=" + mResponses
+ if (sVerbose) {
+ Slog.v(TAG, "showSaveLocked(): mResponses=" + mResponses + ", mContexts=" + mContexts
+ ", mViewStates=" + mViewStates);
}
@@ -505,7 +773,7 @@
final AutofillValue currentValue = viewState.getCurrentValue();
if (currentValue == null || currentValue.isEmpty()) {
- if (DEBUG) {
+ if (sDebug) {
Slog.d(TAG, "showSaveLocked(): empty value for required " + id );
}
allRequiredAreNotEmpty = false;
@@ -514,7 +782,7 @@
final AutofillValue filledValue = viewState.getAutofilledValue();
if (!currentValue.equals(filledValue)) {
- if (DEBUG) {
+ if (sDebug) {
Slog.d(TAG, "showSaveLocked(): found a change on required " + id + ": "
+ filledValue + " => " + currentValue);
}
@@ -537,7 +805,7 @@
final AutofillValue currentValue = viewState.getCurrentValue();
final AutofillValue filledValue = viewState.getAutofilledValue();
if (currentValue != null && !currentValue.equals(filledValue)) {
- if (DEBUG) {
+ if (sDebug) {
Slog.d(TAG, "finishSessionLocked(): found a change on optional "
+ id + ": " + filledValue + " => " + currentValue);
}
@@ -554,7 +822,7 @@
}
}
// Nothing changed...
- if (DEBUG) {
+ if (sDebug) {
Slog.d(TAG, "showSaveLocked(): with no changes, comes no responsibilities."
+ "allRequiredAreNotNull=" + allRequiredAreNotEmpty
+ ", atLeastOneChanged=" + atLeastOneChanged);
@@ -566,177 +834,198 @@
* Calls service when user requested save.
*/
void callSaveLocked() {
- if (DEBUG) {
- Slog.d(TAG, "callSaveLocked(): mViewStates=" + mViewStates);
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#callSaveLocked() rejected - session: "
+ + id + " destroyed");
+ return;
}
- for (Entry<AutofillId, ViewState> entry : mViewStates.entrySet()) {
- final AutofillValue value = entry.getValue().getCurrentValue();
- if (value == null) {
- if (VERBOSE) {
- Slog.v(TAG, "callSaveLocked(): skipping " + entry.getKey());
+ if (sVerbose) Slog.v(TAG, "callSaveLocked(): mViewStates=" + mViewStates);
+
+ final int numContexts = mContexts.size();
+
+ for (int i = 0; i < numContexts; i++) {
+ final FillContext context = mContexts.get(i);
+
+ if (sVerbose) Slog.v(TAG, "callSaveLocked(): updating " + context);
+
+ for (Entry<AutofillId, ViewState> entry : mViewStates.entrySet()) {
+ final AutofillValue value = entry.getValue().getCurrentValue();
+ if (value == null) {
+ if (sVerbose) Slog.v(TAG, "callSaveLocked(): skipping " + entry.getKey());
+ continue;
}
- continue;
- }
- final AutofillId id = entry.getKey();
- final ViewNode node = findViewNodeByIdLocked(id);
- if (node == null) {
- Slog.w(TAG, "callSaveLocked(): did not find node with id " + id);
- continue;
- }
- if (VERBOSE) {
- Slog.v(TAG, "callSaveLocked(): updating " + id + " to " + value);
+ final AutofillId id = entry.getKey();
+ final ViewNode node = findViewNodeById(context.getStructure(), id);
+ if (node == null) {
+ Slog.w(TAG, "callSaveLocked(): did not find node with id " + id);
+ continue;
+ }
+ if (sVerbose) Slog.v(TAG, "callSaveLocked(): updating " + id + " to " + value);
+
+ node.updateAutofillValue(value);
}
- node.updateAutofillValue(value);
+ // Sanitize structure before it's sent to service.
+ context.getStructure().sanitizeForParceling(false);
+
+ if (sVerbose) {
+ Slog.v(TAG, "Dumping structure of " + context + " before calling service.save()");
+ context.getStructure().dump();
+ }
}
- // Sanitize structure before it's sent to service.
- mStructure.sanitizeForParceling(false);
+ // Remove pending fill requests as the session is finished.
+ cancelCurrentRequestLocked();
- if (VERBOSE) {
- Slog.v(TAG, "Dumping " + mStructure + " before calling service.save()");
- mStructure.dump();
- }
-
- // TODO(b/33197203): Implement partitioning properly
- final int lastResponseIdx = getLastResponseIndex();
- final int requestId = mResponses.keyAt(lastResponseIdx);
- final FillContext fillContext = new FillContext(requestId, mStructure);
- final ArrayList<FillContext> fillContexts = new ArrayList<>(1);
- fillContexts.add(fillContext);
-
- final SaveRequest saveRequest = new SaveRequest(fillContexts, mClientState);
+ final SaveRequest saveRequest = new SaveRequest(mContexts, mClientState);
mRemoteFillService.onSaveRequest(saveRequest);
}
- void updateLocked(AutofillId id, Rect virtualBounds, AutofillValue value, int flags) {
+ /**
+ * Determines if a new partition should be started for an id.
+ *
+ * @param id The id of the view that is entered
+ *
+ * @return {@code true} iff a new partition should be started
+ */
+ private boolean shouldStartNewPartitionLocked(@NonNull AutofillId id) {
+ if (mResponses == null) {
+ return true;
+ }
+
+ final int numResponses = mResponses.size();
+ for (int responseNum = 0; responseNum < numResponses; responseNum++) {
+ final FillResponse response = mResponses.valueAt(responseNum);
+
+ if (ArrayUtils.contains(response.getIgnoredIds(), id)) {
+ return false;
+ }
+
+ final SaveInfo saveInfo = response.getSaveInfo();
+ if (saveInfo != null) {
+ if (ArrayUtils.contains(saveInfo.getOptionalIds(), id)
+ || ArrayUtils.contains(saveInfo.getRequiredIds(), id)) {
+ return false;
+ }
+ }
+
+ final ArrayList<Dataset> datasets = response.getDatasets();
+ if (datasets != null) {
+ final int numDatasets = datasets.size();
+
+ for (int dataSetNum = 0; dataSetNum < numDatasets; dataSetNum++) {
+ final ArrayList<AutofillId> fields = datasets.get(dataSetNum).getFieldIds();
+
+ if (fields != null && fields.contains(id)) {
+ return false;
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+
+ void updateLocked(AutofillId id, Rect virtualBounds, AutofillValue value, int action,
+ int flags) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#updateLocked() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
ViewState viewState = mViewStates.get(id);
if (viewState == null) {
- if ((flags & (FLAG_START_SESSION | FLAG_VALUE_CHANGED)) != 0) {
- if (DEBUG) {
- Slog.d(TAG, "Creating viewState for " + id + " on " + getFlagAsString(flags));
+ if (action == ACTION_START_SESSION || action == ACTION_VALUE_CHANGED
+ || action == ACTION_VIEW_ENTERED) {
+ if (sVerbose) {
+ Slog.v(TAG,
+ "Creating viewState for " + id + " on " + getActionAsString(action));
}
viewState = new ViewState(this, id, value, this, ViewState.STATE_INITIAL);
mViewStates.put(id, viewState);
- } else if (mStructure != null && (flags & FLAG_VIEW_ENTERED) != 0) {
- if (isIgnoredLocked(id)) {
- if (DEBUG) {
- Slog.d(TAG, "Not starting partition for ignored view id " + id);
- }
- return;
- }
- viewState = startPartitionLocked(id, value);
} else {
- if (VERBOSE) Slog.v(TAG, "Ignored " + getFlagAsString(flags) + " for " + id);
+ if (sVerbose) Slog.v(TAG, "Ignored " + getActionAsString(action) + " for " + id);
return;
}
}
- if ((flags & FLAG_START_SESSION) != 0) {
- // View is triggering autofill.
- mCurrentViewId = viewState.id;
- viewState.update(value, virtualBounds);
- viewState.setState(ViewState.STATE_STARTED_SESSION);
- return;
- }
-
- if ((flags & FLAG_VALUE_CHANGED) != 0) {
- if (value != null && !value.equals(viewState.getCurrentValue())) {
- // Always update the internal state.
- viewState.setCurrentValue(value);
-
- // Must check if this update was caused by autofilling the view, in which
- // case we just update the value, but not the UI.
- final AutofillValue filledValue = viewState.getAutofilledValue();
- if (value.equals(filledValue)) {
- return;
- }
- // Update the internal state...
- viewState.setState(ViewState.STATE_CHANGED);
-
- //..and the UI
- if (value.isText()) {
- getUiForShowing().filterFillUi(value.getTextValue().toString());
- } else {
- getUiForShowing().filterFillUi(null);
- }
- }
-
- return;
- }
-
- if ((flags & FLAG_VIEW_ENTERED) != 0) {
- // Remove the UI if the ViewState has changed.
- if (mCurrentViewId != viewState.id) {
- mUi.hideFillUi(mCurrentViewId != null ? mCurrentViewId : null);
+ switch(action) {
+ case ACTION_START_SESSION:
+ // View is triggering autofill.
mCurrentViewId = viewState.id;
- }
+ viewState.update(value, virtualBounds);
+ viewState.setState(ViewState.STATE_STARTED_SESSION);
+ requestNewFillResponseLocked(flags);
+ break;
+ case ACTION_VALUE_CHANGED:
+ if (value != null && !value.equals(viewState.getCurrentValue())) {
+ // Always update the internal state.
+ viewState.setCurrentValue(value);
- // If the ViewState is ready to be displayed, onReady() will be called.
- viewState.update(value, virtualBounds);
+ // Must check if this update was caused by autofilling the view, in which
+ // case we just update the value, but not the UI.
+ final AutofillValue filledValue = viewState.getAutofilledValue();
+ if (value.equals(filledValue)) {
+ return;
+ }
+ // Update the internal state...
+ viewState.setState(ViewState.STATE_CHANGED);
- return;
+ //..and the UI
+ if (value.isText()) {
+ getUiForShowing().filterFillUi(value.getTextValue().toString());
+ } else {
+ getUiForShowing().filterFillUi(null);
+ }
+ }
+ break;
+ case ACTION_VIEW_ENTERED:
+ if (shouldStartNewPartitionLocked(id)) {
+ // TODO(b/37424539): proper implementation
+ if (mResponseWaitingAuth != null) {
+ viewState.setState(ViewState.STATE_WAITING_RESPONSE_AUTH);
+ } else {
+ if (sDebug) {
+ Slog.d(TAG, "Starting partition for view id " + viewState.id);
+ }
+ viewState.setState(ViewState.STATE_STARTED_PARTITION);
+ requestNewFillResponseLocked(flags);
+ }
+ }
+
+ // Remove the UI if the ViewState has changed.
+ if (mCurrentViewId != viewState.id) {
+ mUi.hideFillUi(mCurrentViewId != null ? mCurrentViewId : null);
+ mCurrentViewId = viewState.id;
+ }
+
+ // If the ViewState is ready to be displayed, onReady() will be called.
+ viewState.update(value, virtualBounds);
+ break;
+ case ACTION_VIEW_EXITED:
+ if (mCurrentViewId == viewState.id) {
+ mUi.hideFillUi(viewState.id);
+ mCurrentViewId = null;
+ }
+ break;
+ default:
+ Slog.w(TAG, "updateLocked(): unknown action: " + action);
}
-
- if ((flags & FLAG_VIEW_EXITED) != 0) {
- if (mCurrentViewId == viewState.id) {
- mUi.hideFillUi(viewState.id);
- mCurrentViewId = null;
- }
- return;
- }
-
- Slog.w(TAG, "updateLocked(): unknown flags " + flags + ": " + getFlagAsString(flags));
- }
-
- private ViewState startPartitionLocked(AutofillId id, AutofillValue value) {
- // TODO(b/33197203 , b/35707731): temporary workaround until partitioning supports auth
- if (mResponseWaitingAuth != null) {
- final ViewState viewState =
- new ViewState(this, id, value, this, ViewState.STATE_WAITING_RESPONSE_AUTH);
- mViewStates.put(id, viewState);
- return viewState;
- }
- if (DEBUG) {
- Slog.d(TAG, "Starting partition for view id " + id);
- }
- final ViewState newViewState =
- new ViewState(this, id, value, this,ViewState.STATE_STARTED_PARTITION);
- mViewStates.put(id, newViewState);
-
- // Must update value of nodes so:
- // - proper node is focused
- // - autofillValue is sent back to service when it was previously autofilled
- for (int i = 0; i < mViewStates.size(); i++) {
- final ViewState viewState = mViewStates.valueAt(i);
-
- final ViewNode node = findViewNodeByIdLocked(viewState.id);
- if (node == null) {
- Slog.w(TAG, "startPartitionLocked(): no node for " + viewState.id);
- continue;
- }
-
- final AutofillValue initialValue = viewState.getInitialValue();
- final AutofillValue filledValue = viewState.getAutofilledValue();
- final AutofillOverlay overlay = new AutofillOverlay();
- if (filledValue != null && !filledValue.equals(initialValue)) {
- overlay.value = filledValue;
- }
- overlay.focused = id.equals(viewState.id);
- node.setAutofillOverlay(overlay);
- }
-
- FillRequest request = new FillRequest(mStructure, mClientState, 0);
- mRemoteFillService.onFillRequest(request);
-
- return newViewState;
}
@Override
public void onFillReady(FillResponse response, AutofillId filledId,
@Nullable AutofillValue value) {
+ synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#onFillReady() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
+ }
+
String filterText = null;
if (value != null && value.isText()) {
filterText = value.getTextValue().toString();
@@ -745,17 +1034,24 @@
getUiForShowing().showFillUi(filledId, response, filterText, mPackageName);
}
- String getFlagAsString(int flag) {
- return DebugUtils.flagsToString(AutofillManager.class, "FLAG_", flag);
+ String getActionAsString(int flag) {
+ return DebugUtils.flagsToString(AutofillManager.class, "ACTION_", flag);
+ }
+
+ boolean isDestroyed() {
+ synchronized (mLock) {
+ return mDestroyed;
+ }
+ }
+
+ IAutoFillManagerClient getClient() {
+ synchronized (mLock) {
+ return mClient;
+ }
}
private void notifyUnavailableToClient() {
synchronized (mLock) {
- if (mCurrentViewId == null) {
- // TODO(b/33197203): temporary sanity check; should never happen
- Slog.w(TAG, "notifyUnavailable(): mCurrentViewId is null");
- return;
- }
if (!mHasCallback) return;
try {
mClient.notifyNoFillUi(id, mWindowToken, mCurrentViewId);
@@ -799,18 +1095,17 @@
}
}
- private void processResponseLocked(FillResponse response, int requestId) {
- if (DEBUG) {
- Slog.d(TAG, "processResponseLocked(mCurrentViewId=" + mCurrentViewId + "):" + response);
+ private void processResponseLocked(@NonNull FillResponse response) {
+ if (sVerbose) {
+ Slog.v(TAG, "processResponseLocked(mCurrentViewId=" + mCurrentViewId + "):" + response);
}
if (mResponses == null) {
mResponses = new SparseArray<>(4);
}
+ final int requestId = response.getRequestId();
mResponses.put(requestId, response);
- if (response != null) {
- mClientState = response.getClientState();
- }
+ mClientState = response.getClientState();
setViewStatesLocked(response, ViewState.STATE_FILLABLE);
updateTrackedIdsLocked();
@@ -819,13 +1114,18 @@
return;
}
- if ((mFlags & FLAG_MANUAL_REQUEST) != 0 && response.getDatasets() != null
- && response.getDatasets().size() == 1) {
- Slog.d(TAG, "autofilling manual request directly");
- autoFill(response.getDatasets().get(0));
- return;
- }
+ final ArrayList<Dataset> datasets = response.getDatasets();
+ if (datasets != null && datasets.size() == 1) {
+ // Check if it its a single response for a manual request, in which case it should
+ // be automatically filled
+ final FillContext context = getFillContextByRequestIdLocked(requestId);
+ if (context != null && (context.getStructure().getFlags() & FLAG_MANUAL_REQUEST) != 0) {
+ Slog.d(TAG, "autofilling manual request directly");
+ autoFill(requestId, datasets.get(0));
+ return;
+ }
+ }
// Updates the UI, if necessary.
final ViewState currentView = mViewStates.get(mCurrentViewId);
currentView.maybeCallOnFillReady();
@@ -880,14 +1180,14 @@
}
}
- private ViewState createOrUpdateViewStateLocked(AutofillId id, int state,AutofillValue value) {
+ private ViewState createOrUpdateViewStateLocked(AutofillId id, int state, AutofillValue value) {
ViewState viewState = mViewStates.get(id);
if (viewState != null) {
viewState.setState(state);
} else {
viewState = new ViewState(this, id, null, this, state);
- if (DEBUG) { // TODO(b/33197203): change to VERBOSE once stable
- Slog.d(TAG, "Adding autofillable view with id " + id + " and state " + state);
+ if (sVerbose) {
+ Slog.v(TAG, "Adding autofillable view with id " + id + " and state " + state);
}
mViewStates.put(id, viewState);
}
@@ -911,8 +1211,13 @@
}
}
- void autoFill(Dataset dataset) {
+ void autoFill(int requestId, Dataset dataset) {
synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#autoFill() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
// Autofill it directly...
if (dataset.getAuthentication() == null) {
mService.setDatasetSelected(dataset.getId());
@@ -922,28 +1227,33 @@
}
// ...or handle authentication.
- // TODO(b/33197203 , b/35707731): make sure it's ignored if there is one already
+ // TODO(b/37424539): proper implementation
mService.setDatasetAuthenticationSelected(dataset.getId());
mDatasetWaitingAuth = dataset;
setViewStatesLocked(null, dataset, ViewState.STATE_WAITING_DATASET_AUTH);
- final Intent fillInIntent = createAuthFillInIntent(mStructure, null);
+ final Intent fillInIntent = createAuthFillInIntent(
+ getFillContextByRequestIdLocked(requestId).getStructure(), null);
startAuthentication(dataset.getAuthentication(), fillInIntent);
}
}
CharSequence getServiceName() {
- return mService.getServiceName();
+ synchronized (mLock) {
+ return mService.getServiceName();
+ }
}
FillResponse getResponseWaitingAuth() {
- return mResponseWaitingAuth;
+ synchronized (mLock) {
+ return mResponseWaitingAuth;
+ }
}
private Intent createAuthFillInIntent(AssistStructure structure, Bundle extras) {
final Intent fillInIntent = new Intent();
fillInIntent.putExtra(AutofillManager.EXTRA_ASSIST_STRUCTURE, structure);
if (extras != null) {
- fillInIntent.putExtra(AutofillManager.EXTRA_DATA_EXTRAS, extras);
+ fillInIntent.putExtra(AutofillManager.EXTRA_CLIENT_STATE, extras);
}
return fillInIntent;
}
@@ -958,48 +1268,40 @@
}
}
- private boolean isIgnoredLocked(@NonNull AutofillId id) {
- if (mResponses == null) return false;
-
- for (int i = mResponses.size() - 1; i >= 0; i--) {
- final FillResponse response = mResponses.valueAt(i);
- final AutofillId[] ignoredIds = response.getIgnoredIds();
- if (ignoredIds == null) continue;
- for (int j = 0; j < ignoredIds.length; j++) {
- final AutofillId ignoredId = ignoredIds[j];
- if (ignoredId != null && ignoredId.equals(id)) {
- return true;
- }
- }
- }
- return false;
- }
-
void dumpLocked(String prefix, PrintWriter pw) {
pw.print(prefix); pw.print("id: "); pw.println(id);
pw.print(prefix); pw.print("uid: "); pw.println(uid);
pw.print(prefix); pw.print("mActivityToken: "); pw.println(mActivityToken);
- pw.print(prefix); pw.print("mFlags: "); pw.println(mFlags);
pw.print(prefix); pw.print("mResponses: "); pw.println(mResponses);
pw.print(prefix); pw.print("mResponseWaitingAuth: "); pw.println(mResponseWaitingAuth);
pw.print(prefix); pw.print("mDatasetWaitingAuth: "); pw.println(mDatasetWaitingAuth);
pw.print(prefix); pw.print("mCurrentViewId: "); pw.println(mCurrentViewId);
pw.print(prefix); pw.print("mViewStates size: "); pw.println(mViewStates.size());
+ pw.print(prefix); pw.print("mDestroyed: "); pw.println(mDestroyed);
final String prefix2 = prefix + " ";
for (Map.Entry<AutofillId, ViewState> entry : mViewStates.entrySet()) {
pw.print(prefix); pw.print("State for id "); pw.println(entry.getKey());
entry.getValue().dump(prefix2, pw);
}
- if (VERBOSE) {
- pw.print(prefix); pw.print("mStructure: " );
- // TODO(b/33197203): add method do dump AssistStructure on pw
- if (mStructure != null) {
- pw.println("look at logcat" );
- mStructure.dump(); // dumps to logcat
- } else {
- pw.println("null");
+
+ pw.print(prefix); pw.print("mContexts: " );
+ if (mContexts != null) {
+ int numContexts = mContexts.size();
+ for (int i = 0; i < numContexts; i++) {
+ FillContext context = mContexts.get(i);
+
+ pw.print(prefix2); pw.print(context);
+ if (sVerbose) {
+ pw.println(context.getStructure() + " (look at logcat)");
+
+ // TODO: add method on AssistStructure to dump on pw
+ context.getStructure().dump();
+ }
}
+ } else {
+ pw.println("null");
}
+
pw.print(prefix); pw.print("mHasCallback: "); pw.println(mHasCallback);
pw.print(prefix); pw.print("mClientState: "); pw.println(
Helper.bundleToString(mClientState));
@@ -1008,11 +1310,15 @@
void autoFillApp(Dataset dataset) {
synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#autoFillApp() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
try {
- if (DEBUG) {
- Slog.d(TAG, "autoFillApp(): the buck is on the app: " + dataset);
- }
- mClient.autofill(id, mWindowToken, dataset.getFieldIds(), dataset.getFieldValues());
+ if (sDebug) Slog.d(TAG, "autoFillApp(): the buck is on the app: " + dataset);
+ mClient.autofill(id, mWindowToken, dataset.getFieldIds(),
+ dataset.getFieldValues());
setViewStatesLocked(null, dataset, ViewState.STATE_AUTOFILLED);
} catch (RemoteException e) {
Slog.w(TAG, "Error autofilling activity: " + e);
@@ -1027,54 +1333,29 @@
}
}
- private ViewNode findViewNodeByIdLocked(AutofillId id) {
- final int size = mStructure.getWindowNodeCount();
- for (int i = 0; i < size; i++) {
- final WindowNode window = mStructure.getWindowNodeAt(i);
- final ViewNode root = window.getRootViewNode();
- if (id.equals(root.getAutofillId())) {
- return root;
- }
- final ViewNode child = findViewNodeByIdLocked(root, id);
- if (child != null) {
- return child;
- }
- }
- return null;
- }
-
- private ViewNode findViewNodeByIdLocked(ViewNode parent, AutofillId id) {
- final int childrenSize = parent.getChildCount();
- if (childrenSize > 0) {
- for (int i = 0; i < childrenSize; i++) {
- final ViewNode child = parent.getChildAt(i);
- if (id.equals(child.getAutofillId())) {
- return child;
- }
- final ViewNode grandChild = findViewNodeByIdLocked(child, id);
- if (grandChild != null && id.equals(grandChild.getAutofillId())) {
- return grandChild;
- }
- }
- }
- return null;
- }
-
void destroyLocked() {
+ if (mDestroyed) {
+ return;
+ }
mRemoteFillService.destroy();
+ mUi.hideAll();
mUi.setCallback(null);
+ mDestroyed = true;
mMetricsLogger.action(MetricsEvent.AUTOFILL_SESSION_FINISHED, mPackageName);
}
- void removeSelf() {
+ private void removeSelf() {
synchronized (mLock) {
removeSelfLocked();
}
}
void removeSelfLocked() {
- if (VERBOSE) {
- Slog.v(TAG, "removeSelfLocked()");
+ if (sVerbose) Slog.v(TAG, "removeSelfLocked()");
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#removeSelfLocked() rejected - session: "
+ + id + " destroyed");
+ return;
}
destroyLocked();
mService.removeSessionLocked(id);
diff --git a/services/autofill/java/com/android/server/autofill/ViewState.java b/services/autofill/java/com/android/server/autofill/ViewState.java
index ea5f113..7ca9435 100644
--- a/services/autofill/java/com/android/server/autofill/ViewState.java
+++ b/services/autofill/java/com/android/server/autofill/ViewState.java
@@ -16,7 +16,7 @@
package com.android.server.autofill;
-import static com.android.server.autofill.Helper.DEBUG;
+import static com.android.server.autofill.Helper.sDebug;
import android.annotation.Nullable;
import android.graphics.Rect;
@@ -61,19 +61,19 @@
public static final int STATE_STARTED_PARTITION = 0x20;
/** User select a dataset in this view, but service must authenticate first. */
public static final int STATE_WAITING_DATASET_AUTH = 0x40;
- // TODO(b/33197203 , b/35707731): temporary workaround until partitioning supports auth
+ // TODO(b/37424539): temporary workaround until partitioning supports auth
public static final int STATE_WAITING_RESPONSE_AUTH = 0x80;
public final AutofillId id;
+
private final Listener mListener;
private final Session mSession;
- private FillResponse mResponse;
+ private FillResponse mResponse;
private AutofillValue mInitialValue;
private AutofillValue mCurrentValue;
private AutofillValue mAutofilledValue;
private Rect mVirtualBounds;
-
private int mState;
ViewState(Session session, AutofillId id, AutofillValue value, Listener listener, int state) {
@@ -151,9 +151,9 @@
mState &= ~state;
}
- // TODO(b/33197203): need to refactor / rename / document this method to make it clear that
- // it can change the value and update the UI; similarly, should replace code that
- // directly sets mAutoFilLValue to use encapsulation.
+ // TODO: refactor / rename / document this method (and maybeCallOnFillReady) to make it clear
+ // that it can change the value and update the UI; similarly, should replace code that
+ // directly sets mAutofillValue to use encapsulation.
void update(@Nullable AutofillValue autofillValue, @Nullable Rect virtualBounds) {
if (autofillValue != null) {
mCurrentValue = autofillValue;
@@ -172,9 +172,7 @@
*/
void maybeCallOnFillReady() {
if ((mState & (STATE_AUTOFILLED | STATE_WAITING_DATASET_AUTH)) != 0) {
- if (DEBUG) {
- Slog.d(TAG, "Ignoring UI for " + id + " on " + getStateAsString());
- }
+ if (sDebug) Slog.d(TAG, "Ignoring UI for " + id + " on " + getStateAsString());
return;
}
// First try the current response associated with this View.
diff --git a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
index ab6a3a7..086742e 100644
--- a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
+++ b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
@@ -15,7 +15,7 @@
*/
package com.android.server.autofill.ui;
-import static com.android.server.autofill.ui.Helper.DEBUG;
+import static com.android.server.autofill.Helper.sDebug;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -47,7 +47,7 @@
* managing saving of user edits.
*/
public final class AutoFillUI {
- private static final String TAG = "AutoFillUI";
+ private static final String TAG = "AutofillUI";
private final Handler mHandler = UiThread.getHandler();
private final @NonNull Context mContext;
@@ -60,8 +60,8 @@
private final MetricsLogger mMetricsLogger = new MetricsLogger();
public interface AutoFillUiCallback {
- void authenticate(@NonNull IntentSender intent, @Nullable Bundle extras);
- void fill(@NonNull Dataset dataset);
+ void authenticate(int requestId, @NonNull IntentSender intent, @Nullable Bundle extras);
+ void fill(int requestId, @NonNull Dataset dataset);
void save();
void cancelSave();
void requestShowFillUi(AutofillId id, int width, int height,
@@ -139,7 +139,7 @@
*/
public void showFillUi(@NonNull AutofillId focusedId, @NonNull FillResponse response,
@Nullable String filterText, @NonNull String packageName) {
- if (DEBUG) {
+ if (sDebug) {
Slog.d(TAG, "showFillUi(): id=" + focusedId + ", filter=" + filterText);
}
final LogMaker log = (new LogMaker(MetricsProto.MetricsEvent.AUTOFILL_FILL_UI))
@@ -161,8 +161,8 @@
log.setType(MetricsProto.MetricsEvent.TYPE_DETAIL);
hideFillUiUiThread();
if (mCallback != null) {
- mCallback.authenticate(response.getAuthentication(),
- response.getClientState());
+ mCallback.authenticate(response.getRequestId(),
+ response.getAuthentication(), response.getClientState());
}
}
@@ -171,7 +171,7 @@
log.setType(MetricsProto.MetricsEvent.TYPE_ACTION);
hideFillUiUiThread();
if (mCallback != null) {
- mCallback.fill(dataset);
+ mCallback.fill(response.getRequestId(), dataset);
}
}
diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
index b68e3b1..fa95e03 100644
--- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -15,6 +15,8 @@
*/
package com.android.server.autofill.ui;
+import static com.android.server.autofill.Helper.sDebug;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.PendingIntent;
@@ -117,7 +119,7 @@
final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
content.measure(widthMeasureSpec, heightMeasureSpec);
decor.setOnClickListener(v -> mCallback.onResponsePicked(response));
- // TODO(b/33197203 , b/36660292): temporary limiting maximum height and minimum width
+ // TODO(b/37567439): temporary limiting maximum height and minimum width
mContentWidth = Math.max(content.getMeasuredWidth(), 1000);
mContentHeight = Math.min(content.getMeasuredHeight(), 500);
@@ -341,7 +343,7 @@
mWm.updateViewLayout(mContentView, params);
}
} catch (WindowManager.BadTokenException e) {
- Slog.i(TAG, "Filed with with token " + params.token + " gone.");
+ if (sDebug) Slog.d(TAG, "Filed with with token " + params.token + " gone.");
mCallback.onDestroy();
}
}
diff --git a/services/autofill/java/com/android/server/autofill/ui/Helper.java b/services/autofill/java/com/android/server/autofill/ui/Helper.java
deleted file mode 100644
index 996e421..0000000
--- a/services/autofill/java/com/android/server/autofill/ui/Helper.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.autofill.ui;
-
-final class Helper {
-
- static final boolean DEBUG = true; // TODO(b/33197203): set to false when stable
- static final boolean VERBOSE = false;
- private Helper() {
- throw new UnsupportedOperationException("contains static members only");
- }
-}
diff --git a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
index 9bba1ad..bcdb118 100644
--- a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
@@ -16,7 +16,7 @@
package com.android.server.autofill.ui;
-import static com.android.server.autofill.ui.Helper.DEBUG;
+import static com.android.server.autofill.Helper.sDebug;
import android.annotation.NonNull;
import android.app.Dialog;
@@ -42,7 +42,7 @@
*/
final class SaveUi {
- private static final String TAG = "SaveUi";
+ private static final String TAG = "AutofillSaveUi";
public interface OnSaveListener {
void onSave();
@@ -61,7 +61,7 @@
@Override
public void onSave() {
- if (DEBUG) Slog.d(TAG, "onSave(): " + mDone);
+ if (sDebug) Slog.d(TAG, "onSave(): " + mDone);
if (mDone) {
return;
}
@@ -71,7 +71,7 @@
@Override
public void onCancel(IntentSender listener) {
- if (DEBUG) Slog.d(TAG, "onCancel(): " + mDone);
+ if (sDebug) Slog.d(TAG, "onCancel(): " + mDone);
if (mDone) {
return;
}
@@ -81,7 +81,7 @@
@Override
public void onDestroy() {
- if (DEBUG) Slog.d(TAG, "onDestroy(): " + mDone);
+ if (sDebug) Slog.d(TAG, "onDestroy(): " + mDone);
if (mDone) {
return;
}
@@ -154,26 +154,28 @@
subTitleView.setVisibility(View.VISIBLE);
}
- if (DEBUG) {
- Slog.d(TAG, "Title: " + title + " SubTitle: " + subTitle);
+ Slog.i(TAG, "Showing save dialog: " + title);
+ if (sDebug) {
+ Slog.d(TAG, "SubTitle: " + subTitle);
}
final TextView noButton = view.findViewById(R.id.autofill_save_no);
- if (info.getNegativeActionTitle() != null) {
- noButton.setText(info.getNegativeActionTitle());
- noButton.setOnClickListener((v) -> mListener.onCancel(
- info.getNegativeActionListener()));
+ if (info.getNegativeActionStyle() == SaveInfo.NEGATIVE_BUTTON_STYLE_REJECT) {
+ noButton.setText(R.string.save_password_notnow);
} else {
- noButton.setOnClickListener((v) -> mListener.onCancel(null));
+ noButton.setText(R.string.autofill_save_no);
}
+ noButton.setOnClickListener((v) -> mListener.onCancel(
+ info.getNegativeActionListener()));
final View yesButton = view.findViewById(R.id.autofill_save_yes);
yesButton.setOnClickListener((v) -> mListener.onSave());
final View closeButton = view.findViewById(R.id.autofill_save_close);
- closeButton.setOnClickListener((v) -> mListener.onCancel(null));
+ closeButton.setOnClickListener((v) -> mListener.onCancel(
+ info.getNegativeActionListener()));
- mDialog = new Dialog(context, R.style.Theme_Material_Panel);
+ mDialog = new Dialog(context, R.style.Theme_DeviceDefault_Light_Panel);
mDialog.setContentView(view);
final Window window = mDialog.getWindow();
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index 9301006..1b970e5 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -5641,14 +5641,24 @@
// The job scheduler says our constraints don't hold any more,
// so tear down any ongoing backup task right away.
void endFullBackup() {
- synchronized (mQueueLock) {
- if (mRunningFullBackupTask != null) {
- if (DEBUG_SCHEDULING) {
- Slog.i(TAG, "Telling running backup to stop");
+ // offload the mRunningFullBackupTask.handleCancel() call to another thread,
+ // as we might have to wait for mCancelLock
+ Runnable endFullBackupRunnable = new Runnable() {
+ @Override
+ public void run() {
+ PerformFullTransportBackupTask pftbt = null;
+ synchronized (mQueueLock) {
+ if (mRunningFullBackupTask != null) {
+ if (DEBUG_SCHEDULING) {
+ Slog.i(TAG, "Telling running backup to stop");
+ }
+ pftbt = mRunningFullBackupTask;
+ }
}
- mRunningFullBackupTask.handleCancel(true);
+ pftbt.handleCancel(true);
}
- }
+ };
+ new Thread(endFullBackupRunnable, "end-full-backup").start();
}
// ----- Restore infrastructure -----
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index 41b70a1..6093241 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -36,6 +36,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.content.pm.FeatureInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.NetworkPolicyManager;
@@ -47,7 +48,10 @@
import android.os.IInterface;
import android.os.Parcel;
import android.os.RemoteException;
+import android.os.ResultReceiver;
import android.os.ServiceManager;
+import android.os.ShellCallback;
+import android.os.ShellCommand;
import android.os.UserHandle;
import android.provider.Settings;
import android.provider.SettingsStringUtil.ComponentNameSet;
@@ -71,6 +75,7 @@
import org.xmlpull.v1.XmlSerializer;
import java.io.File;
+import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@@ -86,7 +91,6 @@
//TODO schedule stopScan on activity destroy(except if configuration change)
//TODO on associate called again after configuration change -> replace old callback with new
//TODO avoid leaking calling activity in IFindDeviceCallback (see PrintManager#print for example)
-//TODO check user-feature present in manifest on API calls
/** @hide */
public class CompanionDeviceManagerService extends SystemService implements Binder.DeathRecipient {
@@ -203,13 +207,15 @@
checkNotNull(request, "Request cannot be null");
checkNotNull(callback, "Callback cannot be null");
checkCallerIsSystemOr(callingPackage);
+ int userId = getCallingUserId();
+ checkUsesFeature(callingPackage, userId);
final long callingIdentity = Binder.clearCallingIdentity();
try {
- //TODO bindServiceAsUser
- getContext().bindService(
+ getContext().bindServiceAsUser(
new Intent().setComponent(SERVICE_TO_BIND_TO),
createServiceConnection(request, callback, callingPackage),
- Context.BIND_AUTO_CREATE);
+ Context.BIND_AUTO_CREATE,
+ UserHandle.of(userId));
} finally {
Binder.restoreCallingIdentity(callingIdentity);
}
@@ -219,6 +225,7 @@
public List<String> getAssociations(String callingPackage, int userId)
throws RemoteException {
checkCallerIsSystemOr(callingPackage, userId);
+ checkUsesFeature(callingPackage, getCallingUserId());
return CollectionUtils.map(
readAllAssociations(userId, callingPackage),
a -> a.deviceAddress);
@@ -230,8 +237,8 @@
throws RemoteException {
checkNotNull(deviceMacAddress);
checkCallerIsSystemOr(callingPackage);
- updateAssociations(associations -> CollectionUtils.remove(associations,
- new Association(getCallingUserId(), deviceMacAddress, callingPackage)));
+ checkUsesFeature(callingPackage, getCallingUserId());
+ removeAssociation(getCallingUserId(), callingPackage, deviceMacAddress);
}
private void checkCallerIsSystemOr(String pkg) throws RemoteException {
@@ -239,7 +246,7 @@
}
private void checkCallerIsSystemOr(String pkg, int userId) throws RemoteException {
- if (getCallingUserId() == UserHandle.USER_SYSTEM) {
+ if (isCallerSystem()) {
return;
}
@@ -282,16 +289,45 @@
private void checkCanCallNotificationApi(String callingPackage) throws RemoteException {
checkCallerIsSystemOr(callingPackage);
- checkState(!ArrayUtils.isEmpty(readAllAssociations(getCallingUserId(), callingPackage)),
+ int userId = getCallingUserId();
+ checkState(!ArrayUtils.isEmpty(readAllAssociations(userId, callingPackage)),
"App must have an association before calling this API");
+ checkUsesFeature(callingPackage, userId);
+ }
+
+ private void checkUsesFeature(String pkg, int userId) {
+ if (isCallerSystem()) {
+ // Drop the requirement for calls from system process
+ return;
+ }
+
+ FeatureInfo[] reqFeatures = getPackageInfo(pkg, userId).reqFeatures;
+ String requiredFeature = PackageManager.FEATURE_COMPANION_DEVICE_SETUP;
+ int numFeatures = ArrayUtils.size(reqFeatures);
+ for (int i = 0; i < numFeatures; i++) {
+ if (requiredFeature.equals(reqFeatures[i].name)) return;
+ }
+ throw new IllegalStateException("Must declare uses-feature "
+ + requiredFeature
+ + " in manifest to use this API");
+ }
+
+ @Override
+ public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
+ String[] args, ShellCallback callback, ResultReceiver resultReceiver)
+ throws RemoteException {
+ new ShellCmd().exec(this, in, out, err, args, callback, resultReceiver);
}
}
-
- private int getCallingUserId() {
+ private static int getCallingUserId() {
return UserHandle.getUserId(Binder.getCallingUid());
}
+ private static boolean isCallerSystem() {
+ return getCallingUserId() == UserHandle.USER_SYSTEM;
+ }
+
private ServiceConnection createServiceConnection(
final AssociationRequest request,
final IFindDeviceCallback findDeviceCallback,
@@ -349,8 +385,7 @@
@Override
public void onDeviceSelected(String packageName, int userId, String deviceAddress) {
- updateSpecialAccessPermissionForAssociatedPackage(packageName, userId);
- recordAssociation(packageName, deviceAddress);
+ addAssociation(userId, packageName, deviceAddress);
cleanup();
}
@@ -361,6 +396,16 @@
};
}
+ void addAssociation(int userId, String packageName, String deviceAddress) {
+ updateSpecialAccessPermissionForAssociatedPackage(packageName, userId);
+ recordAssociation(packageName, deviceAddress);
+ }
+
+ void removeAssociation(int userId, String pkg, String deviceMacAddress) {
+ updateAssociations(associations -> CollectionUtils.remove(associations,
+ new Association(userId, deviceMacAddress, pkg)));
+ }
+
private void updateSpecialAccessPermissionForAssociatedPackage(String packageName, int userId) {
PackageInfo packageInfo = getPackageInfo(packageName, userId);
if (packageInfo == null) {
@@ -369,8 +414,9 @@
Binder.withCleanCallingIdentity(() -> {
try {
- if (ArrayUtils.contains(packageInfo.requestedPermissions,
- Manifest.permission.RUN_IN_BACKGROUND)) {
+ if (containsEither(packageInfo.requestedPermissions,
+ Manifest.permission.RUN_IN_BACKGROUND,
+ Manifest.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND)) {
mIdleController.addPowerSaveWhitelistApp(packageInfo.packageName);
} else {
mIdleController.removePowerSaveWhitelistApp(packageInfo.packageName);
@@ -380,8 +426,9 @@
}
NetworkPolicyManager networkPolicyManager = NetworkPolicyManager.from(getContext());
- if (ArrayUtils.contains(packageInfo.requestedPermissions,
- Manifest.permission.USE_DATA_IN_BACKGROUND)) {
+ if (containsEither(packageInfo.requestedPermissions,
+ Manifest.permission.USE_DATA_IN_BACKGROUND,
+ Manifest.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND)) {
networkPolicyManager.addUidPolicy(
packageInfo.applicationInfo.uid,
NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND);
@@ -393,12 +440,18 @@
});
}
+ private static <T> boolean containsEither(T[] array, T a, T b) {
+ return ArrayUtils.contains(array, a) || ArrayUtils.contains(array, b);
+ }
+
@Nullable
private PackageInfo getPackageInfo(String packageName, int userId) {
return Binder.withCleanCallingIdentity(() -> {
try {
return getContext().getPackageManager().getPackageInfoAsUser(
- packageName, PackageManager.GET_PERMISSIONS, userId);
+ packageName,
+ PackageManager.GET_PERMISSIONS | PackageManager.GET_CONFIGURATIONS,
+ userId);
} catch (PackageManager.NameNotFoundException e) {
Slog.e(LOG_TAG, "Failed to get PackageInfo for package " + packageName, e);
return null;
@@ -466,8 +519,8 @@
}
@Nullable
- private ArrayList<Association> readAllAssociations(int uid) {
- return readAllAssociations(uid, null);
+ private ArrayList<Association> readAllAssociations(int userId) {
+ return readAllAssociations(userId, null);
}
@Nullable
@@ -503,6 +556,8 @@
}
}
+
+
private class Association {
public final int uid;
public final String deviceAddress;
@@ -536,4 +591,45 @@
}
}
+ private class ShellCmd extends ShellCommand {
+ public static final String USAGE = "help\n"
+ + "list USER_ID\n"
+ + "associate USER_ID PACKAGE MAC_ADDRESS\n"
+ + "disassociate USER_ID PACKAGE MAC_ADDRESS";
+
+ @Override
+ public int onCommand(String cmd) {
+ switch (cmd) {
+ case "list": {
+ ArrayList<Association> associations = readAllAssociations(getNextArgInt());
+ for (int i = 0; i < size(associations); i++) {
+ Association a = associations.get(i);
+ getOutPrintWriter()
+ .println(a.companionAppPackage + " " + a.deviceAddress);
+ }
+ } break;
+
+ case "associate": {
+ addAssociation(getNextArgInt(), getNextArgRequired(), getNextArgRequired());
+ } break;
+
+ case "disassociate": {
+ removeAssociation(getNextArgInt(), getNextArgRequired(), getNextArgRequired());
+ } break;
+
+ default: return handleDefaultCommands(cmd);
+ }
+ return 0;
+ }
+
+ private int getNextArgInt() {
+ return Integer.parseInt(getNextArgRequired());
+ }
+
+ @Override
+ public void onHelp() {
+ getOutPrintWriter().println(USAGE);
+ }
+ }
+
}
diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java
index 6c18b26..18b4571 100644
--- a/services/core/java/com/android/server/BluetoothManagerService.java
+++ b/services/core/java/com/android/server/BluetoothManagerService.java
@@ -18,6 +18,7 @@
import android.Manifest;
import android.app.ActivityManager;
+import android.app.AppGlobals;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.IBluetooth;
@@ -37,11 +38,11 @@
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.database.ContentObserver;
import android.os.Binder;
-import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
@@ -50,7 +51,6 @@
import android.os.Process;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
-import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
@@ -61,15 +61,15 @@
import android.util.Slog;
import com.android.internal.util.DumpUtils;
-import com.android.server.pm.PackageManagerService;
+import com.android.server.pm.UserRestrictionsUtils;
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
class BluetoothManagerService extends IBluetoothManager.Stub {
@@ -120,7 +120,6 @@
private static final int MESSAGE_ADD_PROXY_DELAYED = 400;
private static final int MESSAGE_BIND_PROFILE_SERVICE = 401;
- private static final int MAX_SAVE_RETRIES = 3;
private static final int MAX_ERROR_RESTART_RETRIES = 6;
// Bluetooth persisted setting is off
@@ -223,22 +222,25 @@
@Override
public void onUserRestrictionsChanged(int userId, Bundle newRestrictions,
Bundle prevRestrictions) {
- if (!newRestrictions.containsKey(UserManager.DISALLOW_BLUETOOTH)
- && !prevRestrictions.containsKey(UserManager.DISALLOW_BLUETOOTH)) {
- // The relevant restriction has not changed - do nothing.
- return;
+ if (!UserRestrictionsUtils.restrictionsChanged(prevRestrictions, newRestrictions,
+ UserManager.DISALLOW_BLUETOOTH, UserManager.DISALLOW_BLUETOOTH_SHARING)) {
+ return; // No relevant changes, nothing to do.
}
- final boolean bluetoothDisallowed =
- newRestrictions.getBoolean(UserManager.DISALLOW_BLUETOOTH);
- if ((mEnable || mEnableExternal) && bluetoothDisallowed) {
+
+ final boolean disallowed = newRestrictions.getBoolean(UserManager.DISALLOW_BLUETOOTH);
+
+ // DISALLOW_BLUETOOTH is a global restriction that can only be set by DO or PO on the
+ // system user, so we only look at the system user.
+ if (userId == UserHandle.USER_SYSTEM && disallowed && (mEnable || mEnableExternal)) {
try {
- disable(null, true);
+ disable(null /* packageName */, true /* persist */);
} catch (RemoteException e) {
- Slog.w(TAG, "Exception when disabling Bluetooth from UserRestrictionsListener",
- e);
+ Slog.w(TAG, "Exception when disabling Bluetooth", e);
}
}
- updateOppLauncherComponentState(bluetoothDisallowed);
+ final boolean sharingDisallowed = disallowed
+ || newRestrictions.getBoolean(UserManager.DISALLOW_BLUETOOTH_SHARING);
+ updateOppLauncherComponentState(userId, sharingDisallowed);
}
};
@@ -994,11 +996,6 @@
LocalServices.getService(UserManagerInternal.class);
userManagerInternal.addUserRestrictionsListener(mUserRestrictionsListener);
final boolean isBluetoothDisallowed = isBluetoothDisallowed();
- PackageManagerService packageManagerService =
- (PackageManagerService) ServiceManager.getService("package");
- if (packageManagerService != null && !packageManagerService.isOnlyCoreApps()) {
- updateOppLauncherComponentState(isBluetoothDisallowed);
- }
if (isBluetoothDisallowed) {
return;
}
@@ -2074,21 +2071,21 @@
/**
* Disables BluetoothOppLauncherActivity component, so the Bluetooth sharing option is not
- * offered to the user if Bluetooth is disallowed. Puts the component to its default state if
- * Bluetooth is not disallowed.
+ * offered to the user if Bluetooth or sharing is disallowed. Puts the component to its default
+ * state if Bluetooth is not disallowed.
*
- * @param bluetoothDisallowed whether the {@link UserManager.DISALLOW_BLUETOOTH} user
- * restriction was set.
+ * @param userId user to disable bluetooth sharing for.
+ * @param bluetoothSharingDisallowed whether bluetooth sharing is disallowed.
*/
- private void updateOppLauncherComponentState(boolean bluetoothDisallowed) {
+ private void updateOppLauncherComponentState(int userId, boolean bluetoothSharingDisallowed) {
final ComponentName oppLauncherComponent = new ComponentName("com.android.bluetooth",
"com.android.bluetooth.opp.BluetoothOppLauncherActivity");
- final int newState = bluetoothDisallowed
+ final int newState = bluetoothSharingDisallowed
? PackageManager.COMPONENT_ENABLED_STATE_DISABLED
: PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
try {
- mContext.getPackageManager()
- .setComponentEnabledSetting(oppLauncherComponent, newState, 0);
+ final IPackageManager imp = AppGlobals.getPackageManager();
+ imp.setComponentEnabledSetting(oppLauncherComponent, newState, 0 /* flags */, userId);
} catch (Exception e) {
// The component was not found, do nothing.
}
diff --git a/services/core/java/com/android/server/DropBoxManagerService.java b/services/core/java/com/android/server/DropBoxManagerService.java
index 9d3d531..e1756d1 100644
--- a/services/core/java/com/android/server/DropBoxManagerService.java
+++ b/services/core/java/com/android/server/DropBoxManagerService.java
@@ -371,6 +371,14 @@
doPrint = true;
} else if (args[i].equals("-f") || args[i].equals("--file")) {
doFile = true;
+ } else if (args[i].equals("-h") || args[i].equals("--help")) {
+ pw.println("Dropbox (dropbox) dump options:");
+ pw.println(" [-h|--help] [-p|--print] [-f|--file] [timestamp]");
+ pw.println(" -h|--help: print this help");
+ pw.println(" -p|--print: print full contents of each entry");
+ pw.println(" -f|--file: print path of each entry's file");
+ pw.println(" [timestamp] optionally filters to only those entries.");
+ return;
} else if (args[i].startsWith("-")) {
out.append("Unknown argument: ").append(args[i]).append("\n");
} else {
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index 8ad3d23..20a6d14 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -212,6 +212,7 @@
Context.BIND_AUTO_CREATE
| Context.BIND_NOT_VISIBLE
| Context.BIND_NOT_FOREGROUND
+ | Context.BIND_IMPORTANT_BACKGROUND
| Context.BIND_SHOWING_UI;
/**
diff --git a/services/core/java/com/android/server/NetworkScoreService.java b/services/core/java/com/android/server/NetworkScoreService.java
index d25b3cc..114d761 100644
--- a/services/core/java/com/android/server/NetworkScoreService.java
+++ b/services/core/java/com/android/server/NetworkScoreService.java
@@ -16,9 +16,6 @@
package com.android.server;
-import static android.net.NetworkRecommendationProvider.EXTRA_RECOMMENDATION_RESULT;
-import static android.net.NetworkRecommendationProvider.EXTRA_SEQUENCE;
-
import android.Manifest.permission;
import android.annotation.Nullable;
import android.content.BroadcastReceiver;
@@ -36,8 +33,6 @@
import android.net.NetworkKey;
import android.net.NetworkScoreManager;
import android.net.NetworkScorerAppData;
-import android.net.RecommendationRequest;
-import android.net.RecommendationResult;
import android.net.ScoredNetwork;
import android.net.Uri;
import android.net.wifi.ScanResult;
@@ -46,24 +41,18 @@
import android.net.wifi.WifiScanner;
import android.os.Binder;
import android.os.Build;
-import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
-import android.os.IRemoteCallback;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
-import android.os.RemoteCallback;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.UserHandle;
-import android.provider.Settings;
import android.provider.Settings.Global;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
-import android.util.Pair;
-import android.util.TimedRemoteCaller;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
@@ -80,9 +69,6 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.Supplier;
@@ -99,7 +85,6 @@
private final Context mContext;
private final NetworkScorerAppManager mNetworkScorerAppManager;
- private final AtomicReference<RequestRecommendationCaller> mReqRecommendationCallerRef;
@GuardedBy("mScoreCaches")
private final Map<Integer, RemoteCallbackList<INetworkScoreCache>> mScoreCaches;
/** Lock used to update mPackageMonitor when scorer package changes occur. */
@@ -113,7 +98,6 @@
private NetworkScorerPackageMonitor mPackageMonitor;
@GuardedBy("mServiceConnectionLock")
private ScoringServiceConnection mServiceConnection;
- private volatile long mRecommendationRequestTimeoutMs;
private BroadcastReceiver mUserIntentReceiver = new BroadcastReceiver() {
@Override
@@ -256,9 +240,6 @@
mContext.registerReceiverAsUser(
mUserIntentReceiver, UserHandle.SYSTEM, filter, null /* broadcastPermission*/,
null /* scheduler */);
- mReqRecommendationCallerRef = new AtomicReference<>(
- new RequestRecommendationCaller(TimedRemoteCaller.DEFAULT_CALL_TIMEOUT_MILLIS));
- mRecommendationRequestTimeoutMs = TimedRemoteCaller.DEFAULT_CALL_TIMEOUT_MILLIS;
mHandler = new ServiceHandler(looper);
mContentObserver = new DispatchingContentObserver(context, mHandler);
mServiceConnProducer = serviceConnProducer;
@@ -295,10 +276,6 @@
mContentObserver.observe(packageNameUri,
ServiceHandler.MSG_RECOMMENDATIONS_PACKAGE_CHANGED);
- final Uri timeoutUri = Global.getUriFor(Global.NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS);
- mContentObserver.observe(timeoutUri,
- ServiceHandler.MSG_RECOMMENDATION_REQUEST_TIMEOUT_CHANGED);
-
final Uri settingUri = Global.getUriFor(Global.NETWORK_RECOMMENDATIONS_ENABLED);
mContentObserver.observe(settingUri,
ServiceHandler.MSG_RECOMMENDATION_ENABLED_SETTING_CHANGED);
@@ -827,87 +804,6 @@
}
@Override
- public RecommendationResult requestRecommendation(RecommendationRequest request) {
- mContext.enforceCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES, TAG);
- throwIfCalledOnMainThread();
- final long token = Binder.clearCallingIdentity();
- try {
- final INetworkRecommendationProvider provider = getRecommendationProvider();
- if (provider != null) {
- try {
- final RequestRecommendationCaller caller = mReqRecommendationCallerRef.get();
- return caller.getRecommendationResult(provider, request);
- } catch (RemoteException | TimeoutException e) {
- Log.w(TAG, "Failed to request a recommendation.", e);
- // TODO: 12/15/16 - Keep track of failures.
- }
- }
-
- if (DBG) {
- Log.d(TAG, "Returning the default network recommendation.");
- }
-
- if (request != null && request.getDefaultWifiConfig() != null) {
- return RecommendationResult.createConnectRecommendation(
- request.getDefaultWifiConfig());
- }
- return RecommendationResult.createDoNotConnectRecommendation();
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- /**
- * Request a recommendation for the best network to connect to
- * taking into account the inputs from the {@link RecommendationRequest}.
- *
- * @param request a {@link RecommendationRequest} instance containing the details of the request
- * @param remoteCallback a {@link IRemoteCallback} instance to invoke when the recommendation
- * is available.
- * @throws SecurityException if the caller is not the system
- */
- @Override
- public void requestRecommendationAsync(RecommendationRequest request,
- RemoteCallback remoteCallback) {
- mContext.enforceCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES, TAG);
-
- final OneTimeCallback oneTimeCallback = new OneTimeCallback(remoteCallback);
- final Pair<RecommendationRequest, OneTimeCallback> pair =
- Pair.create(request, oneTimeCallback);
- final Message timeoutMsg = mHandler.obtainMessage(
- ServiceHandler.MSG_RECOMMENDATION_REQUEST_TIMEOUT, pair);
- final INetworkRecommendationProvider provider = getRecommendationProvider();
- final long token = Binder.clearCallingIdentity();
- try {
- if (provider != null) {
- try {
- mHandler.sendMessageDelayed(timeoutMsg, mRecommendationRequestTimeoutMs);
- provider.requestRecommendation(request, new IRemoteCallback.Stub() {
- @Override
- public void sendResult(Bundle data) throws RemoteException {
- // Remove the timeout message
- mHandler.removeMessages(timeoutMsg.what, pair);
- oneTimeCallback.sendResult(data);
- }
- }, 0 /*sequence*/);
- return;
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to request a recommendation.", e);
- // TODO: 12/15/16 - Keep track of failures.
- // Remove the timeout message
- mHandler.removeMessages(timeoutMsg.what, pair);
- // Will fall through and send back the default recommendation.
- }
- }
- } finally {
- Binder.restoreCallingIdentity(token);
- }
-
- // Else send back the default recommendation.
- sendDefaultRecommendationResponse(request, oneTimeCallback);
- }
-
- @Override
public boolean requestScores(NetworkKey[] networks) {
mContext.enforceCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES, TAG);
final long token = Binder.clearCallingIdentity();
@@ -941,7 +837,6 @@
return;
}
writer.println("Current scorer: " + currentScorer);
- writer.println("RecommendationRequestTimeoutMs: " + mRecommendationRequestTimeoutMs);
sendCacheUpdateCallback(new BiConsumer<INetworkScoreCache, Object>() {
@Override
@@ -996,12 +891,6 @@
}
}
- private void throwIfCalledOnMainThread() {
- if (Thread.currentThread() == mContext.getMainLooper().getThread()) {
- throw new RuntimeException("Cannot invoke on the main thread");
- }
- }
-
@Nullable
private INetworkRecommendationProvider getRecommendationProvider() {
synchronized (mServiceConnectionLock) {
@@ -1012,19 +901,6 @@
return null;
}
- @VisibleForTesting
- public void refreshRecommendationRequestTimeoutMs() {
- final ContentResolver cr = mContext.getContentResolver();
- long timeoutMs = Settings.Global.getLong(cr,
- Global.NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS, -1L /*default*/);
- if (timeoutMs < 0) {
- timeoutMs = TimedRemoteCaller.DEFAULT_CALL_TIMEOUT_MILLIS;
- }
- if (DBG) Log.d(TAG, "Updating the recommendation request timeout to " + timeoutMs + " ms");
- mRecommendationRequestTimeoutMs = timeoutMs;
- mReqRecommendationCallerRef.set(new RequestRecommendationCaller(timeoutMs));
- }
-
// The class and methods need to be public for Mockito to work.
@VisibleForTesting
public static class ScoringServiceConnection implements ServiceConnection {
@@ -1114,93 +990,10 @@
}
}
- /**
- * Executes the async requestRecommendation() call with a timeout.
- */
- private static final class RequestRecommendationCaller
- extends TimedRemoteCaller<RecommendationResult> {
- private final IRemoteCallback mCallback;
-
- RequestRecommendationCaller(long callTimeoutMillis) {
- super(callTimeoutMillis);
- mCallback = new IRemoteCallback.Stub() {
- @Override
- public void sendResult(Bundle data) throws RemoteException {
- final RecommendationResult result =
- data.getParcelable(EXTRA_RECOMMENDATION_RESULT);
- final int sequence = data.getInt(EXTRA_SEQUENCE, -1);
- if (VERBOSE) Log.v(TAG, "callback received for sequence " + sequence);
- onRemoteMethodResult(result, sequence);
- }
- };
- }
-
- /**
- * Runs the requestRecommendation() call on the given {@link INetworkRecommendationProvider}
- * instance.
- *
- * @param target the {@link INetworkRecommendationProvider} to request a recommendation
- * from
- * @param request the {@link RecommendationRequest} from the calling client
- * @return a {@link RecommendationResult} from the provider
- * @throws RemoteException if the call failed
- * @throws TimeoutException if the call took longer than the set timeout
- */
- RecommendationResult getRecommendationResult(INetworkRecommendationProvider target,
- RecommendationRequest request) throws RemoteException, TimeoutException {
- final int sequence = onBeforeRemoteCall();
- if (VERBOSE) Log.v(TAG, "getRecommendationResult() seq=" + sequence);
- target.requestRecommendation(request, mCallback, sequence);
- return getResultTimed(sequence);
- }
- }
-
- /**
- * A wrapper around {@link RemoteCallback} that guarantees
- * {@link RemoteCallback#sendResult(Bundle)} will be invoked at most once.
- */
- @VisibleForTesting
- public static final class OneTimeCallback {
- private final RemoteCallback mRemoteCallback;
- private final AtomicBoolean mCallbackRun;
-
- public OneTimeCallback(RemoteCallback remoteCallback) {
- mRemoteCallback = remoteCallback;
- mCallbackRun = new AtomicBoolean(false);
- }
-
- public void sendResult(Bundle data) {
- if (mCallbackRun.compareAndSet(false, true)) {
- mRemoteCallback.sendResult(data);
- }
- }
- }
-
- private static void sendDefaultRecommendationResponse(RecommendationRequest request,
- OneTimeCallback remoteCallback) {
- if (DBG) {
- Log.d(TAG, "Returning the default network recommendation.");
- }
-
- final RecommendationResult result;
- if (request != null && request.getDefaultWifiConfig() != null) {
- result = RecommendationResult.createConnectRecommendation(
- request.getDefaultWifiConfig());
- } else {
- result = RecommendationResult.createDoNotConnectRecommendation();
- }
-
- final Bundle data = new Bundle();
- data.putParcelable(EXTRA_RECOMMENDATION_RESULT, result);
- remoteCallback.sendResult(data);
- }
-
@VisibleForTesting
public final class ServiceHandler extends Handler {
- public static final int MSG_RECOMMENDATION_REQUEST_TIMEOUT = 1;
- public static final int MSG_RECOMMENDATIONS_PACKAGE_CHANGED = 2;
- public static final int MSG_RECOMMENDATION_REQUEST_TIMEOUT_CHANGED = 3;
- public static final int MSG_RECOMMENDATION_ENABLED_SETTING_CHANGED = 4;
+ public static final int MSG_RECOMMENDATIONS_PACKAGE_CHANGED = 1;
+ public static final int MSG_RECOMMENDATION_ENABLED_SETTING_CHANGED = 2;
public ServiceHandler(Looper looper) {
super(looper);
@@ -1210,26 +1003,11 @@
public void handleMessage(Message msg) {
final int what = msg.what;
switch (what) {
- case MSG_RECOMMENDATION_REQUEST_TIMEOUT:
- if (DBG) {
- Log.d(TAG, "Network recommendation request timed out.");
- }
- final Pair<RecommendationRequest, OneTimeCallback> pair =
- (Pair<RecommendationRequest, OneTimeCallback>) msg.obj;
- final RecommendationRequest request = pair.first;
- final OneTimeCallback remoteCallback = pair.second;
- sendDefaultRecommendationResponse(request, remoteCallback);
- break;
-
case MSG_RECOMMENDATIONS_PACKAGE_CHANGED:
case MSG_RECOMMENDATION_ENABLED_SETTING_CHANGED:
refreshBinding();
break;
- case MSG_RECOMMENDATION_REQUEST_TIMEOUT_CHANGED:
- refreshRecommendationRequestTimeoutMs();
- break;
-
default:
Log.w(TAG,"Unknown message: " + what);
}
diff --git a/services/core/java/com/android/server/PersistentDataBlockService.java b/services/core/java/com/android/server/PersistentDataBlockService.java
index 417d375..e3cd87c 100644
--- a/services/core/java/com/android/server/PersistentDataBlockService.java
+++ b/services/core/java/com/android/server/PersistentDataBlockService.java
@@ -95,7 +95,6 @@
mContext = context;
mDataBlockFile = SystemProperties.get(PERSISTENT_DATA_BLOCK_PROP);
mBlockDeviceSize = -1; // Load lazily
- mAllowedUid = getAllowedUid(UserHandle.USER_SYSTEM);
}
private int getAllowedUid(int userHandle) {
@@ -117,6 +116,7 @@
public void onStart() {
// Do init on a separate thread, will join in PHASE_ACTIVITY_MANAGER_READY
SystemServerInitThreadPool.get().submit(() -> {
+ mAllowedUid = getAllowedUid(UserHandle.USER_SYSTEM);
enforceChecksumValidity();
formatIfOemUnlockEnabled();
publishBinderService(Context.PERSISTENT_DATA_BLOCK_SERVICE, mService);
diff --git a/services/core/java/com/android/server/SyntheticPasswordCrypto.java b/services/core/java/com/android/server/SyntheticPasswordCrypto.java
index 12d91c5..71ab2a5 100644
--- a/services/core/java/com/android/server/SyntheticPasswordCrypto.java
+++ b/services/core/java/com/android/server/SyntheticPasswordCrypto.java
@@ -139,12 +139,14 @@
keyStore.load(null);
KeyProtection.Builder builder = new KeyProtection.Builder(KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
- .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE);
+ .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
+ .setCriticalToDeviceEncryption(true);
if (sid != 0) {
builder.setUserAuthenticationRequired(true)
.setBoundToSpecificSecureUserId(sid)
.setUserAuthenticationValidityDurationSeconds(USER_AUTHENTICATION_VALIDITY);
}
+
keyStore.setEntry(keyAlias,
new KeyStore.SecretKeyEntry(secretKey),
builder.build());
diff --git a/services/core/java/com/android/server/SyntheticPasswordManager.java b/services/core/java/com/android/server/SyntheticPasswordManager.java
index d23584f..6ec74e1 100644
--- a/services/core/java/com/android/server/SyntheticPasswordManager.java
+++ b/services/core/java/com/android/server/SyntheticPasswordManager.java
@@ -82,7 +82,7 @@
// 256-bit synthetic password
private static final byte SYNTHETIC_PASSWORD_LENGTH = 256 / 8;
- private static final int PASSWORD_SCRYPT_N = 13;
+ private static final int PASSWORD_SCRYPT_N = 11;
private static final int PASSWORD_SCRYPT_R = 3;
private static final int PASSWORD_SCRYPT_P = 1;
private static final int PASSWORD_SALT_LENGTH = 16;
diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java
index cb13a3d..10b2609 100644
--- a/services/core/java/com/android/server/SystemServiceManager.java
+++ b/services/core/java/com/android/server/SystemServiceManager.java
@@ -33,6 +33,7 @@
*/
public class SystemServiceManager {
private static final String TAG = "SystemServiceManager";
+ private static final int SERVICE_CALL_WARN_TIME_MS = 50;
private final Context mContext;
private boolean mSafeMode;
@@ -117,12 +118,14 @@
// Register it.
mServices.add(service);
// Start it.
+ long time = System.currentTimeMillis();
try {
service.onStart();
} catch (RuntimeException ex) {
throw new RuntimeException("Failed to start service " + service.getClass().getName()
+ ": onStart threw an exception", ex);
}
+ warnIfTooLong(System.currentTimeMillis() - time, service, "onStart");
}
/**
@@ -143,6 +146,7 @@
final int serviceLen = mServices.size();
for (int i = 0; i < serviceLen; i++) {
final SystemService service = mServices.get(i);
+ long time = System.currentTimeMillis();
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, service.getClass().getName());
try {
service.onBootPhase(mCurrentPhase);
@@ -152,6 +156,7 @@
+ ": onBootPhase threw an exception during phase "
+ mCurrentPhase, ex);
}
+ warnIfTooLong(System.currentTimeMillis() - time, service, "onBootPhase");
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
} finally {
@@ -160,81 +165,96 @@
}
public void startUser(final int userHandle) {
+ Slog.i(TAG, "Calling onStartUser u" + userHandle);
final int serviceLen = mServices.size();
for (int i = 0; i < serviceLen; i++) {
final SystemService service = mServices.get(i);
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "onStartUser "
+ service.getClass().getName());
+ long time = System.currentTimeMillis();
try {
service.onStartUser(userHandle);
} catch (Exception ex) {
Slog.wtf(TAG, "Failure reporting start of user " + userHandle
+ " to service " + service.getClass().getName(), ex);
}
+ warnIfTooLong(System.currentTimeMillis() - time, service, "onStartUser ");
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
public void unlockUser(final int userHandle) {
+ Slog.i(TAG, "Calling onUnlockUser u" + userHandle);
final int serviceLen = mServices.size();
for (int i = 0; i < serviceLen; i++) {
final SystemService service = mServices.get(i);
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "onUnlockUser "
+ service.getClass().getName());
+ long time = System.currentTimeMillis();
try {
service.onUnlockUser(userHandle);
} catch (Exception ex) {
Slog.wtf(TAG, "Failure reporting unlock of user " + userHandle
+ " to service " + service.getClass().getName(), ex);
}
+ warnIfTooLong(System.currentTimeMillis() - time, service, "onUnlockUser ");
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
public void switchUser(final int userHandle) {
+ Slog.i(TAG, "Calling switchUser u" + userHandle);
final int serviceLen = mServices.size();
for (int i = 0; i < serviceLen; i++) {
final SystemService service = mServices.get(i);
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "onSwitchUser "
+ service.getClass().getName());
+ long time = System.currentTimeMillis();
try {
service.onSwitchUser(userHandle);
} catch (Exception ex) {
Slog.wtf(TAG, "Failure reporting switch of user " + userHandle
+ " to service " + service.getClass().getName(), ex);
}
+ warnIfTooLong(System.currentTimeMillis() - time, service, "onSwitchUser");
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
public void stopUser(final int userHandle) {
+ Slog.i(TAG, "Calling onStopUser u" + userHandle);
final int serviceLen = mServices.size();
for (int i = 0; i < serviceLen; i++) {
final SystemService service = mServices.get(i);
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "onStopUser "
+ service.getClass().getName());
+ long time = System.currentTimeMillis();
try {
service.onStopUser(userHandle);
} catch (Exception ex) {
Slog.wtf(TAG, "Failure reporting stop of user " + userHandle
+ " to service " + service.getClass().getName(), ex);
}
+ warnIfTooLong(System.currentTimeMillis() - time, service, "onStopUser");
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
public void cleanupUser(final int userHandle) {
+ Slog.i(TAG, "Calling onCleanupUser u" + userHandle);
final int serviceLen = mServices.size();
for (int i = 0; i < serviceLen; i++) {
final SystemService service = mServices.get(i);
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "onCleanupUser "
+ service.getClass().getName());
+ long time = System.currentTimeMillis();
try {
service.onCleanupUser(userHandle);
} catch (Exception ex) {
Slog.wtf(TAG, "Failure reporting cleanup of user " + userHandle
+ " to service " + service.getClass().getName(), ex);
}
+ warnIfTooLong(System.currentTimeMillis() - time, service, "onCleanupUser");
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
@@ -263,6 +283,12 @@
mRuntimeRestarted = runtimeRestarted;
}
+ private void warnIfTooLong(long duration, SystemService service, String operation) {
+ if (duration > SERVICE_CALL_WARN_TIME_MS) {
+ Slog.w(TAG, "Service " + service.getClass().getName() + " took " + duration + " ms in "
+ + operation);
+ }
+ }
/**
* Outputs the state of this manager to the System log.
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index adb55b9..03da5b2 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -112,6 +112,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
@@ -575,6 +576,22 @@
long identityToken = clearCallingIdentity();
try {
UserAccounts accounts = getUserAccounts(userId);
+ if (AccountManager.PACKAGE_NAME_KEY_LEGACY_VISIBLE.equals(packageName)) {
+ int visibility = getAccountVisibilityFromCache(account, packageName, accounts);
+ if (AccountManager.VISIBILITY_UNDEFINED != visibility) {
+ return visibility;
+ } else {
+ return AccountManager.VISIBILITY_USER_MANAGED_VISIBLE;
+ }
+ }
+ if (AccountManager.PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE.equals(packageName)) {
+ int visibility = getAccountVisibilityFromCache(account, packageName, accounts);
+ if (AccountManager.VISIBILITY_UNDEFINED != visibility) {
+ return visibility;
+ } else {
+ return AccountManager.VISIBILITY_USER_MANAGED_NOT_VISIBLE;
+ }
+ }
return resolveAccountVisibility(account, packageName, accounts);
} finally {
restoreCallingIdentity(identityToken);
@@ -640,11 +657,6 @@
return AccountManager.VISIBILITY_VISIBLE; // Authenticator can always see the account
}
- if (isSpecialPackageKey(packageName)) {
- Log.d(TAG, "Package name is forbidden: " + packageName);
- return AccountManager.VISIBILITY_NOT_VISIBLE;
- }
-
// Return stored value if it was set.
int visibility = getAccountVisibilityFromCache(account, packageName, accounts);
@@ -752,10 +764,12 @@
synchronized (accounts.dbLock) {
synchronized (accounts.cacheLock) {
Map<String, Integer> packagesToVisibility;
+ List<String> accountRemovedReceivers;
if (notify) {
if (isSpecialPackageKey(packageName)) {
packagesToVisibility =
getRequestingPackages(account, accounts);
+ accountRemovedReceivers = getAccountRemovedReceivers(account, accounts);
} else {
if (!packageExistsForUser(packageName, accounts.userId)) {
return false; // package is not installed.
@@ -763,15 +777,20 @@
packagesToVisibility = new HashMap<>();
packagesToVisibility.put(packageName,
resolveAccountVisibility(account, packageName, accounts));
+ accountRemovedReceivers = new ArrayList<>();
+ if (shouldNotifyPackageOnAccountRemoval(account, packageName, accounts)) {
+ accountRemovedReceivers.add(packageName);
+ }
}
} else {
- // Notifications will not be send.
+ // Notifications will not be send - only used during add account.
if (!isSpecialPackageKey(packageName) &&
!packageExistsForUser(packageName, accounts.userId)) {
// package is not installed and not meta value.
return false;
}
- packagesToVisibility = new HashMap<>();
+ packagesToVisibility = Collections.emptyMap();
+ accountRemovedReceivers = Collections.emptyList();
}
if (!updateAccountVisibilityLocked(account, packageName, newVisibility, accounts)) {
@@ -781,11 +800,14 @@
if (notify) {
for (Entry<String, Integer> packageToVisibility : packagesToVisibility
.entrySet()) {
- if (packageToVisibility.getValue()
- != AccountManager.VISIBILITY_NOT_VISIBLE) {
+ if (shouldNotifyOnVisibilityChange(packageToVisibility.getValue(),
+ resolveAccountVisibility(account, packageName, accounts))) {
notifyPackage(packageToVisibility.getKey(), accounts);
}
}
+ for (String packageNameToNotify : accountRemovedReceivers) {
+ sendAccountRemovedBroadcast(account, packageNameToNotify, accounts.userId);
+ }
sendAccountsChangedBroadcast(accounts.userId);
}
return true;
@@ -889,10 +911,11 @@
// Send notification to all packages which can potentially see the account
private void sendNotificationAccountUpdated(Account account, UserAccounts accounts) {
Map<String, Integer> packagesToVisibility = getRequestingPackages(account, accounts);
- // packages with VISIBILITY_USER_MANAGED_NOT_VISIBL still get notification.
- // Should we notify VISIBILITY_NOT_VISIBLE packages when account is added?
+
for (Entry<String, Integer> packageToVisibility : packagesToVisibility.entrySet()) {
- if (packageToVisibility.getValue() != AccountManager.VISIBILITY_NOT_VISIBLE) {
+ if ((packageToVisibility.getValue() != AccountManager.VISIBILITY_NOT_VISIBLE)
+ && (packageToVisibility.getValue()
+ != AccountManager.VISIBILITY_USER_MANAGED_NOT_VISIBLE)) {
notifyPackage(packageToVisibility.getKey(), accounts);
}
}
@@ -931,6 +954,44 @@
return result;
}
+ // Returns a list of packages listening to ACTION_ACCOUNT_REMOVED able to see the account.
+ private List<String> getAccountRemovedReceivers(Account account, UserAccounts accounts) {
+ Intent intent = new Intent(AccountManager.ACTION_ACCOUNT_REMOVED);
+ intent.setFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
+ List<ResolveInfo> receivers =
+ mPackageManager.queryBroadcastReceiversAsUser(intent, 0, accounts.userId);
+ List<String> result = new ArrayList<>();
+ if (receivers == null) {
+ return result;
+ }
+ for (ResolveInfo resolveInfo: receivers) {
+ String packageName = resolveInfo.activityInfo.applicationInfo.packageName;
+ int visibility = resolveAccountVisibility(account, packageName, accounts);
+ if (visibility == AccountManager.VISIBILITY_VISIBLE
+ || visibility == AccountManager.VISIBILITY_USER_MANAGED_VISIBLE) {
+ result.add(packageName);
+ }
+ }
+ return result;
+ }
+
+ // Returns true if given package is listening to ACTION_ACCOUNT_REMOVED and can see the account.
+ private boolean shouldNotifyPackageOnAccountRemoval(Account account,
+ String packageName, UserAccounts accounts) {
+ int visibility = resolveAccountVisibility(account, packageName, accounts);
+ if (visibility != AccountManager.VISIBILITY_VISIBLE
+ && visibility != AccountManager.VISIBILITY_USER_MANAGED_VISIBLE) {
+ return false;
+ }
+
+ Intent intent = new Intent(AccountManager.ACTION_ACCOUNT_REMOVED);
+ intent.setFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
+ intent.setPackage(packageName);
+ List<ResolveInfo> receivers =
+ mPackageManager.queryBroadcastReceiversAsUser(intent, 0, accounts.userId);
+ return (receivers != null && receivers.size() > 0);
+ }
+
private boolean packageExistsForUser(String packageName, int userId) {
try {
long identityToken = clearCallingIdentity();
@@ -959,9 +1020,12 @@
mContext.sendBroadcastAsUser(ACCOUNTS_CHANGED_INTENT, new UserHandle(userId));
}
- private void sendAccountRemovedBroadcast(int userId) {
+ private void sendAccountRemovedBroadcast(Account account, String packageName, int userId) {
Intent intent = new Intent(AccountManager.ACTION_ACCOUNT_REMOVED);
intent.setFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
+ intent.setPackage(packageName);
+ intent.putExtra(AccountManager.KEY_ACCOUNT_NAME, account.name);
+ intent.putExtra(AccountManager.KEY_ACCOUNT_TYPE, account.type);
mContext.sendBroadcastAsUser(intent, new UserHandle(userId));
}
@@ -1087,6 +1151,8 @@
+ "'s registered authenticator no longer exist.");
Map<String, Integer> packagesToVisibility =
getRequestingPackages(account, accounts);
+ List<String> accountRemovedReceivers =
+ getAccountRemovedReceivers(account, accounts);
accountsDb.beginTransaction();
try {
accountsDb.deleteDeAccount(accountId);
@@ -1112,12 +1178,14 @@
for (Entry<String, Integer> packageToVisibility :
packagesToVisibility.entrySet()) {
- if (packageToVisibility.getValue()
- != AccountManager.VISIBILITY_NOT_VISIBLE) {
+ if (shouldNotifyOnVisibilityChange(packageToVisibility.getValue(),
+ AccountManager.VISIBILITY_NOT_VISIBLE)) {
notifyPackage(packageToVisibility.getKey(), accounts);
}
}
- sendAccountRemovedBroadcast(accounts.userId);
+ for (String packageName : accountRemovedReceivers) {
+ sendAccountRemovedBroadcast(account, packageName, accounts.userId);
+ }
} else {
ArrayList<String> accountNames = accountNamesByType.get(account.type);
if (accountNames == null) {
@@ -1147,6 +1215,14 @@
}
}
+ private boolean shouldNotifyOnVisibilityChange(int oldVisibility, int newVisibility) {
+ boolean oldVisible = (oldVisibility == AccountManager.VISIBILITY_VISIBLE) ||
+ (oldVisibility == AccountManager.VISIBILITY_USER_MANAGED_VISIBLE);
+ boolean newVisible = (newVisibility == AccountManager.VISIBILITY_VISIBLE) ||
+ (newVisibility == AccountManager.VISIBILITY_USER_MANAGED_VISIBLE);
+ return oldVisible == newVisible;
+ }
+
private SparseBooleanArray getUidsOfInstalledOrUpdatedPackagesAsUser(int userId) {
// Get the UIDs of all apps that might have data on the device. We want
// to preserve user data if the app might otherwise be storing data.
@@ -1911,6 +1987,8 @@
}
synchronized (accounts.dbLock) {
synchronized (accounts.cacheLock) {
+ List<String> accountRemovedReceivers =
+ getAccountRemovedReceivers(accountToRename, accounts);
accounts.accountsDb.beginTransaction();
Account renamedAccount = new Account(newName, accountToRename.type);
if ((accounts.accountsDb.findCeAccountId(renamedAccount) >= 0)) {
@@ -1978,7 +2056,9 @@
sendNotificationAccountUpdated(resultAccount, accounts);
sendAccountsChangedBroadcast(accounts.userId);
- sendAccountRemovedBroadcast(accounts.userId);
+ for (String packageName : accountRemovedReceivers) {
+ sendAccountRemovedBroadcast(accountToRename, packageName, accounts.userId);
+ }
}
}
return resultAccount;
@@ -2181,6 +2261,8 @@
synchronized (accounts.cacheLock) {
Map<String, Integer> packagesToVisibility = getRequestingPackages(account,
accounts);
+ List<String> accountRemovedReceivers =
+ getAccountRemovedReceivers(account, accounts);
accounts.accountsDb.beginTransaction();
// Set to a dummy value, this will only be used if the database
// transaction succeeds.
@@ -2206,15 +2288,18 @@
removeAccountFromCacheLocked(accounts, account);
for (Entry<String, Integer> packageToVisibility : packagesToVisibility
.entrySet()) {
- if (packageToVisibility.getValue()
- != AccountManager.VISIBILITY_NOT_VISIBLE) {
+ if ((packageToVisibility.getValue() == AccountManager.VISIBILITY_VISIBLE)
+ || (packageToVisibility.getValue()
+ == AccountManager.VISIBILITY_USER_MANAGED_VISIBLE)) {
notifyPackage(packageToVisibility.getKey(), accounts);
}
}
// Only broadcast LOGIN_ACCOUNTS_CHANGED if a change occurred.
sendAccountsChangedBroadcast(accounts.userId);
- sendAccountRemovedBroadcast(accounts.userId);
+ for (String packageName : accountRemovedReceivers) {
+ sendAccountRemovedBroadcast(account, packageName, accounts.userId);
+ }
String action = userUnlocked ? AccountsDb.DEBUG_ACTION_ACCOUNT_REMOVE
: AccountsDb.DEBUG_ACTION_ACCOUNT_REMOVE_DE;
logRecord(action, AccountsDb.TABLE_ACCOUNTS, accountId, accounts);
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index c6e44e0..5edf19a 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -31,10 +31,12 @@
import android.app.ActivityThread;
import android.app.AppOpsManager;
+import android.app.NotificationManager;
import android.app.ServiceStartArgs;
import android.content.IIntentSender;
import android.content.IntentSender;
import android.content.pm.ParceledListSlice;
+import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.DeadObjectException;
@@ -43,10 +45,14 @@
import android.os.RemoteCallback;
import android.os.SystemProperties;
import android.os.TransactionTooLargeException;
+import android.provider.Settings;
import android.util.ArrayMap;
import android.util.ArraySet;
+import com.android.internal.R;
import com.android.internal.app.procstats.ServiceState;
+import com.android.internal.messages.nano.SystemMessageProto;
+import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.os.BatteryStatsImpl;
import com.android.internal.os.TransferPipe;
import com.android.internal.util.FastPrintWriter;
@@ -101,32 +107,6 @@
// calling startForeground() before we ANR + stop it.
static final int SERVICE_START_FOREGROUND_TIMEOUT = 5*1000;
- // How long a service needs to be running until restarting its process
- // is no longer considered to be a relaunch of the service.
- static final int SERVICE_RESTART_DURATION = 1*1000;
-
- // How long a service needs to be running until it will start back at
- // SERVICE_RESTART_DURATION after being killed.
- static final int SERVICE_RESET_RUN_DURATION = 60*1000;
-
- // Multiplying factor to increase restart duration time by, for each time
- // a service is killed before it has run for SERVICE_RESET_RUN_DURATION.
- static final int SERVICE_RESTART_DURATION_FACTOR = 4;
-
- // The minimum amount of time between restarting services that we allow.
- // That is, when multiple services are restarting, we won't allow each
- // to restart less than this amount of time from the last one.
- static final int SERVICE_MIN_RESTART_TIME_BETWEEN = 10*1000;
-
- // Maximum amount of time for there to be no activity on a service before
- // we consider it non-essential and allow its process to go on the
- // LRU background list.
- static final int MAX_SERVICE_INACTIVITY = 30*60*1000;
-
- // How long we wait for a background started service to stop itself before
- // allowing the next pending start to run.
- static final int BG_START_TIMEOUT = 15*1000;
-
final ActivityManagerService mAm;
// Maximum number of services that we allow to start in the background
@@ -162,6 +142,11 @@
/** Temporary list for holding the results of calls to {@link #collectPackageServicesLocked} */
private ArrayList<ServiceRecord> mTmpCollectionResults = null;
+ /**
+ * For keeping ActiveForegroundApps retaining state while the screen is off.
+ */
+ boolean mScreenOn = true;
+
/** 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
@@ -176,9 +161,23 @@
};
/**
+ * Information about an app that is currently running one or more foreground services.
+ * (This mapps directly to the running apps we show in the notification.)
+ */
+ static final class ActiveForegroundApp {
+ String mPackageName;
+ CharSequence mLabel;
+ boolean mShownWhileScreenOn;
+ long mStartTime;
+ long mStartVisibleTime;
+ long mEndTime;
+ int mNumActive;
+ }
+
+ /**
* Information about services for a single user.
*/
- class ServiceMap extends Handler {
+ final class ServiceMap extends Handler {
final int mUserId;
final ArrayMap<ComponentName, ServiceRecord> mServicesByName = new ArrayMap<>();
final ArrayMap<Intent.FilterComparison, ServiceRecord> mServicesByIntent = new ArrayMap<>();
@@ -196,7 +195,11 @@
final ArrayList<ServiceRecord> mStartingBackground = new ArrayList<>();
+ final ArrayMap<String, ActiveForegroundApp> mActiveForegroundApps = new ArrayMap<>();
+ boolean mActiveForegroundAppsChanged;
+
static final int MSG_BG_START_TIMEOUT = 1;
+ static final int MSG_UPDATE_FOREGROUND_APPS = 2;
ServiceMap(Looper looper, int userId) {
super(looper);
@@ -211,6 +214,9 @@
rescheduleDelayedStartsLocked();
}
} break;
+ case MSG_UPDATE_FOREGROUND_APPS: {
+ updateForegroundApps(this);
+ } break;
}
}
@@ -528,7 +534,7 @@
if (r.startRequested && addToStarting) {
boolean first = smap.mStartingBackground.size() == 0;
smap.mStartingBackground.add(r);
- r.startingBgTimeout = SystemClock.uptimeMillis() + BG_START_TIMEOUT;
+ r.startingBgTimeout = SystemClock.uptimeMillis() + mAm.mConstants.BG_START_TIMEOUT;
if (DEBUG_DELAYED_SERVICE) {
RuntimeException here = new RuntimeException("here");
here.fillInStackTrace();
@@ -716,6 +722,171 @@
}
}
+ void updateForegroundApps(ServiceMap smap) {
+ // This is called from the handler without the lock held.
+ ArrayList<ActiveForegroundApp> active = null;
+ synchronized (mAm) {
+ final long now = SystemClock.elapsedRealtime();
+ final long nowPlusMin = now + mAm.mConstants.FOREGROUND_SERVICE_UI_MIN_TIME;
+ if (smap != null) {
+ for (int i = smap.mActiveForegroundApps.size()-1; i >= 0; i--) {
+ ActiveForegroundApp aa = smap.mActiveForegroundApps.valueAt(i);
+ if (aa.mEndTime != 0 && (mScreenOn || aa.mShownWhileScreenOn)) {
+ if (aa.mEndTime < (aa.mStartVisibleTime
+ + mAm.mConstants.FOREGROUND_SERVICE_UI_MIN_TIME)) {
+ // Check to see if this should still be displayed... we continue
+ // until it has been shown for at least the timeout duration.
+ if (nowPlusMin >= aa.mStartVisibleTime) {
+ // All over!
+ smap.mActiveForegroundApps.removeAt(i);
+ smap.mActiveForegroundAppsChanged = true;
+ continue;
+ }
+ } else {
+ // This was up for longer than the timeout, so just remove immediately.
+ smap.mActiveForegroundApps.removeAt(i);
+ smap.mActiveForegroundAppsChanged = true;
+ continue;
+ }
+ }
+ if (active == null) {
+ active = new ArrayList<>();
+ }
+ active.add(aa);
+ }
+ }
+ if (!smap.mActiveForegroundAppsChanged) {
+ return;
+ }
+ smap.mActiveForegroundAppsChanged = false;
+ }
+
+ final NotificationManager nm = (NotificationManager) mAm.mContext.getSystemService(
+ Context.NOTIFICATION_SERVICE);
+ final Context context = mAm.mContext;
+
+ if (active != null) {
+ for (int i = 0; i < active.size(); i++) {
+ ActiveForegroundApp aa = active.get(i);
+ if (aa.mLabel == null) {
+ PackageManager pm = context.getPackageManager();
+ try {
+ ApplicationInfo ai = pm.getApplicationInfoAsUser(aa.mPackageName,
+ PackageManager.MATCH_KNOWN_PACKAGES, smap.mUserId);
+ aa.mLabel = ai.loadLabel(pm);
+ } catch (PackageManager.NameNotFoundException e) {
+ aa.mLabel = aa.mPackageName;
+ }
+ }
+ }
+
+ Intent intent;
+ String title;
+ String msg;
+ if (active.size() == 1) {
+ intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+ intent.setData(Uri.fromParts("package", active.get(0).mPackageName, null));
+ title = context.getString(
+ R.string.foreground_service_app_in_background, active.get(0).mLabel);
+ msg = context.getString(R.string.foreground_service_tap_for_details);
+ } else {
+ intent = new Intent(Settings.ACTION_FOREGROUND_SERVICES_SETTINGS);
+ String[] pkgs = new String[active.size()];
+ for (int i = 0; i < active.size(); i++) {
+ pkgs[i] = active.get(i).mPackageName;
+ }
+ intent.putExtra("packages", pkgs);
+ title = context.getString(
+ R.string.foreground_service_apps_in_background, active.size());
+ msg = active.get(0).mLabel.toString();
+ for (int i = 1; i < active.size(); i++) {
+ msg = context.getString(R.string.foreground_service_multiple_separator,
+ msg, active.get(i).mLabel);
+ }
+ }
+ Notification.Builder n =
+ new Notification.Builder(context,
+ SystemNotificationChannels.FOREGROUND_SERVICE)
+ .setSmallIcon(R.drawable.ic_check_circle_24px)
+ .setOngoing(true)
+ .setShowWhen(false)
+ .setColor(context.getColor(
+ com.android.internal.R.color.system_notification_accent_color))
+ .setContentTitle(title)
+ .setContentText(msg)
+ .setContentIntent(
+ PendingIntent.getActivityAsUser(context, 0, intent,
+ PendingIntent.FLAG_UPDATE_CURRENT,
+ null, new UserHandle(smap.mUserId)));
+ nm.notifyAsUser(null, SystemMessageProto.SystemMessage.NOTE_FOREGROUND_SERVICES,
+ n.build(), new UserHandle(smap.mUserId));
+ } else {
+ nm.cancelAsUser(null, SystemMessageProto.SystemMessage.NOTE_FOREGROUND_SERVICES,
+ new UserHandle(smap.mUserId));
+ }
+ }
+
+ private void requestUpdateActiveForegroundAppsLocked(ServiceMap smap, long time) {
+ Message msg = smap.obtainMessage(ServiceMap.MSG_UPDATE_FOREGROUND_APPS);
+ if (time != 0) {
+ smap.sendMessageAtTime(msg, time);
+ } else {
+ smap.mActiveForegroundAppsChanged = true;
+ smap.sendMessage(msg);
+ }
+ }
+
+ private void decActiveForegroundAppLocked(ServiceMap smap, ServiceRecord r) {
+ ActiveForegroundApp active = smap.mActiveForegroundApps.get(r.packageName);
+ if (active != null) {
+ active.mNumActive--;
+ if (active.mNumActive <= 0) {
+ active.mEndTime = SystemClock.elapsedRealtime();
+ if (active.mEndTime >= (active.mStartVisibleTime
+ + mAm.mConstants.FOREGROUND_SERVICE_UI_MIN_TIME)) {
+ // Have been active for long enough that we will remove it immediately.
+ smap.mActiveForegroundApps.remove(r.packageName);
+ smap.mActiveForegroundAppsChanged = true;
+ requestUpdateActiveForegroundAppsLocked(smap, 0);
+ } else {
+ requestUpdateActiveForegroundAppsLocked(smap, active.mStartVisibleTime
+ + mAm.mConstants.FOREGROUND_SERVICE_UI_MIN_TIME);
+ }
+ }
+ }
+ }
+
+ void updateScreenStateLocked(boolean screenOn) {
+ if (mScreenOn != screenOn) {
+ mScreenOn = screenOn;
+
+ // If screen is turning on, then we now reset the start time of any foreground
+ // services that were started while the screen was off.
+ if (screenOn) {
+ final long nowElapsed = SystemClock.elapsedRealtime();
+ for (int i = mServiceMap.size()-1; i >= 0; i--) {
+ ServiceMap smap = mServiceMap.valueAt(i);
+ boolean changed = false;
+ for (int j = smap.mActiveForegroundApps.size()-1; j >= 0; j--) {
+ ActiveForegroundApp active = smap.mActiveForegroundApps.valueAt(j);
+ if (!active.mShownWhileScreenOn) {
+ changed = true;
+ active.mShownWhileScreenOn = mScreenOn;
+ active.mStartVisibleTime = nowElapsed;
+ if (active.mEndTime != 0) {
+ active.mEndTime = nowElapsed;
+ }
+ }
+ }
+ if (changed) {
+ requestUpdateActiveForegroundAppsLocked(smap,
+ nowElapsed + mAm.mConstants.FOREGROUND_SERVICE_UI_MIN_TIME);
+ }
+ }
+ }
+ }
+ }
+
private void setServiceForegroundInnerLocked(ServiceRecord r, int id,
Notification notification, int flags) {
if (id != 0) {
@@ -770,7 +941,23 @@
}
notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;
r.foregroundNoti = notification;
- r.isForeground = true;
+ if (!r.isForeground) {
+ final ServiceMap smap = getServiceMapLocked(r.userId);
+ if (smap != null) {
+ ActiveForegroundApp active = smap.mActiveForegroundApps.get(r.packageName);
+ if (active == null) {
+ active = new ActiveForegroundApp();
+ active.mPackageName = r.packageName;
+ active.mShownWhileScreenOn = mScreenOn;
+ active.mStartTime = active.mStartVisibleTime
+ = SystemClock.elapsedRealtime();
+ smap.mActiveForegroundApps.put(r.packageName, active);
+ requestUpdateActiveForegroundAppsLocked(smap, 0);
+ }
+ active.mNumActive++;
+ }
+ r.isForeground = true;
+ }
r.postNotification();
if (r.app != null) {
updateServiceForegroundLocked(r.app, true);
@@ -780,6 +967,10 @@
PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE);
} else {
if (r.isForeground) {
+ final ServiceMap smap = getServiceMapLocked(r.userId);
+ if (smap != null) {
+ decActiveForegroundAppLocked(smap, r);
+ }
r.isForeground = false;
if (r.app != null) {
mAm.updateLruProcessLocked(r.app, false, null);
@@ -1561,8 +1752,8 @@
if ((r.serviceInfo.applicationInfo.flags
&ApplicationInfo.FLAG_PERSISTENT) == 0) {
- long minDuration = SERVICE_RESTART_DURATION;
- long resetTime = SERVICE_RESET_RUN_DURATION;
+ long minDuration = mAm.mConstants.SERVICE_RESTART_DURATION;
+ long resetTime = mAm.mConstants.SERVICE_RESET_RUN_DURATION;
// Any delivered but not yet finished starts should be put back
// on the pending list.
@@ -1603,7 +1794,7 @@
r.restartCount = 1;
r.restartDelay = minDuration;
} else {
- r.restartDelay *= SERVICE_RESTART_DURATION_FACTOR;
+ r.restartDelay *= mAm.mConstants.SERVICE_RESTART_DURATION_FACTOR;
if (r.restartDelay < minDuration) {
r.restartDelay = minDuration;
}
@@ -1617,13 +1808,12 @@
boolean repeat;
do {
repeat = false;
+ final long restartTimeBetween = mAm.mConstants.SERVICE_MIN_RESTART_TIME_BETWEEN;
for (int i=mRestartingServices.size()-1; i>=0; i--) {
ServiceRecord r2 = mRestartingServices.get(i);
- if (r2 != r && r.nextRestartTime
- >= (r2.nextRestartTime-SERVICE_MIN_RESTART_TIME_BETWEEN)
- && r.nextRestartTime
- < (r2.nextRestartTime+SERVICE_MIN_RESTART_TIME_BETWEEN)) {
- r.nextRestartTime = r2.nextRestartTime + SERVICE_MIN_RESTART_TIME_BETWEEN;
+ if (r2 != r && r.nextRestartTime >= (r2.nextRestartTime-restartTimeBetween)
+ && r.nextRestartTime < (r2.nextRestartTime+restartTimeBetween)) {
+ r.nextRestartTime = r2.nextRestartTime + restartTimeBetween;
r.restartDelay = r.nextRestartTime - now;
repeat = true;
break;
@@ -1868,7 +2058,8 @@
final boolean newService = app.services.add(r);
bumpServiceExecutingLocked(r, execInFg, "create");
mAm.updateLruProcessLocked(app, false, null);
- updateServiceForegroundLocked(r.app, true);
+ updateServiceForegroundLocked(r.app, /* oomAdj= */ false);
+ mAm.updateOomAdjLocked();
boolean created = false;
try {
@@ -2150,7 +2341,10 @@
final ServiceMap smap = getServiceMapLocked(r.userId);
ServiceRecord found = smap.mServicesByName.remove(r.name);
- if (found != r) {
+
+ // Note when this method is called by bringUpServiceLocked(), the service is not found
+ // in mServicesByName and found will be null.
+ if (found != null && found != r) {
// This is not actually the service we think is running... this should not happen,
// but if it does, fail hard.
smap.mServicesByName.put(r.name, found);
@@ -2170,6 +2364,9 @@
}
cancelForegroundNotificationLocked(r);
+ if (r.isForeground) {
+ decActiveForegroundAppLocked(smap, r);
+ }
r.isForeground = false;
r.foregroundId = 0;
r.foregroundNoti = null;
@@ -2608,6 +2805,22 @@
return didSomething;
}
+ void removeUninstalledPackageLocked(String packageName, int userId) {
+ ServiceMap smap = mServiceMap.get(userId);
+ if (smap != null && smap.mActiveForegroundApps.size() > 0) {
+ for (int i = smap.mActiveForegroundApps.size(); i >= 0; i--) {
+ ActiveForegroundApp aa = smap.mActiveForegroundApps.valueAt(i);
+ if (aa.mPackageName.equals(packageName)) {
+ smap.mActiveForegroundApps.removeAt(i);
+ smap.mActiveForegroundAppsChanged = true;
+ }
+ }
+ if (smap.mActiveForegroundAppsChanged) {
+ requestUpdateActiveForegroundAppsLocked(smap, 0);
+ }
+ }
+ }
+
void cleanUpRemovedTaskLocked(TaskRecord tr, ComponentName component, Intent baseIntent) {
ArrayList<ServiceRecord> services = new ArrayList<>();
ArrayMap<ComponentName, ServiceRecord> alls = getServicesLocked(tr.userId);
@@ -3390,6 +3603,55 @@
}
}
+ if (matcher.all) {
+ final long nowElapsed = SystemClock.elapsedRealtime();
+ final int[] users = mAm.mUserController.getUsers();
+ for (int user : users) {
+ boolean printedUser = false;
+ ServiceMap smap = mServiceMap.get(user);
+ if (smap == null) {
+ continue;
+ }
+ for (int i = smap.mActiveForegroundApps.size() - 1; i >= 0; i--) {
+ ActiveForegroundApp aa = smap.mActiveForegroundApps.valueAt(i);
+ if (dumpPackage != null && !dumpPackage.equals(aa.mPackageName)) {
+ continue;
+ }
+ if (!printedUser) {
+ printedUser = true;
+ printedAnything = true;
+ if (needSep) pw.println();
+ needSep = true;
+ pw.print("Active foreground apps - user ");
+ pw.print(user);
+ pw.println(":");
+ }
+ pw.print(" #");
+ pw.print(i);
+ pw.print(": ");
+ pw.println(aa.mPackageName);
+ if (aa.mLabel != null) {
+ pw.print(" mLabel=");
+ pw.println(aa.mLabel);
+ }
+ pw.print(" mNumActive=");
+ pw.print(aa.mNumActive);
+ pw.print(" mShownWhileScreenOn=");
+ pw.println(aa.mShownWhileScreenOn);
+ pw.print(" mStartTime=");
+ TimeUtils.formatDuration(aa.mStartTime - nowElapsed, pw);
+ pw.print(" mStartVisibleTime=");
+ TimeUtils.formatDuration(aa.mStartVisibleTime - nowElapsed, pw);
+ pw.println();
+ if (aa.mEndTime != 0) {
+ pw.print(" mEndTime=");
+ TimeUtils.formatDuration(aa.mEndTime - nowElapsed, pw);
+ pw.println();
+ }
+ }
+ }
+ }
+
if (!printedAnything) {
pw.println(" (nothing)");
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index 55ee183..5749f31 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -20,25 +20,137 @@
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
-import android.os.SystemProperties;
import android.provider.Settings;
import android.util.KeyValueListParser;
import android.util.Slog;
import java.io.PrintWriter;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_POWER_QUICK;
+
/**
* Settings constants that can modify the activity manager's behavior.
*/
final class ActivityManagerConstants extends ContentObserver {
// Key names stored in the settings value.
private static final String KEY_MAX_CACHED_PROCESSES = "max_cached_processes";
+ private static final String KEY_BACKGROUND_SETTLE_TIME = "background_settle_time";
+ private static final String KEY_FOREGROUND_SERVICE_UI_MIN_TIME
+ = "foreground_service_ui_min_time";
+ private static final String KEY_CONTENT_PROVIDER_RETAIN_TIME = "content_provider_retain_time";
+ private static final String KEY_GC_TIMEOUT = "gc_timeout";
+ private static final String KEY_GC_MIN_INTERVAL = "gc_min_interval";
+ private static final String KEY_FULL_PSS_MIN_INTERVAL = "full_pss_min_interval";
+ private static final String KEY_FULL_PSS_LOWERED_INTERVAL = "full_pss_lowered_interval";
+ private static final String KEY_POWER_CHECK_DELAY = "power_check_delay";
+ private static final String KEY_WAKE_LOCK_MIN_CHECK_DURATION = "wake_lock_min_check_duration";
+ private static final String KEY_CPU_MIN_CHECK_DURATION = "cpu_min_check_duration";
+ private static final String KEY_SERVICE_USAGE_INTERACTION_TIME
+ = "service_usage_interaction_time";
+ private static final String KEY_USAGE_STATS_INTERACTION_INTERVAL
+ = "usage_stats_interaction_interval";
+ static final String KEY_SERVICE_RESTART_DURATION = "service_restart_duration";
+ static final String KEY_SERVICE_RESET_RUN_DURATION = "service_reset_run_duration";
+ static final String KEY_SERVICE_RESTART_DURATION_FACTOR = "service_restart_duration_factor";
+ static final String KEY_SERVICE_MIN_RESTART_TIME_BETWEEN = "service_min_restart_time_between";
+ static final String KEY_MAX_SERVICE_INACTIVITY = "service_max_inactivity";
+ static final String KEY_BG_START_TIMEOUT = "service_bg_start_timeout";
private static final int DEFAULT_MAX_CACHED_PROCESSES = 32;
+ private static final long DEFAULT_BACKGROUND_SETTLE_TIME = 60*1000;
+ private static final long DEFAULT_FOREGROUND_SERVICE_UI_MIN_TIME = 30*1000;
+ private static final long DEFAULT_CONTENT_PROVIDER_RETAIN_TIME = 20*1000;
+ private static final long DEFAULT_GC_TIMEOUT = 5*1000;
+ private static final long DEFAULT_GC_MIN_INTERVAL = 60*1000;
+ private static final long DEFAULT_FULL_PSS_MIN_INTERVAL = 10*60*1000;
+ private static final long DEFAULT_FULL_PSS_LOWERED_INTERVAL = 2*60*1000;
+ private static final long DEFAULT_POWER_CHECK_DELAY = (DEBUG_POWER_QUICK ? 2 : 15) * 60*1000;
+ private static final long DEFAULT_WAKE_LOCK_MIN_CHECK_DURATION
+ = (DEBUG_POWER_QUICK ? 1 : 5) * 60*1000;
+ private static final long DEFAULT_CPU_MIN_CHECK_DURATION
+ = (DEBUG_POWER_QUICK ? 1 : 5) * 60*1000;
+ private static final long DEFAULT_SERVICE_USAGE_INTERACTION_TIME = 30*60*1000;
+ private static final long DEFAULT_USAGE_STATS_INTERACTION_INTERVAL = 24*60*60*1000L;
+ private static final long DEFAULT_SERVICE_RESTART_DURATION = 1*1000;
+ private static final long DEFAULT_SERVICE_RESET_RUN_DURATION = 60*1000;
+ private static final int DEFAULT_SERVICE_RESTART_DURATION_FACTOR = 4;
+ private static final long DEFAULT_SERVICE_MIN_RESTART_TIME_BETWEEN = 10*1000;
+ private static final long DEFAULT_MAX_SERVICE_INACTIVITY = 30*60*1000;
+ private static final long DEFAULT_BG_START_TIMEOUT = 15*1000;
// Maximum number of cached processes we will allow.
public int MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES;
+ // This is the amount of time we allow an app to settle after it goes into the background,
+ // before we start restricting what it can do.
+ public long BACKGROUND_SETTLE_TIME = DEFAULT_BACKGROUND_SETTLE_TIME;
+
+ // The minimum time a foreground service will be shown as running in the notification UI.
+ public long FOREGROUND_SERVICE_UI_MIN_TIME = DEFAULT_FOREGROUND_SERVICE_UI_MIN_TIME;
+
+ // How long we will retain processes hosting content providers in the "last activity"
+ // state before allowing them to drop down to the regular cached LRU list. This is
+ // to avoid thrashing of provider processes under low memory situations.
+ long CONTENT_PROVIDER_RETAIN_TIME = DEFAULT_CONTENT_PROVIDER_RETAIN_TIME;
+
+ // How long to wait after going idle before forcing apps to GC.
+ long GC_TIMEOUT = DEFAULT_GC_TIMEOUT;
+
+ // The minimum amount of time between successive GC requests for a process.
+ long GC_MIN_INTERVAL = DEFAULT_GC_MIN_INTERVAL;
+
+ // The minimum amount of time between successive PSS requests for a process.
+ long FULL_PSS_MIN_INTERVAL = DEFAULT_FULL_PSS_MIN_INTERVAL;
+
+ // The minimum amount of time between successive PSS requests for a process
+ // when the request is due to the memory state being lowered.
+ long FULL_PSS_LOWERED_INTERVAL = DEFAULT_FULL_PSS_LOWERED_INTERVAL;
+
+ // The rate at which we check for apps using excessive power -- 15 mins.
+ long POWER_CHECK_DELAY = DEFAULT_POWER_CHECK_DELAY;
+
+ // The minimum sample duration we will allow before deciding we have
+ // enough data on wake locks to start killing things.
+ long WAKE_LOCK_MIN_CHECK_DURATION = DEFAULT_WAKE_LOCK_MIN_CHECK_DURATION;
+
+ // The minimum sample duration we will allow before deciding we have
+ // enough data on CPU usage to start killing things.
+ long CPU_MIN_CHECK_DURATION = DEFAULT_CPU_MIN_CHECK_DURATION;
+
+ // This is the amount of time an app needs to be running a foreground service before
+ // we will consider it to be doing interaction for usage stats.
+ long SERVICE_USAGE_INTERACTION_TIME = DEFAULT_SERVICE_USAGE_INTERACTION_TIME;
+
+ // Maximum amount of time we will allow to elapse before re-reporting usage stats
+ // interaction with foreground processes.
+ long USAGE_STATS_INTERACTION_INTERVAL = DEFAULT_USAGE_STATS_INTERACTION_INTERVAL;
+
+ // How long a service needs to be running until restarting its process
+ // is no longer considered to be a relaunch of the service.
+ public long SERVICE_RESTART_DURATION = DEFAULT_SERVICE_RESTART_DURATION;
+
+ // How long a service needs to be running until it will start back at
+ // SERVICE_RESTART_DURATION after being killed.
+ public long SERVICE_RESET_RUN_DURATION = DEFAULT_SERVICE_RESET_RUN_DURATION;
+
+ // Multiplying factor to increase restart duration time by, for each time
+ // a service is killed before it has run for SERVICE_RESET_RUN_DURATION.
+ public int SERVICE_RESTART_DURATION_FACTOR = DEFAULT_SERVICE_RESTART_DURATION_FACTOR;
+
+ // The minimum amount of time between restarting services that we allow.
+ // That is, when multiple services are restarting, we won't allow each
+ // to restart less than this amount of time from the last one.
+ public long SERVICE_MIN_RESTART_TIME_BETWEEN = DEFAULT_SERVICE_MIN_RESTART_TIME_BETWEEN;
+
+ // Maximum amount of time for there to be no activity on a service before
+ // we consider it non-essential and allow its process to go on the
+ // LRU background list.
+ public long MAX_SERVICE_INACTIVITY = DEFAULT_MAX_SERVICE_INACTIVITY;
+
+ // How long we wait for a background started service to stop itself before
+ // allowing the next pending start to run.
+ public long BG_START_TIMEOUT = DEFAULT_BG_START_TIMEOUT;
+
private final ActivityManagerService mService;
private ContentResolver mResolver;
private final KeyValueListParser mParser = new KeyValueListParser(',');
@@ -111,6 +223,42 @@
}
MAX_CACHED_PROCESSES = mParser.getInt(KEY_MAX_CACHED_PROCESSES,
DEFAULT_MAX_CACHED_PROCESSES);
+ BACKGROUND_SETTLE_TIME = mParser.getLong(KEY_BACKGROUND_SETTLE_TIME,
+ DEFAULT_BACKGROUND_SETTLE_TIME);
+ FOREGROUND_SERVICE_UI_MIN_TIME = mParser.getLong(KEY_FOREGROUND_SERVICE_UI_MIN_TIME,
+ DEFAULT_FOREGROUND_SERVICE_UI_MIN_TIME);
+ CONTENT_PROVIDER_RETAIN_TIME = mParser.getLong(KEY_CONTENT_PROVIDER_RETAIN_TIME,
+ DEFAULT_CONTENT_PROVIDER_RETAIN_TIME);
+ GC_TIMEOUT = mParser.getLong(KEY_GC_TIMEOUT,
+ DEFAULT_GC_TIMEOUT);
+ GC_MIN_INTERVAL = mParser.getLong(KEY_GC_MIN_INTERVAL,
+ DEFAULT_GC_MIN_INTERVAL);
+ FULL_PSS_MIN_INTERVAL = mParser.getLong(KEY_FULL_PSS_MIN_INTERVAL,
+ DEFAULT_FULL_PSS_MIN_INTERVAL);
+ FULL_PSS_LOWERED_INTERVAL = mParser.getLong(KEY_FULL_PSS_LOWERED_INTERVAL,
+ DEFAULT_FULL_PSS_LOWERED_INTERVAL);
+ POWER_CHECK_DELAY = mParser.getLong(KEY_POWER_CHECK_DELAY,
+ DEFAULT_POWER_CHECK_DELAY);
+ WAKE_LOCK_MIN_CHECK_DURATION = mParser.getLong(KEY_WAKE_LOCK_MIN_CHECK_DURATION,
+ DEFAULT_WAKE_LOCK_MIN_CHECK_DURATION);
+ CPU_MIN_CHECK_DURATION = mParser.getLong(KEY_CPU_MIN_CHECK_DURATION,
+ DEFAULT_CPU_MIN_CHECK_DURATION);
+ SERVICE_USAGE_INTERACTION_TIME = mParser.getLong(KEY_SERVICE_USAGE_INTERACTION_TIME,
+ DEFAULT_SERVICE_USAGE_INTERACTION_TIME);
+ USAGE_STATS_INTERACTION_INTERVAL = mParser.getLong(KEY_USAGE_STATS_INTERACTION_INTERVAL,
+ DEFAULT_USAGE_STATS_INTERACTION_INTERVAL);
+ SERVICE_RESTART_DURATION = mParser.getLong(KEY_SERVICE_RESTART_DURATION,
+ DEFAULT_SERVICE_RESTART_DURATION);
+ SERVICE_RESET_RUN_DURATION = mParser.getLong(KEY_SERVICE_RESET_RUN_DURATION,
+ DEFAULT_SERVICE_RESET_RUN_DURATION);
+ SERVICE_RESTART_DURATION_FACTOR = mParser.getInt(KEY_SERVICE_RESTART_DURATION_FACTOR,
+ DEFAULT_SERVICE_RESTART_DURATION_FACTOR);
+ SERVICE_MIN_RESTART_TIME_BETWEEN = mParser.getLong(KEY_SERVICE_MIN_RESTART_TIME_BETWEEN,
+ DEFAULT_SERVICE_MIN_RESTART_TIME_BETWEEN);
+ MAX_SERVICE_INACTIVITY = mParser.getLong(KEY_MAX_SERVICE_INACTIVITY,
+ DEFAULT_MAX_SERVICE_INACTIVITY);
+ BG_START_TIMEOUT = mParser.getLong(KEY_BG_START_TIMEOUT,
+ DEFAULT_BG_START_TIMEOUT);
updateMaxCachedProcesses();
}
}
@@ -134,6 +282,42 @@
pw.print(" "); pw.print(KEY_MAX_CACHED_PROCESSES); pw.print("=");
pw.println(MAX_CACHED_PROCESSES);
+ pw.print(" "); pw.print(KEY_BACKGROUND_SETTLE_TIME); pw.print("=");
+ pw.println(BACKGROUND_SETTLE_TIME);
+ pw.print(" "); pw.print(KEY_FOREGROUND_SERVICE_UI_MIN_TIME); pw.print("=");
+ pw.println(FOREGROUND_SERVICE_UI_MIN_TIME);
+ pw.print(" "); pw.print(KEY_CONTENT_PROVIDER_RETAIN_TIME); pw.print("=");
+ pw.println(CONTENT_PROVIDER_RETAIN_TIME);
+ pw.print(" "); pw.print(KEY_GC_TIMEOUT); pw.print("=");
+ pw.println(GC_TIMEOUT);
+ pw.print(" "); pw.print(KEY_GC_MIN_INTERVAL); pw.print("=");
+ pw.println(GC_MIN_INTERVAL);
+ pw.print(" "); pw.print(KEY_FULL_PSS_MIN_INTERVAL); pw.print("=");
+ pw.println(FULL_PSS_MIN_INTERVAL);
+ pw.print(" "); pw.print(KEY_FULL_PSS_LOWERED_INTERVAL); pw.print("=");
+ pw.println(FULL_PSS_LOWERED_INTERVAL);
+ pw.print(" "); pw.print(KEY_POWER_CHECK_DELAY); pw.print("=");
+ pw.println(POWER_CHECK_DELAY);
+ pw.print(" "); pw.print(KEY_WAKE_LOCK_MIN_CHECK_DURATION); pw.print("=");
+ pw.println(WAKE_LOCK_MIN_CHECK_DURATION);
+ pw.print(" "); pw.print(KEY_CPU_MIN_CHECK_DURATION); pw.print("=");
+ pw.println(CPU_MIN_CHECK_DURATION);
+ pw.print(" "); pw.print(KEY_SERVICE_USAGE_INTERACTION_TIME); pw.print("=");
+ pw.println(SERVICE_USAGE_INTERACTION_TIME);
+ pw.print(" "); pw.print(KEY_USAGE_STATS_INTERACTION_INTERVAL); pw.print("=");
+ pw.println(USAGE_STATS_INTERACTION_INTERVAL);
+ pw.print(" "); pw.print(KEY_SERVICE_RESTART_DURATION); pw.print("=");
+ pw.println(SERVICE_RESTART_DURATION);
+ pw.print(" "); pw.print(KEY_SERVICE_RESET_RUN_DURATION); pw.print("=");
+ pw.println(SERVICE_RESET_RUN_DURATION);
+ pw.print(" "); pw.print(KEY_SERVICE_RESTART_DURATION_FACTOR); pw.print("=");
+ pw.println(SERVICE_RESTART_DURATION_FACTOR);
+ pw.print(" "); pw.print(KEY_SERVICE_MIN_RESTART_TIME_BETWEEN); pw.print("=");
+ pw.println(SERVICE_MIN_RESTART_TIME_BETWEEN);
+ pw.print(" "); pw.print(KEY_MAX_SERVICE_INACTIVITY); pw.print("=");
+ pw.println(MAX_SERVICE_INACTIVITY);
+ pw.print(" "); pw.print(KEY_BG_START_TIMEOUT); pw.print("=");
+ pw.println(BG_START_TIMEOUT);
pw.println();
if (mOverrideMaxCachedProcesses >= 0) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index d99601c..d46a24b 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -229,7 +229,7 @@
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
-import android.app.PictureInPictureArgs;
+import android.app.PictureInPictureParams;
import android.app.ProfilerInfo;
import android.app.RemoteAction;
import android.app.WaitResult;
@@ -411,6 +411,7 @@
import com.android.server.pm.Installer.InstallerException;
import com.android.server.statusbar.StatusBarManagerInternal;
import com.android.server.vr.VrManagerInternal;
+import com.android.server.wm.PinnedStackWindowController;
import com.android.server.wm.WindowManagerService;
import org.xmlpull.v1.XmlPullParser;
@@ -512,41 +513,12 @@
// before we decide it must be hung.
static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT = 10*1000;
- // How long we will retain processes hosting content providers in the "last activity"
- // state before allowing them to drop down to the regular cached LRU list. This is
- // to avoid thrashing of provider processes under low memory situations.
- static final int CONTENT_PROVIDER_RETAIN_TIME = 20*1000;
-
// How long we wait for a launched process to attach to the activity manager
// before we decide it's never going to come up for real, when the process was
// started with a wrapper for instrumentation (such as Valgrind) because it
// could take much longer than usual.
static final int PROC_START_TIMEOUT_WITH_WRAPPER = 1200*1000;
- // How long to wait after going idle before forcing apps to GC.
- static final int GC_TIMEOUT = 5*1000;
-
- // The minimum amount of time between successive GC requests for a process.
- static final int GC_MIN_INTERVAL = 60*1000;
-
- // The minimum amount of time between successive PSS requests for a process.
- static final int FULL_PSS_MIN_INTERVAL = 10*60*1000;
-
- // The minimum amount of time between successive PSS requests for a process
- // when the request is due to the memory state being lowered.
- static final int FULL_PSS_LOWERED_INTERVAL = 2*60*1000;
-
- // The rate at which we check for apps using excessive power -- 15 mins.
- static final int POWER_CHECK_DELAY = (DEBUG_POWER_QUICK ? 2 : 15) * 60*1000;
-
- // The minimum sample duration we will allow before deciding we have
- // enough data on wake locks to start killing things.
- static final int WAKE_LOCK_MIN_CHECK_DURATION = (DEBUG_POWER_QUICK ? 1 : 5) * 60*1000;
-
- // The minimum sample duration we will allow before deciding we have
- // enough data on CPU usage to start killing things.
- static final int CPU_MIN_CHECK_DURATION = (DEBUG_POWER_QUICK ? 1 : 5) * 60*1000;
-
// How long we allow a receiver to run before giving up on it.
static final int BROADCAST_FG_TIMEOUT = 10*1000;
static final int BROADCAST_BG_TIMEOUT = 60*1000;
@@ -557,18 +529,6 @@
// How long we wait until we timeout on key dispatching during instrumentation.
static final int INSTRUMENTATION_KEY_DISPATCHING_TIMEOUT = 60*1000;
- // This is the amount of time an app needs to be running a foreground service before
- // we will consider it to be doing interaction for usage stats.
- static final int SERVICE_USAGE_INTERACTION_TIME = 30*60*1000;
-
- // Maximum amount of time we will allow to elapse before re-reporting usage stats
- // interaction with foreground processes.
- static final long USAGE_STATS_INTERACTION_INTERVAL = 24*60*60*1000L;
-
- // This is the amount of time we allow an app to settle after it goes into the background,
- // before we start restricting what it can do.
- static final int BACKGROUND_SETTLE_TIME = 1*60*1000;
-
// How long to wait in getAssistContextExtras for the activity and foreground services
// to respond with the result.
static final int PENDING_ASSIST_EXTRAS_TIMEOUT = 500;
@@ -2146,7 +2106,7 @@
checkExcessivePowerUsageLocked(true);
removeMessages(CHECK_EXCESSIVE_WAKE_LOCKS_MSG);
Message nmsg = obtainMessage(CHECK_EXCESSIVE_WAKE_LOCKS_MSG);
- sendMessageDelayed(nmsg, POWER_CHECK_DELAY);
+ sendMessageDelayed(nmsg, mConstants.POWER_CHECK_DELAY);
}
} break;
case REPORT_MEM_USAGE_MSG: {
@@ -4258,7 +4218,7 @@
"Unable to set a higher trim level than current level");
}
if (!(level < ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN ||
- app.curProcState >= ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND)) {
+ app.curProcState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND)) {
throw new IllegalArgumentException("Unable to set a background trim level "
+ "on a foreground process");
}
@@ -5344,7 +5304,7 @@
memInfos.add(new ProcessMemInfo(rec.processName, rec.pid, rec.setAdj,
rec.setProcState, rec.adjType, rec.makeAdjReason()));
}
- if ((rec.lastLowMemory+GC_MIN_INTERVAL) <= now) {
+ if ((rec.lastLowMemory+mConstants.GC_MIN_INTERVAL) <= now) {
// The low memory report is overriding any current
// state for a GC request. Make sure to do
// heavy/important/visible/foreground processes first.
@@ -7102,7 +7062,7 @@
if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
// Start looking for apps that are abusing wake locks.
Message nmsg = mHandler.obtainMessage(CHECK_EXCESSIVE_WAKE_LOCKS_MSG);
- mHandler.sendMessageDelayed(nmsg, POWER_CHECK_DELAY);
+ mHandler.sendMessageDelayed(nmsg, mConstants.POWER_CHECK_DELAY);
// Tell anyone interested that we are done booting!
SystemProperties.set("sys.boot_completed", "1");
@@ -7817,24 +7777,38 @@
final long origId = Binder.clearCallingIdentity();
try {
synchronized(this) {
- final ActivityStack stack = ActivityRecord.getStackLocked(token);
- if (stack == null) {
- return false;
- }
- return stack.mStackId == PINNED_STACK_ID;
+ return isInPictureInPictureMode(ActivityRecord.forTokenLocked(token));
}
} finally {
Binder.restoreCallingIdentity(origId);
}
}
+ private boolean isInPictureInPictureMode(ActivityRecord r) {
+ if (r == null || r.getStack() == null || !r.getStack().isPinnedStack() ||
+ r.getStack().isInStackLocked(r) == null) {
+ return false;
+ }
+
+ // If we are animating to fullscreen then we have already dispatched the PIP mode
+ // changed, so we should reflect that check here as well.
+ final PinnedActivityStack stack = r.getStack();
+ final PinnedStackWindowController windowController = stack.getWindowContainerController();
+ return !windowController.isAnimatingBoundsToFullscreen();
+ }
+
@Override
- public boolean enterPictureInPictureMode(IBinder token, final PictureInPictureArgs args) {
+ public boolean enterPictureInPictureMode(IBinder token, final PictureInPictureParams params) {
final long origId = Binder.clearCallingIdentity();
try {
synchronized(this) {
- final ActivityRecord r = ensureValidPictureInPictureActivityArgsLocked(
- "enterPictureInPictureMode", token, args);
+ final ActivityRecord r = ensureValidPictureInPictureActivityParamsLocked(
+ "enterPictureInPictureMode", token, params);
+
+ // If the activity is already in picture in picture mode, then just return early
+ if (isInPictureInPictureMode(r)) {
+ return true;
+ }
// Activity supports picture-in-picture, now check that we can enter PiP at this
// point, if it is
@@ -7845,7 +7819,7 @@
final Runnable enterPipRunnable = () -> {
// Only update the saved args from the args that are set
- r.pictureInPictureArgs.copyOnlySet(args);
+ r.pictureInPictureArgs.copyOnlySet(params);
final float aspectRatio = r.pictureInPictureArgs.getAspectRatio();
final List<RemoteAction> actions = r.pictureInPictureArgs.getActions();
// Adjust the source bounds by the insets for the transition down
@@ -7864,7 +7838,7 @@
MetricsLogger.action(mContext, MetricsEvent.ACTION_PICTURE_IN_PICTURE_ENTERED,
r.supportsPictureInPictureWhilePausing);
- logPictureInPictureArgs(args);
+ logPictureInPictureArgs(params);
};
if (isKeyguardLocked()) {
@@ -7903,15 +7877,15 @@
}
@Override
- public void setPictureInPictureArgs(IBinder token, final PictureInPictureArgs args) {
+ public void setPictureInPictureParams(IBinder token, final PictureInPictureParams params) {
final long origId = Binder.clearCallingIdentity();
try {
synchronized(this) {
- final ActivityRecord r = ensureValidPictureInPictureActivityArgsLocked(
- "setPictureInPictureArgs", token, args);
+ final ActivityRecord r = ensureValidPictureInPictureActivityParamsLocked(
+ "setPictureInPictureParams", token, params);
// Only update the saved args from the args that are set
- r.pictureInPictureArgs.copyOnlySet(args);
+ r.pictureInPictureArgs.copyOnlySet(params);
if (r.getStack().getStackId() == PINNED_STACK_ID) {
// If the activity is already in picture-in-picture, update the pinned stack now
// if it is not already expanding to fullscreen. Otherwise, the arguments will
@@ -7923,21 +7897,28 @@
stack.setPictureInPictureActions(r.pictureInPictureArgs.getActions());
}
}
- logPictureInPictureArgs(args);
+ logPictureInPictureArgs(params);
}
} finally {
Binder.restoreCallingIdentity(origId);
}
}
- private void logPictureInPictureArgs(PictureInPictureArgs args) {
- if (args.hasSetActions()) {
+ @Override
+ public int getMaxNumPictureInPictureActions(IBinder token) {
+ // Currently, this is a static constant, but later, we may change this to be dependent on
+ // the context of the activity
+ return 3;
+ }
+
+ private void logPictureInPictureArgs(PictureInPictureParams params) {
+ if (params.hasSetActions()) {
MetricsLogger.histogram(mContext, "tron_varz_picture_in_picture_actions_count",
- args.getActions().size());
+ params.getActions().size());
}
- if (args.hasSetAspectRatio()) {
+ if (params.hasSetAspectRatio()) {
LogMaker lm = new LogMaker(MetricsEvent.ACTION_PICTURE_IN_PICTURE_ASPECT_RATIO_CHANGED);
- lm.addTaggedData(MetricsEvent.PICTURE_IN_PICTURE_ASPECT_RATIO, args.getAspectRatio());
+ lm.addTaggedData(MetricsEvent.PICTURE_IN_PICTURE_ASPECT_RATIO, params.getAspectRatio());
MetricsLogger.action(lm);
}
}
@@ -7948,8 +7929,8 @@
*
* @return the activity record for the given {@param token} if all the checks pass.
*/
- private ActivityRecord ensureValidPictureInPictureActivityArgsLocked(String caller,
- IBinder token, PictureInPictureArgs args) {
+ private ActivityRecord ensureValidPictureInPictureActivityParamsLocked(String caller,
+ IBinder token, PictureInPictureParams params) {
if (!mSupportsPictureInPicture) {
throw new IllegalStateException(caller
+ ": Device doesn't support picture-in-picture mode.");
@@ -7971,9 +7952,9 @@
+ ": Activities on the home, assistant, or recents stack not supported");
}
- if (args.hasSetAspectRatio()
+ if (params.hasSetAspectRatio()
&& !mWindowManager.isValidPictureInPictureAspectRatio(r.getStack().mDisplayId,
- args.getAspectRatio())) {
+ params.getAspectRatio())) {
final float minAspectRatio = mContext.getResources().getFloat(
com.android.internal.R.dimen.config_pictureInPictureMinAspectRatio);
final float maxAspectRatio = mContext.getResources().getFloat(
@@ -7983,12 +7964,8 @@
minAspectRatio, maxAspectRatio));
}
- if (args.hasSetActions()
- && args.getActions().size() > ActivityManager.getMaxNumPictureInPictureActions()) {
- throw new IllegalArgumentException(String.format(caller + ": Invalid number of"
- + "picture-in-picture actions. Only a maximum of %d actions allowed",
- ActivityManager.getMaxNumPictureInPictureActions()));
- }
+ // Truncate the number of actions if necessary
+ params.truncateActions(getMaxNumPictureInPictureActions(token));
return r;
}
@@ -11255,9 +11232,13 @@
holder.provider = null;
return holder;
}
- // Don't expose instant app providers
- if (cpr.appInfo.isInstantApp()) {
- return null;
+ // Don't expose providers between normal apps and instant apps
+ try {
+ if (AppGlobals.getPackageManager()
+ .resolveContentProvider(name, 0 /*flags*/, userId) == null) {
+ return null;
+ }
+ } catch (RemoteException e) {
}
final long origId = Binder.clearCallingIdentity();
@@ -12255,14 +12236,15 @@
}
void updateSleepIfNeededLocked() {
- if (mSleeping && !shouldSleepLocked()) {
+ final boolean shouldSleep = shouldSleepLocked();
+ if (mSleeping && !shouldSleep) {
mSleeping = false;
startTimeTrackingFocusedActivityLocked();
mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
mStackSupervisor.comeOutOfSleepIfNeededLocked();
sendNotifyVrManagerOfSleepState(false);
updateOomAdjLocked();
- } else if (!mSleeping && shouldSleepLocked()) {
+ } else if (!mSleeping && shouldSleep) {
mSleeping = true;
if (mCurAppTimeTracker != null) {
mCurAppTimeTracker.stop();
@@ -12276,7 +12258,20 @@
checkExcessivePowerUsageLocked(false);
mHandler.removeMessages(CHECK_EXCESSIVE_WAKE_LOCKS_MSG);
Message nmsg = mHandler.obtainMessage(CHECK_EXCESSIVE_WAKE_LOCKS_MSG);
- mHandler.sendMessageDelayed(nmsg, POWER_CHECK_DELAY);
+ mHandler.sendMessageDelayed(nmsg, mConstants.POWER_CHECK_DELAY);
+ }
+
+ // Also update state in a special way for running foreground services UI.
+ switch (mWakefulness) {
+ case PowerManagerInternal.WAKEFULNESS_ASLEEP:
+ case PowerManagerInternal.WAKEFULNESS_DREAMING:
+ case PowerManagerInternal.WAKEFULNESS_DOZING:
+ mServices.updateScreenStateLocked(false);
+ break;
+ case PowerManagerInternal.WAKEFULNESS_AWAKE:
+ default:
+ mServices.updateScreenStateLocked(true);
+ break;
}
}
@@ -12814,7 +12809,7 @@
public Bundle getAssistContextExtras(int requestType) {
PendingAssistExtras pae = enqueueAssistContext(requestType, null, null, null,
null, null, true /* focused */, true /* newSessionId */,
- UserHandle.getCallingUserId(), null, PENDING_ASSIST_EXTRAS_TIMEOUT);
+ UserHandle.getCallingUserId(), null, PENDING_ASSIST_EXTRAS_TIMEOUT, 0);
if (pae == null) {
return null;
}
@@ -12884,25 +12879,21 @@
Bundle receiverExtras, IBinder activityToken, boolean focused, boolean newSessionId) {
return enqueueAssistContext(requestType, null, null, receiver, receiverExtras,
activityToken, focused, newSessionId, UserHandle.getCallingUserId(), null,
- PENDING_ASSIST_EXTRAS_LONG_TIMEOUT) != null;
+ PENDING_ASSIST_EXTRAS_LONG_TIMEOUT, 0) != null;
}
@Override
public boolean requestAutofillData(IResultReceiver receiver, Bundle receiverExtras,
- IBinder activityToken) {
- // NOTE: we could always use ActivityManager.ASSIST_CONTEXT_FULL and let ActivityThread
- // rely on the flags to decide whether the handleRequestAssistContextExtras() is for
- // autofill, but it's safer to explicitly use new AutoFill types, in case the Assist
- // requests use flags in the future as well (since their flags value might collide with the
- // autofill flag values).
+ IBinder activityToken, int flags) {
return enqueueAssistContext(ActivityManager.ASSIST_CONTEXT_AUTOFILL, null, null,
receiver, receiverExtras, activityToken, true, true, UserHandle.getCallingUserId(),
- null, PENDING_AUTOFILL_ASSIST_STRUCTURE_TIMEOUT) != null;
+ null, PENDING_AUTOFILL_ASSIST_STRUCTURE_TIMEOUT, flags) != null;
}
private PendingAssistExtras enqueueAssistContext(int requestType, Intent intent, String hint,
IResultReceiver receiver, Bundle receiverExtras, IBinder activityToken,
- boolean focused, boolean newSessionId, int userHandle, Bundle args, long timeout) {
+ boolean focused, boolean newSessionId, int userHandle, Bundle args, long timeout,
+ int flags) {
enforceCallingPermission(android.Manifest.permission.GET_TOP_ACTIVITY_INFO,
"enqueueAssistContext()");
@@ -12952,7 +12943,7 @@
}
try {
activity.app.thread.requestAssistContextExtras(activity.appToken, pae, requestType,
- mViSessionId);
+ mViSessionId, flags);
mPendingAssistExtras.add(pae);
mUiHandler.postDelayed(pae, timeout);
} catch (RemoteException e) {
@@ -13064,7 +13055,7 @@
Bundle args) {
return enqueueAssistContext(requestType, intent, hint, null, null, null,
true /* focused */, true /* newSessionId */, userHandle, args,
- PENDING_ASSIST_EXTRAS_TIMEOUT) != null;
+ PENDING_ASSIST_EXTRAS_TIMEOUT, 0) != null;
}
public void registerProcessObserver(IProcessObserver observer) {
@@ -14622,8 +14613,10 @@
}
static int procStateToImportance(int procState, int memAdj,
- ActivityManager.RunningAppProcessInfo currApp) {
- int imp = ActivityManager.RunningAppProcessInfo.procStateToImportance(procState);
+ ActivityManager.RunningAppProcessInfo currApp,
+ int clientTargetSdk) {
+ int imp = ActivityManager.RunningAppProcessInfo.procStateToImportanceForTargetSdk(
+ procState, clientTargetSdk);
if (imp == ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
currApp.lru = memAdj;
} else {
@@ -14633,7 +14626,8 @@
}
private void fillInProcMemInfo(ProcessRecord app,
- ActivityManager.RunningAppProcessInfo outInfo) {
+ ActivityManager.RunningAppProcessInfo outInfo,
+ int clientTargetSdk) {
outInfo.pid = app.pid;
outInfo.uid = app.info.uid;
if (mHeavyWeightProcess == app) {
@@ -14648,7 +14642,7 @@
outInfo.lastTrimLevel = app.trimMemoryLevel;
int adj = app.curAdj;
int procState = app.curProcState;
- outInfo.importance = procStateToImportance(procState, adj, outInfo);
+ outInfo.importance = procStateToImportance(procState, adj, outInfo, clientTargetSdk);
outInfo.importanceReasonCode = app.adjTypeCode;
outInfo.processState = app.curProcState;
}
@@ -14658,6 +14652,7 @@
enforceNotIsolatedCaller("getRunningAppProcesses");
final int callingUid = Binder.getCallingUid();
+ final int clientTargetSdk = mPackageManagerInt.getUidTargetSdkVersion(callingUid);
// Lazy instantiation of list
List<ActivityManager.RunningAppProcessInfo> runList = null;
@@ -14680,7 +14675,7 @@
ActivityManager.RunningAppProcessInfo currApp =
new ActivityManager.RunningAppProcessInfo(app.processName,
app.pid, app.getPackageList());
- fillInProcMemInfo(app, currApp);
+ fillInProcMemInfo(app, currApp, clientTargetSdk);
if (app.adjSource instanceof ProcessRecord) {
currApp.importanceReasonPid = ((ProcessRecord)app.adjSource).pid;
currApp.importanceReasonImportance =
@@ -14736,12 +14731,16 @@
@Override
public void getMyMemoryState(ActivityManager.RunningAppProcessInfo outInfo) {
enforceNotIsolatedCaller("getMyMemoryState");
+
+ final int callingUid = Binder.getCallingUid();
+ final int clientTargetSdk = mPackageManagerInt.getUidTargetSdkVersion(callingUid);
+
synchronized (this) {
ProcessRecord proc;
synchronized (mPidsSelfLocked) {
proc = mPidsSelfLocked.get(Binder.getCallingPid());
}
- fillInProcMemInfo(proc, outInfo);
+ fillInProcMemInfo(proc, outInfo, clientTargetSdk);
}
}
@@ -19008,6 +19007,8 @@
removeTasksByPackageNameLocked(ssp, userId);
+ mServices.removeUninstalledPackageLocked(ssp, userId);
+
// Hide the "unsupported display" dialog if necessary.
if (mUnsupportedDisplaySizeDialog != null && ssp.equals(
mUnsupportedDisplaySizeDialog.getPackageName())) {
@@ -19146,6 +19147,12 @@
case android.security.KeyChain.ACTION_TRUST_STORE_CHANGED:
mHandler.sendEmptyMessage(HANDLE_TRUST_STORAGE_UPDATE_MSG);
break;
+ case "com.android.launcher.action.INSTALL_SHORTCUT":
+ // As of O, we no longer support this broadcasts, even for pre-O apps.
+ // Apps should now be using ShortcutManager.pinRequestShortcut().
+ Log.w(TAG, "Broadcast " + action
+ + " no longer supported. It will not be delivered.");
+ return ActivityManager.BROADCAST_SUCCESS;
}
if (Intent.ACTION_PACKAGE_ADDED.equals(action) ||
@@ -19687,12 +19694,12 @@
ActiveInstrumentation activeInstr = new ActiveInstrumentation(this);
activeInstr.mClass = className;
String defProcess = ai.processName;;
- if (ii.targetProcess == null) {
+ if (ii.targetProcesses == null) {
activeInstr.mTargetProcesses = new String[]{ai.processName};
- } else if (ii.targetProcess.equals("*")) {
+ } else if (ii.targetProcesses.equals("*")) {
activeInstr.mTargetProcesses = new String[0];
} else {
- activeInstr.mTargetProcesses = ii.targetProcess.split(",");
+ activeInstr.mTargetProcesses = ii.targetProcesses.split(",");
defProcess = activeInstr.mTargetProcesses[0];
}
activeInstr.mTargetInfo = ai;
@@ -20791,8 +20798,8 @@
if (adj > ProcessList.BACKUP_APP_ADJ) {
if (DEBUG_BACKUP) Slog.v(TAG_BACKUP, "oom BACKUP_APP_ADJ for " + app);
adj = ProcessList.BACKUP_APP_ADJ;
- if (procState > ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND) {
- procState = ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND;
+ if (procState > ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND) {
+ procState = ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND;
}
app.adjType = "backup";
app.cached = false;
@@ -20824,7 +20831,7 @@
app.adjType = "cch-started-ui-services";
}
} else {
- if (now < (s.lastActivity + ActiveServices.MAX_SERVICE_INACTIVITY)) {
+ if (now < (s.lastActivity + mConstants.MAX_SERVICE_INACTIVITY)) {
// This service has seen some activity within
// recent memory, so we will keep its process ahead
// of the background processes.
@@ -20889,8 +20896,7 @@
clientAdj = adj;
clientProcState = procState;
} else {
- if (now >= (s.lastActivity
- + ActiveServices.MAX_SERVICE_INACTIVITY)) {
+ if (now >= (s.lastActivity + mConstants.MAX_SERVICE_INACTIVITY)) {
// This service has not seen activity within
// recent memory, so allow it to drop to the
// LRU list if there is no other reason to keep
@@ -20936,7 +20942,8 @@
adjType = "service";
}
}
- if ((cr.flags&Context.BIND_NOT_FOREGROUND) == 0) {
+ if ((cr.flags & (Context.BIND_NOT_FOREGROUND
+ | Context.BIND_IMPORTANT_BACKGROUND)) == 0) {
// This will treat important bound services identically to
// the top app, which may behave differently than generic
// foreground work.
@@ -20980,6 +20987,12 @@
}
}
}
+ } else if ((cr.flags & Context.BIND_IMPORTANT_BACKGROUND) == 0) {
+ if (clientProcState <
+ ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND) {
+ clientProcState =
+ ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND;
+ }
} else {
if (clientProcState <
ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND) {
@@ -21118,7 +21131,8 @@
}
}
- if (app.lastProviderTime > 0 && (app.lastProviderTime+CONTENT_PROVIDER_RETAIN_TIME) > now) {
+ if (app.lastProviderTime > 0 &&
+ (app.lastProviderTime+mConstants.CONTENT_PROVIDER_RETAIN_TIME) > now) {
if (adj > ProcessList.PREVIOUS_APP_ADJ) {
adj = ProcessList.PREVIOUS_APP_ADJ;
schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
@@ -21140,6 +21154,7 @@
switch (procState) {
case ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND:
case ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND:
+ case ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND:
case ActivityManager.PROCESS_STATE_SERVICE:
// These all are longer-term states, so pull them up to the top
// of the background states, but not all the way to the top state.
@@ -21335,7 +21350,8 @@
void requestPssAllProcsLocked(long now, boolean always, boolean memLowered) {
if (!always) {
if (now < (mLastFullPssTime +
- (memLowered ? FULL_PSS_LOWERED_INTERVAL : FULL_PSS_MIN_INTERVAL))) {
+ (memLowered ? mConstants.FULL_PSS_LOWERED_INTERVAL
+ : mConstants.FULL_PSS_MIN_INTERVAL))) {
return;
}
}
@@ -21417,7 +21433,7 @@
while (mProcessesToGc.size() > 0) {
ProcessRecord proc = mProcessesToGc.remove(0);
if (proc.curRawAdj > ProcessList.PERCEPTIBLE_APP_ADJ || proc.reportLowMemory) {
- if ((proc.lastRequestedGc+GC_MIN_INTERVAL)
+ if ((proc.lastRequestedGc+mConstants.GC_MIN_INTERVAL)
<= SystemClock.uptimeMillis()) {
// To avoid spamming the system, we will GC processes one
// at a time, waiting a few seconds between each.
@@ -21460,10 +21476,10 @@
ProcessRecord proc = mProcessesToGc.get(0);
Message msg = mHandler.obtainMessage(GC_BACKGROUND_PROCESSES_MSG);
- long when = proc.lastRequestedGc + GC_MIN_INTERVAL;
+ long when = proc.lastRequestedGc + mConstants.GC_MIN_INTERVAL;
long now = SystemClock.uptimeMillis();
- if (when < (now+GC_TIMEOUT)) {
- when = now + GC_TIMEOUT;
+ if (when < (now+mConstants.GC_TIMEOUT)) {
+ when = now + mConstants.GC_TIMEOUT;
}
mHandler.sendMessageAtTime(msg, when);
}
@@ -21496,7 +21512,7 @@
*/
final void scheduleAppGcLocked(ProcessRecord app) {
long now = SystemClock.uptimeMillis();
- if ((app.lastRequestedGc+GC_MIN_INTERVAL) > now) {
+ if ((app.lastRequestedGc+mConstants.GC_MIN_INTERVAL) > now) {
return;
}
if (!mProcessesToGc.contains(app)) {
@@ -21526,10 +21542,10 @@
final long uptimeSince = curUptime - mLastPowerCheckUptime;
mLastPowerCheckRealtime = curRealtime;
mLastPowerCheckUptime = curUptime;
- if (realtimeSince < WAKE_LOCK_MIN_CHECK_DURATION) {
+ if (realtimeSince < mConstants.WAKE_LOCK_MIN_CHECK_DURATION) {
doWakeKills = false;
}
- if (uptimeSince < CPU_MIN_CHECK_DURATION) {
+ if (uptimeSince < mConstants.CPU_MIN_CHECK_DURATION) {
doCpuKills = false;
}
int i = mLruProcesses.size();
@@ -21694,9 +21710,11 @@
}
}
} catch (Exception e) {
- Slog.w(TAG, "Failed setting process group of " + app.pid
- + " to " + app.curSchedGroup);
- e.printStackTrace();
+ if (false) {
+ Slog.w(TAG, "Failed setting process group of " + app.pid
+ + " to " + app.curSchedGroup);
+ Slog.w(TAG, "at location", e);
+ }
} finally {
Binder.restoreCallingIdentity(oldId);
}
@@ -21785,7 +21803,7 @@
app.procStateChanged = true;
}
} else if (app.reportedInteraction && (nowElapsed-app.interactionEventTime)
- > USAGE_STATS_INTERACTION_INTERVAL) {
+ > mConstants.USAGE_STATS_INTERACTION_INTERVAL) {
// For apps that sit around for a long time in the interactive state, we need
// to report this at least once a day so they don't go idle.
maybeUpdateUsageStatsLocked(app, nowElapsed);
@@ -21958,7 +21976,8 @@
app.fgInteractionTime = nowElapsed;
isInteraction = false;
} else {
- isInteraction = nowElapsed > app.fgInteractionTime + SERVICE_USAGE_INTERACTION_TIME;
+ isInteraction = nowElapsed > app.fgInteractionTime
+ + mConstants.SERVICE_USAGE_INTERACTION_TIME;
}
} else {
// If the app was being forced to the foreground, by say a Toast, then
@@ -21967,8 +21986,8 @@
&& app.curProcState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
app.fgInteractionTime = 0;
}
- if (isInteraction && (!app.reportedInteraction
- || (nowElapsed-app.interactionEventTime) > USAGE_STATS_INTERACTION_INTERVAL)) {
+ if (isInteraction && (!app.reportedInteraction || (nowElapsed-app.interactionEventTime)
+ > mConstants.USAGE_STATS_INTERACTION_INTERVAL)) {
app.interactionEventTime = nowElapsed;
String[] packages = app.getPackageList();
if (packages != null) {
@@ -22484,7 +22503,8 @@
// the handler time base is uptime. All this means is that we may
// stop background uids later than we had intended, but that only
// happens because the device was sleeping so we are okay anyway.
- mHandler.sendEmptyMessageDelayed(IDLE_UIDS_MSG, BACKGROUND_SETTLE_TIME);
+ mHandler.sendEmptyMessageDelayed(IDLE_UIDS_MSG,
+ mConstants.BACKGROUND_SETTLE_TIME);
}
}
} else {
@@ -22589,7 +22609,7 @@
return;
}
final long nowElapsed = SystemClock.elapsedRealtime();
- final long maxBgTime = nowElapsed - BACKGROUND_SETTLE_TIME;
+ final long maxBgTime = nowElapsed - mConstants.BACKGROUND_SETTLE_TIME;
long nextTime = 0;
if (mLocalPowerManager != null) {
mLocalPowerManager.startUidChanges();
@@ -22614,7 +22634,7 @@
if (nextTime > 0) {
mHandler.removeMessages(IDLE_UIDS_MSG);
mHandler.sendEmptyMessageDelayed(IDLE_UIDS_MSG,
- nextTime + BACKGROUND_SETTLE_TIME - nowElapsed);
+ nextTime + mConstants.BACKGROUND_SETTLE_TIME - nowElapsed);
}
}
}
diff --git a/services/core/java/com/android/server/am/ActivityMetricsLogger.java b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
index 08ff7de..2dd3b74 100644
--- a/services/core/java/com/android/server/am/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
@@ -133,7 +133,7 @@
*/
void notifyActivityLaunching() {
if (!isAnyTransitionActive()) {
- mCurrentTransitionStartTime = System.currentTimeMillis();
+ mCurrentTransitionStartTime = SystemClock.uptimeMillis();
}
}
@@ -299,7 +299,7 @@
private int calculateCurrentDelay() {
// Shouldn't take more than 25 days to launch an app, so int is fine here.
- return (int) (System.currentTimeMillis() - mCurrentTransitionStartTime);
+ return (int) (SystemClock.uptimeMillis() - mCurrentTransitionStartTime);
}
private void logAppTransitionMultiEvents() {
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 6e84ed6..158175f 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -62,6 +62,8 @@
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION;
import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
import static android.content.res.Configuration.EMPTY;
+import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
+import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.content.res.Configuration.UI_MODE_TYPE_MASK;
import static android.content.res.Configuration.UI_MODE_TYPE_VR_HEADSET;
import static android.os.Build.VERSION_CODES.HONEYCOMB;
@@ -115,7 +117,7 @@
import android.app.ActivityManager.TaskDescription;
import android.app.ActivityOptions;
import android.app.PendingIntent;
-import android.app.PictureInPictureArgs;
+import android.app.PictureInPictureParams;
import android.app.ResultInfo;
import android.content.ComponentName;
import android.content.Intent;
@@ -139,6 +141,7 @@
import android.service.voice.IVoiceInteractionSession;
import android.util.EventLog;
import android.util.Log;
+import android.util.MergedConfiguration;
import android.util.Slog;
import android.util.TimeUtils;
import android.view.AppTransitionAnimationSpec;
@@ -240,13 +243,8 @@
long cpuTimeAtResume; // the cpu time of host process at the time of resuming activity
long pauseTime; // last time we started pausing the activity
long launchTickTime; // base time for launch tick messages
- // TODO: Refactor mLastReportedConfiguration and mLastReportedOverrideConfiguration to use a
- // MergedConfiguration object for clarity.
- private Configuration mLastReportedConfiguration; // configuration activity was last running in
- // Overridden configuration by the activity task
- // WARNING: Reference points to {@link TaskRecord#getMergedOverrideConfig}, so its internal
- // state should never be altered directly.
- private Configuration mLastReportedOverrideConfiguration;
+ // Last configuration reported to the activity in the client process.
+ private MergedConfiguration mLastReportedConfiguration;
private int mLastReportedDisplayId;
CompatibilityInfo compat;// last used compatibility mode
ActivityRecord resultTo; // who started this entry, so will get our reply
@@ -274,11 +272,13 @@
// completed
boolean preserveWindowOnDeferredRelaunch; // activity windows are preserved on deferred relaunch
int configChangeFlags; // which config values have changed
- boolean keysPaused; // has key dispatching been paused for it?
+ private boolean keysPaused; // has key dispatching been paused for it?
int launchMode; // the launch mode activity attribute.
boolean visible; // does this activity's window need to be shown?
boolean visibleIgnoringKeyguard; // is this activity visible, ignoring the fact that Keyguard
// might hide this activity?
+ private boolean mDeferHidingClient; // If true we told WM to defer reporting to the client
+ // process that it is hidden.
boolean sleeping; // have we told the activity to sleep?
boolean nowVisible; // is this activity's window visible?
boolean idle; // has the activity gone idle?
@@ -293,8 +293,8 @@
boolean supportsPictureInPictureWhilePausing; // This flag is set by the system to indicate
// that the activity can enter picture in picture while pausing (ie. only when another
// task is brought to front or started)
- PictureInPictureArgs pictureInPictureArgs = new PictureInPictureArgs(); // The PiP
- // arguments used when deferring the entering of picture-in-picture.
+ PictureInPictureParams pictureInPictureArgs = new PictureInPictureParams.Builder().build();
+ // The PiP params used when deferring the entering of picture-in-picture.
int launchCount; // count of launches since last state
long lastLaunchTime; // time of last launch of this activity
ComponentName requestedVrComponent; // the requested component for handling VR mode.
@@ -344,10 +344,7 @@
/**
* Temp configs used in {@link #ensureActivityConfigurationLocked(int, boolean)}
*/
- private final Configuration mTmpConfig1 = new Configuration();
- private final Configuration mTmpConfig2 = new Configuration();
- private final Configuration mTmpConfig3 = new Configuration();
- private final Point mTmpPoint = new Point();
+ private final Configuration mTmpConfig = new Configuration();
private final Rect mTmpBounds = new Rect();
private static String startingWindowStateToString(int state) {
@@ -398,10 +395,9 @@
pw.print(" labelRes=0x"); pw.print(Integer.toHexString(labelRes));
pw.print(" icon=0x"); pw.print(Integer.toHexString(icon));
pw.print(" theme=0x"); pw.println(Integer.toHexString(theme));
- pw.print(prefix); pw.print("mLastReportedConfiguration=");
- pw.println(mLastReportedConfiguration);
- pw.print(prefix); pw.print("mLastReportedOverrideConfiguration=");
- pw.println(mLastReportedOverrideConfiguration);
+ pw.println(prefix + "mLastReportedConfigurations:");
+ mLastReportedConfiguration.dump(pw, prefix + " ");
+
pw.print(prefix); pw.print("CurrentConfiguration="); pw.println(getConfiguration());
if (!getOverrideConfiguration().equals(EMPTY)) {
pw.println(prefix + "OverrideConfiguration=" + getOverrideConfiguration());
@@ -523,6 +519,9 @@
else TimeUtils.formatDuration(lastVisibleTime, now, pw);
pw.println();
}
+ if (mDeferHidingClient) {
+ pw.println(prefix + "mDeferHidingClient=" + mDeferHidingClient);
+ }
if (deferRelaunchUntilPaused || configChangeFlags != 0) {
pw.print(prefix); pw.print("deferRelaunchUntilPaused="); pw.print(deferRelaunchUntilPaused);
pw.print(" configChangeFlags=");
@@ -799,8 +798,7 @@
resolvedType = _resolvedType;
componentSpecified = _componentSpecified;
rootVoiceInteraction = _rootVoiceInteraction;
- mLastReportedConfiguration = new Configuration(_configuration);
- mLastReportedOverrideConfiguration = new Configuration();
+ mLastReportedConfiguration = new MergedConfiguration(_configuration);
resultTo = _resultTo;
resultWho = _resultWho;
requestCode = _reqCode;
@@ -1567,18 +1565,31 @@
return mWindowContainerController.screenshotApplications(getDisplayId(), w, h, scale);
}
+ void setDeferHidingClient(boolean deferHidingClient) {
+ if (mDeferHidingClient == deferHidingClient) {
+ return;
+ }
+ mDeferHidingClient = deferHidingClient;
+ if (!mDeferHidingClient && !visible) {
+ // Hiding the client is no longer deferred and the app isn't visible still, go ahead and
+ // update the visibility.
+ setVisibility(false);
+ }
+ }
+
void setVisibility(boolean visible) {
- mWindowContainerController.setVisibility(visible);
+ mWindowContainerController.setVisibility(visible, mDeferHidingClient);
}
// TODO: Look into merging with #setVisibility()
void setVisible(boolean newVisible) {
visible = newVisible;
+ mDeferHidingClient = !visible && mDeferHidingClient;
if (!visible && mUpdateTaskThumbnailWhenHidden) {
updateThumbnailLocked(screenshotActivityLocked(), null /* description */);
mUpdateTaskThumbnailWhenHidden = false;
}
- mWindowContainerController.setVisibility(visible);
+ setVisibility(visible);
final ArrayList<ActivityContainer> containers = mChildContainers;
for (int containerNdx = containers.size() - 1; containerNdx >= 0; --containerNdx) {
final ActivityContainer container = containers.get(containerNdx);
@@ -2191,15 +2202,15 @@
* global configuration is sent to the client for this activity.
*/
void setLastReportedGlobalConfiguration(@NonNull Configuration config) {
- mLastReportedConfiguration.setTo(config);
+ mLastReportedConfiguration.setGlobalConfiguration(config);
}
/**
- * Set the last reported merged override configuration to the client. Should be called whenever
+ * Set the last reported configuration to the client. Should be called whenever
* a new merged configuration is sent to the client for this activity.
*/
- void setLastReportedMergedOverrideConfiguration(@NonNull Configuration config) {
- mLastReportedOverrideConfiguration.setTo(config);
+ void setLastReportedConfiguration(@NonNull MergedConfiguration config) {
+ mLastReportedConfiguration.setTo(config);
}
/** Call when override config was sent to the Window Manager to update internal records. */
@@ -2207,7 +2218,7 @@
// we should only set this when we actually report to the activity which is what the method
// setLastReportedMergedOverrideConfiguration() does. Investigate if this is really needed.
void onOverrideConfigurationSent() {
- mLastReportedOverrideConfiguration.setTo(getMergedOverrideConfiguration());
+ mLastReportedConfiguration.setOverrideConfiguration(getMergedOverrideConfiguration());
}
@Override
@@ -2223,18 +2234,20 @@
}
// TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer.
- private boolean updateOverrideConfiguration() {
+ private void updateOverrideConfiguration() {
+ mTmpConfig.unset();
computeBounds(mTmpBounds);
if (mTmpBounds.equals(mBounds)) {
- return false;
+ return;
}
+
mBounds.set(mTmpBounds);
// Bounds changed...update configuration to match.
- mTmpConfig1.unset();
- task.computeOverrideConfiguration(mTmpConfig1, mBounds, null /* insetBounds */,
- false /* overrideWidth */, false /* overrideHeight */);
- onOverrideConfigurationChanged(mTmpConfig1);
- return true;
+ if (!mBounds.isEmpty()) {
+ task.computeOverrideConfiguration(mTmpConfig, mBounds, null /* insetBounds */,
+ false /* overrideWidth */, false /* overrideHeight */);
+ }
+ onOverrideConfigurationChanged(mTmpConfig);
}
/**
@@ -2262,12 +2275,12 @@
int maxActivityHeight = containingAppHeight;
if (containingAppWidth < containingAppHeight) {
- // Width is the shorter side, so we use that to figure-out what the max. height should
- // be given the aspect ratio.
+ // Width is the shorter side, so we use that to figure-out what the max. height
+ // should be given the aspect ratio.
maxActivityHeight = (int) ((maxActivityWidth * maxAspectRatio) + 0.5f);
} else {
- // Height is the shorter side, so we use that to figure-out what the max. width should
- // be given the aspect ratio.
+ // Height is the shorter side, so we use that to figure-out what the max. width
+ // should be given the aspect ratio.
maxActivityWidth = (int) ((maxActivityHeight * maxAspectRatio) + 0.5f);
}
@@ -2337,9 +2350,8 @@
// nothing to do. We test the full configuration instead of the global and merged override
// configurations because there are cases (like moving a task to the pinned stack) where
// the combine configurations are equal, but would otherwise differ in the override config
- mTmpConfig1.setTo(mLastReportedConfiguration);
- mTmpConfig1.updateFrom(mLastReportedOverrideConfiguration);
- if (getConfiguration().equals(mTmpConfig1) && !forceNewConfig && !displayChanged) {
+ mTmpConfig.setTo(mLastReportedConfiguration.getMergedConfiguration());
+ if (getConfiguration().equals(mTmpConfig) && !forceNewConfig && !displayChanged) {
if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
"Configuration & display unchanged in " + this);
return true;
@@ -2350,18 +2362,12 @@
// Find changes between last reported merged configuration and the current one. This is used
// to decide whether to relaunch an activity or just report a configuration change.
- final int changes = getConfigurationChanges(mTmpConfig1);
-
- // Preserve configuration used to generate this set of configuration changes.
- mTmpConfig3.setTo(mTmpConfig1);
+ final int changes = getConfigurationChanges(mTmpConfig);
// Update last reported values.
- final Configuration newGlobalConfig = service.getGlobalConfiguration();
final Configuration newMergedOverrideConfig = getMergedOverrideConfiguration();
- mTmpConfig1.setTo(mLastReportedConfiguration);
- mTmpConfig2.setTo(mLastReportedOverrideConfiguration);
- mLastReportedConfiguration.setTo(newGlobalConfig);
- mLastReportedOverrideConfiguration.setTo(newMergedOverrideConfig);
+ mLastReportedConfiguration.setConfiguration(service.getGlobalConfiguration(),
+ newMergedOverrideConfig);
if (changes == 0 && !forceNewConfig) {
if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
@@ -2395,10 +2401,9 @@
"Checking to restart " + info.name + ": changed=0x"
+ Integer.toHexString(changes) + ", handles=0x"
+ Integer.toHexString(info.getRealConfigChanged())
- + ", newGlobalConfig=" + newGlobalConfig
- + ", newMergedOverrideConfig=" + newMergedOverrideConfig);
+ + ", mLastReportedConfiguration=" + mLastReportedConfiguration);
- if (shouldRelaunchLocked(changes, mTmpConfig3) || forceNewConfig) {
+ if (shouldRelaunchLocked(changes, mTmpConfig) || forceNewConfig) {
// Aha, the activity isn't handling the change, so DIE DIE DIE.
configChangeFlags |= changes;
startFreezingScreenLocked(app, globalChanges);
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index c3f346b..82e2a3d 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -1406,6 +1406,8 @@
prev.state = STOPPING;
} else if ((!prev.visible && !hasVisibleBehindActivity())
|| mService.isSleepingOrShuttingDownLocked()) {
+ // Clear out any deferred client hide we might currently have.
+ prev.setDeferHidingClient(false);
// If we were visible then resumeTopActivities will release resources before
// stopping.
addToStopping(prev, true /* scheduleIdle */, false /* idleDelayed */);
@@ -2024,11 +2026,12 @@
try {
final boolean canEnterPictureInPicture = r.checkEnterPictureInPictureState(
"makeInvisible", true /* noThrow */, true /* beforeStopping */);
- // We don't want to call setVisible(false) to avoid notifying the client of this
- // intermittent invisible state if it can enter Pip and isn't stopped or stopping.
- if (!canEnterPictureInPicture || r.state == STOPPING || r.state == STOPPED) {
- r.setVisible(false);
- }
+ // Defer telling the client it is hidden if it can enter Pip and isn't current stopped
+ // or stopping. This gives it a chance to enter Pip in onPause().
+ final boolean deferHidingClient = canEnterPictureInPicture
+ && r.state != STOPPING && r.state != STOPPED;
+ r.setDeferHidingClient(deferHidingClient);
+ r.setVisible(false);
switch (r.state) {
case STOPPING:
@@ -2053,15 +2056,6 @@
if (visibleBehind == r) {
releaseBackgroundResources(r);
} else {
- // If this activity is in a state where it can currently enter
- // picture-in-picture, then don't immediately schedule the idle now in case
- // the activity tries to enterPictureInPictureMode() later. Otherwise,
- // we will try and stop the activity next time idle is processed.
-
- if (canEnterPictureInPicture) {
- // We set r.visible=false so that Stop will later call setVisible for us
- r.visible = false;
- }
addToStopping(r, true /* scheduleIdle */,
canEnterPictureInPicture /* idleDelayed */);
}
@@ -2343,20 +2337,22 @@
mStackSupervisor.setLaunchSource(next.info.applicationInfo.uid);
- final boolean prevCanPip = prev != null && prev.checkEnterPictureInPictureState(
- "resumeTopActivity", true /* noThrow */, userLeaving /* beforeStopping */);
+ boolean lastResumedCanPip = false;
+ final ActivityStack lastFocusedStack = mStackSupervisor.getLastStack();
+ if (lastFocusedStack != null && lastFocusedStack != this) {
+ // So, why aren't we using prev here??? See the param comment on the method. prev doesn't
+ // represent the last resumed activity. However, the last focus stack does if it isn't null.
+ final ActivityRecord lastResumed = lastFocusedStack.mResumedActivity;
+ lastResumedCanPip = lastResumed != null && lastResumed.checkEnterPictureInPictureState(
+ "resumeTopActivity", true /* noThrow */, userLeaving /* beforeStopping */);
+ }
// If the flag RESUME_WHILE_PAUSING is set, then continue to schedule the previous activity
// to be paused, while at the same time resuming the new resume activity only if the
// previous activity can't go into Pip since we want to give Pip activities a chance to
// enter Pip before resuming the next activity.
- final boolean resumeWhilePausing = (next.info.flags & FLAG_RESUME_WHILE_PAUSING) != 0;
- // TODO: This would be go to have however, the various call points that pass in
- // prev need to be corrected first. In some cases the prev is equal to the next e.g. launch
- // an app from home. And, is come other cases it is null e.g. press home button after
- // launching an app. The doc on the method says prev. is null expect for the case we are
- // coming from pause. We need to see if that is a valid thing and also if all the code in
- // this method using prev. are setup to function like that.
- //&& !prevCanPip;
+ final boolean resumeWhilePausing = (next.info.flags & FLAG_RESUME_WHILE_PAUSING) != 0
+ && !lastResumedCanPip;
+
boolean pausing = mStackSupervisor.pauseBackStacks(userLeaving, next, false);
if (mResumedActivity != null) {
if (DEBUG_STATES) Slog.d(TAG_STATES,
@@ -3305,13 +3301,21 @@
final ActivityRecord next = topRunningActivityLocked();
final String myReason = reason + " adjustFocus";
+
if (next != r) {
if (next != null && StackId.keepFocusInStackIfPossible(mStackId) && isFocusable()) {
// For freeform, docked, and pinned stacks we always keep the focus within the
// stack as long as there is a running activity.
return;
} else {
+ // Task is not guaranteed to be non-null. For example, destroying the
+ // {@link ActivityRecord} will disassociate the task from the activity.
final TaskRecord task = r.getTask();
+
+ if (task == null) {
+ throw new IllegalStateException("activity no longer associated with task:" + r);
+ }
+
final boolean isAssistantOrOverAssistant = task.getStack().isAssistantStack() ||
task.isOverAssistantStack();
if (r.frontOfTask && isATopFinishingTask(task)
@@ -3377,8 +3381,8 @@
if (DEBUG_STATES) Slog.d(TAG_STATES, "no-history finish of " + r);
if (requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
"stop-no-history", false)) {
- // Activity was finished, no need to continue trying to schedule stop.
- adjustFocusedActivityStackLocked(r, "stopActivityFinished");
+ // If {@link requestFinishActivityLocked} returns {@code true},
+ // {@link adjustFocusedActivityStackLocked} would have been already called.
r.resumeKeyDispatchingLocked();
return;
}
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index fb8c161..61d185f 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -110,7 +110,6 @@
import android.app.ActivityOptions;
import android.app.AppOpsManager;
import android.app.IActivityContainerCallback;
-import android.app.ITaskStackListener;
import android.app.ProfilerInfo;
import android.app.ResultInfo;
import android.app.StatusBarManager;
@@ -157,11 +156,11 @@
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.service.voice.IVoiceInteractionSession;
-import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.EventLog;
import android.util.IntArray;
+import android.util.MergedConfiguration;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseIntArray;
@@ -1128,7 +1127,7 @@
mActivitiesWaitingForVisibleActivity.remove(r);
for (int i = mWaitingForActivityVisible.size() - 1; i >= 0; --i) {
- if (mWaitingForActivityVisible.get(i).matches(r)) {
+ if (mWaitingForActivityVisible.get(i).matches(r.realActivity)) {
mWaitingForActivityVisible.remove(i);
}
}
@@ -1142,7 +1141,7 @@
boolean changed = false;
for (int i = mWaitingForActivityVisible.size() - 1; i >= 0; --i) {
final WaitInfo w = mWaitingForActivityVisible.get(i);
- if (w.matches(r)) {
+ if (w.matches(r.realActivity)) {
final WaitResult result = w.getResult();
changed = true;
result.timeout = false;
@@ -1443,17 +1442,16 @@
// a Binder interface which would create a new Configuration. Consequently we have to
// always create a new Configuration here.
- final Configuration globalConfiguration =
- new Configuration(mService.getGlobalConfiguration());
- r.setLastReportedGlobalConfiguration(globalConfiguration);
- final Configuration mergedOverrideConfiguration =
- new Configuration(r.getMergedOverrideConfiguration());
- r.setLastReportedMergedOverrideConfiguration(mergedOverrideConfiguration);
+ final MergedConfiguration mergedConfiguration = new MergedConfiguration(
+ mService.getGlobalConfiguration(), r.getMergedOverrideConfiguration());
+ r.setLastReportedConfiguration(mergedConfiguration);
app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
System.identityHashCode(r), r.info,
- globalConfiguration,
- mergedOverrideConfiguration, r.compat,
+ // TODO: Have this take the merged configuration instead of separate global and
+ // override configs.
+ mergedConfiguration.getGlobalConfiguration(),
+ mergedConfiguration.getOverrideConfiguration(), r.compat,
r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
r.persistentState, results, newIntents, !andResume,
mService.isNextTransitionForward(), profilerInfo);
@@ -2979,8 +2977,8 @@
// Calculate the default bounds (don't use existing stack bounds as we may have just created
// the stack
- final Rect destBounds = mWindowManager.getPictureInPictureBounds(DEFAULT_DISPLAY,
- aspectRatio, false /* useExistingStackBounds */);
+ final Rect destBounds = stack.getPictureInPictureBounds(aspectRatio,
+ false /* useExistingStackBounds */);
stack.animateResizePinnedStack(sourceHintBounds, destBounds, -1 /* animationDuration */,
true /* schedulePipModeChangedOnAnimationEnd */);
@@ -3944,10 +3942,11 @@
}
private StackInfo getStackInfoLocked(ActivityStack stack) {
- final ActivityDisplay display = mActivityDisplays.get(DEFAULT_DISPLAY);
+ final int displayId = stack.mDisplayId;
+ final ActivityDisplay display = mActivityDisplays.get(displayId);
StackInfo info = new StackInfo();
stack.getWindowContainerBounds(info.bounds);
- info.displayId = DEFAULT_DISPLAY;
+ info.displayId = displayId;
info.stackId = stack.mStackId;
info.userId = stack.mCurrentUser;
info.visible = stack.shouldBeVisible(null) == STACK_VISIBLE;
@@ -5140,10 +5139,8 @@
this.mResult = result;
}
- public boolean matches(ActivityRecord record) {
- return mTargetComponent == null ||
- (TextUtils.equals(mTargetComponent.getPackageName(), record.info.packageName)
- && TextUtils.equals(mTargetComponent.getClassName(), record.info.name));
+ public boolean matches(ComponentName targetComponent) {
+ return mTargetComponent == null || mTargetComponent.equals(targetComponent);
}
public WaitResult getResult() {
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 1f4b21b1..ca842d55 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -245,6 +245,9 @@
ActivityRecord[] outActivity, ActivityStackSupervisor.ActivityContainer container,
TaskRecord inTask) {
int err = ActivityManager.START_SUCCESS;
+ // Pull the optional Ephemeral Installer-only bundle out of the options early.
+ final Bundle verificationBundle
+ = options != null ? options.popAppVerificationBundle() : null;
ProcessRecord callerApp = null;
if (caller != null) {
@@ -466,7 +469,7 @@
// app [on install success].
if (rInfo != null && rInfo.auxiliaryInfo != null) {
intent = createLaunchIntent(rInfo.auxiliaryInfo, ephemeralIntent,
- callingPackage, resolvedType, userId);
+ callingPackage, verificationBundle, resolvedType, userId);
resolvedType = null;
callingUid = realCallingUid;
callingPid = realCallingPid;
@@ -522,14 +525,16 @@
* Creates a launch intent for the given auxiliary resolution data.
*/
private @NonNull Intent createLaunchIntent(@NonNull AuxiliaryResolveInfo auxiliaryResponse,
- Intent originalIntent, String callingPackage, String resolvedType, int userId) {
+ Intent originalIntent, String callingPackage, Bundle verificationBundle,
+ String resolvedType, int userId) {
if (auxiliaryResponse.needsPhaseTwo) {
// request phase two resolution
mService.getPackageManagerInternalLocked().requestInstantAppResolutionPhaseTwo(
- auxiliaryResponse, originalIntent, resolvedType, callingPackage, userId);
+ auxiliaryResponse, originalIntent, resolvedType, callingPackage,
+ verificationBundle, userId);
}
return InstantAppResolver.buildEphemeralInstallerIntent(originalIntent,
- callingPackage, resolvedType, userId, auxiliaryResponse.packageName,
+ callingPackage, verificationBundle, resolvedType, userId, auxiliaryResponse.packageName,
auxiliaryResponse.splitName, auxiliaryResponse.versionCode,
auxiliaryResponse.token, auxiliaryResponse.needsPhaseTwo);
}
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index ba72dcf..d6bfb35 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -751,6 +751,26 @@
mAppsNotReportingCrashes.add(proc.info.packageName);
}
+ static boolean isInterestingForBackgroundTraces(ProcessRecord app) {
+ // The system_server is always considered interesting.
+ if (app.pid == MY_PID) {
+ return true;
+ }
+
+ // A package is considered interesting if any of the following is true :
+ //
+ // - It's displaying an activity.
+ // - It's the SystemUI.
+ // - It has an overlay or a top UI visible.
+ //
+ // NOTE: The check whether a given ProcessRecord belongs to the systemui
+ // process is a bit of a kludge, but the same pattern seems repeated at
+ // several places in the system server.
+ return app.isInterestingToUserLocked() ||
+ (app.info != null && "com.android.systemui".equals(app.info.packageName)) ||
+ (app.hasTopUi || app.hasOverlayUi);
+ }
+
final void appNotResponding(ProcessRecord app, ActivityRecord activity,
ActivityRecord parent, boolean aboveSystem, final String annotation) {
ArrayList<Integer> firstPids = new ArrayList<Integer>(5);
@@ -812,7 +832,7 @@
firstPids.add(app.pid);
// Don't dump other PIDs if it's a background ANR
- isSilentANR = !showBackground && !app.isInterestingToUserLocked() && app.pid != MY_PID;
+ isSilentANR = !showBackground && !isInterestingForBackgroundTraces(app);
if (!isSilentANR) {
int parentPid = app.pid;
if (parent != null && parent.app != null && parent.app.pid > 0) {
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index 349180f..d08298b 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -1180,7 +1180,7 @@
skip = true;
}
if (!skip && r.callerInstantApp
- && (info.activityInfo.flags & ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL) == 0
+ && (info.activityInfo.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) == 0
&& r.callingUid != info.activityInfo.applicationInfo.uid) {
Slog.w(TAG, "Instant App Denial: receiving "
+ r.intent
diff --git a/services/core/java/com/android/server/am/ConnectionRecord.java b/services/core/java/com/android/server/am/ConnectionRecord.java
index cd37041..9b7a0c4 100644
--- a/services/core/java/com/android/server/am/ConnectionRecord.java
+++ b/services/core/java/com/android/server/am/ConnectionRecord.java
@@ -74,6 +74,9 @@
if ((flags&Context.BIND_NOT_FOREGROUND) != 0) {
sb.append("!FG ");
}
+ if ((flags&Context.BIND_IMPORTANT_BACKGROUND) != 0) {
+ sb.append("IMPB ");
+ }
if ((flags&Context.BIND_ABOVE_CLIENT) != 0) {
sb.append("ABCLT ");
}
diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java
index dd16e22..144eb11 100644
--- a/services/core/java/com/android/server/am/KeyguardController.java
+++ b/services/core/java/com/android/server/am/KeyguardController.java
@@ -95,6 +95,7 @@
return;
}
mKeyguardShowing = showing;
+ dismissDockedStackIfNeeded();
if (showing) {
mKeyguardGoingAway = false;
mDismissalRequested = false;
diff --git a/services/core/java/com/android/server/am/PinnedActivityStack.java b/services/core/java/com/android/server/am/PinnedActivityStack.java
index a4932bb..672f563 100644
--- a/services/core/java/com/android/server/am/PinnedActivityStack.java
+++ b/services/core/java/com/android/server/am/PinnedActivityStack.java
@@ -43,6 +43,11 @@
return new PinnedStackWindowController(mStackId, this, displayId, onTop, outBounds);
}
+ Rect getPictureInPictureBounds(float aspectRatio, boolean useExistingStackBounds) {
+ return getWindowContainerController().getPictureInPictureBounds(aspectRatio,
+ useExistingStackBounds);
+ }
+
void animateResizePinnedStack(Rect sourceHintBounds, Rect toBounds, int animationDuration,
boolean schedulePipModeChangedOnAnimationEnd) {
getWindowContainerController().animateResizePinnedStack(toBounds, sourceHintBounds,
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 0dc6788..80e7c75 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -373,6 +373,9 @@
case ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND:
procState = "IMPB";
break;
+ case ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND:
+ procState = "TRNB";
+ break;
case ActivityManager.PROCESS_STATE_BACKUP:
procState = "BKUP";
break;
@@ -482,6 +485,7 @@
PROC_MEM_TOP, // ActivityManager.PROCESS_STATE_TOP_SLEEPING
PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
+ PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND
PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_BACKUP
PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
PROC_MEM_SERVICE, // ActivityManager.PROCESS_STATE_SERVICE
@@ -502,6 +506,7 @@
PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_TOP_SLEEPING
PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
+ PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND
PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_BACKUP
PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_SERVICE
@@ -522,6 +527,7 @@
PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_TOP_SLEEPING
PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
+ PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND
PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_BACKUP
PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
PSS_SAME_SERVICE_INTERVAL, // ActivityManager.PROCESS_STATE_SERVICE
@@ -542,6 +548,7 @@
PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_TOP_SLEEPING
PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
+ PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND
PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_BACKUP
PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_SERVICE
@@ -562,6 +569,7 @@
PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_TOP_SLEEPING
PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
+ PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND
PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_BACKUP
PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_SERVICE
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 3c5c5fd..b025385 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -520,6 +520,14 @@
return true;
}
}
+
+ final int servicesSize = services.size();
+ for (int i = 0; i < servicesSize; i++) {
+ ServiceRecord r = services.valueAt(i);
+ if (r.isForeground) {
+ return true;
+ }
+ }
return false;
}
diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java
index cffa475..027dc08 100644
--- a/services/core/java/com/android/server/am/ServiceRecord.java
+++ b/services/core/java/com/android/server/am/ServiceRecord.java
@@ -483,7 +483,7 @@
appInfo.packageName, 0, new UserHandle(userId));
Notification.Builder notiBuilder = new Notification.Builder(ctx,
- localForegroundNoti.getChannel());
+ localForegroundNoti.getChannelId());
// it's ugly, but it clearly identifies the app
notiBuilder.setSmallIcon(appInfo.icon);
@@ -495,8 +495,9 @@
Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
runningIntent.setData(Uri.fromParts("package",
appInfo.packageName, null));
- PendingIntent pi = PendingIntent.getActivity(ams.mContext, 0,
- runningIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ PendingIntent pi = PendingIntent.getActivityAsUser(ams.mContext, 0,
+ runningIntent, PendingIntent.FLAG_UPDATE_CURRENT, null,
+ UserHandle.of(userId));
notiBuilder.setColor(ams.mContext.getColor(
com.android.internal
.R.color.system_notification_accent_color));
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index dc636e5..056fec5 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -2212,11 +2212,6 @@
/** Returns the bounds that should be used to launch this task. */
Rect getLaunchBounds() {
- // If we're over lockscreen, forget about stack bounds and use fullscreen.
- if (mService.mStackSupervisor.mKeyguardController.isKeyguardShowing()) {
- return null;
- }
-
if (mStack == null) {
return null;
}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index eea5473..e2b838f 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -232,6 +232,7 @@
private static final int MSG_UNMUTE_STREAM = 24;
private static final int MSG_DYN_POLICY_MIX_STATE_UPDATE = 25;
private static final int MSG_INDICATE_SYSTEM_READY = 26;
+ private static final int MSG_ACCESSORY_PLUG_MEDIA_UNMUTE = 27;
// start of messages handled under wakelock
// these messages can only be queued, i.e. sent with queueMsgUnderWakeLock(),
// and not with sendMsg(..., ..., SENDMSG_QUEUE, ...)
@@ -3964,6 +3965,33 @@
}
}
+ private static final int DEVICE_MEDIA_UNMUTED_ON_PLUG =
+ AudioSystem.DEVICE_OUT_WIRED_HEADSET | AudioSystem.DEVICE_OUT_WIRED_HEADPHONE |
+ AudioSystem.DEVICE_OUT_LINE |
+ AudioSystem.DEVICE_OUT_ALL_A2DP |
+ AudioSystem.DEVICE_OUT_ALL_USB |
+ AudioSystem.DEVICE_OUT_HDMI;
+
+ private void onAccessoryPlugMediaUnmute(int newDevice) {
+ if (DEBUG_VOL) {
+ Log.i(TAG, String.format("onAccessoryPlugMediaUnmute newDevice=%d [%s]",
+ newDevice, AudioSystem.getOutputDeviceName(newDevice)));
+ }
+ synchronized (mConnectedDevices) {
+ if ((newDevice & DEVICE_MEDIA_UNMUTED_ON_PLUG) != 0
+ && mStreamStates[AudioSystem.STREAM_MUSIC].mIsMuted
+ && mStreamStates[AudioSystem.STREAM_MUSIC].getIndex(newDevice) != 0
+ && (newDevice & AudioSystem.getDevicesForStream(AudioSystem.STREAM_MUSIC)) != 0)
+ {
+ if (DEBUG_VOL) {
+ Log.i(TAG, String.format(" onAccessoryPlugMediaUnmute unmuting device=%d [%s]",
+ newDevice, AudioSystem.getOutputDeviceName(newDevice)));
+ }
+ mStreamStates[AudioSystem.STREAM_MUSIC].mute(false);
+ }
+ }
+ }
+
///////////////////////////////////////////////////////////////////////////
// Inner classes
///////////////////////////////////////////////////////////////////////////
@@ -4854,6 +4882,10 @@
onIndicateSystemReady();
break;
+ case MSG_ACCESSORY_PLUG_MEDIA_UNMUTE:
+ onAccessoryPlugMediaUnmute(msg.arg1);
+ break;
+
case MSG_PERSIST_MUSIC_ACTIVE_MS:
final int musicActiveMs = msg.arg1;
Settings.Secure.putIntForUser(mContentResolver,
@@ -4942,7 +4974,7 @@
// must be called synchronized on mConnectedDevices
private void makeA2dpDeviceAvailable(String address, String name) {
- // enable A2DP before notifying A2DP connection to avoid unecessary processing in
+ // enable A2DP before notifying A2DP connection to avoid unnecessary processing in
// audio policy manager
VolumeStreamState streamState = mStreamStates[AudioSystem.STREAM_MUSIC];
sendMsg(mAudioHandler, MSG_SET_DEVICE_VOLUME, SENDMSG_QUEUE,
@@ -4956,6 +4988,8 @@
makeDeviceListKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address),
new DeviceListSpec(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, name,
address));
+ sendMsg(mAudioHandler, MSG_ACCESSORY_PLUG_MEDIA_UNMUTE, SENDMSG_QUEUE,
+ AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, 0, null, 0);
}
private void onSendBecomingNoisyIntent() {
@@ -5115,7 +5149,7 @@
private void onBluetoothA2dpDeviceConfigChange(BluetoothDevice btDevice)
{
- if (DEBUG_VOL) {
+ if (DEBUG_DEVICES) {
Log.d(TAG, "onBluetoothA2dpDeviceConfigChange btDevice=" + btDevice);
}
if (btDevice == null) {
@@ -5132,8 +5166,13 @@
final DeviceListSpec deviceSpec = mConnectedDevices.get(key);
if (deviceSpec != null) {
// Device is connected
- AudioSystem.handleDeviceConfigChange(device, address,
- btDevice.getName());
+ if (AudioSystem.handleDeviceConfigChange(device, address,
+ btDevice.getName()) != AudioSystem.AUDIO_STATUS_OK) {
+ // force A2DP device disconnection in case of error so that AudioService state is
+ // consistent with audio policy manager state
+ setBluetoothA2dpDeviceConnectionState(
+ btDevice, BluetoothA2dp.STATE_DISCONNECTED, BluetoothProfile.A2DP_SINK);
+ }
}
}
}
@@ -5176,6 +5215,8 @@
return false;
}
mConnectedDevices.put(deviceKey, new DeviceListSpec(device, deviceName, address));
+ sendMsg(mAudioHandler, MSG_ACCESSORY_PLUG_MEDIA_UNMUTE, SENDMSG_QUEUE,
+ device, 0, null, 0);
return true;
} else if (!connect && isConnected) {
AudioSystem.setDeviceConnectionState(device,
@@ -5669,7 +5710,7 @@
//==========================================================================================
public int requestAudioFocus(AudioAttributes aa, int durationHint, IBinder cb,
IAudioFocusDispatcher fd, String clientId, String callingPackageName, int flags,
- IAudioPolicyCallback pcb) {
+ IAudioPolicyCallback pcb, int sdk) {
// permission checks
if ((flags & AudioManager.AUDIOFOCUS_FLAG_LOCK) == AudioManager.AUDIOFOCUS_FLAG_LOCK) {
if (AudioSystem.IN_VOICE_COMM_FOCUS_ID.equals(clientId)) {
@@ -5690,7 +5731,7 @@
}
return mMediaFocusControl.requestAudioFocus(aa, durationHint, cb, fd,
- clientId, callingPackageName, flags);
+ clientId, callingPackageName, flags, sdk);
}
public int abandonAudioFocus(IAudioFocusDispatcher fd, String clientId, AudioAttributes aa,
@@ -6044,8 +6085,8 @@
(AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
updateDefaultStreamOverrideDelay(accessibilityManager.isTouchExplorationEnabled());
updateA11yVolumeAlias(accessibilityManager.isAccessibilityVolumeStreamActive());
- accessibilityManager.addTouchExplorationStateChangeListener(this);
- accessibilityManager.addAccessibilityServicesStateChangeListener(this);
+ accessibilityManager.addTouchExplorationStateChangeListener(this, null);
+ accessibilityManager.addAccessibilityServicesStateChangeListener(this, null);
}
//---------------------------------------------------------------------------------
@@ -6182,6 +6223,7 @@
pw.print(" mCameraSoundForced="); pw.println(mCameraSoundForced);
pw.print(" mHasVibrator="); pw.println(mHasVibrator);
pw.print(" mVolumePolicy="); pw.println(mVolumePolicy);
+ pw.print(" mAvrcpAbsVolSupported="); pw.println(mAvrcpAbsVolSupported);
dumpAudioPolicies(pw);
diff --git a/services/core/java/com/android/server/audio/FocusRequester.java b/services/core/java/com/android/server/audio/FocusRequester.java
index bcaa295..3bc603f 100644
--- a/services/core/java/com/android/server/audio/FocusRequester.java
+++ b/services/core/java/com/android/server/audio/FocusRequester.java
@@ -48,6 +48,7 @@
private final String mPackageName;
private final int mCallingUid;
private final MediaFocusControl mFocusController; // never null
+ private final int mSdkTarget;
/**
* the audio focus gain request that caused the addition of this object in the focus stack.
@@ -87,7 +88,7 @@
*/
FocusRequester(AudioAttributes aa, int focusRequest, int grantFlags,
IAudioFocusDispatcher afl, IBinder source, String id, AudioFocusDeathHandler hdlr,
- String pn, int uid, @NonNull MediaFocusControl ctlr) {
+ String pn, int uid, @NonNull MediaFocusControl ctlr, int sdk) {
mAttributes = aa;
mFocusDispatcher = afl;
mSourceRef = source;
@@ -99,6 +100,7 @@
mGrantFlags = grantFlags;
mFocusLossReceived = AudioManager.AUDIOFOCUS_NONE;
mFocusController = ctlr;
+ mSdkTarget = sdk;
}
FocusRequester(AudioFocusInfo afi, IAudioFocusDispatcher afl,
@@ -110,6 +112,7 @@
mFocusGainRequest = afi.getGainRequest();
mFocusLossReceived = AudioManager.AUDIOFOCUS_NONE;
mGrantFlags = afi.getFlags();
+ mSdkTarget = afi.getSdkTarget();
mFocusDispatcher = afl;
mSourceRef = source;
@@ -169,6 +172,9 @@
return mAttributes;
}
+ int getSdkTarget() {
+ return mSdkTarget;
+ }
private static String focusChangeToString(int focus) {
switch(focus) {
@@ -226,7 +232,8 @@
+ " -- loss: " + focusLossToString()
+ " -- notified: " + mFocusLossWasNotified
+ " -- uid: " + mCallingUid
- + " -- attr: " + mAttributes);
+ + " -- attr: " + mAttributes
+ + " -- sdk:" + mSdkTarget);
}
@@ -419,6 +426,6 @@
AudioFocusInfo toAudioFocusInfo() {
return new AudioFocusInfo(mAttributes, mCallingUid, mClientId, mPackageName,
- mFocusGainRequest, mFocusLossReceived, mGrantFlags);
+ mFocusGainRequest, mFocusLossReceived, mGrantFlags, mSdkTarget);
}
}
diff --git a/services/core/java/com/android/server/audio/MediaFocusControl.java b/services/core/java/com/android/server/audio/MediaFocusControl.java
index 821e78a..f5c13c1 100644
--- a/services/core/java/com/android/server/audio/MediaFocusControl.java
+++ b/services/core/java/com/android/server/audio/MediaFocusControl.java
@@ -27,6 +27,7 @@
import android.media.audiopolicy.AudioPolicy;
import android.media.audiopolicy.IAudioPolicyCallback;
import android.os.Binder;
+import android.os.Build;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
@@ -56,6 +57,17 @@
*/
static final boolean ENFORCE_DUCKING = true;
/**
+ * set to true to the framework enforces ducking itself only with apps above a given SDK
+ * target level. Is ignored if ENFORCE_DUCKING is false.
+ */
+ static final boolean ENFORCE_DUCKING_FOR_NEW = true;
+ /**
+ * the SDK level (included) up to which the framework doesn't enforce ducking itself. Is ignored
+ * if ENFORCE_DUCKING_FOR_NEW is false;
+ */
+ // automatic ducking was introduced for Android O
+ static final int DUCKING_IN_APP_SDK_LEVEL = Build.VERSION_CODES.N_MR1;
+ /**
* set to true so the framework enforces muting media/game itself when the device is ringing
* or in a call.
*/
@@ -629,7 +641,8 @@
/** @see AudioManager#requestAudioFocus(AudioManager.OnAudioFocusChangeListener, int, int, int) */
protected int requestAudioFocus(AudioAttributes aa, int focusChangeHint, IBinder cb,
- IAudioFocusDispatcher fd, String clientId, String callingPackageName, int flags) {
+ IAudioFocusDispatcher fd, String clientId, String callingPackageName, int flags,
+ int sdk) {
Log.i(TAG, " AudioFocus requestAudioFocus() from uid/pid " + Binder.getCallingUid()
+ "/" + Binder.getCallingPid()
+ " clientId=" + clientId
@@ -656,7 +669,7 @@
// construct AudioFocusInfo as it will be communicated to audio focus policy
afiForExtPolicy = new AudioFocusInfo(aa, Binder.getCallingUid(),
clientId, callingPackageName, focusChangeHint, 0 /*lossReceived*/,
- flags);
+ flags, sdk);
} else {
afiForExtPolicy = null;
}
@@ -722,7 +735,7 @@
removeFocusStackEntry(clientId, false /* signal */, false /*notifyFocusFollowers*/);
final FocusRequester nfr = new FocusRequester(aa, focusChangeHint, flags, fd, cb,
- clientId, afdh, callingPackageName, Binder.getCallingUid(), this);
+ clientId, afdh, callingPackageName, Binder.getCallingUid(), this, sdk);
if (focusGrantDelayed) {
// focusGrantDelayed being true implies we can't reassign focus right now
// which implies the focus stack is not empty.
@@ -767,7 +780,7 @@
if (mFocusPolicy != null) {
final AudioFocusInfo afi = new AudioFocusInfo(aa, Binder.getCallingUid(),
clientId, callingPackageName, 0 /*gainRequest*/, 0 /*lossReceived*/,
- 0 /*flags*/);
+ 0 /*flags*/, 0 /* sdk n/a here*/);
if (notifyExtFocusPolicyFocusAbandon_syncAf(afi)) {
return AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
}
diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
index 9eda929..d35104f 100644
--- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
@@ -46,32 +46,28 @@
public final class PlaybackActivityMonitor
implements AudioPlaybackConfiguration.PlayerDeathMonitor, PlayerFocusEnforcer {
- public final static String TAG = "AudioService.PlaybackActivityMonitor";
+ public static final String TAG = "AudioService.PlaybackActivityMonitor";
- private final static boolean DEBUG = false;
- private final static int VOLUME_SHAPER_SYSTEM_DUCK_ID = 1;
+ private static final boolean DEBUG = false;
+ private static final int VOLUME_SHAPER_SYSTEM_DUCK_ID = 1;
- private final VolumeShaper.Configuration DUCK_VSHAPE =
+ private static final VolumeShaper.Configuration DUCK_VSHAPE =
new VolumeShaper.Configuration.Builder()
.setId(VOLUME_SHAPER_SYSTEM_DUCK_ID)
.setCurve(new float[] { 0.f, 1.f } /* times */,
new float[] { 1.f, 0.2f } /* volumes */)
.setOptionFlags(VolumeShaper.Configuration.OPTION_FLAG_CLOCK_TIME)
- .setDurationMillis(MediaFocusControl.getFocusRampTimeMs(
+ .setDuration(MediaFocusControl.getFocusRampTimeMs(
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK,
new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_NOTIFICATION)
.build()))
.build();
- private final VolumeShaper.Configuration DUCK_ID =
+ private static final VolumeShaper.Configuration DUCK_ID =
new VolumeShaper.Configuration(VOLUME_SHAPER_SYSTEM_DUCK_ID);
- private final VolumeShaper.Operation PLAY_CREATE_IF_NEEDED =
+ private static final VolumeShaper.Operation PLAY_CREATE_IF_NEEDED =
new VolumeShaper.Operation.Builder(VolumeShaper.Operation.PLAY)
.createIfNeeded()
.build();
- private final VolumeShaper.Operation TERMINATE =
- new VolumeShaper.Operation.Builder()
- .terminate()
- .build();
private final ArrayList<PlayMonitorClient> mClients = new ArrayList<PlayMonitorClient>();
// a public client is one that needs an anonymized version of the playback configurations, we
@@ -166,14 +162,7 @@
synchronized(mPlayerLock) {
final AudioPlaybackConfiguration apc = mPlayers.get(new Integer(piid));
if (checkConfigurationCaller(piid, apc, binderUid)) {
- try {
- apc.getPlayerProxy().applyVolumeShaper(
- DUCK_ID,
- TERMINATE);
- } catch (Exception e) { /* silent failure, happens with binder failure */ }
mPlayers.remove(new Integer(piid));
- } else {
- Log.e(TAG, "Error releasing player " + piid);
}
}
}
@@ -206,16 +195,16 @@
}
/**
- * Check that piid and uid are valid for the given configuration.
+ * Check that piid and uid are valid for the given valid configuration.
* @param piid the piid of the player.
* @param apc the configuration found for this piid.
* @param binderUid actual uid of client trying to signal a player state/event/attributes.
- * @return true if the call is valid and the change should proceed, false otherwise.
+ * @return true if the call is valid and the change should proceed, false otherwise. Always
+ * returns false when apc is null.
*/
private static boolean checkConfigurationCaller(int piid,
final AudioPlaybackConfiguration apc, int binderUid) {
if (apc == null) {
- Log.e(TAG, "Invalid operation: unknown player " + piid);
return false;
} else if ((binderUid != 0) && (apc.getClientUid() != binderUid)) {
Log.e(TAG, "Forbidden operation from uid " + binderUid + " for player " + piid);
@@ -319,10 +308,17 @@
{
if (mDuckedPlayers.contains(new Integer(piid))) {
if (DEBUG) { Log.v(TAG, "player " + piid + " already ducked"); }
+ } else if (MediaFocusControl.ENFORCE_DUCKING
+ && MediaFocusControl.ENFORCE_DUCKING_FOR_NEW
+ && loser.getSdkTarget() <= MediaFocusControl.DUCKING_IN_APP_SDK_LEVEL) {
+ // legacy behavior, apps used to be notified when they should be ducking
+ if (DEBUG) { Log.v(TAG, "not ducking player " + piid + ": old SDK"); }
+ return false;
} else if (apc.getAudioAttributes().getContentType() ==
AudioAttributes.CONTENT_TYPE_SPEECH) {
// the player is speaking, ducking will make the speech unintelligible
// so let the app handle it instead
+ if (DEBUG) { Log.v(TAG, "not ducking player " + piid + ": SPEECH"); }
return false;
} else if (apc.getPlayerType()
== AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) {
@@ -509,7 +505,7 @@
/**
* Inner class to track clients that want to be notified of playback updates
*/
- private final static class PlayMonitorClient implements IBinder.DeathRecipient {
+ private static final class PlayMonitorClient implements IBinder.DeathRecipient {
// can afford to be static because only one PlaybackActivityMonitor ever instantiated
static PlaybackActivityMonitor sListenerDeathMonitor;
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index ac5fb43..9c5930b 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -218,6 +218,10 @@
return (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
}
+ private WifiManager getWifiManager() {
+ return (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
+ }
+
private void updateConfiguration() {
mConfig = new TetheringConfiguration(mContext);
}
@@ -394,15 +398,21 @@
}
private int setWifiTethering(final boolean enable) {
- synchronized (mPublicSync) {
- mWifiTetherRequested = enable;
- final WifiManager wifiManager =
- (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
- if (wifiManager.setWifiApEnabled(null /* use existing wifi config */, enable)) {
- return ConnectivityManager.TETHER_ERROR_NO_ERROR;
+ int rval = ConnectivityManager.TETHER_ERROR_MASTER_ERROR;
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mPublicSync) {
+ mWifiTetherRequested = enable;
+ final WifiManager mgr = getWifiManager();
+ if ((enable && mgr.startSoftAp(null /* use existing wifi config */)) ||
+ (!enable && mgr.stopSoftAp())) {
+ rval = ConnectivityManager.TETHER_ERROR_NO_ERROR;
+ }
}
- return ConnectivityManager.TETHER_ERROR_MASTER_ERROR;
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
+ return rval;
}
private void setBluetoothTethering(final boolean enable, final ResultReceiver receiver) {
@@ -1420,12 +1430,37 @@
} else {
mForwardedDownstreams.remove(who);
}
+
+ // If this is a Wi-Fi interface, notify WifiManager of the active serving state.
+ if (who.interfaceType() == ConnectivityManager.TETHERING_WIFI) {
+ final WifiManager mgr = getWifiManager();
+ final String iface = who.interfaceName();
+ switch (mode) {
+ case IControlsTethering.STATE_TETHERED:
+ mgr.updateInterfaceIpState(iface, WifiManager.IFACE_IP_MODE_TETHERED);
+ break;
+ case IControlsTethering.STATE_LOCAL_ONLY:
+ mgr.updateInterfaceIpState(iface, WifiManager.IFACE_IP_MODE_LOCAL_ONLY);
+ break;
+ default:
+ Log.wtf(TAG, "Unknown active serving mode: " + mode);
+ break;
+ }
+ }
}
private void handleInterfaceServingStateInactive(TetherInterfaceStateMachine who) {
mNotifyList.remove(who);
mIPv6TetheringCoordinator.removeActiveDownstream(who);
mForwardedDownstreams.remove(who);
+
+ // If this is a Wi-Fi interface, tell WifiManager of any errors.
+ if (who.interfaceType() == ConnectivityManager.TETHERING_WIFI) {
+ if (who.lastError() != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+ getWifiManager().updateInterfaceIpState(
+ who.interfaceName(), WifiManager.IFACE_IP_MODE_CONFIGURATION_ERROR);
+ }
+ }
}
class InitialState extends State {
@@ -1742,7 +1777,7 @@
public void notifyInterfaceStateChange(String iface, TetherInterfaceStateMachine who,
int state, int error) {
synchronized (mPublicSync) {
- TetherState tetherState = mTetherStates.get(iface);
+ final TetherState tetherState = mTetherStates.get(iface);
if (tetherState != null && tetherState.stateMachine.equals(who)) {
tetherState.lastState = state;
tetherState.lastError = error;
diff --git a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
index e21349a..d3cfd87 100644
--- a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
+++ b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
@@ -117,9 +117,11 @@
setInitialState(mInitialState);
}
- public int interfaceType() {
- return mInterfaceType;
- }
+ public String interfaceName() { return mIfaceName; }
+
+ public int interfaceType() { return mInterfaceType; }
+
+ public int lastError() { return mLastError; }
// configured when we start tethering and unconfig'd on error or conclusion
private boolean configureIfaceIp(boolean enabled) {
diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java
index 313abab..dbccc07 100644
--- a/services/core/java/com/android/server/dreams/DreamManagerService.java
+++ b/services/core/java/com/android/server/dreams/DreamManagerService.java
@@ -353,6 +353,7 @@
&& mCurrentDreamIsTest == isTest
&& mCurrentDreamCanDoze == canDoze
&& mCurrentDreamUserId == userId) {
+ Slog.i(TAG, "Already in target dream.");
return;
}
@@ -388,6 +389,7 @@
mHandler.post(new Runnable() {
@Override
public void run() {
+ Slog.i(TAG, "Performing gentle wake from dream.");
mController.stopDream(immediate);
}
});
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index abb2b55..e2c1274 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -1916,7 +1916,8 @@
}
try {
- final int uid = AppGlobals.getPackageManager().getPackageUid(pkgName, 0, userId);
+ final int uid = AppGlobals.getPackageManager().getPackageUid(pkgName, 0,
+ userId != UserHandle.USER_ALL ? userId : UserHandle.USER_SYSTEM);
if (uid < 0) {
return JobSchedulerShellCommand.CMD_ERR_NO_PACKAGE;
}
@@ -1942,6 +1943,25 @@
return 0;
}
+ // Shell command infrastructure: immediately timeout currently executing jobs
+ int executeTimeoutCommand(PrintWriter pw, String pkgName, int userId,
+ boolean hasJobId, int jobId) {
+ if (DEBUG) {
+ Slog.v(TAG, "executeTimeoutCommand(): " + pkgName + "/" + userId + " " + jobId);
+ }
+
+ synchronized (mLock) {
+ boolean foundSome = false;
+ for (int i=0; i<mActiveServices.size(); i++) {
+ mActiveServices.get(i).timeoutIfExecutingLocked(pkgName, userId, hasJobId, jobId);
+ }
+ if (!foundSome) {
+ pw.println("No matching executing jobs found.");
+ }
+ }
+ return 0;
+ }
+
void setMonitorBattery(boolean enabled) {
synchronized (mLock) {
if (mBatteryController != null) {
diff --git a/services/core/java/com/android/server/job/JobSchedulerShellCommand.java b/services/core/java/com/android/server/job/JobSchedulerShellCommand.java
index 848704e..fdfb345 100644
--- a/services/core/java/com/android/server/job/JobSchedulerShellCommand.java
+++ b/services/core/java/com/android/server/job/JobSchedulerShellCommand.java
@@ -16,11 +16,11 @@
package com.android.server.job;
+import android.app.ActivityManager;
import android.app.AppGlobals;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.os.Binder;
-import android.os.RemoteException;
import android.os.ShellCommand;
import android.os.UserHandle;
@@ -46,18 +46,20 @@
switch (cmd != null ? cmd : "") {
case "run":
return runJob(pw);
+ case "timeout":
+ return timeout(pw);
case "monitor-battery":
- return runMonitorBattery(pw);
+ return monitorBattery(pw);
case "get-battery-seq":
- return runGetBatterySeq(pw);
+ return getBatterySeq(pw);
case "get-battery-charging":
- return runGetBatteryCharging(pw);
+ return getBatteryCharging(pw);
case "get-battery-not-low":
- return runGetBatteryNotLow(pw);
+ return getBatteryNotLow(pw);
case "get-storage-seq":
- return runGetStorageSeq(pw);
+ return getStorageSeq(pw);
case "get-storage-not-low":
- return runGetStorageNotLow(pw);
+ return getStorageNotLow(pw);
default:
return handleDefaultCommands(cmd);
}
@@ -109,47 +111,87 @@
final String pkgName = getNextArgRequired();
final int jobId = Integer.parseInt(getNextArgRequired());
- int ret = mInternal.executeRunCommand(pkgName, userId, jobId, force);
- switch (ret) {
- case CMD_ERR_NO_PACKAGE:
- pw.print("Package not found: ");
- pw.print(pkgName);
- pw.print(" / user ");
- pw.println(userId);
- break;
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ int ret = mInternal.executeRunCommand(pkgName, userId, jobId, force);
+ switch (ret) {
+ case CMD_ERR_NO_PACKAGE:
+ pw.print("Package not found: ");
+ pw.print(pkgName);
+ pw.print(" / user ");
+ pw.println(userId);
+ break;
- case CMD_ERR_NO_JOB:
- pw.print("Could not find job ");
- pw.print(jobId);
- pw.print(" in package ");
- pw.print(pkgName);
- pw.print(" / user ");
- pw.println(userId);
- break;
+ case CMD_ERR_NO_JOB:
+ pw.print("Could not find job ");
+ pw.print(jobId);
+ pw.print(" in package ");
+ pw.print(pkgName);
+ pw.print(" / user ");
+ pw.println(userId);
+ break;
- case CMD_ERR_CONSTRAINTS:
- pw.print("Job ");
- pw.print(jobId);
- pw.print(" in package ");
- pw.print(pkgName);
- pw.print(" / user ");
- pw.print(userId);
- pw.println(" has functional constraints but --force not specified");
- break;
+ case CMD_ERR_CONSTRAINTS:
+ pw.print("Job ");
+ pw.print(jobId);
+ pw.print(" in package ");
+ pw.print(pkgName);
+ pw.print(" / user ");
+ pw.print(userId);
+ pw.println(" has functional constraints but --force not specified");
+ break;
- default:
- // success!
- pw.print("Running job");
- if (force) {
- pw.print(" [FORCED]");
- }
- pw.println();
- break;
+ default:
+ // success!
+ pw.print("Running job");
+ if (force) {
+ pw.print(" [FORCED]");
+ }
+ pw.println();
+ break;
+ }
+ return ret;
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
- return ret;
}
- private int runMonitorBattery(PrintWriter pw) throws Exception {
+ private int timeout(PrintWriter pw) throws Exception {
+ checkPermission("force timeout jobs");
+
+ int userId = UserHandle.USER_ALL;
+
+ String opt;
+ while ((opt = getNextOption()) != null) {
+ switch (opt) {
+ case "-u":
+ case "--user":
+ userId = UserHandle.parseUserArg(getNextArgRequired());
+ break;
+
+ default:
+ pw.println("Error: unknown option '" + opt + "'");
+ return -1;
+ }
+ }
+
+ if (userId == UserHandle.USER_CURRENT) {
+ userId = ActivityManager.getCurrentUser();
+ }
+
+ final String pkgName = getNextArg();
+ final String jobIdStr = getNextArg();
+ final int jobId = jobIdStr != null ? Integer.parseInt(jobIdStr) : -1;
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ return mInternal.executeTimeoutCommand(pw, pkgName, userId, jobIdStr != null, jobId);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ private int monitorBattery(PrintWriter pw) throws Exception {
checkPermission("change battery monitoring");
String opt = getNextArgRequired();
boolean enabled;
@@ -161,37 +203,42 @@
getErrPrintWriter().println("Error: unknown option " + opt);
return 1;
}
- mInternal.setMonitorBattery(enabled);
- if (enabled) pw.println("Battery monitoring enabled");
- else pw.println("Battery monitoring disabled");
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ mInternal.setMonitorBattery(enabled);
+ if (enabled) pw.println("Battery monitoring enabled");
+ else pw.println("Battery monitoring disabled");
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
return 0;
}
- private int runGetBatterySeq(PrintWriter pw) {
+ private int getBatterySeq(PrintWriter pw) {
int seq = mInternal.getBatterySeq();
pw.println(seq);
return 0;
}
- private int runGetBatteryCharging(PrintWriter pw) {
+ private int getBatteryCharging(PrintWriter pw) {
boolean val = mInternal.getBatteryCharging();
pw.println(val);
return 0;
}
- private int runGetBatteryNotLow(PrintWriter pw) {
+ private int getBatteryNotLow(PrintWriter pw) {
boolean val = mInternal.getBatteryNotLow();
pw.println(val);
return 0;
}
- private int runGetStorageSeq(PrintWriter pw) {
+ private int getStorageSeq(PrintWriter pw) {
int seq = mInternal.getStorageSeq();
pw.println(seq);
return 0;
}
- private int runGetStorageNotLow(PrintWriter pw) {
+ private int getStorageNotLow(PrintWriter pw) {
boolean val = mInternal.getStorageNotLow();
pw.println(val);
return 0;
@@ -211,6 +258,12 @@
pw.println(" connectivity are not currently met");
pw.println(" -u or --user: specify which user's job is to be run; the default is");
pw.println(" the primary or system user");
+ pw.println(" timeout [-u | --user USER_ID] [PACKAGE] [JOB_ID]");
+ pw.println(" Trigger immediate timeout of currently executing jobs, as if their.");
+ pw.println(" execution timeout had expired.");
+ pw.println(" Options:");
+ pw.println(" -u or --user: specify which user's job is to be run; the default is");
+ pw.println(" all users");
pw.println(" monitor-battery [on|off]");
pw.println(" Control monitoring of all battery changes. Off by default. Turning");
pw.println(" on makes get-battery-seq useful.");
diff --git a/services/core/java/com/android/server/job/JobServiceContext.java b/services/core/java/com/android/server/job/JobServiceContext.java
index 9144966..73beecf 100644
--- a/services/core/java/com/android/server/job/JobServiceContext.java
+++ b/services/core/java/com/android/server/job/JobServiceContext.java
@@ -184,7 +184,8 @@
scheduleOpTimeOutLocked();
final Intent intent = new Intent().setComponent(job.getServiceComponent());
boolean binding = mContext.bindServiceAsUser(intent, this,
- Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND,
+ Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND
+ | Context.BIND_IMPORTANT_BACKGROUND,
new UserHandle(job.getUserId()));
if (!binding) {
if (DEBUG) {
@@ -255,6 +256,20 @@
return mTimeoutElapsed;
}
+ boolean timeoutIfExecutingLocked(String pkgName, int userId, boolean matchJobId, int jobId) {
+ final JobStatus executing = getRunningJob();
+ if (executing != null && (userId == UserHandle.USER_ALL || userId == executing.getUserId())
+ && (pkgName == null || pkgName.equals(executing.getSourcePackageName()))
+ && (!matchJobId || jobId == executing.getJobId())) {
+ if (mVerb == VERB_EXECUTING) {
+ mParams.setStopReason(JobParameters.REASON_TIMEOUT);
+ sendStopMessageLocked();
+ return true;
+ }
+ }
+ return false;
+ }
+
@Override
public void jobFinished(int jobId, boolean reschedule) {
doCallback(reschedule);
diff --git a/services/core/java/com/android/server/job/controllers/JobStatus.java b/services/core/java/com/android/server/job/controllers/JobStatus.java
index 7fdb08a..4d507d6 100644
--- a/services/core/java/com/android/server/job/controllers/JobStatus.java
+++ b/services/core/java/com/android/server/job/controllers/JobStatus.java
@@ -107,6 +107,9 @@
private GrantedUriPermissions uriPerms;
private boolean prepared;
+ static final boolean DEBUG_PREPARE = true;
+ private Throwable unpreparedPoint = null;
+
/**
* Earliest point in the future at which this job will be eligible to run. A value of 0
* indicates there is no delay constraint. See {@link #hasTimingDelayConstraint()}.
@@ -410,6 +413,9 @@
return;
}
prepared = true;
+ if (DEBUG_PREPARE) {
+ unpreparedPoint = null;
+ }
final ClipData clip = job.getClipData();
if (clip != null) {
uriPerms = GrantedUriPermissions.createFromClip(am, clip, sourceUid, sourcePackageName,
@@ -420,9 +426,15 @@
public void unprepareLocked(IActivityManager am) {
if (!prepared) {
Slog.wtf(TAG, "Hasn't been prepared: " + this);
+ if (DEBUG_PREPARE && unpreparedPoint != null) {
+ Slog.e(TAG, "Was already unprepared at ", unpreparedPoint);
+ }
return;
}
prepared = false;
+ if (DEBUG_PREPARE) {
+ unpreparedPoint = new Throwable().fillInStackTrace();
+ }
if (uriPerms != null) {
uriPerms.revoke(am);
uriPerms = null;
diff --git a/services/core/java/com/android/server/location/GeofenceManager.java b/services/core/java/com/android/server/location/GeofenceManager.java
index e24bf76..2493dfb 100644
--- a/services/core/java/com/android/server/location/GeofenceManager.java
+++ b/services/core/java/com/android/server/location/GeofenceManager.java
@@ -23,8 +23,10 @@
import android.app.AppOpsManager;
import android.app.PendingIntent;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.database.ContentObserver;
import android.location.Geofence;
import android.location.Location;
import android.location.LocationListener;
@@ -35,6 +37,8 @@
import android.os.Message;
import android.os.PowerManager;
import android.os.SystemClock;
+import android.os.UserHandle;
+import android.provider.Settings;
import android.util.Slog;
import com.android.server.LocationManagerService;
@@ -58,9 +62,9 @@
private static final long MAX_AGE_NANOS = 5 * 60 * 1000000000L; // five minutes
/**
- * Most frequent update interval allowed.
+ * The default value of most frequent update interval allowed.
*/
- private static final long MIN_INTERVAL_MS = 1 * 60 * 1000; // one minute
+ private static final long DEFAULT_MIN_INTERVAL_MS = 30 * 60 * 1000; // 30 minutes
/**
* Least frequent update interval allowed.
@@ -106,6 +110,12 @@
*/
private boolean mPendingUpdate;
+ /**
+ * The actual value of most frequent update interval allowed.
+ */
+ private long mEffectiveMinIntervalMs;
+ private ContentResolver mResolver;
+
public GeofenceManager(Context context, LocationBlacklist blacklist) {
mContext = context;
mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
@@ -114,6 +124,28 @@
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mHandler = new GeofenceHandler();
mBlacklist = blacklist;
+ mResolver = mContext.getContentResolver();
+ updateMinInterval();
+ mResolver.registerContentObserver(
+ Settings.Global.getUriFor(
+ Settings.Global.LOCATION_BACKGROUND_THROTTLE_PROXIMITY_ALERT_INTERVAL_MS),
+ true,
+ new ContentObserver(mHandler) {
+ @Override
+ public void onChange(boolean selfChange) {
+ synchronized (mLock) {
+ updateMinInterval();
+ }
+ }
+ }, UserHandle.USER_ALL);
+ }
+
+ /**
+ * Updates the minimal location request frequency.
+ */
+ private void updateMinInterval() {
+ mEffectiveMinIntervalMs = Settings.Global.getLong(mResolver,
+ Settings.Global.LOCATION_BACKGROUND_THROTTLE_INTERVAL_MS, DEFAULT_MIN_INTERVAL_MS);
}
public void addFence(LocationRequest request, Geofence geofence, PendingIntent intent,
@@ -301,10 +333,10 @@
// Compute a location update interval based on the distance to the nearest fence.
long intervalMs;
if (location != null && Double.compare(minFenceDistance, Double.MAX_VALUE) != 0) {
- intervalMs = (long)Math.min(MAX_INTERVAL_MS, Math.max(MIN_INTERVAL_MS,
+ intervalMs = (long)Math.min(MAX_INTERVAL_MS, Math.max(mEffectiveMinIntervalMs,
minFenceDistance * 1000 / MAX_SPEED_M_S));
} else {
- intervalMs = MIN_INTERVAL_MS;
+ intervalMs = mEffectiveMinIntervalMs;
}
if (!mReceivingLocationUpdates || mLocationUpdateInterval != intervalMs) {
mReceivingLocationUpdates = true;
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 39585a1..d9ca00c 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -1167,7 +1167,7 @@
builder.setContentTitle(title);
builder.setContentText(body);
builder.setDefaults(Notification.DEFAULT_ALL);
- builder.setChannel(SystemNotificationChannels.NETWORK_ALERTS);
+ builder.setChannelId(SystemNotificationChannels.NETWORK_ALERTS);
final Intent snoozeIntent = buildSnoozeWarningIntent(policy.template);
builder.setDeleteIntent(PendingIntent.getBroadcast(
@@ -2879,17 +2879,11 @@
final List<UserInfo> users = mUserManager.getUsers();
for (int ui = users.size() - 1; ui >= 0; ui--) {
UserInfo user = users.get(ui);
- for (int i = mPowerSaveTempWhitelistAppIds.size() - 1; i >= 0; i--) {
- if (mPowerSaveTempWhitelistAppIds.valueAt(i)) {
- int appId = mPowerSaveTempWhitelistAppIds.keyAt(i);
- int uid = UserHandle.getUid(user.id, appId);
- uidRules.put(uid, FIREWALL_RULE_ALLOW);
- }
- }
- for (int i = mPowerSaveWhitelistAppIds.size() - 1; i >= 0; i--) {
- int appId = mPowerSaveWhitelistAppIds.keyAt(i);
- int uid = UserHandle.getUid(user.id, appId);
- uidRules.put(uid, FIREWALL_RULE_ALLOW);
+ updateRulesForWhitelistedAppIds(uidRules, mPowerSaveTempWhitelistAppIds, user.id);
+ updateRulesForWhitelistedAppIds(uidRules, mPowerSaveWhitelistAppIds, user.id);
+ if (chain == FIREWALL_CHAIN_POWERSAVE) {
+ updateRulesForWhitelistedAppIds(uidRules,
+ mPowerSaveWhitelistExceptIdleAppIds, user.id);
}
}
for (int i = mUidState.size() - 1; i >= 0; i--) {
@@ -2903,16 +2897,39 @@
}
}
- private boolean isWhitelistedBatterySaverUL(int uid) {
+ private void updateRulesForWhitelistedAppIds(final SparseIntArray uidRules,
+ final SparseBooleanArray whitelistedAppIds, int userId) {
+ for (int i = whitelistedAppIds.size() - 1; i >= 0; --i) {
+ if (whitelistedAppIds.valueAt(i)) {
+ final int appId = whitelistedAppIds.keyAt(i);
+ final int uid = UserHandle.getUid(userId, appId);
+ uidRules.put(uid, FIREWALL_RULE_ALLOW);
+ }
+ }
+ }
+
+ /**
+ * @param deviceIdleMode if true then we don't consider
+ * {@link #mPowerSaveWhitelistExceptIdleAppIds} for checking if the {@param uid} is
+ * whitelisted.
+ */
+ private boolean isWhitelistedBatterySaverUL(int uid, boolean deviceIdleMode) {
final int appId = UserHandle.getAppId(uid);
- return mPowerSaveTempWhitelistAppIds.get(appId) || mPowerSaveWhitelistAppIds.get(appId);
+ boolean isWhitelisted = mPowerSaveTempWhitelistAppIds.get(appId)
+ || mPowerSaveWhitelistAppIds.get(appId);
+ if (!deviceIdleMode) {
+ isWhitelisted = isWhitelisted || mPowerSaveWhitelistExceptIdleAppIds.get(appId);
+ }
+ return isWhitelisted;
}
// NOTE: since both fw_dozable and fw_powersave uses the same map
// (mPowerSaveTempWhitelistAppIds) for whitelisting, we can reuse their logic in this method.
private void updateRulesForWhitelistedPowerSaveUL(int uid, boolean enabled, int chain) {
if (enabled) {
- if (isWhitelistedBatterySaverUL(uid) || isUidForegroundOnRestrictPowerUL(uid)) {
+ final boolean isWhitelisted = isWhitelistedBatterySaverUL(uid,
+ chain == FIREWALL_CHAIN_DOZABLE);
+ if (isWhitelisted || isUidForegroundOnRestrictPowerUL(uid)) {
setUidFirewallRule(chain, uid, FIREWALL_RULE_ALLOW);
} else {
setUidFirewallRule(chain, uid, FIREWALL_RULE_DEFAULT);
@@ -3430,7 +3447,7 @@
final boolean restrictMode = isIdle || mRestrictPower || mDeviceIdleMode;
final boolean isForeground = isUidForegroundOnRestrictPowerUL(uid);
- final boolean isWhitelisted = isWhitelistedBatterySaverUL(uid);
+ final boolean isWhitelisted = isWhitelistedBatterySaverUL(uid, mDeviceIdleMode);
final int oldRule = oldUidRules & MASK_ALL_NETWORKS;
int newRule = RULE_NONE;
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index 3cb2f35..b8d633f 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -19,10 +19,12 @@
import static android.content.Context.BIND_ALLOW_WHITELIST_MANAGEMENT;
import static android.content.Context.BIND_AUTO_CREATE;
import static android.content.Context.BIND_FOREGROUND_SERVICE;
+import static android.content.Context.DEVICE_POLICY_SERVICE;
import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.PendingIntent;
+import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -39,6 +41,7 @@
import android.content.pm.UserInfo;
import android.database.ContentObserver;
import android.net.Uri;
+import android.os.Binder;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
@@ -895,7 +898,9 @@
if (this.userid == UserHandle.USER_ALL) return true;
if (this.isSystem) return true;
if (nid == UserHandle.USER_ALL || nid == this.userid) return true;
- return supportsProfiles() && mUserProfiles.isCurrentProfile(nid);
+ return supportsProfiles()
+ && mUserProfiles.isCurrentProfile(nid)
+ && isPermittedForProfile(nid);
}
public boolean supportsProfiles() {
@@ -906,7 +911,7 @@
public void binderDied() {
if (DEBUG) Slog.d(TAG, "binderDied");
// Remove the service, but don't unbind from the service. The system will bring the
- // service back up, and the onServiceConnected handler will readd the service with the
+ // service back up, and the onServiceConnected handler will read the service with the
// new binding. If this isn't a bound service, and is just a registered
// service, just removing it from the list is all we need to do anyway.
removeServiceImpl(this.service, this.userid);
@@ -918,6 +923,26 @@
if (this.connection == null) return false;
return mEnabledServicesForCurrentProfiles.contains(this.component);
}
+
+ /**
+ * Returns true if this service is allowed to receive events for the given userId. A
+ * managed profile owner can disallow non-system services running outside of the profile
+ * from receiving events from the profile.
+ */
+ public boolean isPermittedForProfile(int userId) {
+ if (!mUserProfiles.isManagedProfile(userId)) {
+ return true;
+ }
+ DevicePolicyManager dpm =
+ (DevicePolicyManager) mContext.getSystemService(DEVICE_POLICY_SERVICE);
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return dpm.isNotificationListenerServicePermitted(
+ component.getPackageName(), userId);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
}
/** convenience method for looking in mEnabledServicesForCurrentProfiles */
@@ -959,6 +984,13 @@
return mCurrentProfiles.get(userId) != null;
}
}
+
+ public boolean isManagedProfile(int userId) {
+ synchronized (mCurrentProfiles) {
+ UserInfo user = mCurrentProfiles.get(userId);
+ return user != null && user.isManagedProfile();
+ }
+ }
}
public static class Config {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 02b93a2..8b84205 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -56,6 +56,7 @@
import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
import android.Manifest;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
@@ -980,6 +981,14 @@
void addNotification(NotificationRecord r) {
mNotificationList.add(r);
mNotificationsByKey.put(r.sbn.getKey(), r);
+ if (r.sbn.isGroup()) {
+ mSummaryByGroupKey.put(r.getGroupKey(), r);
+ }
+ }
+
+ @VisibleForTesting
+ void addEnqueuedNotification(NotificationRecord r) {
+ mEnqueuedNotifications.add(r);
}
@VisibleForTesting
@@ -1016,7 +1025,7 @@
@VisibleForTesting
void init(Looper looper, IPackageManager packageManager, PackageManager packageManagerClient,
LightsManager lightsManager, NotificationListeners notificationListeners,
- ICompanionDeviceManager companionManager) {
+ ICompanionDeviceManager companionManager, SnoozeHelper snoozeHelper) {
Resources resources = getContext().getResources();
mMaxPackageEnqueueRate = Settings.Global.getFloat(getContext().getContentResolver(),
Settings.Global.MAX_NOTIFICATION_ENQUEUE_RATE,
@@ -1071,21 +1080,7 @@
sendRegisteredOnlyBroadcast(NotificationManager.ACTION_NOTIFICATION_POLICY_CHANGED);
}
});
- mSnoozeHelper = new SnoozeHelper(getContext(), new SnoozeHelper.Callback() {
- @Override
- public void repost(int userId, NotificationRecord r) {
- try {
- if (DBG) {
- Slog.d(TAG, "Reposting " + r.getKey());
- }
- enqueueNotificationInternal(r.sbn.getPackageName(), r.sbn.getOpPkg(),
- r.sbn.getUid(), r.sbn.getInitialPid(), r.sbn.getTag(), r.sbn.getId(),
- r.sbn.getNotification(), userId);
- } catch (Exception e) {
- Slog.e(TAG, "Cannot un-snooze notification", e);
- }
- }
- }, mUserProfiles);
+ mSnoozeHelper = snoozeHelper;
mGroupHelper = new GroupHelper(new GroupHelper.Callback() {
@Override
public void addAutoGroup(String key) {
@@ -1204,9 +1199,25 @@
@Override
public void onStart() {
+ SnoozeHelper snoozeHelper = new SnoozeHelper(getContext(), new SnoozeHelper.Callback() {
+ @Override
+ public void repost(int userId, NotificationRecord r) {
+ try {
+ if (DBG) {
+ Slog.d(TAG, "Reposting " + r.getKey());
+ }
+ enqueueNotificationInternal(r.sbn.getPackageName(), r.sbn.getOpPkg(),
+ r.sbn.getUid(), r.sbn.getInitialPid(), r.sbn.getTag(), r.sbn.getId(),
+ r.sbn.getNotification(), userId);
+ } catch (Exception e) {
+ Slog.e(TAG, "Cannot un-snooze notification", e);
+ }
+ }
+ }, mUserProfiles);
+
init(Looper.myLooper(), AppGlobals.getPackageManager(), getContext().getPackageManager(),
getLocalService(LightsManager.class), new NotificationListeners(),
- null);
+ null, snoozeHelper);
publishBinderService(Context.NOTIFICATION_SERVICE, mService);
publishLocalService(NotificationManagerInternal.class, mInternalService);
}
@@ -2838,6 +2849,7 @@
new Notification.Builder(getContext(), channelId)
.setSmallIcon(adjustedSbn.getNotification().getSmallIcon())
.setGroupSummary(true)
+ .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
.setGroup(GroupHelper.AUTOGROUP_KEY)
.setFlag(Notification.FLAG_AUTOGROUP_SUMMARY, true)
.setFlag(Notification.FLAG_GROUP_SUMMARY, true)
@@ -3172,9 +3184,9 @@
mUsageStats.registerEnqueuedByApp(pkg);
// setup local book-keeping
- String channelId = notification.getChannel();
- if (mIsTelevision && (new Notification.TvExtender(notification)).getChannel() != null) {
- channelId = (new Notification.TvExtender(notification)).getChannel();
+ String channelId = notification.getChannelId();
+ if (mIsTelevision && (new Notification.TvExtender(notification)).getChannelId() != null) {
+ channelId = (new Notification.TvExtender(notification)).getChannelId();
}
final NotificationChannel channel = mRankingHelper.getNotificationChannel(pkg,
notificationUid, channelId, false /* includeDeleted */);
@@ -3304,7 +3316,7 @@
return false;
}
} else if (isCallerInstantApp(pkg)) {
- // Ephemeral apps have some special contraints for notifications.
+ // Ephemeral apps have some special constraints for notifications.
// They are not allowed to create new notifications however they are allowed to
// update notifications created by the system (e.g. a foreground service
// notification).
@@ -3378,6 +3390,76 @@
return isBlocked;
}
+ protected class SnoozeNotificationRunnable implements Runnable {
+ private final String mKey;
+ private final long mDuration;
+ private final String mSnoozeCriterionId;
+
+ SnoozeNotificationRunnable(String key, long duration, String snoozeCriterionId) {
+ mKey = key;
+ mDuration = duration;
+ mSnoozeCriterionId = snoozeCriterionId;
+ }
+
+ @Override
+ public void run() {
+ synchronized (mNotificationLock) {
+ final NotificationRecord r = findNotificationByKeyLocked(mKey);
+ if (r != null) {
+ snoozeLocked(r);
+ }
+ }
+ }
+
+ void snoozeLocked(NotificationRecord r) {
+ if (r.sbn.isGroup()) {
+ final List<NotificationRecord> groupNotifications = findGroupNotificationsLocked(
+ r.sbn.getPackageName(), r.sbn.getGroupKey(), r.sbn.getUserId());
+ if (r.getNotification().isGroupSummary()) {
+ // snooze summary and all children
+ for (int i = 0; i < groupNotifications.size(); i++) {
+ snoozeNotificationLocked(groupNotifications.get(i));
+ }
+ } else {
+ // if there is a valid summary for this group, and we are snoozing the only
+ // child, also snooze the summary
+ if (mSummaryByGroupKey.containsKey(r.sbn.getGroupKey())) {
+ if (groupNotifications.size() != 2) {
+ snoozeNotificationLocked(r);
+ } else {
+ // snooze summary and the one child
+ for (int i = 0; i < groupNotifications.size(); i++) {
+ snoozeNotificationLocked(groupNotifications.get(i));
+ }
+ }
+ } else {
+ snoozeNotificationLocked(r);
+ }
+ }
+ } else {
+ // just snooze the one notification
+ snoozeNotificationLocked(r);
+ }
+ }
+
+ void snoozeNotificationLocked(NotificationRecord r) {
+ MetricsLogger.action(r.getLogMaker()
+ .setCategory(MetricsEvent.NOTIFICATION_SNOOZED)
+ .setType(MetricsEvent.TYPE_CLOSE)
+ .addTaggedData(MetricsEvent.NOTIFICATION_SNOOZED_CRITERIA,
+ mSnoozeCriterionId == null ? 0 : 1));
+ cancelNotificationLocked(r, false, REASON_SNOOZED);
+ updateLightsLocked();
+ if (mSnoozeCriterionId != null) {
+ mNotificationAssistants.notifyAssistantSnoozedLocked(r.sbn, mSnoozeCriterionId);
+ mSnoozeHelper.snooze(r);
+ } else {
+ mSnoozeHelper.snooze(r, mDuration);
+ }
+ savePolicyFile();
+ }
+ }
+
protected class EnqueueNotificationRunnable implements Runnable {
private final NotificationRecord r;
private final int userId;
@@ -3412,6 +3494,11 @@
// can to avoid extracting signals.
handleGroupedNotificationLocked(r, old, callingUid, callingPid);
+ // if this is a group child, unsnooze parent summary
+ if (n.isGroup() && notification.isGroupChild()) {
+ mSnoozeHelper.repostGroupSummary(pkg, r.getUserId(), n.getGroupKey());
+ }
+
// This conditional is a dirty hack to limit the logging done on
// behalf of the download manager without affecting other apps.
if (!pkg.equals("com.android.providers.downloads")
@@ -3584,7 +3671,7 @@
@VisibleForTesting
void scheduleTimeoutLocked(NotificationRecord record) {
- if (record.getNotification().getTimeout() > 0) {
+ if (record.getNotification().getTimeoutAfter() > 0) {
final PendingIntent pi = PendingIntent.getBroadcast(getContext(),
REQUEST_CODE_TIMEOUT,
new Intent(ACTION_NOTIFICATION_TIMEOUT)
@@ -3594,7 +3681,7 @@
.putExtra(EXTRA_KEY, record.getKey()),
PendingIntent.FLAG_UPDATE_CURRENT);
mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
- SystemClock.elapsedRealtime() + record.getNotification().getTimeout(), pi);
+ SystemClock.elapsedRealtime() + record.getNotification().getTimeoutAfter(), pi);
}
}
@@ -3659,10 +3746,7 @@
}
hasValidVibrate = vibration != null;
- // We can alert, and we're allowed to alert, but if the developer asked us to only do
- // it once, and we already have, then don't.
- if (!(record.isUpdate
- && (notification.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0)) {
+ if (!shouldMuteNotificationLocked(record)) {
sendAccessibilityEvent(notification, record.sbn.getPackageName());
if (hasValidSound) {
@@ -3716,6 +3800,24 @@
}
}
+ boolean shouldMuteNotificationLocked(final NotificationRecord record) {
+ final Notification notification = record.getNotification();
+ if(record.isUpdate
+ && (notification.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0) {
+ return true;
+ }
+ if (record.sbn.isGroup()) {
+ if (notification.isGroupSummary()
+ && notification.getGroupAlertBehavior() == Notification.GROUP_ALERT_CHILDREN) {
+ return true;
+ } else if (notification.isGroupChild()
+ && notification.getGroupAlertBehavior() == Notification.GROUP_ALERT_SUMMARY) {
+ return true;
+ }
+ }
+ return false;
+ }
+
private boolean playSound(final NotificationRecord record, Uri soundUri) {
boolean looping = (record.getNotification().flags & Notification.FLAG_INSISTENT) != 0;
// do not play notifications if there is a user of exclusive audio focus
@@ -4379,31 +4481,7 @@
snoozeCriterionId, listenerName));
}
// Needs to post so that it can cancel notifications not yet enqueued.
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- synchronized (mNotificationLock) {
- final NotificationRecord r = findNotificationByKeyLocked(key);
- if (r != null) {
- MetricsLogger.action(r.getLogMaker()
- .setCategory(MetricsEvent.NOTIFICATION_SNOOZED)
- .setType(MetricsEvent.TYPE_CLOSE)
- .addTaggedData(MetricsEvent.NOTIFICATION_SNOOZED_CRITERIA,
- snoozeCriterionId == null ? 0 : 1));
- cancelNotificationLocked(r, false, REASON_SNOOZED);
- updateLightsLocked();
- if (snoozeCriterionId != null) {
- mNotificationAssistants.notifyAssistantSnoozedLocked(r.sbn,
- snoozeCriterionId);
- mSnoozeHelper.snooze(r);
- } else {
- mSnoozeHelper.snooze(r, duration);
- }
- savePolicyFile();
- }
- }
- }
- });
+ mHandler.post(new SnoozeNotificationRunnable(key, duration, snoozeCriterionId));
}
void unsnoozeNotificationInt(String key, ManagedServiceInfo listener) {
@@ -4516,6 +4594,30 @@
}
}
+ @NonNull List<NotificationRecord> findGroupNotificationsLocked(String pkg,
+ String groupKey, int userId) {
+ List<NotificationRecord> records = new ArrayList<>();
+ records.addAll(findGroupNotificationByListLocked(mNotificationList, pkg, groupKey, userId));
+ records.addAll(
+ findGroupNotificationByListLocked(mEnqueuedNotifications, pkg, groupKey, userId));
+ return records;
+ }
+
+
+ private @NonNull List<NotificationRecord> findGroupNotificationByListLocked(
+ ArrayList<NotificationRecord> list, String pkg, String groupKey, int userId) {
+ List<NotificationRecord> records = new ArrayList<>();
+ final int len = list.size();
+ for (int i = 0; i < len; i++) {
+ NotificationRecord r = list.get(i);
+ if (notificationMatchesUserId(r, userId) && r.getGroupKey().equals(groupKey)
+ && r.sbn.getPackageName().equals(pkg)) {
+ records.add(r);
+ }
+ }
+ return records;
+ }
+
// Searches both enqueued and posted notifications by key.
// TODO: need to combine a bunch of these getters with slightly different behavior.
// TODO: Should enqueuing just add to mNotificationsByKey instead?
@@ -4530,7 +4632,7 @@
return null;
}
- private NotificationRecord findNotificationLocked(String pkg, String tag, int id, int userId) {
+ NotificationRecord findNotificationLocked(String pkg, String tag, int id, int userId) {
NotificationRecord r;
if ((r = findNotificationByListLocked(mNotificationList, pkg, tag, id, userId)) != null) {
return r;
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index b48fd5c..b51a4d1 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -392,7 +392,8 @@
}
pw.println(prefix + "contentView=" + notification.contentView);
pw.println(prefix + String.format("color=0x%08x", notification.color));
- pw.println(prefix + "timeout=" + TimeUtils.formatForLogging(notification.getTimeout()));
+ pw.println(prefix + "timeout="
+ + TimeUtils.formatForLogging(notification.getTimeoutAfter()));
if (notification.actions != null && notification.actions.length > 0) {
pw.println(prefix + "actions={");
final int N = notification.actions.length;
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 32de316..6d18c83 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -33,7 +33,6 @@
import android.metrics.LogMaker;
import android.os.Build;
import android.os.UserHandle;
-import android.provider.Settings;
import android.service.notification.NotificationListenerService.Ranking;
import android.text.TextUtils;
import android.util.ArrayMap;
@@ -508,6 +507,14 @@
updateConfig();
}
+ int getPackagePriority(String pkg, int uid) {
+ return getOrCreateRecord(pkg, uid).priority;
+ }
+
+ int getPackageVisibility(String pkg, int uid) {
+ return getOrCreateRecord(pkg, uid).visibility;
+ }
+
@Override
public void createNotificationChannelGroup(String pkg, int uid, NotificationChannelGroup group,
boolean fromTargetApp) {
@@ -608,6 +615,16 @@
}
r.channels.put(updatedChannel.getId(), updatedChannel);
+ if (NotificationChannel.DEFAULT_CHANNEL_ID.equals(updatedChannel.getId())) {
+ // copy settings to app level so they are inherited by new channels
+ // when the app migrates
+ r.importance = updatedChannel.getImportance();
+ r.priority = updatedChannel.canBypassDnd()
+ ? Notification.PRIORITY_MAX : Notification.PRIORITY_DEFAULT;
+ r.visibility = updatedChannel.getLockscreenVisibility();
+ r.showBadge = updatedChannel.canShowBadge();
+ }
+
MetricsLogger.action(getChannelLog(updatedChannel, pkg));
updateConfig();
}
diff --git a/services/core/java/com/android/server/notification/SnoozeHelper.java b/services/core/java/com/android/server/notification/SnoozeHelper.java
index 913f636..42b4f57 100644
--- a/services/core/java/com/android/server/notification/SnoozeHelper.java
+++ b/services/core/java/com/android/server/notification/SnoozeHelper.java
@@ -25,6 +25,7 @@
import android.annotation.NonNull;
import android.app.AlarmManager;
+import android.app.Notification;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -61,7 +62,6 @@
private static final String REPOST_ACTION = SnoozeHelper.class.getSimpleName() + ".EVALUATE";
private static final int REQUEST_CODE_REPOST = 1;
private static final String REPOST_SCHEME = "repost";
- private static final String EXTRA_PKG = "pkg";
private static final String EXTRA_KEY = "key";
private static final String EXTRA_USER_ID = "userId";
@@ -98,7 +98,7 @@
protected Collection<NotificationRecord> getSnoozed(int userId, String pkg) {
if (mSnoozedNotifications.containsKey(userId)
&& mSnoozedNotifications.get(userId).containsKey(pkg)) {
- mSnoozedNotifications.get(userId).get(pkg).values();
+ return mSnoozedNotifications.get(userId).get(pkg).values();
}
return Collections.EMPTY_LIST;
}
@@ -106,16 +106,18 @@
protected @NonNull List<NotificationRecord> getSnoozed() {
List<NotificationRecord> snoozedForUser = new ArrayList<>();
int[] userIds = mUserProfiles.getCurrentProfileIds();
- final int N = userIds.length;
- for (int i = 0; i < N; i++) {
- final ArrayMap<String, ArrayMap<String, NotificationRecord>> snoozedPkgs =
- mSnoozedNotifications.get(userIds[i]);
- if (snoozedPkgs != null) {
- final int M = snoozedPkgs.size();
- for (int j = 0; j < M; j++) {
- final ArrayMap<String, NotificationRecord> records = snoozedPkgs.valueAt(j);
- if (records != null) {
- snoozedForUser.addAll(records.values());
+ if (userIds != null) {
+ final int N = userIds.length;
+ for (int i = 0; i < N; i++) {
+ final ArrayMap<String, ArrayMap<String, NotificationRecord>> snoozedPkgs =
+ mSnoozedNotifications.get(userIds[i]);
+ if (snoozedPkgs != null) {
+ final int M = snoozedPkgs.size();
+ for (int j = 0; j < M; j++) {
+ final ArrayMap<String, NotificationRecord> records = snoozedPkgs.valueAt(j);
+ if (records != null) {
+ snoozedForUser.addAll(records.values());
+ }
}
}
}
@@ -281,6 +283,42 @@
}
}
+ protected void repostGroupSummary(String pkg, int userId, String groupKey) {
+ if (mSnoozedNotifications.containsKey(userId)) {
+ ArrayMap<String, ArrayMap<String, NotificationRecord>> keysByPackage
+ = mSnoozedNotifications.get(userId);
+
+ if (keysByPackage != null && keysByPackage.containsKey(pkg)) {
+ ArrayMap<String, NotificationRecord> recordsByKey = keysByPackage.get(pkg);
+
+ if (recordsByKey != null) {
+ String groupSummaryKey = null;
+ int N = recordsByKey.size();
+ for (int i = 0; i < N; i++) {
+ final NotificationRecord potentialGroupSummary = recordsByKey.valueAt(i);
+ if (potentialGroupSummary.sbn.isGroup()
+ && potentialGroupSummary.getNotification().isGroupSummary()
+ && groupKey.equals(potentialGroupSummary.getGroupKey())) {
+ groupSummaryKey = potentialGroupSummary.getKey();
+ break;
+ }
+ }
+
+ if (groupSummaryKey != null) {
+ NotificationRecord record = recordsByKey.remove(groupSummaryKey);
+ mPackages.remove(groupSummaryKey);
+ mUsers.remove(groupSummaryKey);
+
+ MetricsLogger.action(record.getLogMaker()
+ .setCategory(MetricsProto.MetricsEvent.NOTIFICATION_SNOOZED)
+ .setType(MetricsProto.MetricsEvent.TYPE_OPEN));
+ mCallback.repost(userId, record);
+ }
+ }
+ }
+ }
+ }
+
private PendingIntent createPendingIntent(String pkg, String key, int userId) {
return PendingIntent.getBroadcast(mContext,
REQUEST_CODE_REPOST,
diff --git a/services/core/java/com/android/server/os/SchedulingPolicyService.java b/services/core/java/com/android/server/os/SchedulingPolicyService.java
index a8bb809..46be232 100644
--- a/services/core/java/com/android/server/os/SchedulingPolicyService.java
+++ b/services/core/java/com/android/server/os/SchedulingPolicyService.java
@@ -20,6 +20,7 @@
import android.os.Binder;
import android.os.ISchedulingPolicyService;
import android.os.Process;
+import android.util.Log;
/**
* The implementation of the scheduling policy service interface.
@@ -50,16 +51,24 @@
// since if not the case then the getThreadGroupLeader() test will also fail.
if (!isPermitted() || prio < PRIORITY_MIN ||
prio > PRIORITY_MAX || Process.getThreadGroupLeader(tid) != pid) {
- return PackageManager.PERMISSION_DENIED;
+ return PackageManager.PERMISSION_DENIED;
+ }
+ if (Binder.getCallingUid() != Process.BLUETOOTH_UID) {
+ try {
+ // make good use of our CAP_SYS_NICE capability
+ Process.setThreadGroup(tid, !isForApp ?
+ Process.THREAD_GROUP_AUDIO_SYS : Process.THREAD_GROUP_AUDIO_APP);
+ } catch (RuntimeException e) {
+ Log.e(TAG, "Failed setThreadGroup: " + e);
+ return PackageManager.PERMISSION_DENIED;
+ }
}
try {
- // make good use of our CAP_SYS_NICE capability
- Process.setThreadGroup(tid, !isForApp ?
- Process.THREAD_GROUP_AUDIO_SYS : Process.THREAD_GROUP_AUDIO_APP);
// must be in this order or it fails the schedulability constraint
Process.setThreadScheduler(tid, Process.SCHED_FIFO | Process.SCHED_RESET_ON_FORK,
- prio);
+ prio);
} catch (RuntimeException e) {
+ Log.e(TAG, "Failed setThreadScheduler: " + e);
return PackageManager.PERMISSION_DENIED;
}
return PackageManager.PERMISSION_GRANTED;
@@ -74,6 +83,7 @@
switch (Binder.getCallingUid()) {
case Process.AUDIOSERVER_UID: // fastcapture, fastmixer
case Process.CAMERASERVER_UID: // camera high frame rate recording
+ case Process.BLUETOOTH_UID: // Bluetooth audio playback
return true;
default:
return false;
diff --git a/services/core/java/com/android/server/pm/InstantAppRegistry.java b/services/core/java/com/android/server/pm/InstantAppRegistry.java
index fc9e0a3..b165984 100644
--- a/services/core/java/com/android/server/pm/InstantAppRegistry.java
+++ b/services/core/java/com/android/server/pm/InstantAppRegistry.java
@@ -218,6 +218,11 @@
byte[] randomBytes = new byte[8];
new SecureRandom().nextBytes(randomBytes);
String id = ByteStringUtils.toHexString(randomBytes).toLowerCase(Locale.US);
+ File appDir = getInstantApplicationDir(packageName, userId);
+ if (!appDir.exists() && !appDir.mkdirs()) {
+ Slog.e(LOG_TAG, "Cannot create instant app cookie directory");
+ return id;
+ }
File idFile = new File(getInstantApplicationDir(packageName, userId),
INSTANT_APP_ANDROID_ID_FILE);
try (FileOutputStream fos = new FileOutputStream(idFile)) {
diff --git a/services/core/java/com/android/server/pm/InstantAppResolver.java b/services/core/java/com/android/server/pm/InstantAppResolver.java
index b56db04..624d8c9 100644
--- a/services/core/java/com/android/server/pm/InstantAppResolver.java
+++ b/services/core/java/com/android/server/pm/InstantAppResolver.java
@@ -41,6 +41,7 @@
import android.metrics.LogMaker;
import android.os.Binder;
import android.os.Build;
+import android.os.Bundle;
import android.os.Handler;
import android.os.RemoteException;
import android.util.Log;
@@ -147,6 +148,7 @@
final Intent installerIntent = buildEphemeralInstallerIntent(
requestObj.origIntent,
requestObj.callingPackage,
+ requestObj.verificationBundle,
requestObj.resolvedType,
requestObj.userId,
packageName,
@@ -172,6 +174,7 @@
*/
public static Intent buildEphemeralInstallerIntent(@NonNull Intent origIntent,
@NonNull String callingPackage,
+ @Nullable Bundle verificationBundle,
@NonNull String resolvedType,
int userId,
@NonNull String instantAppPackageName,
@@ -234,6 +237,10 @@
intent.putExtra(Intent.EXTRA_PACKAGE_NAME, instantAppPackageName);
intent.putExtra(Intent.EXTRA_SPLIT_NAME, instantAppSplitName);
intent.putExtra(Intent.EXTRA_VERSION_CODE, versionCode);
+ intent.putExtra(Intent.EXTRA_CALLING_PACKAGE, callingPackage);
+ if (verificationBundle != null) {
+ intent.putExtra(Intent.EXTRA_VERIFICATION_BUNDLE, verificationBundle);
+ }
}
return intent;
diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
index 8413491..254bc2a 100644
--- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java
+++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
@@ -28,6 +28,7 @@
import android.os.WorkSource;
import android.util.Log;
import android.util.Slog;
+import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.IndentingPrintWriter;
@@ -141,7 +142,7 @@
final String[] instructionSets = targetInstructionSets != null ?
targetInstructionSets : getAppDexInstructionSets(pkg.applicationInfo);
final String[] dexCodeInstructionSets = getDexCodeInstructionSets(instructionSets);
- final List<String> paths = pkg.getAllCodePathsExcludingResourceOnly();
+ final List<String> paths = pkg.getAllCodePaths();
final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid);
final String compilerFilter = getRealCompilerFilter(pkg.applicationInfo,
@@ -149,18 +150,32 @@
final boolean profileUpdated = checkForProfileUpdates &&
isProfileUpdated(pkg, sharedGid, compilerFilter);
- String sharedLibrariesPath = getSharedLibrariesPath(sharedLibraries);
+ final String sharedLibrariesPath = getSharedLibrariesPath(sharedLibraries);
// Get the dexopt flags after getRealCompilerFilter to make sure we get the correct flags.
final int dexoptFlags = getDexFlags(pkg, compilerFilter);
+ // Get the dependencies of each split in the package. For each code path in the package,
+ // this array contains the relative paths of each split it depends on, separated by colons.
+ String[] splitDependencies = getSplitDependencies(pkg);
int result = DEX_OPT_SKIPPED;
- // TODO: Iterate based on dependency hierarchy (currently alphabetically by name)
- // (b/37480811).
- String basePathCheck = null;
- for (String path : paths) {
+ for (int i = 0; i < paths.size(); i++) {
+ // Skip paths that have no code.
+ if ((i == 0 && (pkg.applicationInfo.flags & ApplicationInfo.FLAG_HAS_CODE) == 0) ||
+ (i != 0 && (pkg.splitFlags[i - 1] & ApplicationInfo.FLAG_HAS_CODE) == 0)) {
+ continue;
+ }
+ // Append shared libraries with split dependencies for this split.
+ String path = paths.get(i);
+ String sharedLibrariesPathWithSplits;
+ if (sharedLibrariesPath != null && splitDependencies[i] != null) {
+ sharedLibrariesPathWithSplits = sharedLibrariesPath + ":" + splitDependencies[i];
+ } else {
+ sharedLibrariesPathWithSplits =
+ splitDependencies[i] != null ? splitDependencies[i] : sharedLibrariesPath;
+ }
for (String dexCodeIsa : dexCodeInstructionSets) {
int newResult = dexOptPath(pkg, path, dexCodeIsa, compilerFilter, profileUpdated,
- sharedLibrariesPath, dexoptFlags, sharedGid, packageStats);
+ sharedLibrariesPathWithSplits, dexoptFlags, sharedGid, packageStats);
// The end result is:
// - FAILED if any path failed,
// - PERFORMED if at least one path needed compilation,
@@ -168,22 +183,6 @@
if ((result != DEX_OPT_FAILED) && (newResult != DEX_OPT_SKIPPED)) {
result = newResult;
}
- // Add the relative path of code we just compiled to the shared libraries.
- int slashIndex = path.lastIndexOf('/') + 1;
- String relativePath = path.substring(slashIndex);
- if (sharedLibrariesPath == null) {
- sharedLibrariesPath = relativePath;
- } else {
- sharedLibrariesPath += ":" + relativePath;
- }
- // Sanity check that the base paths are all the same.
- String basePath = path.substring(0, slashIndex);
- if (basePathCheck == null) {
- basePathCheck = basePath;
- } else if (!basePath.equals(basePathCheck)) {
- Slog.wtf(TAG, "Split paths have different base paths: " + basePath + " and " +
- basePathCheck);
- }
}
}
return result;
@@ -437,6 +436,69 @@
}
/**
+ * Walks dependency tree and gathers the dependencies for each split in a split apk.
+ * The split paths are stored as relative paths, separated by colons.
+ */
+ private String[] getSplitDependencies(PackageParser.Package pkg) {
+ // Convert all the code paths to relative paths.
+ String baseCodePath = new File(pkg.baseCodePath).getParent();
+ List<String> paths = pkg.getAllCodePaths();
+ String[] splitDependencies = new String[paths.size()];
+ for (int i = 0; i < paths.size(); i++) {
+ File pathFile = new File(paths.get(i));
+ String fileName = pathFile.getName();
+ paths.set(i, fileName);
+
+ // Sanity check that the base paths of the splits are all the same.
+ String basePath = pathFile.getParent();
+ if (!basePath.equals(baseCodePath)) {
+ Slog.wtf(TAG, "Split paths have different base paths: " + basePath + " and " +
+ baseCodePath);
+ }
+ }
+
+ // If there are no other dependencies, fill in the implicit dependency on the base apk.
+ SparseArray<int[]> dependencies = pkg.applicationInfo.splitDependencies;
+ if (dependencies == null) {
+ for (int i = 1; i < paths.size(); i++) {
+ splitDependencies[i] = paths.get(0);
+ }
+ return splitDependencies;
+ }
+
+ // Fill in the dependencies, skipping the base apk which has no dependencies.
+ for (int i = 1; i < dependencies.size(); i++) {
+ getParentDependencies(dependencies.keyAt(i), paths, dependencies, splitDependencies);
+ }
+
+ return splitDependencies;
+ }
+
+ /**
+ * Recursive method to generate dependencies for a particular split.
+ * The index is a key from the package's splitDependencies.
+ */
+ private String getParentDependencies(int index, List<String> paths,
+ SparseArray<int[]> dependencies, String[] splitDependencies) {
+ // The base apk is always first, and has no dependencies.
+ if (index == 0) {
+ return null;
+ }
+ // Return the result if we've computed the dependencies for this index already.
+ if (splitDependencies[index] != null) {
+ return splitDependencies[index];
+ }
+ // Get the dependencies for the parent of this index and append its path to it.
+ int parent = dependencies.get(index)[0];
+ String parentDependencies =
+ getParentDependencies(parent, paths, dependencies, splitDependencies);
+ String path = parentDependencies == null ? paths.get(parent) :
+ parentDependencies + ":" + paths.get(parent);
+ splitDependencies[index] = path;
+ return path;
+ }
+
+ /**
* Checks if there is an update on the profile information of the {@code pkg}.
* If the compiler filter is not profile guided the method returns false.
*
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index d0a28f9..a56590e 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -739,12 +739,123 @@
@GuardedBy("mPackages")
final SparseArray<Map<String, Integer>> mChangedPackagesSequenceNumbers = new SparseArray<>();
- final PackageParser.Callback mPackageParserCallback = new PackageParser.Callback() {
- @Override public boolean hasFeature(String feature) {
+ class PackageParserCallback implements PackageParser.Callback {
+ @Override public final boolean hasFeature(String feature) {
return PackageManagerService.this.hasSystemFeature(feature, 0);
}
+
+ final List<PackageParser.Package> getStaticOverlayPackagesLocked(
+ Collection<PackageParser.Package> allPackages, String targetPackageName) {
+ List<PackageParser.Package> overlayPackages = null;
+ for (PackageParser.Package p : allPackages) {
+ if (targetPackageName.equals(p.mOverlayTarget) && p.mIsStaticOverlay) {
+ if (overlayPackages == null) {
+ overlayPackages = new ArrayList<PackageParser.Package>();
+ }
+ overlayPackages.add(p);
+ }
+ }
+ if (overlayPackages != null) {
+ Comparator<PackageParser.Package> cmp = new Comparator<PackageParser.Package>() {
+ public int compare(PackageParser.Package p1, PackageParser.Package p2) {
+ return p1.mOverlayPriority - p2.mOverlayPriority;
+ }
+ };
+ Collections.sort(overlayPackages, cmp);
+ }
+ return overlayPackages;
+ }
+
+ final String[] getStaticOverlayPathsLocked(Collection<PackageParser.Package> allPackages,
+ String targetPackageName, String targetPath) {
+ if ("android".equals(targetPackageName)) {
+ // Static RROs targeting to "android", ie framework-res.apk, are already applied by
+ // native AssetManager.
+ return null;
+ }
+ List<PackageParser.Package> overlayPackages =
+ getStaticOverlayPackagesLocked(allPackages, targetPackageName);
+ if (overlayPackages == null || overlayPackages.isEmpty()) {
+ return null;
+ }
+ List<String> overlayPathList = null;
+ for (PackageParser.Package overlayPackage : overlayPackages) {
+ if (targetPath == null) {
+ if (overlayPathList == null) {
+ overlayPathList = new ArrayList<String>();
+ }
+ overlayPathList.add(overlayPackage.baseCodePath);
+ continue;
+ }
+
+ try {
+ // Creates idmaps for system to parse correctly the Android manifest of the
+ // target package.
+ //
+ // OverlayManagerService will update each of them with a correct gid from its
+ // target package app id.
+ mInstaller.idmap(targetPath, overlayPackage.baseCodePath,
+ UserHandle.getSharedAppGid(
+ UserHandle.getUserGid(UserHandle.USER_SYSTEM)));
+ if (overlayPathList == null) {
+ overlayPathList = new ArrayList<String>();
+ }
+ overlayPathList.add(overlayPackage.baseCodePath);
+ } catch (InstallerException e) {
+ Slog.e(TAG, "Failed to generate idmap for " + targetPath + " and " +
+ overlayPackage.baseCodePath);
+ }
+ }
+ return overlayPathList == null ? null : overlayPathList.toArray(new String[0]);
+ }
+
+ String[] getStaticOverlayPaths(String targetPackageName, String targetPath) {
+ synchronized (mPackages) {
+ return getStaticOverlayPathsLocked(
+ mPackages.values(), targetPackageName, targetPath);
+ }
+ }
+
+ @Override public final String[] getOverlayApks(String targetPackageName) {
+ return getStaticOverlayPaths(targetPackageName, null);
+ }
+
+ @Override public final String[] getOverlayPaths(String targetPackageName,
+ String targetPath) {
+ return getStaticOverlayPaths(targetPackageName, targetPath);
+ }
};
+ class ParallelPackageParserCallback extends PackageParserCallback {
+ List<PackageParser.Package> mOverlayPackages = null;
+
+ void findStaticOverlayPackages() {
+ synchronized (mPackages) {
+ for (PackageParser.Package p : mPackages.values()) {
+ if (p.mIsStaticOverlay) {
+ if (mOverlayPackages == null) {
+ mOverlayPackages = new ArrayList<PackageParser.Package>();
+ }
+ mOverlayPackages.add(p);
+ }
+ }
+ }
+ }
+
+ @Override
+ synchronized String[] getStaticOverlayPaths(String targetPackageName, String targetPath) {
+ // We can trust mOverlayPackages without holding mPackages because package uninstall
+ // can't happen while running parallel parsing.
+ // Moreover holding mPackages on each parsing thread causes dead-lock.
+ return mOverlayPackages == null ? null :
+ getStaticOverlayPathsLocked(mOverlayPackages, targetPackageName, targetPath);
+ }
+ }
+
+ final PackageParser.Callback mPackageParserCallback = new PackageParserCallback();
+ final ParallelPackageParserCallback mParallelPackageParserCallback =
+ new ParallelPackageParserCallback();
+
public static final class SharedLibraryEntry {
public final String path;
public final String apk;
@@ -2453,6 +2564,8 @@
| PackageParser.PARSE_IS_SYSTEM_DIR
| PackageParser.PARSE_TRUSTED_OVERLAY, scanFlags | SCAN_TRUSTED_OVERLAY, 0);
+ mParallelPackageParserCallback.findStaticOverlayPackages();
+
// Find base frameworks (resource packages without code).
scanDirTracedLI(frameworkDir, mDefParseFlags
| PackageParser.PARSE_IS_SYSTEM
@@ -4074,14 +4187,26 @@
* action and a {@code android.intent.category.BROWSABLE} category</li>
* </ul>
*/
+ int updateFlagsForResolve(int flags, int userId, Intent intent, int callingUid) {
+ return updateFlagsForResolve(flags, userId, intent, callingUid,
+ false /*includeInstantApps*/, false /*onlyExposedExplicitly*/);
+ }
int updateFlagsForResolve(int flags, int userId, Intent intent, int callingUid,
boolean includeInstantApps) {
+ return updateFlagsForResolve(flags, userId, intent, callingUid,
+ includeInstantApps, false /*onlyExposedExplicitly*/);
+ }
+ int updateFlagsForResolve(int flags, int userId, Intent intent, int callingUid,
+ boolean includeInstantApps, boolean onlyExposedExplicitly) {
// Safe mode means we shouldn't match any third-party components
if (mSafeMode) {
flags |= PackageManager.MATCH_SYSTEM_ONLY;
}
if (getInstantAppPackageName(callingUid) != null) {
// But, ephemeral apps see both ephemeral and exposed, non-ephemeral components
+ if (onlyExposedExplicitly) {
+ flags |= PackageManager.MATCH_EXPLICITLY_VISIBLE_ONLY;
+ }
flags |= PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY;
flags |= PackageManager.MATCH_INSTANT;
} else {
@@ -4098,7 +4223,8 @@
|| isSpecialProcess
|| mContext.checkCallingOrSelfPermission(
android.Manifest.permission.ACCESS_INSTANT_APPS) == PERMISSION_GRANTED;
- flags &= ~PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY;
+ flags &= ~(PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY
+ | PackageManager.MATCH_EXPLICITLY_VISIBLE_ONLY);
if (!allowMatchInstant) {
flags &= ~PackageManager.MATCH_INSTANT;
}
@@ -5659,19 +5785,19 @@
}
private ResolveInfo resolveIntentInternal(Intent intent, String resolvedType,
- int flags, int userId, boolean includeInstantApps) {
+ int flags, int userId, boolean resolveForStart) {
try {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "resolveIntent");
if (!sUserManager.exists(userId)) return null;
final int callingUid = Binder.getCallingUid();
- flags = updateFlagsForResolve(flags, userId, intent, callingUid, includeInstantApps);
+ flags = updateFlagsForResolve(flags, userId, intent, callingUid, resolveForStart);
enforceCrossUserPermission(callingUid, userId,
false /*requireFullPermission*/, false /*checkShell*/, "resolve intent");
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "queryIntentActivities");
final List<ResolveInfo> query = queryIntentActivitiesInternal(intent, resolvedType,
- flags, userId, includeInstantApps);
+ flags, userId, resolveForStart);
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
final ResolveInfo bestChoice =
@@ -5807,10 +5933,10 @@
private void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj,
Intent origIntent, String resolvedType, String callingPackage,
- int userId) {
+ Bundle verificationBundle, int userId) {
final Message msg = mHandler.obtainMessage(INSTANT_APP_RESOLUTION_PHASE_TWO,
new InstantAppRequest(responseObj, origIntent, resolvedType,
- callingPackage, userId));
+ callingPackage, userId, verificationBundle));
mHandler.sendMessage(msg);
}
@@ -6208,14 +6334,14 @@
}
private @NonNull List<ResolveInfo> queryIntentActivitiesInternal(Intent intent,
- String resolvedType, int flags, int userId, boolean includeInstantApps) {
+ String resolvedType, int flags, int userId, boolean resolveForStart) {
if (!sUserManager.exists(userId)) return Collections.emptyList();
final int callingUid = Binder.getCallingUid();
final String instantAppPkgName = getInstantAppPackageName(callingUid);
- flags = updateFlagsForResolve(flags, userId, intent, callingUid, includeInstantApps);
enforceCrossUserPermission(callingUid, userId,
false /* requireFullPermission */, false /* checkShell */,
"query intent activities");
+ final String pkgName = intent.getPackage();
ComponentName comp = intent.getComponent();
if (comp == null) {
if (intent.getSelector() != null) {
@@ -6224,6 +6350,8 @@
}
}
+ flags = updateFlagsForResolve(flags, userId, intent, callingUid, resolveForStart,
+ comp != null || pkgName != null /*onlyExposedExplicitly*/);
if (comp != null) {
final List<ResolveInfo> list = new ArrayList<ResolveInfo>(1);
final ActivityInfo ai = getActivityInfo(comp, flags, userId);
@@ -6236,6 +6364,8 @@
(flags & PackageManager.MATCH_INSTANT) != 0;
final boolean matchVisibleToInstantAppOnly =
(flags & PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY) != 0;
+ final boolean matchExplicitlyVisibleOnly =
+ (flags & PackageManager.MATCH_EXPLICITLY_VISIBLE_ONLY) != 0;
final boolean isCallerInstantApp =
instantAppPkgName != null;
final boolean isTargetSameInstantApp =
@@ -6243,8 +6373,14 @@
final boolean isTargetInstantApp =
(ai.applicationInfo.privateFlags
& ApplicationInfo.PRIVATE_FLAG_INSTANT) != 0;
+ final boolean isTargetVisibleToInstantApp =
+ (ai.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0;
+ final boolean isTargetExplicitlyVisibleToInstantApp =
+ isTargetVisibleToInstantApp
+ && (ai.flags & ActivityInfo.FLAG_IMPLICITLY_VISIBLE_TO_INSTANT_APP) == 0;
final boolean isTargetHiddenFromInstantApp =
- (ai.flags & ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL) == 0;
+ !isTargetVisibleToInstantApp
+ || (matchExplicitlyVisibleOnly && !isTargetExplicitlyVisibleToInstantApp);
final boolean blockResolution =
!isTargetSameInstantApp
&& ((!matchInstantApp && !isCallerInstantApp && isTargetInstantApp)
@@ -6263,7 +6399,6 @@
boolean sortResult = false;
boolean addEphemeral = false;
List<ResolveInfo> result;
- final String pkgName = intent.getPackage();
final boolean ephemeralDisabled = isEphemeralDisabled();
synchronized (mPackages) {
if (pkgName == null) {
@@ -6350,7 +6485,7 @@
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "resolveEphemeral");
final InstantAppRequest requestObject = new InstantAppRequest(
null /*responseObj*/, intent /*origIntent*/, resolvedType,
- null /*callingPackage*/, userId);
+ null /*callingPackage*/, userId, null /*verificationBundle*/);
final AuxiliaryResolveInfo auxiliaryResponse =
InstantAppResolver.doInstantAppResolutionPhaseOne(
mContext, mInstantAppResolverConnection, requestObject);
@@ -6529,7 +6664,7 @@
}
// allow activities that have been explicitly exposed to ephemeral apps
if (!isEphemeralApp
- && ((info.activityInfo.flags & ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL) != 0)) {
+ && ((info.activityInfo.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0)) {
continue;
}
resolveInfos.remove(i);
@@ -7069,16 +7204,16 @@
@Override
public ResolveInfo resolveService(Intent intent, String resolvedType, int flags, int userId) {
final int callingUid = Binder.getCallingUid();
- return resolveServiceInternal(
- intent, resolvedType, flags, userId, callingUid, false /*includeInstantApps*/);
+ return resolveServiceInternal(intent, resolvedType, flags, userId, callingUid);
}
private ResolveInfo resolveServiceInternal(Intent intent, String resolvedType, int flags,
- int userId, int callingUid, boolean includeInstantApps) {
+ int userId, int callingUid) {
if (!sUserManager.exists(userId)) return null;
- flags = updateFlagsForResolve(flags, userId, intent, callingUid, includeInstantApps);
+ flags = updateFlagsForResolve(
+ flags, userId, intent, callingUid, false /*includeInstantApps*/);
List<ResolveInfo> query = queryIntentServicesInternal(
- intent, resolvedType, flags, userId, callingUid, includeInstantApps);
+ intent, resolvedType, flags, userId, callingUid, false /*includeInstantApps*/);
if (query != null) {
if (query.size() >= 1) {
// If there is more than one service with the same priority,
@@ -7130,7 +7265,7 @@
(si.applicationInfo.privateFlags
& ApplicationInfo.PRIVATE_FLAG_INSTANT) != 0;
final boolean isTargetHiddenFromInstantApp =
- (si.flags & ServiceInfo.FLAG_VISIBLE_TO_EPHEMERAL) == 0;
+ (si.flags & ServiceInfo.FLAG_VISIBLE_TO_INSTANT_APP) == 0;
final boolean blockResolution =
!isTargetSameInstantApp
&& ((!matchInstantApp && !isCallerInstantApp && isTargetInstantApp)
@@ -7202,7 +7337,7 @@
}
// allow services that have been explicitly exposed to ephemeral apps
if (!isEphemeralApp
- && ((info.serviceInfo.flags & ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL) != 0)) {
+ && ((info.serviceInfo.flags & ServiceInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0)) {
continue;
}
resolveInfos.remove(i);
@@ -7251,7 +7386,7 @@
(pi.applicationInfo.privateFlags
& ApplicationInfo.PRIVATE_FLAG_INSTANT) != 0;
final boolean isTargetHiddenFromInstantApp =
- (pi.flags & ProviderInfo.FLAG_VISIBLE_TO_EPHEMERAL) == 0;
+ (pi.flags & ProviderInfo.FLAG_VISIBLE_TO_INSTANT_APP) == 0;
final boolean blockResolution =
!isTargetSameInstantApp
&& ((!matchInstantApp && !isCallerInstantApp && isTargetInstantApp)
@@ -7323,7 +7458,7 @@
}
// allow providers that have been explicitly exposed to instant applications
if (!isEphemeralApp
- && ((info.providerInfo.flags & ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL) != 0)) {
+ && ((info.providerInfo.flags & ProviderInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0)) {
continue;
}
resolveInfos.remove(i);
@@ -7683,7 +7818,8 @@
}
// instant application; filter out non-exposed provider
if (instantAppPkgName != null
- && (provider.info.flags & ProviderInfo.FLAG_VISIBLE_TO_EPHEMERAL) == 0) {
+ && !isInstantApp
+ && (provider.info.flags & ProviderInfo.FLAG_VISIBLE_TO_INSTANT_APP) == 0) {
return null;
}
// provider not enabled
@@ -7833,7 +7969,8 @@
+ " flags=0x" + Integer.toHexString(parseFlags));
}
ParallelPackageParser parallelPackageParser = new ParallelPackageParser(
- mSeparateProcesses, mOnlyCore, mMetrics, mCacheDir, mPackageParserCallback);
+ mSeparateProcesses, mOnlyCore, mMetrics, mCacheDir,
+ mParallelPackageParserCallback);
// Submit files for parsing in parallel
int fileCount = 0;
@@ -12429,16 +12566,21 @@
if (ai == null) {
return null;
}
+ final boolean matchExplicitlyVisibleOnly =
+ (mFlags & PackageManager.MATCH_EXPLICITLY_VISIBLE_ONLY) != 0;
final boolean matchVisibleToInstantApp =
(mFlags & PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY) != 0;
- final boolean isInstantApp = (mFlags & PackageManager.MATCH_INSTANT) != 0;
+ final boolean componentVisible =
+ matchVisibleToInstantApp
+ && info.isVisibleToInstantApp()
+ && (!matchExplicitlyVisibleOnly || info.isExplicitlyVisibleToInstantApp());
+ final boolean matchInstantApp = (mFlags & PackageManager.MATCH_INSTANT) != 0;
// throw out filters that aren't visible to ephemeral apps
- if (matchVisibleToInstantApp
- && !(info.isVisibleToInstantApp() || userState.instantApp)) {
+ if (matchVisibleToInstantApp && !(componentVisible || userState.instantApp)) {
return null;
}
- // throw out ephemeral filters if we're not explicitly requesting them
- if (!isInstantApp && userState.instantApp) {
+ // throw out instant app filters if we're not explicitly requesting them
+ if (!matchInstantApp && userState.instantApp) {
return null;
}
// throw out instant app filters if updates are available; will trigger
@@ -14117,9 +14259,6 @@
synchronized (mPackages) {
boolean result = mSettings.setDefaultBrowserPackageNameLPw(packageName, userId);
if (packageName != null) {
- result |= updateIntentVerificationStatus(packageName,
- PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS,
- userId);
mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultBrowserLPr(
packageName, userId);
}
@@ -17050,10 +17189,10 @@
PackageParser.Permission perm = pkg.permissions.get(i);
BasePermission bp = mSettings.mPermissions.get(perm.info.name);
- // Don't allow anyone but the platform to define ephemeral permissions.
+ // Don't allow anyone but the system to define ephemeral permissions.
if ((perm.info.protectionLevel & PermissionInfo.PROTECTION_FLAG_EPHEMERAL) != 0
- && !PLATFORM_PACKAGE_NAME.equals(pkg.packageName)) {
- Slog.w(TAG, "Package " + pkg.packageName
+ && !systemApp) {
+ Slog.w(TAG, "Non-System package " + pkg.packageName
+ " attempting to delcare ephemeral permission "
+ perm.info.name + "; Removing ephemeral.");
perm.info.protectionLevel &= ~PermissionInfo.PROTECTION_FLAG_EPHEMERAL;
@@ -18588,6 +18727,7 @@
destroyAppDataLIF(pkg, userId,
StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE);
destroyAppProfilesLIF(pkg, userId);
+ clearDefaultBrowserIfNeededForUser(ps.name, userId);
removeKeystoreDataIfNeeded(nextUserId, ps.appId);
schedulePackageCleaning(ps.name, nextUserId, false);
synchronized (mPackages) {
@@ -19309,12 +19449,18 @@
}
}
+ /** Clears state for all users, and touches intent filter verification policy */
void clearDefaultBrowserIfNeeded(String packageName) {
for (int oneUserId : sUserManager.getUserIds()) {
- String defaultBrowserPackageName = getDefaultBrowserPackageName(oneUserId);
- if (TextUtils.isEmpty(defaultBrowserPackageName)) continue;
+ clearDefaultBrowserIfNeededForUser(packageName, oneUserId);
+ }
+ }
+
+ private void clearDefaultBrowserIfNeededForUser(String packageName, int userId) {
+ final String defaultBrowserPackageName = getDefaultBrowserPackageName(userId);
+ if (!TextUtils.isEmpty(defaultBrowserPackageName)) {
if (packageName.equals(defaultBrowserPackageName)) {
- setDefaultBrowserPackageName(null, oneUserId);
+ setDefaultBrowserPackageName(null, userId);
}
}
}
@@ -20538,6 +20684,7 @@
public static final int DUMP_DEXOPT = 1 << 20;
public static final int DUMP_COMPILER_STATS = 1 << 21;
public static final int DUMP_ENABLED_OVERLAYS = 1 << 22;
+ public static final int DUMP_CHANGES = 1 << 23;
public static final int OPTION_SHOW_FILTERS = 1 << 0;
@@ -20783,6 +20930,8 @@
dumpState.setDump(DumpState.DUMP_COMPILER_STATS);
} else if ("enabled-overlays".equals(cmd)) {
dumpState.setDump(DumpState.DUMP_ENABLED_OVERLAYS);
+ } else if ("changes".equals(cmd)) {
+ dumpState.setDump(DumpState.DUMP_CHANGES);
} else if ("write".equals(cmd)) {
synchronized (mPackages) {
mSettings.writeLPr();
@@ -21113,6 +21262,31 @@
mSettings.dumpSharedUsersLPr(pw, packageName, permissionNames, dumpState, checkin);
}
+ if (dumpState.isDumping(DumpState.DUMP_CHANGES)) {
+ if (dumpState.onTitlePrinted()) pw.println();
+ pw.println("Package Changes:");
+ pw.print(" Sequence number="); pw.println(mChangedPackagesSequenceNumber);
+ final int K = mChangedPackages.size();
+ for (int i = 0; i < K; i++) {
+ final SparseArray<String> changes = mChangedPackages.valueAt(i);
+ pw.print(" User "); pw.print(mChangedPackages.keyAt(i)); pw.println(":");
+ final int N = changes.size();
+ if (N == 0) {
+ pw.print(" "); pw.println("No packages changed");
+ } else {
+ for (int j = 0; j < N; j++) {
+ final String pkgName = changes.valueAt(j);
+ final int sequenceNumber = changes.keyAt(j);
+ pw.print(" ");
+ pw.print("seq=");
+ pw.print(sequenceNumber);
+ pw.print(", package=");
+ pw.println(pkgName);
+ }
+ }
+ }
+ }
+
if (!checkin && dumpState.isDumping(DumpState.DUMP_PERMISSIONS) && packageName == null) {
mSettings.dumpRestoredPermissionGrantsLPr(pw, dumpState);
}
@@ -23391,9 +23565,11 @@
@Override
public void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj,
- Intent origIntent, String resolvedType, String callingPackage, int userId) {
+ Intent origIntent, String resolvedType, String callingPackage,
+ Bundle verificationBundle, int userId) {
PackageManagerService.this.requestInstantAppResolutionPhaseTwo(
- responseObj, origIntent, resolvedType, callingPackage, userId);
+ responseObj, origIntent, resolvedType, callingPackage, verificationBundle,
+ userId);
}
@Override
@@ -23516,14 +23692,13 @@
public ResolveInfo resolveIntent(Intent intent, String resolvedType,
int flags, int userId) {
return resolveIntentInternal(
- intent, resolvedType, flags, userId, true /*includeInstantApps*/);
+ intent, resolvedType, flags, userId, true /*resolveForStart*/);
}
@Override
public ResolveInfo resolveService(Intent intent, String resolvedType,
int flags, int userId, int callingUid) {
- return resolveServiceInternal(
- intent, resolvedType, flags, userId, callingUid, true /*includeInstantApps*/);
+ return resolveServiceInternal(intent, resolvedType, flags, userId, callingUid);
}
@Override
@@ -23539,6 +23714,13 @@
mIsolatedOwners.delete(isolatedUid);
}
}
+
+ @Override
+ public int getUidTargetSdkVersion(int uid) {
+ synchronized (mPackages) {
+ return getUidTargetSdkVersionLockedLPr(uid);
+ }
+ }
}
@Override
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 554deae..cea031e 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -1386,7 +1386,11 @@
if (userId == UserHandle.USER_ALL) {
return false;
}
- mDefaultBrowserApp.put(userId, packageName);
+ if (packageName != null) {
+ mDefaultBrowserApp.put(userId, packageName);
+ } else {
+ mDefaultBrowserApp.remove(userId);
+ }
writePackageRestrictionsLPr(userId);
return true;
}
diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
index 84381fe..c6667a7 100644
--- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
+++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
@@ -74,6 +74,7 @@
UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES,
UserManager.DISALLOW_CONFIG_BLUETOOTH,
UserManager.DISALLOW_BLUETOOTH,
+ UserManager.DISALLOW_BLUETOOTH_SHARING,
UserManager.DISALLOW_USB_FILE_TRANSFER,
UserManager.DISALLOW_CONFIG_CREDENTIALS,
UserManager.DISALLOW_REMOVE_USER,
@@ -155,6 +156,7 @@
*/
private static final Set<String> GLOBAL_RESTRICTIONS = Sets.newArraySet(
UserManager.DISALLOW_ADJUST_VOLUME,
+ UserManager.DISALLOW_BLUETOOTH_SHARING,
UserManager.DISALLOW_RUN_IN_BACKGROUND,
UserManager.DISALLOW_UNMUTE_MICROPHONE,
UserManager.DISALLOW_UNMUTE_DEVICE
@@ -167,6 +169,17 @@
UserManager.DISALLOW_ADD_MANAGED_PROFILE
);
+ /**
+ * User restrictions that default to {@code true} for managed profile owners.
+ *
+ * NB: {@link UserManager#DISALLOW_INSTALL_UNKNOWN_SOURCES} is also set by default but it is
+ * not set to existing profile owners unless they used to have INSTALL_NON_MARKET_APPS disabled
+ * in settings. So it is handled separately.
+ */
+ private static final Set<String> DEFAULT_ENABLED_FOR_MANAGED_PROFILES = Sets.newArraySet(
+ UserManager.DISALLOW_BLUETOOTH_SHARING
+ );
+
/*
* Special user restrictions that are always applied to all users no matter who sets them.
*/
@@ -308,6 +321,13 @@
}
/**
+ * Returns the user restrictions that default to {@code true} for managed profile owners.
+ */
+ public static @NonNull Set<String> getDefaultEnabledForManagedProfiles() {
+ return DEFAULT_ENABLED_FOR_MANAGED_PROFILES;
+ }
+
+ /**
* Takes restrictions that can be set by device owner, and sort them into what should be applied
* globally and what should be applied only on the current user.
*/
@@ -544,8 +564,8 @@
public static void moveRestriction(String restrictionKey, SparseArray<Bundle> srcRestrictions,
SparseArray<Bundle> destRestrictions) {
for (int i = 0; i < srcRestrictions.size(); i++) {
- int key = srcRestrictions.keyAt(i);
- Bundle from = srcRestrictions.valueAt(i);
+ final int key = srcRestrictions.keyAt(i);
+ final Bundle from = srcRestrictions.valueAt(i);
if (contains(from, restrictionKey)) {
from.remove(restrictionKey);
Bundle to = destRestrictions.get(key);
@@ -562,4 +582,24 @@
}
}
}
+
+ /**
+ * Returns whether restrictions differ between two bundles.
+ * @param oldRestrictions old bundle of restrictions.
+ * @param newRestrictions new bundle of restrictions
+ * @param restrictions restrictions of interest, if empty, all restrictions are checked.
+ */
+ public static boolean restrictionsChanged(Bundle oldRestrictions, Bundle newRestrictions,
+ String... restrictions) {
+ if (restrictions.length == 0) {
+ return areEqual(oldRestrictions, newRestrictions);
+ }
+ for (final String restriction : restrictions) {
+ if (oldRestrictions.getBoolean(restriction, false) !=
+ newRestrictions.getBoolean(restriction, false)) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java
index 364bf28..ebb9450 100644
--- a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java
+++ b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java
@@ -193,6 +193,7 @@
0
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
,
PixelFormat.TRANSLUCENT);
lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 1d064de..7e03d80 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -5909,7 +5909,7 @@
// handled it send it to the session manager to
// figure out.
MediaSessionLegacyHelper.getHelper(mContext).sendVolumeKeyEvent(
- event, AudioManager.USE_DEFAULT_STREAM_TYPE, false);
+ event, AudioManager.USE_DEFAULT_STREAM_TYPE, true);
}
break;
}
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 61ed72d..8c3d80f 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -65,6 +65,7 @@
import android.service.vr.IVrStateCallbacks;
import android.util.EventLog;
import android.util.KeyValueListParser;
+import android.util.Log;
import android.util.PrintWriterPrinter;
import android.util.Slog;
import android.util.SparseArray;
@@ -91,6 +92,10 @@
import com.android.server.lights.Light;
import com.android.server.lights.LightsManager;
import com.android.server.power.BatterySaverPolicy.ServiceType;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
import libcore.util.Objects;
import java.io.FileDescriptor;
@@ -191,6 +196,12 @@
// System property indicating that the screen should remain off until an explicit user action
private static final String SYSTEM_PROPERTY_QUIESCENT = "ro.boot.quiescent";
+ // Possible reasons for shutting down for use in data/misc/reboot/last_shutdown_reason
+ private static final String REASON_SHUTDOWN = "shutdown";
+ private static final String REASON_REBOOT = "reboot";
+ private static final String REASON_USERREQUESTED = "userrequested";
+ private static final String REASON_THERMAL_SHUTDOWN = "thermal-shutdown";
+
private static final String TRACE_SCREEN_ON = "Screen turning on";
/** If turning screen on takes more than this long, we show a warning on logcat. */
@@ -204,6 +215,9 @@
private static final int HALT_MODE_REBOOT = 1;
private static final int HALT_MODE_REBOOT_SAFE_MODE = 2;
+ // File location for last reboot reason
+ private static final String LAST_REBOOT_LOCATION = "/data/misc/reboot/last_reboot_reason";
+
private final Context mContext;
private final ServiceThread mHandlerThread;
private final PowerManagerHandler mHandler;
@@ -4340,6 +4354,25 @@
}
/**
+ * Gets the reason for the last time the phone had to reboot.
+ *
+ * @return The reason the phone last shut down as an int or
+ * {@link PowerManager.SHUTDOWN_REASON_UNKNOWN} if the file could not be opened.
+ */
+ @Override // Binder call
+ public int getLastShutdownReason() {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.DEVICE_POWER, null);
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ return getLastShutdownReasonInternal(new File(LAST_REBOOT_LOCATION));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ /**
* Reboots the device.
*
* @param confirm If true, shows a reboot confirmation dialog.
@@ -4566,6 +4599,28 @@
}
}
+ @VisibleForTesting
+ int getLastShutdownReasonInternal(File lastRebootReason) {
+ String line = "";
+ try (BufferedReader bufferedReader = new BufferedReader(new FileReader(lastRebootReason))){
+ line = bufferedReader.readLine();
+ } catch (IOException e) {
+ Slog.e(TAG, "Failed to read last_reboot_reason file", e);
+ }
+ switch (line) {
+ case REASON_SHUTDOWN:
+ return PowerManager.SHUTDOWN_REASON_SHUTDOWN;
+ case REASON_REBOOT:
+ return PowerManager.SHUTDOWN_REASON_REBOOT;
+ case REASON_USERREQUESTED:
+ return PowerManager.SHUTDOWN_REASON_USER_REQUESTED;
+ case REASON_THERMAL_SHUTDOWN:
+ return PowerManager.SHUTDOWN_REASON_THERMAL_SHUTDOWN;
+ default:
+ return PowerManager.SHUTDOWN_REASON_UNKNOWN;
+ }
+ }
+
private final class LocalService extends PowerManagerInternal {
@Override
public void setScreenBrightnessOverrideFromWindowManager(int screenBrightness) {
diff --git a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
index 275b612..fbc9e56 100644
--- a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
+++ b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
@@ -660,7 +660,7 @@
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setCategory(Notification.CATEGORY_SYSTEM)
.extend(new Notification.TvExtender()
- .setChannel(TV_NOTIFICATION_CHANNEL_ID))
+ .setChannelId(TV_NOTIFICATION_CHANNEL_ID))
.build();
notification.flags |= Notification.FLAG_NO_CLEAR;
notificationMgr.notifyAsUser(null, SystemMessage.NOTE_LOW_STORAGE, notification,
diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java
index 39a1573..860b241 100644
--- a/services/core/java/com/android/server/vr/VrManagerService.java
+++ b/services/core/java/com/android/server/vr/VrManagerService.java
@@ -656,16 +656,12 @@
false, mOverlayToken, null, oldUserId);
}
- if (!mVrModeEnabled) {
- return;
- }
-
// Apply the restrictions for the current user based on vr state
String[] exemptions = (exemptedPackage == null) ? new String[0] :
new String[] { exemptedPackage };
appOpsManager.setUserRestrictionForUser(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
- true, mOverlayToken, exemptions, newUserId);
+ mVrModeEnabled, mOverlayToken, exemptions, newUserId);
}
private void updateDependentAppOpsLocked(String newVrServicePackage, int newUserId,
diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java
index 292734d..c625cbe 100644
--- a/services/core/java/com/android/server/wm/AppWindowContainerController.java
+++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java
@@ -323,7 +323,7 @@
}
}
- public void setVisibility(boolean visible) {
+ public void setVisibility(boolean visible, boolean deferHidingClient) {
synchronized(mWindowMap) {
if (mContainer == null) {
Slog.w(TAG_WM, "Attempted to set visibility of non-existing app token: "
@@ -342,6 +342,7 @@
mService.mClosingApps.remove(wtoken);
wtoken.waitingToShow = false;
wtoken.hiddenRequested = !visible;
+ wtoken.mDeferHidingClient = deferHidingClient;
if (!visible) {
// If the app is dead while it was visible, we kept its dead window on screen.
@@ -368,15 +369,12 @@
wtoken.waitingToShow = true;
}
- if (wtoken.clientHidden) {
- // In the case where we are making an app visible
- // but holding off for a transition, we still need
- // to tell the client to make its windows visible so
- // they get drawn. Otherwise, we will wait on
- // performing the transition until all windows have
- // been drawn, they never will be, and we are sad.
- wtoken.clientHidden = false;
- wtoken.sendAppVisibilityToClients();
+ if (wtoken.isClientHidden()) {
+ // In the case where we are making an app visible but holding off for a
+ // transition, we still need to tell the client to make its windows visible
+ // so they get drawn. Otherwise, we will wait on performing the transition
+ // until all windows have been drawn, they never will be, and we are sad.
+ wtoken.setClientHidden(false);
}
}
wtoken.requestUpdateWallpaperIfNeeded();
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 847545a..36418be 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -129,7 +129,11 @@
boolean hiddenRequested;
// Have we told the window clients to hide themselves?
- boolean clientHidden;
+ private boolean mClientHidden;
+
+ // If true we will defer setting mClientHidden to true and reporting to the client that it is
+ // hidden.
+ boolean mDeferHidingClient;
// Last visibility state we reported to the app token.
boolean reportedVisible;
@@ -312,16 +316,25 @@
}
}
+ boolean isClientHidden() {
+ return mClientHidden;
+ }
+
+ void setClientHidden(boolean hideClient) {
+ if (mClientHidden == hideClient || (hideClient && mDeferHidingClient)) {
+ return;
+ }
+ mClientHidden = hideClient;
+ sendAppVisibilityToClients();
+ }
+
boolean setVisibility(WindowManager.LayoutParams lp,
boolean visible, int transit, boolean performLayout, boolean isVoiceInteraction) {
boolean delayed = false;
inPendingTransaction = false;
- if (clientHidden == visible) {
- clientHidden = !visible;
- sendAppVisibilityToClients();
- }
+ setClientHidden(!visible);
// Allow for state changes and animation to be applied if:
// * token is transitioning visibility state
@@ -880,6 +893,7 @@
if (mPendingRelaunchCount > 0) {
mPendingRelaunchCount--;
}
+ updateAllDrawn();
}
void clearRelaunching() {
@@ -1165,10 +1179,7 @@
hidden = false;
hiddenRequested = false;
}
- if (clientHidden != fromToken.clientHidden) {
- clientHidden = fromToken.clientHidden;
- sendAppVisibilityToClients();
- }
+ setClientHidden(fromToken.mClientHidden);
fromToken.mAppAnimator.transferCurrentAnimation(
mAppAnimator, tStartingWindow.mWinAnimator);
@@ -1291,16 +1302,20 @@
}
}
- void updateAllDrawn(DisplayContent dc) {
+ void updateAllDrawn() {
if (!allDrawn) {
+ // Number of drawn windows can be less when a window is being relaunched, wait for
+ // all windows to be launched and drawn for this token be considered all drawn
final int numInteresting = mNumInterestingWindows;
- if (numInteresting > 0 && mNumDrawnWindows >= numInteresting) {
+ if (numInteresting > 0 && mNumDrawnWindows >= numInteresting && !isRelaunching()) {
if (DEBUG_VISIBILITY) Slog.v(TAG, "allDrawn: " + this
+ " interesting=" + numInteresting + " drawn=" + mNumDrawnWindows);
allDrawn = true;
// Force an additional layout pass where
// WindowStateAnimator#commitFinishDrawingLocked() will call performShowLocked().
- dc.setLayoutNeeded();
+ if (mDisplayContent != null) {
+ mDisplayContent.setLayoutNeeded();
+ }
mService.mH.obtainMessage(NOTIFY_ACTIVITY_DRAWN, token).sendToTarget();
final TaskStack s = getStack();
@@ -1317,7 +1332,9 @@
+ " interesting=" + numInteresting
+ " drawn=" + mNumDrawnWindowsExcludingSaved);
allDrawnExcludingSaved = true;
- dc.setLayoutNeeded();
+ if (mDisplayContent != null) {
+ mDisplayContent.setLayoutNeeded();
+ }
if (isAnimatingInvisibleWithSavedSurface()
&& !mService.mFinishedEarlyAnim.contains(this)) {
mService.mFinishedEarlyAnim.add(this);
@@ -1533,10 +1550,9 @@
pw.print(prefix); pw.print("task="); pw.println(getTask());
pw.print(prefix); pw.print(" mFillsParent="); pw.print(mFillsParent);
pw.print(" mOrientation="); pw.println(mOrientation);
- pw.print(prefix); pw.print("hiddenRequested="); pw.print(hiddenRequested);
- pw.print(" clientHidden="); pw.print(clientHidden);
- pw.print(" reportedDrawn="); pw.print(reportedDrawn);
- pw.print(" reportedVisible="); pw.println(reportedVisible);
+ pw.println(prefix + "hiddenRequested=" + hiddenRequested + " mClientHidden=" + mClientHidden
+ + ((mDeferHidingClient) ? " mDeferHidingClient=" + mDeferHidingClient : "")
+ + " reportedDrawn=" + reportedDrawn + " reportedVisible=" + reportedVisible);
if (paused) {
pw.print(prefix); pw.print("paused="); pw.println(paused);
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 1823610..05b95e2 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -666,8 +666,9 @@
}
}
}
- if ((!winAnimator.isAnimationStarting() && !winAnimator.isWaitingForOpening()) ||
- winAnimator.isDummyAnimation()) {
+ final TaskStack stack = w.getStack();
+ if ((!winAnimator.isAnimationStarting() && !winAnimator.isWaitingForOpening())
+ || (stack != null && stack.isAnimatingBounds())) {
// Updates the shown frame before we set up the surface. This is needed
// because the resizing could change the top-left position (in addition to
// size) of the window. setSurfaceBoundariesLocked uses mShownPosition to
@@ -675,7 +676,10 @@
//
// If an animation is being started, we can't call this method because the
// animation hasn't processed its initial transformation yet, but in general
- // we do want to update the position if the window is animating.
+ // we do want to update the position if the window is animating. We make an exception
+ // for the bounds animating state, where an application may have been waiting
+ // for an exit animation to start, but instead enters PiP. We need to ensure
+ // we always recompute the top-left in this case.
winAnimator.computeShownFrameLocked();
}
winAnimator.setSurfaceBoundariesLocked(mTmpRecoveringMemory /* recoveringMemory */);
@@ -1950,7 +1954,8 @@
for (int i = mTaskStackContainers.size() - 1; i >= 0; --i) {
final TaskStack stack = mTaskStackContainers.get(i);
final boolean isDockedOnBottom = stack.getDockSide() == DOCKED_BOTTOM;
- if (stack.isVisible() && (imeOnBottom || isDockedOnBottom)) {
+ if (stack.isVisible() && (imeOnBottom || isDockedOnBottom) &&
+ StackId.isStackAffectedByDragResizing(stack.mStackId)) {
stack.setAdjustedForIme(imeWin, imeOnBottom && imeHeightChanged);
} else {
stack.resetAdjustedForIme(false);
@@ -2245,7 +2250,7 @@
wsa.destroySurface();
mService.mForceRemoves.add(w);
mTmpWindow = w;
- } else if (w.mAppToken != null && w.mAppToken.clientHidden) {
+ } else if (w.mAppToken != null && w.mAppToken.isClientHidden()) {
Slog.w(TAG_WM, "LEAKED SURFACE (app token hidden): "
+ w + " surface=" + wsa.mSurfaceController
+ " token=" + w.mAppToken
@@ -2725,7 +2730,7 @@
final AppWindowToken atoken = mTmpUpdateAllDrawn.removeLast();
// See if any windows have been drawn, so they (and others associated with them)
// can now be shown.
- atoken.updateAllDrawn(this);
+ atoken.updateAllDrawn();
}
return mTmpApplySurfaceChangesTransactionState.focusDisplayed;
diff --git a/services/core/java/com/android/server/wm/PinnedStackWindowController.java b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
index 5b9c16c..b0b93ab 100644
--- a/services/core/java/com/android/server/wm/PinnedStackWindowController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
@@ -17,6 +17,8 @@
package com.android.server.wm;
import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID;
+import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
+
import static com.android.server.wm.BoundsAnimationController.NO_PIP_MODE_CHANGED_CALLBACKS;
import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_END;
import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_START;
@@ -42,6 +44,42 @@
}
/**
+ * @param useExistingStackBounds Apply {@param aspectRatio} to the existing target stack bounds
+ * if possible
+ */
+ public Rect getPictureInPictureBounds(float aspectRatio, boolean useExistingStackBounds) {
+ synchronized (mWindowMap) {
+ if (!mService.mSupportsPictureInPicture || mContainer == null) {
+ return null;
+ }
+
+ final Rect stackBounds;
+ final DisplayContent displayContent = mContainer.getDisplayContent();
+ if (displayContent == null) {
+ return null;
+ }
+
+ final PinnedStackController pinnedStackController =
+ displayContent.getPinnedStackController();
+ if (useExistingStackBounds) {
+ // If the stack exists, then use its final bounds to calculate the new aspect ratio
+ // bounds
+ stackBounds = new Rect();
+ mContainer.getAnimationOrCurrentBounds(stackBounds);
+ } else {
+ // Otherwise, just calculate the aspect ratio bounds from the default bounds
+ stackBounds = pinnedStackController.getDefaultBounds();
+ }
+
+ if (pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio)) {
+ return pinnedStackController.transformBoundsToAspectRatio(stackBounds, aspectRatio);
+ } else {
+ return stackBounds;
+ }
+ }
+ }
+
+ /**
* Animates the pinned stack.
*/
public void animateResizePinnedStack(Rect toBounds, Rect sourceHintBounds,
@@ -104,8 +142,7 @@
return;
}
- final int displayId = mContainer.getDisplayContent().getDisplayId();
- final Rect toBounds = mService.getPictureInPictureBounds(displayId, aspectRatio,
+ final Rect toBounds = getPictureInPictureBounds(aspectRatio,
true /* useExistingStackBounds */);
final Rect targetBounds = new Rect();
mContainer.getAnimationOrCurrentBounds(targetBounds);
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index a1b1cd0..60b136f 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -674,7 +674,7 @@
if (win.getDisplayContent().mWallpaperController.isWallpaperTarget(win)) {
wallpaperDestroyed = true;
}
- win.destroyOrSaveSurface();
+ win.destroyOrSaveSurfaceUnchecked();
} while (i > 0);
mService.mDestroySurface.clear();
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 4262d12..0a999e6 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -382,9 +382,7 @@
* the adjusted bounds's top.
*/
void alignToAdjustedBounds(Rect adjustedBounds, Rect tempInsetBounds, boolean alignBottom) {
- // Task override config might be empty, while display or stack override config isn't, so
- // we have to check merged override config here.
- if (!isResizeable() || Configuration.EMPTY.equals(getMergedOverrideConfiguration())) {
+ if (!isResizeable() || Configuration.EMPTY.equals(getOverrideConfiguration())) {
return;
}
@@ -439,7 +437,7 @@
for (int i = mChildren.size() - 1; i >= 0; i--) {
final AppWindowToken token = mChildren.get(i);
// skip hidden (or about to hide) apps
- if (token.mIsExiting || token.clientHidden || token.hiddenRequested) {
+ if (token.mIsExiting || token.isClientHidden() || token.hiddenRequested) {
continue;
}
final WindowState win = token.findMainWindow();
@@ -607,7 +605,7 @@
for (int i = mChildren.size() - 1; i >= 0; i--) {
final AppWindowToken token = mChildren.get(i);
// skip hidden (or about to hide) apps
- if (!token.mIsExiting && !token.clientHidden && !token.hiddenRequested) {
+ if (!token.mIsExiting && !token.isClientHidden() && !token.hiddenRequested) {
return token;
}
}
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 1feb743..da7a9f0 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -733,10 +733,17 @@
outTempTaskBounds.setEmpty();
// When the home stack is resizable, should always have the same stack and task bounds
- if (mStackId == HOME_STACK_ID && findHomeTask().isResizeable()) {
- // Calculate the home stack bounds when in docked mode
- getDisplayContent().mDividerControllerLocked
- .getHomeStackBoundsInDockedMode(outStackBounds);
+ if (mStackId == HOME_STACK_ID) {
+ if (findHomeTask().isResizeable()) {
+ // Calculate the home stack bounds when in docked mode and the home stack is
+ // resizeable.
+ getDisplayContent().mDividerControllerLocked
+ .getHomeStackBoundsInDockedMode(outStackBounds);
+ } else {
+ // Home stack isn't resizeable, so don't specify stack bounds.
+ outStackBounds.setEmpty();
+ }
+
outTempTaskBounds.set(outStackBounds);
return;
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 2a01aa2..a7f6600 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -1470,7 +1470,7 @@
if (mInTouchMode) {
res |= WindowManagerGlobal.ADD_FLAG_IN_TOUCH_MODE;
}
- if (win.mAppToken == null || !win.mAppToken.clientHidden) {
+ if (win.mAppToken == null || !win.mAppToken.isClientHidden()) {
res |= WindowManagerGlobal.ADD_FLAG_APP_VISIBLE;
}
@@ -1950,7 +1950,7 @@
}
if (viewVisibility == View.VISIBLE &&
(win.mAppToken == null || win.mAttrs.type == TYPE_APPLICATION_STARTING
- || !win.mAppToken.clientHidden)) {
+ || !win.mAppToken.isClientHidden())) {
result = win.relayoutVisibleWindow(mergedConfiguration, result, attrChanges,
oldVisibility);
try {
@@ -2141,7 +2141,12 @@
if (mInputMethodWindow == win) {
setInputMethodWindowLocked(null);
}
- win.destroyOrSaveSurface();
+ boolean stopped = win.mAppToken != null ? win.mAppToken.mAppStopped : false;
+ // We set mDestroying=true so AppWindowToken#notifyAppStopped in-to destroy surfaces
+ // will later actually destroy the surface if we do not do so here. Normally we leave
+ // this to the exit animation.
+ win.mDestroying = true;
+ win.destroySurface(false, stopped);
}
// TODO(multidisplay): Magnification is supported only for the default display.
if (mAccessibilityController != null && win.getDisplayId() == DEFAULT_DISPLAY) {
@@ -2756,44 +2761,6 @@
mDockedStackCreateBounds = bounds;
}
- /**
- * @param useExistingStackBounds Apply {@param aspectRatio} to the existing target stack bounds
- * if possible
- */
- public Rect getPictureInPictureBounds(int displayId, float aspectRatio,
- boolean useExistingStackBounds) {
- synchronized (mWindowMap) {
- if (!mSupportsPictureInPicture) {
- return null;
- }
-
- final Rect stackBounds;
- final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
- if (displayContent == null) {
- return null;
- }
-
- final PinnedStackController pinnedStackController =
- displayContent.getPinnedStackController();
- final TaskStack stack = displayContent.getStackById(PINNED_STACK_ID);
- if (stack != null && useExistingStackBounds) {
- // If the stack exists, then use its final bounds to calculate the new aspect ratio
- // bounds.
- stackBounds = new Rect();
- stack.getAnimationOrCurrentBounds(stackBounds);
- } else {
- // Otherwise, just calculate the aspect ratio bounds from the default bounds
- stackBounds = pinnedStackController.getDefaultBounds();
- }
-
- if (pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio)) {
- return pinnedStackController.transformBoundsToAspectRatio(stackBounds, aspectRatio);
- } else {
- return stackBounds;
- }
- }
- }
-
public boolean isValidPictureInPictureAspectRatio(int displayId, float aspectRatio) {
final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
return displayContent.getPinnedStackController().isValidPictureInPictureAspectRatio(
@@ -4313,7 +4280,10 @@
if (mWaitingForConfig) {
mWaitingForConfig = false;
mLastFinishedFreezeSource = "config-unchanged";
- mRoot.getDisplayContent(displayId).setLayoutNeeded();
+ final DisplayContent dc = mRoot.getDisplayContent(displayId);
+ if (dc != null) {
+ dc.setLayoutNeeded();
+ }
mWindowPlacerLocked.performSurfacePlacement();
}
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index b9776a3..67516c1 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -1399,7 +1399,7 @@
* @return true if the window should be considered while evaluating allDrawn flags.
*/
boolean mightAffectAllDrawn(boolean visibleOnly) {
- final boolean isViewVisible = (mAppToken == null || !mAppToken.clientHidden)
+ final boolean isViewVisible = (mAppToken == null || !mAppToken.isClientHidden())
&& (mViewVisibility == View.VISIBLE) && !mWindowRemovalAllowed;
return (isOnScreen() && (!visibleOnly || isViewVisible)
|| mWinAnimator.mAttrType == TYPE_BASE_APPLICATION
@@ -2312,7 +2312,7 @@
* interacts with it.
*/
boolean shouldKeepVisibleDeadAppWindow() {
- if (!isWinVisibleLw() || mAppToken == null || mAppToken.clientHidden) {
+ if (!isWinVisibleLw() || mAppToken == null || mAppToken.isClientHidden()) {
// Not a visible app window or the app isn't dead.
return false;
}
@@ -2570,12 +2570,24 @@
void sendAppVisibilityToClients() {
super.sendAppVisibilityToClients();
- final boolean clientHidden = mAppToken.clientHidden;
+ final boolean clientHidden = mAppToken.isClientHidden();
if (mAttrs.type == TYPE_APPLICATION_STARTING && clientHidden) {
// Don't hide the starting window.
return;
}
+ if (clientHidden) {
+ // Once we are notifying the client that it's visibility has changed, we need to prevent
+ // it from destroying child surfaces until the animation has finished. We do this by
+ // detaching any surface control the client added from the client.
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ final WindowState c = mChildren.get(i);
+ c.mWinAnimator.detachChildren();
+ }
+
+ mWinAnimator.detachChildren();
+ }
+
try {
if (DEBUG_VISIBILITY) Slog.v(TAG,
"Setting visibility of " + this + ": " + (!clientHidden));
@@ -2698,7 +2710,7 @@
+ " win.mWindowRemovalAllowed=" + mWindowRemovalAllowed
+ " win.mRemoveOnExit=" + mRemoveOnExit);
if (!cleanupOnResume || mRemoveOnExit) {
- destroyOrSaveSurface();
+ destroyOrSaveSurfaceUnchecked();
}
if (mRemoveOnExit) {
removeImmediately();
@@ -2713,7 +2725,10 @@
return destroyedSomething;
}
- void destroyOrSaveSurface() {
+ // Destroy or save the application surface without checking
+ // various indicators of whether the client has released the surface.
+ // This is in general unsafe, and most callers should use {@link #destroySurface}
+ void destroyOrSaveSurfaceUnchecked() {
mSurfaceSaved = shouldSaveSurface();
if (mSurfaceSaved) {
if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) {
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index b945cf1..2236b59 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -341,7 +341,7 @@
mAnimation.cancel();
mAnimation = null;
mLocalAnimating = false;
- mWin.destroyOrSaveSurface();
+ mWin.destroyOrSaveSurfaceUnchecked();
}
}
diff --git a/services/core/jni/com_android_server_SystemServer.cpp b/services/core/jni/com_android_server_SystemServer.cpp
index 4a08ce4..96c2d7e 100644
--- a/services/core/jni/com_android_server_SystemServer.cpp
+++ b/services/core/jni/com_android_server_SystemServer.cpp
@@ -48,7 +48,7 @@
status_t err;
- configureRpcThreadpool(1, false /* callerWillJoin */);
+ configureRpcThreadpool(5, false /* callerWillJoin */);
sp<ISensorManager> sensorService = new SensorManager();
err = sensorService->registerAsService();
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index 74ecd11..edd7d53 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -1277,8 +1277,8 @@
* constellation and svFlag fields.
*/
enum ShiftWidth: uint8_t {
- SVID_SHIFT_WIDTH = 7,
- CONSTELLATION_TYPE_SHIFT_WIDTH = 3
+ SVID_SHIFT_WIDTH = 8,
+ CONSTELLATION_TYPE_SHIFT_WIDTH = 4
};
static jint android_location_GnssLocationProvider_read_sv_status(JNIEnv* env, jobject /* obj */,
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DeviceAdminServiceController.java b/services/devicepolicy/java/com/android/server/devicepolicy/DeviceAdminServiceController.java
index 97fa9d5..c7b8f02 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DeviceAdminServiceController.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DeviceAdminServiceController.java
@@ -15,6 +15,7 @@
*/
package com.android.server.devicepolicy;
+import android.Manifest.permission;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.admin.DevicePolicyManager;
@@ -115,10 +116,12 @@
return null;
}
final ServiceInfo si = list.get(0).serviceInfo;
- if (si.exported) {
- Log.e(TAG, "DeviceAdminService must not be exported: '"
+
+ if (!permission.BIND_DEVICE_ADMIN.equals(si.permission)) {
+ Log.e(TAG, "DeviceAdminService "
+ si.getComponentName().flattenToShortString()
- + "' will be ignored.");
+ + " must be protected with " + permission.BIND_DEVICE_ADMIN
+ + ".");
return null;
}
return si;
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index e82ba9c..87fb8c8 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -16,6 +16,7 @@
package com.android.server.devicepolicy;
+import static android.Manifest.permission.BIND_DEVICE_ADMIN;
import static android.Manifest.permission.MANAGE_CA_CERTIFICATES;
import static android.app.admin.DevicePolicyManager.CODE_ACCOUNTS_NOT_EMPTY;
import static android.app.admin.DevicePolicyManager.CODE_ADD_MANAGED_PROFILE_DISALLOWED;
@@ -662,6 +663,8 @@
private static final String TAG_GLOBAL_PROXY_SPEC = "global-proxy-spec";
private static final String TAG_SPECIFIES_GLOBAL_PROXY = "specifies-global-proxy";
private static final String TAG_PERMITTED_IMES = "permitted-imes";
+ private static final String TAG_PERMITTED_NOTIFICATION_LISTENERS =
+ "permitted-notification-listeners";
private static final String TAG_MAX_FAILED_PASSWORD_WIPE = "max-failed-password-wipe";
private static final String TAG_MAX_TIME_TO_UNLOCK = "max-time-to-unlock";
private static final String TAG_STRONG_AUTH_UNLOCK_TIMEOUT = "strong-auth-unlock-timeout";
@@ -769,6 +772,11 @@
// allowed.
List<String> permittedInputMethods;
+ // The list of packages allowed to use a NotificationListenerService to receive events for
+ // notifications from this user. Null means that all packages are allowed. Empty list means
+ // that only packages from the system are allowed.
+ List<String> permittedNotificationListeners;
+
// List of package names to keep cached.
List<String> keepUninstalledPackages;
@@ -1015,6 +1023,8 @@
writePackageListToXml(out, TAG_PERMITTED_ACCESSIBILITY_SERVICES,
permittedAccessiblityServices);
writePackageListToXml(out, TAG_PERMITTED_IMES, permittedInputMethods);
+ writePackageListToXml(out, TAG_PERMITTED_NOTIFICATION_LISTENERS,
+ permittedNotificationListeners);
writePackageListToXml(out, TAG_KEEP_UNINSTALLED_PACKAGES, keepUninstalledPackages);
if (hasUserRestrictions()) {
UserRestrictionsUtils.writeRestrictions(
@@ -1186,6 +1196,8 @@
permittedAccessiblityServices = readPackageList(parser, tag);
} else if (TAG_PERMITTED_IMES.equals(tag)) {
permittedInputMethods = readPackageList(parser, tag);
+ } else if (TAG_PERMITTED_NOTIFICATION_LISTENERS.equals(tag)) {
+ permittedNotificationListeners = readPackageList(parser, tag);
} else if (TAG_KEEP_UNINSTALLED_PACKAGES.equals(tag)) {
keepUninstalledPackages = readPackageList(parser, tag);
} else if (TAG_USER_RESTRICTIONS.equals(tag)) {
@@ -1406,6 +1418,10 @@
pw.print(prefix); pw.print("permittedInputMethods=");
pw.println(permittedInputMethods);
}
+ if (permittedNotificationListeners != null) {
+ pw.print(prefix); pw.print("permittedNotificationListeners=");
+ pw.println(permittedNotificationListeners);
+ }
if (keepUninstalledPackages != null) {
pw.print(prefix); pw.print("keepUninstalledPackages=");
pw.println(keepUninstalledPackages);
@@ -1902,7 +1918,7 @@
setDeviceOwnerSystemPropertyLocked();
findOwnerComponentIfNecessaryLocked();
migrateUserRestrictionsIfNecessaryLocked();
- setDefaultEnabledUserRestrictionsIfNecessaryLocked();
+ maybeSetDefaultDeviceOwnerUserRestrictionsLocked();
// TODO PO may not have a class name either due to b/17652534. Address that too.
@@ -1910,36 +1926,80 @@
}
}
- private void setDefaultEnabledUserRestrictionsIfNecessaryLocked() {
+ /** Apply default restrictions that haven't been applied to device owners yet. */
+ private void maybeSetDefaultDeviceOwnerUserRestrictionsLocked() {
final ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
- if (deviceOwner != null
- && !UserRestrictionsUtils.getDefaultEnabledForDeviceOwner().equals(
- deviceOwner.defaultEnabledRestrictionsAlreadySet)) {
- Slog.i(LOG_TAG,"New user restrictions need to be set by default for the device owner");
+ if (deviceOwner != null) {
+ maybeSetDefaultRestrictionsForAdminLocked(mOwners.getDeviceOwnerUserId(),
+ deviceOwner, UserRestrictionsUtils.getDefaultEnabledForDeviceOwner());
+ }
+ }
- if (VERBOSE_LOG) {
- Slog.d(LOG_TAG,"Default enabled restrictions for DO: "
- + UserRestrictionsUtils.getDefaultEnabledForDeviceOwner()
- + ". Restrictions already enabled: "
- + deviceOwner.defaultEnabledRestrictionsAlreadySet);
- }
-
- Set<String> restrictionsToSet = new ArraySet<>(
- UserRestrictionsUtils.getDefaultEnabledForDeviceOwner());
- restrictionsToSet.removeAll(deviceOwner.defaultEnabledRestrictionsAlreadySet);
- if (!restrictionsToSet.isEmpty()) {
- for (String restriction : restrictionsToSet) {
- deviceOwner.ensureUserRestrictions().putBoolean(restriction, true);
+ /** Apply default restrictions that haven't been applied to profile owners yet. */
+ private void maybeSetDefaultProfileOwnerUserRestrictions() {
+ synchronized (this) {
+ for (final int userId : mOwners.getProfileOwnerKeys()) {
+ final ActiveAdmin profileOwner = getProfileOwnerAdminLocked(userId);
+ // The following restrictions used to be applied to managed profiles by different
+ // means (via Settings or by disabling components). Now they are proper user
+ // restrictions so we apply them to managed profile owners. Non-managed secondary
+ // users didn't have those restrictions so we skip them to keep existing behavior.
+ if (profileOwner == null || !mUserManager.isManagedProfile(userId)) {
+ continue;
}
- deviceOwner.defaultEnabledRestrictionsAlreadySet.addAll(restrictionsToSet);
- Slog.i(LOG_TAG,
- "Enabled the following restrictions by default: " + restrictionsToSet);
-
- saveUserRestrictionsLocked(mOwners.getDeviceOwnerUserId());
+ maybeSetDefaultRestrictionsForAdminLocked(userId, profileOwner,
+ UserRestrictionsUtils.getDefaultEnabledForManagedProfiles());
+ ensureUnknownSourcesRestrictionForProfileOwnerLocked(
+ userId, profileOwner, false /* newOwner */);
}
}
}
+ /**
+ * Checks whether {@link UserManager#DISALLOW_INSTALL_UNKNOWN_SOURCES} should be added to the
+ * set of restrictions for this profile owner.
+ */
+ private void ensureUnknownSourcesRestrictionForProfileOwnerLocked(int userId,
+ ActiveAdmin profileOwner, boolean newOwner) {
+ if (newOwner || mInjector.settingsSecureGetIntForUser(
+ Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED, 0, userId) != 0) {
+ profileOwner.ensureUserRestrictions().putBoolean(
+ UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, true);
+ saveUserRestrictionsLocked(userId);
+ mInjector.settingsSecurePutIntForUser(
+ Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED, 0, userId);
+ }
+ }
+
+ /**
+ * Apply default restrictions that haven't been applied to a given admin yet.
+ */
+ private void maybeSetDefaultRestrictionsForAdminLocked(
+ int userId, ActiveAdmin admin, Set<String> defaultRestrictions) {
+ if (defaultRestrictions.equals(admin.defaultEnabledRestrictionsAlreadySet)) {
+ return; // The same set of default restrictions has been already applied.
+ }
+ Slog.i(LOG_TAG, "New user restrictions need to be set by default for user " + userId);
+
+ if (VERBOSE_LOG) {
+ Slog.d(LOG_TAG,"Default enabled restrictions: "
+ + defaultRestrictions
+ + ". Restrictions already enabled: "
+ + admin.defaultEnabledRestrictionsAlreadySet);
+ }
+
+ final Set<String> restrictionsToSet = new ArraySet<>(defaultRestrictions);
+ restrictionsToSet.removeAll(admin.defaultEnabledRestrictionsAlreadySet);
+ if (!restrictionsToSet.isEmpty()) {
+ for (final String restriction : restrictionsToSet) {
+ admin.ensureUserRestrictions().putBoolean(restriction, true);
+ }
+ admin.defaultEnabledRestrictionsAlreadySet.addAll(restrictionsToSet);
+ Slog.i(LOG_TAG, "Enabled the following restrictions by default: " + restrictionsToSet);
+ saveUserRestrictionsLocked(userId);
+ }
+ }
+
private void setDeviceOwnerSystemPropertyLocked() {
final boolean deviceProvisioned =
mInjector.settingsGlobalGetInt(Settings.Global.DEVICE_PROVISIONED, 0) != 0;
@@ -2926,41 +2986,11 @@
}
}
- private void ensureUnknownSourcesRestrictionForProfileOwners() {
- synchronized (this) {
- for (int userId : mOwners.getProfileOwnerKeys()) {
- if (!mUserManager.isManagedProfile(userId) ||
- mInjector.settingsSecureGetIntForUser(
- Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED, 0, userId) == 0) {
- continue;
- }
- setUserRestrictionOnBehalfOfProfileOwnerLocked(
- UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, userId);
- mInjector.settingsSecurePutIntForUser(
- Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED, 0, userId);
- }
- }
- }
-
- private void setUserRestrictionOnBehalfOfProfileOwnerLocked(String userRestrictionKey,
- int userId) {
- if (UserRestrictionsUtils.isValidRestriction(userRestrictionKey) &&
- UserRestrictionsUtils.canProfileOwnerChange(userRestrictionKey, userId)) {
- ActiveAdmin profileOwner = getProfileOwnerAdminLocked(userId);
- if (profileOwner == null) {
- return;
- }
- Bundle restrictions = profileOwner.ensureUserRestrictions();
- restrictions.putBoolean(userRestrictionKey, true);
- saveUserRestrictionsLocked(userId);
- }
- }
-
private void onLockSettingsReady() {
getUserData(UserHandle.USER_SYSTEM);
loadOwners();
cleanUpOldUsers();
- ensureUnknownSourcesRestrictionForProfileOwners();
+ maybeSetDefaultProfileOwnerUserRestrictions();
handleStartUser(UserHandle.USER_SYSTEM);
// Register an observer for watching for user setup complete and settings changes.
@@ -4636,19 +4666,20 @@
final long ident = mInjector.binderClearCallingIdentity();
try {
// Evict key
- if ((flags & DevicePolicyManager.FLAG_EVICT_CE_KEY) != 0) {
- enforceManagedProfile(callingUserId, "set FLAG_EVICT_CE_KEY");
+ if ((flags & DevicePolicyManager.FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY) != 0) {
+ enforceManagedProfile(
+ callingUserId, "set FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY");
if (!isProfileOwner(admin.info.getComponent(), callingUserId)) {
- throw new SecurityException(
- "Only profile owner admins can set FLAG_EVICT_CE_KEY");
+ throw new SecurityException("Only profile owner admins can set "
+ + "FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY");
}
if (parent) {
throw new IllegalArgumentException(
- "Cannot set FLAG_EVICT_CE_KEY for the parent");
+ "Cannot set FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY for the parent");
}
if (!mInjector.storageManagerIsFileBasedEncryptionEnabled()) {
throw new UnsupportedOperationException(
- "FLAG_EVICT_CE_KEY only applies to FBE devices");
+ "FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY only applies to FBE devices");
}
mUserManager.evictCredentialEncryptionKey(callingUserId);
}
@@ -6712,8 +6743,8 @@
synchronized (this) {
enforceCanSetProfileOwnerLocked(who, userHandle, hasIncompatibleAccountsOrNonAdb);
- if (getActiveAdminUncheckedLocked(who, userHandle) == null
- || getUserData(userHandle).mRemovingAdmins.contains(who)) {
+ final ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
+ if (admin == null || getUserData(userHandle).mRemovingAdmins.contains(who)) {
throw new IllegalArgumentException("Not active admin: " + who);
}
@@ -6729,10 +6760,10 @@
final long id = mInjector.binderClearCallingIdentity();
try {
if (mUserManager.isManagedProfile(userHandle)) {
- setUserRestrictionOnBehalfOfProfileOwnerLocked(
- UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, userHandle);
- mInjector.settingsSecurePutIntForUser(
- Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED, 0, userHandle);
+ maybeSetDefaultRestrictionsForAdminLocked(userHandle, admin,
+ UserRestrictionsUtils.getDefaultEnabledForManagedProfiles());
+ ensureUnknownSourcesRestrictionForProfileOwnerLocked(userHandle, admin,
+ true /* newOwner */);
}
} finally {
mInjector.binderRestoreCallingIdentity(id);
@@ -7791,14 +7822,14 @@
if (admin.permittedAccessiblityServices == null) {
return true;
}
- return checkPackagesInPermittedListOrSystem(Arrays.asList(packageName),
+ return checkPackagesInPermittedListOrSystem(Collections.singletonList(packageName),
admin.permittedAccessiblityServices, userHandle);
}
}
private boolean checkCallerIsCurrentUserOrProfile() {
- int callingUserId = UserHandle.getCallingUserId();
- long token = mInjector.binderClearCallingIdentity();
+ final int callingUserId = UserHandle.getCallingUserId();
+ final long token = mInjector.binderClearCallingIdentity();
try {
UserInfo currentUser;
UserInfo callingUser = getUserInfo(callingUserId);
@@ -7838,6 +7869,7 @@
return false;
}
+ final int callingUserId = mInjector.userHandleGetCallingUserId();
if (packageList != null) {
// InputMethodManager fetches input methods for current user.
// So this can only be set when calling user is the current user
@@ -7852,7 +7884,7 @@
enabledPackages.add(ime.getPackageName());
}
if (!checkPackagesInPermittedListOrSystem(enabledPackages, packageList,
- mInjector.binderGetCallingUserHandle().getIdentifier())) {
+ callingUserId)) {
Slog.e(LOG_TAG, "Cannot set permitted input methods, "
+ "because it contains already enabled input method.");
return false;
@@ -7864,7 +7896,7 @@
ActiveAdmin admin = getActiveAdminForCallerLocked(who,
DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
admin.permittedInputMethods = packageList;
- saveSettingsLocked(UserHandle.getCallingUserId());
+ saveSettingsLocked(callingUserId);
}
return true;
}
@@ -7963,11 +7995,70 @@
if (admin.permittedInputMethods == null) {
return true;
}
- return checkPackagesInPermittedListOrSystem(Arrays.asList(packageName),
+ return checkPackagesInPermittedListOrSystem(Collections.singletonList(packageName),
admin.permittedInputMethods, userHandle);
}
}
+ @Override
+ public boolean setPermittedCrossProfileNotificationListeners(
+ ComponentName who, List<String> packageList) {
+ if (!mHasFeature) {
+ return false;
+ }
+ Preconditions.checkNotNull(who, "ComponentName is null");
+
+ final int callingUserId = mInjector.userHandleGetCallingUserId();
+ if (!isManagedProfile(callingUserId)) {
+ return false;
+ }
+
+ synchronized (this) {
+ ActiveAdmin admin = getActiveAdminForCallerLocked(
+ who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
+ admin.permittedNotificationListeners = packageList;
+ saveSettingsLocked(callingUserId);
+ }
+ return true;
+ }
+
+ @Override
+ public List<String> getPermittedCrossProfileNotificationListeners(ComponentName who) {
+ if (!mHasFeature) {
+ return null;
+ }
+ Preconditions.checkNotNull(who, "ComponentName is null");
+
+ synchronized (this) {
+ ActiveAdmin admin = getActiveAdminForCallerLocked(
+ who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
+ return admin.permittedNotificationListeners;
+ }
+ }
+
+ @Override
+ public boolean isNotificationListenerServicePermitted(String packageName, int userId) {
+ if (!mHasFeature) {
+ return true;
+ }
+
+ Preconditions.checkStringNotEmpty(packageName, "packageName is null or empty");
+ if (!isCallerWithSystemUid()) {
+ throw new SecurityException(
+ "Only the system can query if a notification listener service is permitted");
+ }
+ synchronized (this) {
+ ActiveAdmin profileOwner = getProfileOwnerAdminLocked(userId);
+ if (profileOwner == null || profileOwner.permittedNotificationListeners == null) {
+ return true;
+ }
+ return checkPackagesInPermittedListOrSystem(Collections.singletonList(packageName),
+ profileOwner.permittedNotificationListeners, userId);
+
+ }
+ }
+
+
private void sendAdminEnabledBroadcastLocked(int userHandle) {
DevicePolicyData policyData = getUserData(userHandle);
if (policyData.mAdminBroadcastPending) {
@@ -10016,14 +10107,16 @@
if (!mHasFeature) {
return;
}
+ if (ids == null) {
+ throw new IllegalArgumentException("ids must not be null");
+ }
+ for (String id : ids) {
+ if (TextUtils.isEmpty(id)) {
+ throw new IllegalArgumentException("ids must not contain empty string");
+ }
+ }
- Preconditions.checkNotNull(admin);
- Preconditions.checkCollectionElementsNotNull(ids, "ids");
-
- final Set<String> affiliationIds = new ArraySet<String>(ids);
- Preconditions.checkArgument(
- !affiliationIds.contains(""), "ids must not contain empty strings");
-
+ final Set<String> affiliationIds = new ArraySet<>(ids);
final int callingUserId = mInjector.userHandleGetCallingUserId();
synchronized (this) {
getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
@@ -10844,8 +10937,10 @@
if (!expectedPackageName.equals(info.serviceInfo.packageName)) {
throw new SecurityException("Only allow to bind service in " + expectedPackageName);
}
- if (info.serviceInfo.exported) {
- throw new SecurityException("The service must be unexported");
+ // STOPSHIP(b/37624960): Remove info.serviceInfo.exported before release.
+ if (info.serviceInfo.exported && !BIND_DEVICE_ADMIN.equals(info.serviceInfo.permission)) {
+ throw new SecurityException(
+ "Service must be protected by BIND_DEVICE_ADMIN permission");
}
// It is the system server to bind the service, it would be extremely dangerous if it
// can be exploited to bind any service. Set the component explicitly to make sure we
diff --git a/services/net/java/android/net/apf/ApfCapabilities.java b/services/net/java/android/net/apf/ApfCapabilities.java
index b0e0230..703b415 100644
--- a/services/net/java/android/net/apf/ApfCapabilities.java
+++ b/services/net/java/android/net/apf/ApfCapabilities.java
@@ -46,7 +46,7 @@
}
public String toString() {
- return String.format("%s{version: %d, maxSize: %d format: %d}", getClass().getSimpleName(),
+ return String.format("%s{version: %d, maxSize: %d, format: %d}", getClass().getSimpleName(),
apfVersionSupported, maximumApfProgramSize, apfPacketFormat);
}
}
diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java
index 61a9294..ede2b3a 100644
--- a/services/net/java/android/net/ip/IpManager.java
+++ b/services/net/java/android/net/ip/IpManager.java
@@ -524,7 +524,7 @@
try {
mNwService.registerObserver(mNetlinkTracker);
} catch (RemoteException e) {
- Log.e(mTag, "Couldn't register NetlinkTracker: " + e.toString());
+ logError("Couldn't register NetlinkTracker: %s", e);
}
mMultinetworkPolicyTracker.start();
@@ -611,19 +611,36 @@
return;
}
+ // Thread-unsafe access to mApfFilter but just used for debugging.
+ final ApfFilter apfFilter = mApfFilter;
+ final ProvisioningConfiguration provisioningConfig = mConfiguration;
+ final ApfCapabilities apfCapabilities = (provisioningConfig != null)
+ ? provisioningConfig.mApfCapabilities : null;
+
IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ");
pw.println(mTag + " APF dump:");
pw.increaseIndent();
- // Thread-unsafe access to mApfFilter but just used for debugging.
- ApfFilter apfFilter = mApfFilter;
if (apfFilter != null) {
apfFilter.dump(pw);
} else {
- pw.println("No apf support");
+ pw.print("No active ApfFilter; ");
+ if (provisioningConfig == null) {
+ pw.println("IpManager not yet started.");
+ } else if (apfCapabilities == null || apfCapabilities.apfVersionSupported == 0) {
+ pw.println("Hardware does not support APF.");
+ } else {
+ pw.println("ApfFilter not yet started, APF capabilities: " + apfCapabilities);
+ }
}
pw.decreaseIndent();
pw.println();
+ pw.println(mTag + " current ProvisioningConfiguration:");
+ pw.increaseIndent();
+ pw.println(Objects.toString(provisioningConfig, "N/A"));
+ pw.decreaseIndent();
+
+ pw.println();
pw.println(mTag + " StateMachine dump:");
pw.increaseIndent();
mLocalLog.readOnlyLocalLog().dump(fd, pw, args);
@@ -684,7 +701,9 @@
// TODO: Migrate all Log.e(...) to logError(...).
private void logError(String fmt, Object... args) {
- mLocalLog.log("ERROR " + String.format(fmt, args));
+ final String msg = "ERROR " + String.format(fmt, args);
+ Log.e(mTag, msg);
+ mLocalLog.log(msg);
}
private void getNetworkInterface() {
@@ -692,7 +711,7 @@
mNetworkInterface = NetworkInterface.getByName(mInterfaceName);
} catch (SocketException | NullPointerException e) {
// TODO: throw new IllegalStateException.
- Log.e(mTag, "ALERT: Failed to get interface object: ", e);
+ logError("Failed to get interface object: %s", e);
}
}
@@ -948,7 +967,7 @@
ifcg.setLinkAddress(new LinkAddress("0.0.0.0/0"));
mNwService.setInterfaceConfig(mInterfaceName, ifcg);
} catch (IllegalStateException | RemoteException e) {
- Log.e(mTag, "ALERT: Failed to clear IPv4 address on interface " + mInterfaceName, e);
+ logError("Failed to clear IPv4 address on interface %s: %s", mInterfaceName, e);
}
}
@@ -1074,13 +1093,13 @@
try {
mNwService.disableIpv6(mInterfaceName);
} catch (Exception e) {
- Log.e(mTag, "Failed to disable IPv6" + e);
+ logError("Failed to disable IPv6: %s", e);
}
try {
mNwService.clearInterfaceAddresses(mInterfaceName);
} catch (Exception e) {
- Log.e(mTag, "Failed to clear addresses " + e);
+ logError("Failed to clear addresses: %s", e);
}
}
@@ -1404,7 +1423,7 @@
if (setIPv4Address(ipAddress)) {
mDhcpClient.sendMessage(DhcpClient.EVENT_LINKADDRESS_CONFIGURED);
} else {
- Log.e(mTag, "Failed to set IPv4 address!");
+ logError("Failed to set IPv4 address.");
dispatchCallback(ProvisioningChange.LOST_PROVISIONING,
new LinkProperties(mLinkProperties));
transitionTo(mStoppingState);
diff --git a/services/net/java/android/net/util/ConnectivityPacketSummary.java b/services/net/java/android/net/util/ConnectivityPacketSummary.java
index 5b068c0..dae93af 100644
--- a/services/net/java/android/net/util/ConnectivityPacketSummary.java
+++ b/services/net/java/android/net/util/ConnectivityPacketSummary.java
@@ -368,9 +368,9 @@
byte[] bytes = new byte[ETHER_ADDR_LEN];
mac.get(bytes, 0, bytes.length);
- Byte[] printableBytes = new Byte[bytes.length];
+ Object[] printableBytes = new Object[bytes.length];
int i = 0;
- for (byte b : bytes) printableBytes[i++] = b;
+ for (byte b : bytes) printableBytes[i++] = new Byte(b);
final String MAC48_FORMAT = "%02x:%02x:%02x:%02x:%02x:%02x";
return String.format(MAC48_FORMAT, printableBytes);
diff --git a/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java
index 1106006..d4904f5 100644
--- a/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java
+++ b/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java
@@ -15,6 +15,9 @@
*/
package com.android.server.notification;
+import static android.app.Notification.GROUP_ALERT_ALL;
+import static android.app.Notification.GROUP_ALERT_CHILDREN;
+import static android.app.Notification.GROUP_ALERT_SUMMARY;
import static android.app.NotificationManager.IMPORTANCE_HIGH;
import static junit.framework.Assert.assertFalse;
@@ -188,17 +191,24 @@
private NotificationRecord getCustomLightsNotification() {
return getNotificationRecord(mId, false /* insistent */, true /* once */,
false /* noisy */, true /* buzzy*/, true /* lights */,
- true /* defaultVibration */, true /* defaultSound */, false /* defaultLights */);
+ true /* defaultVibration */, true /* defaultSound */, false /* defaultLights */,
+ null, Notification.GROUP_ALERT_ALL);
}
private NotificationRecord getNotificationRecord(int id, boolean insistent, boolean once,
boolean noisy, boolean buzzy, boolean lights) {
- return getNotificationRecord(id, insistent, once, noisy, buzzy, lights, true, true, true);
+ return getNotificationRecord(id, insistent, once, noisy, buzzy, lights, true, true, true,
+ null, Notification.GROUP_ALERT_ALL);
+ }
+
+ private NotificationRecord getBeepyNotificationRecord(String groupKey, int groupAlertBehavior) {
+ return getNotificationRecord(mId, false, false, true, false, false, true, true, true,
+ groupKey, groupAlertBehavior);
}
private NotificationRecord getNotificationRecord(int id, boolean insistent, boolean once,
boolean noisy, boolean buzzy, boolean lights, boolean defaultVibration,
- boolean defaultSound, boolean defaultLights) {
+ boolean defaultSound, boolean defaultLights, String groupKey, int groupAlertBehavior) {
NotificationChannel channel =
new NotificationChannel("test", "test", IMPORTANCE_HIGH);
final Builder builder = new Builder(getContext())
@@ -239,6 +249,9 @@
}
builder.setDefaults(defaults);
+ builder.setGroup(groupKey);
+ builder.setGroupAlertBehavior(groupAlertBehavior);
+
Notification n = builder.build();
if (insistent) {
n.flags |= Notification.FLAG_INSISTENT;
@@ -546,7 +559,7 @@
}
@Test
- public void testInsistenteVibrate() throws Exception {
+ public void testInsistentVibrate() throws Exception {
NotificationRecord r = getInsistentBuzzyNotification();
mService.buzzBeepBlinkLocked(r);
@@ -568,6 +581,71 @@
}
@Test
+ public void testGroupAlertSummarySilenceChild() throws Exception {
+ NotificationRecord child = getBeepyNotificationRecord("a", GROUP_ALERT_SUMMARY);
+
+ mService.buzzBeepBlinkLocked(child);
+
+ verifyNeverBeep();
+ }
+
+ @Test
+ public void testGroupAlertSummaryNoSilenceSummary() throws Exception {
+ NotificationRecord summary = getBeepyNotificationRecord("a", GROUP_ALERT_SUMMARY);
+ summary.getNotification().flags |= Notification.FLAG_GROUP_SUMMARY;
+
+ mService.buzzBeepBlinkLocked(summary);
+
+ verifyBeepLooped();
+ }
+
+ @Test
+ public void testGroupAlertSummaryNoSilenceNonGroupChild() throws Exception {
+ NotificationRecord nonGroup = getBeepyNotificationRecord(null, GROUP_ALERT_SUMMARY);
+
+ mService.buzzBeepBlinkLocked(nonGroup);
+
+ verifyBeepLooped();
+ }
+
+ @Test
+ public void testGroupAlertChildSilenceSummary() throws Exception {
+ NotificationRecord summary = getBeepyNotificationRecord("a", GROUP_ALERT_CHILDREN);
+ summary.getNotification().flags |= Notification.FLAG_GROUP_SUMMARY;
+
+ mService.buzzBeepBlinkLocked(summary);
+
+ verifyNeverBeep();
+ }
+
+ @Test
+ public void testGroupAlertChildNoSilenceChild() throws Exception {
+ NotificationRecord child = getBeepyNotificationRecord("a", GROUP_ALERT_CHILDREN);
+
+ mService.buzzBeepBlinkLocked(child);
+
+ verifyBeepLooped();
+ }
+
+ @Test
+ public void testGroupAlertChildNoSilenceNonGroupSummary() throws Exception {
+ NotificationRecord nonGroup = getBeepyNotificationRecord(null, GROUP_ALERT_CHILDREN);
+
+ mService.buzzBeepBlinkLocked(nonGroup);
+
+ verifyBeepLooped();
+ }
+
+ @Test
+ public void testGroupAlertAllNoSilenceGroup() throws Exception {
+ NotificationRecord group = getBeepyNotificationRecord("a", GROUP_ALERT_ALL);
+
+ mService.buzzBeepBlinkLocked(group);
+
+ verifyBeepLooped();
+ }
+
+ @Test
public void testHonorAlertOnlyOnceForBuzz() throws Exception {
NotificationRecord r = getBuzzyNotification();
NotificationRecord s = getBuzzyOnceNotification();
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
index 92534a1..f41a99f 100644
--- a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -24,6 +24,7 @@
import static junit.framework.Assert.fail;
import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.any;
@@ -53,9 +54,10 @@
import android.os.UserHandle;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
-import android.support.test.annotation.UiThreadTest;
import android.support.test.InstrumentationRegistry;
+import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import android.testing.TestableLooper.RunWithLooper;
import java.util.ArrayList;
import java.util.Arrays;
@@ -63,6 +65,7 @@
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
@@ -70,6 +73,8 @@
import com.android.server.lights.Light;
import com.android.server.lights.LightsManager;
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
public class NotificationManagerServiceTest {
private static final long WAIT_FOR_IDLE_TIMEOUT = 2;
private static final String TEST_CHANNEL_ID = "NotificationManagerServiceTestChannelId";
@@ -92,6 +97,7 @@
private NotificationManagerService.NotificationListeners mNotificationListeners;
private ManagedServices.ManagedServiceInfo mListener;
@Mock private ICompanionDeviceManager mCompanionMgr;
+ @Mock SnoozeHelper mSnoozeHelper;
// Use a Testable subclass so we can simulate calls from the system without failing.
private static class TestableNotificationManagerService extends NotificationManagerService {
@@ -109,7 +115,6 @@
}
@Before
- @UiThreadTest
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mNotificationManagerService = new TestableNotificationManagerService(mContext);
@@ -124,13 +129,14 @@
final LightsManager mockLightsManager = mock(LightsManager.class);
when(mockLightsManager.getLight(anyInt())).thenReturn(mock(Light.class));
// Use this testable looper.
- mTestableLooper = new TestableLooper(false);
+ mTestableLooper = TestableLooper.get(this);
mListener = mNotificationListeners.new ManagedServiceInfo(
null, new ComponentName(PKG, "test_class"), uid, true, null, 0);
when(mNotificationListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
mNotificationManagerService.init(mTestableLooper.getLooper(), mPackageManager,
- mPackageManagerClient, mockLightsManager, mNotificationListeners, mCompanionMgr);
+ mPackageManagerClient, mockLightsManager, mNotificationListeners, mCompanionMgr,
+ mSnoozeHelper);
// Tests call directly into the Binder.
mBinderService = mNotificationManagerService.getBinderService();
@@ -144,6 +150,18 @@
mTestableLooper.processAllMessages();
}
+ private NotificationRecord generateNotificationRecord(NotificationChannel channel, int id,
+ String groupKey, boolean isSummary) {
+ Notification.Builder nb = new Notification.Builder(mContext, channel.getId())
+ .setContentTitle("foo")
+ .setSmallIcon(android.R.drawable.sym_def_app_icon)
+ .setGroup(groupKey)
+ .setGroupSummary(isSummary);
+
+ StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, id, "tag", uid, 0,
+ nb.build(), new UserHandle(uid), null, 0);
+ return new NotificationRecord(mContext, sbn, channel);
+ }
private NotificationRecord generateNotificationRecord(NotificationChannel channel) {
return generateNotificationRecord(channel, null);
}
@@ -165,7 +183,6 @@
}
@Test
- @UiThreadTest
public void testCreateNotificationChannels_SingleChannel() throws Exception {
final NotificationChannel channel =
new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_DEFAULT);
@@ -177,7 +194,6 @@
}
@Test
- @UiThreadTest
public void testCreateNotificationChannels_NullChannelThrowsException() throws Exception {
try {
mBinderService.createNotificationChannels("test_pkg",
@@ -189,7 +205,6 @@
}
@Test
- @UiThreadTest
public void testCreateNotificationChannels_TwoChannels() throws Exception {
final NotificationChannel channel1 =
new NotificationChannel("id1", "name", NotificationManager.IMPORTANCE_DEFAULT);
@@ -202,7 +217,6 @@
}
@Test
- @UiThreadTest
public void testCreateNotificationChannels_SecondCreateDoesNotChangeImportance()
throws Exception {
final NotificationChannel channel =
@@ -221,7 +235,6 @@
}
@Test
- @UiThreadTest
public void testCreateNotificationChannels_IdenticalChannelsInListIgnoresSecond()
throws Exception {
final NotificationChannel channel1 =
@@ -236,7 +249,6 @@
}
@Test
- @UiThreadTest
public void testBlockedNotifications_suspended() throws Exception {
NotificationUsageStats usageStats = mock(NotificationUsageStats.class);
when(mPackageManager.isPackageSuspendedForUser(anyString(), anyInt())).thenReturn(true);
@@ -249,7 +261,6 @@
}
@Test
- @UiThreadTest
public void testBlockedNotifications_blockedChannel() throws Exception {
NotificationUsageStats usageStats = mock(NotificationUsageStats.class);
when(mPackageManager.isPackageSuspendedForUser(anyString(), anyInt())).thenReturn(false);
@@ -263,7 +274,6 @@
}
@Test
- @UiThreadTest
public void testBlockedNotifications_blockedApp() throws Exception {
NotificationUsageStats usageStats = mock(NotificationUsageStats.class);
when(mPackageManager.isPackageSuspendedForUser(anyString(), anyInt())).thenReturn(false);
@@ -277,7 +287,6 @@
}
@Test
- @UiThreadTest
public void testEnqueueNotificationWithTag_PopulatesGetActiveNotifications() throws Exception {
mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag", 0,
generateNotificationRecord(null).getNotification(), 0);
@@ -288,7 +297,6 @@
}
@Test
- @UiThreadTest
public void testCancelNotificationImmediatelyAfterEnqueue() throws Exception {
mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag", 0,
generateNotificationRecord(null).getNotification(), 0);
@@ -300,7 +308,6 @@
}
@Test
- @UiThreadTest
public void testCancelNotificationWhilePostedAndEnqueued() throws Exception {
mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag", 0,
generateNotificationRecord(null).getNotification(), 0);
@@ -315,7 +322,6 @@
}
@Test
- @UiThreadTest
public void testCancelNotificationsFromListenerImmediatelyAfterEnqueue() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).sbn;
mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag",
@@ -328,7 +334,6 @@
}
@Test
- @UiThreadTest
public void testCancelAllNotificationsImmediatelyAfterEnqueue() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).sbn;
mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag",
@@ -341,7 +346,6 @@
}
@Test
- @UiThreadTest
public void testCancelAllNotifications_IgnoreForegroundService() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).sbn;
sbn.getNotification().flags |= Notification.FLAG_FOREGROUND_SERVICE;
@@ -355,7 +359,6 @@
}
@Test
- @UiThreadTest
public void testCancelAllNotifications_IgnoreOtherPackages() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).sbn;
sbn.getNotification().flags |= Notification.FLAG_FOREGROUND_SERVICE;
@@ -369,7 +372,6 @@
}
@Test
- @UiThreadTest
public void testCancelAllNotifications_NullPkgRemovesAll() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).sbn;
mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag",
@@ -382,7 +384,6 @@
}
@Test
- @UiThreadTest
public void testCancelAllNotifications_NullPkgIgnoresUserAllNotifications() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).sbn;
mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag",
@@ -396,7 +397,6 @@
}
@Test
- @UiThreadTest
public void testRemoveForegroundServiceFlag_ImmediatelyAfterEnqueue() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).sbn;
sbn.getNotification().flags |= Notification.FLAG_FOREGROUND_SERVICE;
@@ -411,7 +411,46 @@
}
@Test
- @UiThreadTest
+ public void testFindGroupNotificationsLocked() throws Exception {
+ // make sure the same notification can be found in both lists and returned
+ final NotificationRecord group1 = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group1", true);
+ mNotificationManagerService.addEnqueuedNotification(group1);
+ mNotificationManagerService.addNotification(group1);
+
+ // should not be returned
+ final NotificationRecord group2 = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group2", true);
+ mBinderService.enqueueNotificationWithTag(PKG, "opPkg", null,
+ group2.sbn.getId(), group2.sbn.getNotification(), group2.sbn.getUserId());
+ waitForIdle();
+
+ // should not be returned
+ final NotificationRecord nonGroup = generateNotificationRecord(
+ mTestNotificationChannel, 3, null, false);
+ mBinderService.enqueueNotificationWithTag(PKG, "opPkg", null,
+ nonGroup.sbn.getId(), nonGroup.sbn.getNotification(), nonGroup.sbn.getUserId());
+ waitForIdle();
+
+ // same group, child, should be returned
+ final NotificationRecord group1Child = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group1", false);
+ mBinderService.enqueueNotificationWithTag(PKG, "opPkg", null, group1Child.sbn.getId(),
+ group1Child.sbn.getNotification(), group1Child.sbn.getUserId());
+ waitForIdle();
+
+ List<NotificationRecord> inGroup1 =
+ mNotificationManagerService.findGroupNotificationsLocked(PKG, group1.getGroupKey(),
+ group1.sbn.getUserId());
+ assertEquals(3, inGroup1.size());
+ for (NotificationRecord record : inGroup1) {
+ assertTrue(record.getGroupKey().equals(group1.getGroupKey()));
+ assertTrue(record.sbn.getId() == 1 || record.sbn.getId() == 4);
+ }
+ }
+
+
+ @Test
public void testTvExtenderChannelOverride_onTv() throws Exception {
mNotificationManagerService.setIsTelevision(true);
mNotificationManagerService.setRankingHelper(mRankingHelper);
@@ -419,7 +458,7 @@
anyString(), anyInt(), eq("foo"), anyBoolean())).thenReturn(
new NotificationChannel("foo", "foo", NotificationManager.IMPORTANCE_HIGH));
- Notification.TvExtender tv = new Notification.TvExtender().setChannel("foo");
+ Notification.TvExtender tv = new Notification.TvExtender().setChannelId("foo");
mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag", 0,
generateNotificationRecord(null, tv).getNotification(), 0);
verify(mRankingHelper, times(1)).getNotificationChannel(
@@ -427,7 +466,6 @@
}
@Test
- @UiThreadTest
public void testTvExtenderChannelOverride_notOnTv() throws Exception {
mNotificationManagerService.setIsTelevision(false);
mNotificationManagerService.setRankingHelper(mRankingHelper);
@@ -435,7 +473,7 @@
anyString(), anyInt(), anyString(), anyBoolean())).thenReturn(
mTestNotificationChannel);
- Notification.TvExtender tv = new Notification.TvExtender().setChannel("foo");
+ Notification.TvExtender tv = new Notification.TvExtender().setChannelId("foo");
mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag", 0,
generateNotificationRecord(null, tv).getNotification(), 0);
verify(mRankingHelper, times(1)).getNotificationChannel(
@@ -443,7 +481,6 @@
}
@Test
- @UiThreadTest
public void testCreateChannelNotifyListener() throws Exception {
List<String> associations = new ArrayList<>();
associations.add("a");
@@ -469,7 +506,6 @@
}
@Test
- @UiThreadTest
public void testCreateChannelGroupNotifyListener() throws Exception {
List<String> associations = new ArrayList<>();
associations.add("a");
@@ -490,7 +526,6 @@
}
@Test
- @UiThreadTest
public void testUpdateChannelNotifyListener() throws Exception {
List<String> associations = new ArrayList<>();
associations.add("a");
@@ -509,7 +544,6 @@
}
@Test
- @UiThreadTest
public void testDeleteChannelNotifyListener() throws Exception {
List<String> associations = new ArrayList<>();
associations.add("a");
@@ -526,7 +560,6 @@
}
@Test
- @UiThreadTest
public void testDeleteChannelGroupNotifyListener() throws Exception {
List<String> associations = new ArrayList<>();
associations.add("a");
@@ -543,7 +576,6 @@
}
@Test
- @UiThreadTest
public void testUpdateNotificationChannelFromPrivilegedListener_success() throws Exception {
mNotificationManagerService.setRankingHelper(mRankingHelper);
List<String> associations = new ArrayList<>();
@@ -561,7 +593,6 @@
}
@Test
- @UiThreadTest
public void testUpdateNotificationChannelFromPrivilegedListener_noAccess() throws Exception {
mNotificationManagerService.setRankingHelper(mRankingHelper);
List<String> associations = new ArrayList<>();
@@ -583,7 +614,6 @@
}
@Test
- @UiThreadTest
public void testUpdateNotificationChannelFromPrivilegedListener_badUser() throws Exception {
mNotificationManagerService.setRankingHelper(mRankingHelper);
List<String> associations = new ArrayList<>();
@@ -609,7 +639,6 @@
}
@Test
- @UiThreadTest
public void testGetNotificationChannelFromPrivilegedListener_success() throws Exception {
mNotificationManagerService.setRankingHelper(mRankingHelper);
List<String> associations = new ArrayList<>();
@@ -624,7 +653,6 @@
}
@Test
- @UiThreadTest
public void testGetNotificationChannelFromPrivilegedListener_noAccess() throws Exception {
mNotificationManagerService.setRankingHelper(mRankingHelper);
List<String> associations = new ArrayList<>();
@@ -643,7 +671,6 @@
}
@Test
- @UiThreadTest
public void testGetNotificationChannelFromPrivilegedListener_badUser() throws Exception {
mNotificationManagerService.setRankingHelper(mRankingHelper);
List<String> associations = new ArrayList<>();
@@ -666,7 +693,6 @@
}
@Test
- @UiThreadTest
public void testGetNotificationChannelGroupsFromPrivilegedListener_success() throws Exception {
mNotificationManagerService.setRankingHelper(mRankingHelper);
List<String> associations = new ArrayList<>();
@@ -680,7 +706,6 @@
}
@Test
- @UiThreadTest
public void testGetNotificationChannelGroupsFromPrivilegedListener_noAccess() throws Exception {
mNotificationManagerService.setRankingHelper(mRankingHelper);
List<String> associations = new ArrayList<>();
@@ -698,7 +723,6 @@
}
@Test
- @UiThreadTest
public void testGetNotificationChannelGroupsFromPrivilegedListener_badUser() throws Exception {
mNotificationManagerService.setRankingHelper(mRankingHelper);
List<String> associations = new ArrayList<>();
@@ -719,7 +743,6 @@
}
@Test
- @UiThreadTest
public void testHasCompanionDevice_failure() throws Exception {
when(mCompanionMgr.getAssociations(anyString(), anyInt())).thenThrow(
new IllegalArgumentException());
@@ -727,11 +750,140 @@
}
@Test
- @UiThreadTest
public void testHasCompanionDevice_noService() throws Exception {
mNotificationManagerService = new TestableNotificationManagerService(mContext);
assertFalse(mNotificationManagerService.hasCompanionDevice(mListener));
}
+ @Test
+ public void testSnoozeRunnable_snoozeNonGrouped() throws Exception {
+ final NotificationRecord nonGrouped = generateNotificationRecord(
+ mTestNotificationChannel, 1, null, false);
+ final NotificationRecord grouped = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ mNotificationManagerService.addNotification(grouped);
+ mNotificationManagerService.addNotification(nonGrouped);
+
+ NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable =
+ mNotificationManagerService.new SnoozeNotificationRunnable(
+ nonGrouped.getKey(), 100, null);
+ snoozeNotificationRunnable.run();
+
+ // only snooze the one notification
+ verify(mSnoozeHelper, times(1)).snooze(any(NotificationRecord.class), anyLong());
+ }
+
+ @Test
+ public void testSnoozeRunnable_snoozeSummary_withChildren() throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ mNotificationManagerService.addNotification(parent);
+ mNotificationManagerService.addNotification(child);
+ mNotificationManagerService.addNotification(child2);
+
+ NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable =
+ mNotificationManagerService.new SnoozeNotificationRunnable(
+ parent.getKey(), 100, null);
+ snoozeNotificationRunnable.run();
+
+ // snooze parent and children
+ verify(mSnoozeHelper, times(3)).snooze(any(NotificationRecord.class), anyLong());
+ }
+
+ @Test
+ public void testSnoozeRunnable_snoozeGroupChild_fellowChildren() throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ mNotificationManagerService.addNotification(parent);
+ mNotificationManagerService.addNotification(child);
+ mNotificationManagerService.addNotification(child2);
+
+ NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable =
+ mNotificationManagerService.new SnoozeNotificationRunnable(
+ child2.getKey(), 100, null);
+ snoozeNotificationRunnable.run();
+
+ // only snooze the one child
+ verify(mSnoozeHelper, times(1)).snooze(any(NotificationRecord.class), anyLong());
+ }
+
+ @Test
+ public void testSnoozeRunnable_snoozeGroupChild_onlyChildOfSummary() throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ assertTrue(parent.sbn.getNotification().isGroupSummary());
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ mNotificationManagerService.addNotification(parent);
+ mNotificationManagerService.addNotification(child);
+
+ NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable =
+ mNotificationManagerService.new SnoozeNotificationRunnable(
+ child.getKey(), 100, null);
+ snoozeNotificationRunnable.run();
+
+ // snooze child and summary
+ verify(mSnoozeHelper, times(2)).snooze(any(NotificationRecord.class), anyLong());
+ }
+
+ @Test
+ public void testSnoozeRunnable_snoozeGroupChild_noOthersInGroup() throws Exception {
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ mNotificationManagerService.addNotification(child);
+
+ NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable =
+ mNotificationManagerService.new SnoozeNotificationRunnable(
+ child.getKey(), 100, null);
+ snoozeNotificationRunnable.run();
+
+ // snooze child only
+ verify(mSnoozeHelper, times(1)).snooze(any(NotificationRecord.class), anyLong());
+ }
+
+ @Test
+ public void testPostGroupChild_unsnoozeParent() throws Exception {
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+
+ mBinderService.enqueueNotificationWithTag(PKG, "opPkg", null,
+ child.sbn.getId(), child.sbn.getNotification(), child.sbn.getUserId());
+ waitForIdle();
+
+ verify(mSnoozeHelper, times(1)).repostGroupSummary(
+ anyString(), anyInt(), eq(child.getGroupKey()));
+ }
+
+ @Test
+ public void testPostNonGroup_noUnsnoozing() throws Exception {
+ final NotificationRecord record = generateNotificationRecord(
+ mTestNotificationChannel, 2, null, false);
+
+ mBinderService.enqueueNotificationWithTag(PKG, "opPkg", null,
+ record.sbn.getId(), record.sbn.getNotification(), record.sbn.getUserId());
+ waitForIdle();
+
+ verify(mSnoozeHelper, never()).repostGroupSummary(anyString(), anyInt(), anyString());
+ }
+
+ @Test
+ public void testPostGroupSummary_noUnsnoozing() throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", true);
+
+ mBinderService.enqueueNotificationWithTag(PKG, "opPkg", null,
+ parent.sbn.getId(), parent.sbn.getNotification(), parent.sbn.getUserId());
+ waitForIdle();
+
+ verify(mSnoozeHelper, never()).repostGroupSummary(anyString(), anyInt(), anyString());
+ }
}
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationRecordTest.java b/services/tests/notification/src/com/android/server/notification/NotificationRecordTest.java
index b2e6ef9..1c8ca84 100644
--- a/services/tests/notification/src/com/android/server/notification/NotificationRecordTest.java
+++ b/services/tests/notification/src/com/android/server/notification/NotificationRecordTest.java
@@ -150,7 +150,7 @@
builder.setDefaults(defaults);
if (!preO) {
- builder.setChannel(channelId);
+ builder.setChannelId(channelId);
}
diff --git a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
index bc5c29d..ce899e3 100644
--- a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
@@ -19,6 +19,7 @@
import static android.app.NotificationManager.IMPORTANCE_HIGH;
import static android.app.NotificationManager.IMPORTANCE_LOW;
import static android.app.NotificationManager.IMPORTANCE_NONE;
+import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.fail;
@@ -48,6 +49,7 @@
import android.net.Uri;
import android.os.Build;
import android.os.UserHandle;
+import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
@@ -550,6 +552,56 @@
}
@Test
+ public void testUpdate_preUpgrade_updatesAppFields() throws Exception {
+ mHelper.setImportance(PKG, UID, IMPORTANCE_UNSPECIFIED);
+ assertTrue(mHelper.canShowBadge(PKG, UID));
+ assertEquals(Notification.PRIORITY_DEFAULT, mHelper.getPackagePriority(PKG, UID));
+ assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE,
+ mHelper.getPackageVisibility(PKG, UID));
+
+ NotificationChannel defaultChannel = mHelper.getNotificationChannel(
+ PKG, UID, NotificationChannel.DEFAULT_CHANNEL_ID, false);
+
+ defaultChannel.setShowBadge(false);
+ defaultChannel.setImportance(IMPORTANCE_NONE);
+ defaultChannel.setBypassDnd(true);
+ defaultChannel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
+
+ mHelper.updateNotificationChannel(PKG, UID, defaultChannel);
+
+ // ensure app level fields are changed
+ assertFalse(mHelper.canShowBadge(PKG, UID));
+ assertEquals(Notification.PRIORITY_MAX, mHelper.getPackagePriority(PKG, UID));
+ assertEquals(Notification.VISIBILITY_SECRET, mHelper.getPackageVisibility(PKG, UID));
+ assertEquals(IMPORTANCE_NONE, mHelper.getImportance(PKG, UID));
+ }
+
+ @Test
+ public void testUpdate_postUpgrade_noUpdateAppFields() throws Exception {
+ final NotificationChannel channel = new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+
+ mHelper.createNotificationChannel(PKG, UID, channel, false);
+ assertTrue(mHelper.canShowBadge(PKG, UID));
+ assertEquals(Notification.PRIORITY_DEFAULT, mHelper.getPackagePriority(PKG, UID));
+ assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE,
+ mHelper.getPackageVisibility(PKG, UID));
+
+ channel.setShowBadge(false);
+ channel.setImportance(IMPORTANCE_NONE);
+ channel.setBypassDnd(true);
+ channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
+
+ mHelper.updateNotificationChannel(PKG, UID, channel);
+
+ // ensure app level fields are not changed
+ assertTrue(mHelper.canShowBadge(PKG, UID));
+ assertEquals(Notification.PRIORITY_DEFAULT, mHelper.getPackagePriority(PKG, UID));
+ assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE,
+ mHelper.getPackageVisibility(PKG, UID));
+ assertEquals(NotificationManager.IMPORTANCE_UNSPECIFIED, mHelper.getImportance(PKG, UID));
+ }
+
+ @Test
public void testGetNotificationChannel_ReturnsNullForUnknownChannel() throws Exception {
assertEquals(null, mHelper.getNotificationChannel(PKG, UID, "garbage", false));
}
diff --git a/services/tests/notification/src/com/android/server/notification/SnoozeHelperTest.java b/services/tests/notification/src/com/android/server/notification/SnoozeHelperTest.java
index 9575d32..51ec05c 100644
--- a/services/tests/notification/src/com/android/server/notification/SnoozeHelperTest.java
+++ b/services/tests/notification/src/com/android/server/notification/SnoozeHelperTest.java
@@ -34,6 +34,7 @@
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import android.util.Slog;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
@@ -232,13 +233,50 @@
assertEquals(4, mSnoozeHelper.getSnoozed().size());
}
+ @Test
+ public void repostGroupSummary_onlyFellowGroupChildren() throws Exception {
+ NotificationRecord r = getNotificationRecord(
+ "pkg", 1, "one", UserHandle.SYSTEM, "group1", false);
+ NotificationRecord r2 = getNotificationRecord(
+ "pkg", 2, "two", UserHandle.SYSTEM, "group1", false);
+ mSnoozeHelper.snooze(r, 1000);
+ mSnoozeHelper.snooze(r2, 1000);
+ mSnoozeHelper.repostGroupSummary("pkg", UserHandle.USER_SYSTEM, "group1");
+
+ verify(mCallback, never()).repost(UserHandle.USER_SYSTEM, r);
+ }
+
+ @Test
+ public void repostGroupSummary_repostsSummary() throws Exception {
+ when(mUserProfiles.getCurrentProfileIds()).thenReturn(
+ new int[] {UserHandle.USER_SYSTEM});
+ NotificationRecord r = getNotificationRecord(
+ "pkg", 1, "one", UserHandle.SYSTEM, "group1", true);
+ NotificationRecord r2 = getNotificationRecord(
+ "pkg", 2, "two", UserHandle.SYSTEM, "group1", false);
+ mSnoozeHelper.snooze(r, 1000);
+ mSnoozeHelper.snooze(r2, 1000);
+ assertEquals(2, mSnoozeHelper.getSnoozed().size());
+ assertEquals(2, mSnoozeHelper.getSnoozed(UserHandle.USER_SYSTEM, "pkg").size());
+
+ mSnoozeHelper.repostGroupSummary("pkg", UserHandle.USER_SYSTEM, r.getGroupKey());
+
+ verify(mCallback, times(1)).repost(UserHandle.USER_SYSTEM, r);
+ verify(mCallback, never()).repost(UserHandle.USER_SYSTEM, r2);
+
+ assertEquals(1, mSnoozeHelper.getSnoozed().size());
+ assertEquals(1, mSnoozeHelper.getSnoozed(UserHandle.USER_SYSTEM, "pkg").size());
+ }
+
private NotificationRecord getNotificationRecord(String pkg, int id, String tag,
- UserHandle user) {
+ UserHandle user, String groupKey, boolean groupSummary) {
Notification n = new Notification.Builder(getContext(), TEST_CHANNEL_ID)
.setContentTitle("A")
.setGroup("G")
.setSortKey("A")
.setWhen(1205)
+ .setGroup(groupKey)
+ .setGroupSummary(groupSummary)
.build();
final NotificationChannel notificationChannel = new NotificationChannel(
TEST_CHANNEL_ID, "name", NotificationManager.IMPORTANCE_LOW);
@@ -246,4 +284,9 @@
pkg, pkg, id, tag, 0, 0, n, user, null,
System.currentTimeMillis()), notificationChannel);
}
+
+ private NotificationRecord getNotificationRecord(String pkg, int id, String tag,
+ UserHandle user) {
+ return getNotificationRecord(pkg, id, tag, user, null, false);
+ }
}
diff --git a/services/tests/servicestests/assets/DevicePolicyManagerServiceMigrationTest3/profile_device_policies.xml b/services/tests/servicestests/assets/DevicePolicyManagerServiceMigrationTest3/profile_device_policies.xml
new file mode 100644
index 0000000..b162785
--- /dev/null
+++ b/services/tests/servicestests/assets/DevicePolicyManagerServiceMigrationTest3/profile_device_policies.xml
@@ -0,0 +1,8 @@
+<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
+<policies setup-complete="true" provisioning-state="3">
+<admin name="com.android.frameworks.servicestests/com.android.server.devicepolicy.DummyDeviceAdmins$Admin1">
+ <policies flags="991" />
+ <strong-auth-unlock-timeout value="0" />
+ <organization-color value="-16738680" />
+</admin>
+</policies>
diff --git a/services/tests/servicestests/assets/DevicePolicyManagerServiceMigrationTest3/profile_owner.xml b/services/tests/servicestests/assets/DevicePolicyManagerServiceMigrationTest3/profile_owner.xml
new file mode 100644
index 0000000..7440424
--- /dev/null
+++ b/services/tests/servicestests/assets/DevicePolicyManagerServiceMigrationTest3/profile_owner.xml
@@ -0,0 +1,8 @@
+<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
+<root>
+ <profile-owner
+ package="com.android.frameworks.servicestests"
+ name="com.android.frameworks.servicestests"
+ component="com.android.frameworks.servicestests/com.android.server.devicepolicy.DummyDeviceAdmins$Admin1"
+ userRestrictionsMigrated="true" />
+</root>
diff --git a/services/tests/servicestests/assets/DevicePolicyManagerServiceMigrationTest3/system_device_policies.xml b/services/tests/servicestests/assets/DevicePolicyManagerServiceMigrationTest3/system_device_policies.xml
new file mode 100644
index 0000000..5f9a871
--- /dev/null
+++ b/services/tests/servicestests/assets/DevicePolicyManagerServiceMigrationTest3/system_device_policies.xml
@@ -0,0 +1,3 @@
+<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
+<policies setup-complete="true" provisioning-state="3">
+</policies>
diff --git a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
index 985e5ea..c78488f 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
@@ -16,25 +16,18 @@
package com.android.server;
-import static android.net.NetworkRecommendationProvider.EXTRA_RECOMMENDATION_RESULT;
-import static android.net.NetworkRecommendationProvider.EXTRA_SEQUENCE;
import static android.net.NetworkScoreManager.CACHE_FILTER_NONE;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertSame;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyListOf;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
-import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.atLeastOnce;
-import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
@@ -55,8 +48,6 @@
import android.net.NetworkKey;
import android.net.NetworkScoreManager;
import android.net.NetworkScorerAppData;
-import android.net.RecommendationRequest;
-import android.net.RecommendationResult;
import android.net.ScoredNetwork;
import android.net.Uri;
import android.net.WifiKey;
@@ -69,13 +60,11 @@
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
-import android.os.IRemoteCallback;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteCallback;
import android.os.RemoteException;
import android.os.UserHandle;
-import android.provider.Settings;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.MediumTest;
import android.support.test.runner.AndroidJUnit4;
@@ -145,9 +134,6 @@
private ContentResolver mContentResolver;
private NetworkScoreService mNetworkScoreService;
- private RecommendationRequest mRecommendationRequest;
- private RemoteCallback mRemoteCallback;
- private OnResultListener mOnResultListener;
private HandlerThread mHandlerThread;
private List<ScanResult> mScanResults;
@@ -177,13 +163,6 @@
WifiConfiguration configuration = new WifiConfiguration();
configuration.SSID = "NetworkScoreServiceTest_SSID";
configuration.BSSID = "NetworkScoreServiceTest_BSSID";
- mRecommendationRequest = new RecommendationRequest.Builder()
- .setDefaultWifiConfig(configuration).build();
- mOnResultListener = new OnResultListener();
- mRemoteCallback = new RemoteCallback(mOnResultListener);
- Settings.Global.putLong(mContentResolver,
- Settings.Global.NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS, -1L);
- mNetworkScoreService.refreshRecommendationRequestTimeoutMs();
populateScanResults();
}
@@ -215,7 +194,6 @@
verify(mNetworkScorerAppManager).updateState();
verify(mNetworkScorerAppManager).migrateNetworkScorerAppSettingIfNeeded();
verify(mServiceConnection).bind(mContext);
-
}
@Test
@@ -256,160 +234,6 @@
}
@Test
- public void testRequestRecommendation_noPermission() throws Exception {
- doThrow(new SecurityException()).when(mContext)
- .enforceCallingOrSelfPermission(eq(permission.REQUEST_NETWORK_SCORES),
- anyString());
- try {
- mNetworkScoreService.requestRecommendation(mRecommendationRequest);
- fail("REQUEST_NETWORK_SCORES not enforced.");
- } catch (SecurityException e) {
- // expected
- }
- }
-
- @Test
- public void testRequestRecommendation_mainThread() throws Exception {
- when(mContext.getMainLooper()).thenReturn(Looper.myLooper());
- try {
- mNetworkScoreService.requestRecommendation(mRecommendationRequest);
- fail("requestRecommendation run on main thread.");
- } catch (RuntimeException e) {
- // expected
- }
- }
-
- @Test
- public void testRequestRecommendation_providerNotConnected() throws Exception {
- when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper());
-
- final RecommendationResult result =
- mNetworkScoreService.requestRecommendation(mRecommendationRequest);
- assertNotNull(result);
- assertEquals(mRecommendationRequest.getDefaultWifiConfig(),
- result.getWifiConfiguration());
- }
-
- @Test
- public void testRequestRecommendation_providerThrowsRemoteException() throws Exception {
- when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper());
- doThrow(new RemoteException()).when(mRecommendationProvider)
- .requestRecommendation(eq(mRecommendationRequest), isA(IRemoteCallback.class),
- anyInt());
- mNetworkScoreService.onUserUnlocked(0);
-
- final RecommendationResult result =
- mNetworkScoreService.requestRecommendation(mRecommendationRequest);
- assertNotNull(result);
- assertEquals(mRecommendationRequest.getDefaultWifiConfig(),
- result.getWifiConfiguration());
- }
-
- @Test
- public void testRequestRecommendation_resultReturned() throws Exception {
- when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper());
- final WifiConfiguration wifiConfiguration = new WifiConfiguration();
- wifiConfiguration.SSID = "testRequestRecommendation_resultReturned_SSID";
- wifiConfiguration.BSSID = "testRequestRecommendation_resultReturned_BSSID";
- final RecommendationResult providerResult = RecommendationResult
- .createConnectRecommendation(wifiConfiguration);
- final Bundle bundle = new Bundle();
- bundle.putParcelable(EXTRA_RECOMMENDATION_RESULT, providerResult);
- doAnswer(invocation -> {
- bundle.putInt(EXTRA_SEQUENCE, invocation.getArgument(2));
- invocation.<IRemoteCallback>getArgument(1).sendResult(bundle);
- return null;
- }).when(mRecommendationProvider)
- .requestRecommendation(eq(mRecommendationRequest), isA(IRemoteCallback.class),
- anyInt());
- mNetworkScoreService.onUserUnlocked(0);
-
- final RecommendationResult result =
- mNetworkScoreService.requestRecommendation(mRecommendationRequest);
- assertNotNull(result);
- assertEquals(providerResult.getWifiConfiguration().SSID,
- result.getWifiConfiguration().SSID);
- assertEquals(providerResult.getWifiConfiguration().BSSID,
- result.getWifiConfiguration().BSSID);
- }
-
- @Test
- public void testRequestRecommendationAsync_noPermission() throws Exception {
- doThrow(new SecurityException()).when(mContext)
- .enforceCallingOrSelfPermission(eq(permission.REQUEST_NETWORK_SCORES),
- anyString());
- try {
- mNetworkScoreService.requestRecommendationAsync(mRecommendationRequest,
- mRemoteCallback);
- fail("REQUEST_NETWORK_SCORES not enforced.");
- } catch (SecurityException e) {
- // expected
- }
- }
-
- @Test
- public void testRequestRecommendationAsync_providerNotConnected() throws Exception {
- mNetworkScoreService.requestRecommendationAsync(mRecommendationRequest,
- mRemoteCallback);
- boolean callbackRan = mOnResultListener.countDownLatch.await(3, TimeUnit.SECONDS);
- assertTrue(callbackRan);
- verifyZeroInteractions(mRecommendationProvider);
- }
-
- @Test
- public void testRequestRecommendationAsync_requestTimesOut() throws Exception {
- mNetworkScoreService.onUserUnlocked(0);
- Settings.Global.putLong(mContentResolver,
- Settings.Global.NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS, 1L);
- mNetworkScoreService.refreshRecommendationRequestTimeoutMs();
- mNetworkScoreService.requestRecommendationAsync(mRecommendationRequest,
- mRemoteCallback);
- boolean callbackRan = mOnResultListener.countDownLatch.await(3, TimeUnit.SECONDS);
- assertTrue(callbackRan);
- verify(mRecommendationProvider).requestRecommendation(eq(mRecommendationRequest),
- isA(IRemoteCallback.Stub.class), anyInt());
-
- assertTrue(mOnResultListener.receivedBundle.containsKey(EXTRA_RECOMMENDATION_RESULT));
- RecommendationResult result =
- mOnResultListener.receivedBundle.getParcelable(EXTRA_RECOMMENDATION_RESULT);
- assertTrue(result.hasRecommendation());
- assertEquals(mRecommendationRequest.getDefaultWifiConfig().SSID,
- result.getWifiConfiguration().SSID);
- }
-
- @Test
- public void testRequestRecommendationAsync_requestSucceeds() throws Exception {
- mNetworkScoreService.onUserUnlocked(0);
- final Bundle bundle = new Bundle();
- doAnswer(invocation -> {
- invocation.<IRemoteCallback>getArgument(1).sendResult(bundle);
- return null;
- }).when(mRecommendationProvider)
- .requestRecommendation(eq(mRecommendationRequest), isA(IRemoteCallback.class),
- anyInt());
-
- mNetworkScoreService.requestRecommendationAsync(mRecommendationRequest,
- mRemoteCallback);
- boolean callbackRan = mOnResultListener.countDownLatch.await(3, TimeUnit.SECONDS);
- assertTrue(callbackRan);
- // If it's not the same instance then something else ran the callback.
- assertSame(bundle, mOnResultListener.receivedBundle);
- }
-
- @Test
- public void testRequestRecommendationAsync_requestThrowsRemoteException() throws Exception {
- mNetworkScoreService.onUserUnlocked(0);
- doThrow(new RemoteException()).when(mRecommendationProvider)
- .requestRecommendation(eq(mRecommendationRequest), isA(IRemoteCallback.class),
- anyInt());
-
- mNetworkScoreService.requestRecommendationAsync(mRecommendationRequest,
- mRemoteCallback);
- boolean callbackRan = mOnResultListener.countDownLatch.await(3, TimeUnit.SECONDS);
- assertTrue(callbackRan);
- }
-
- @Test
public void dispatchingContentObserver_nullUri() throws Exception {
NetworkScoreService.DispatchingContentObserver observer =
new NetworkScoreService.DispatchingContentObserver(mContext, null /*handler*/);
@@ -435,15 +259,6 @@
}
@Test
- public void oneTimeCallback_multipleCallbacks() throws Exception {
- NetworkScoreService.OneTimeCallback callback =
- new NetworkScoreService.OneTimeCallback(mRemoteCallback);
- callback.sendResult(null);
- callback.sendResult(null);
- assertEquals(1, mOnResultListener.resultCount);
- }
-
- @Test
public void testUpdateScores_notActiveScorer() {
bindToScorer(false /*callerIsScorer*/);
@@ -1088,19 +903,6 @@
mNetworkScoreService.onUserUnlocked(0);
}
- private static class OnResultListener implements RemoteCallback.OnResultListener {
- private final CountDownLatch countDownLatch = new CountDownLatch(1);
- private int resultCount;
- private Bundle receivedBundle;
-
- @Override
- public void onResult(Bundle result) {
- countDownLatch.countDown();
- resultCount++;
- receivedBundle = result;
- }
- }
-
private static class CountDownHandler extends Handler {
CountDownLatch latch = new CountDownLatch(1);
int receivedWhat;
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityGestureDetectorTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityGestureDetectorTest.java
index d0c2b52..14abb8a1 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityGestureDetectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityGestureDetectorTest.java
@@ -16,7 +16,6 @@
package com.android.server.accessibility;
-import static junit.framework.TestCase.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.when;
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/FingerprintGestureControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/FingerprintGestureControllerTest.java
index cf477f2..360ccbf 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/FingerprintGestureControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/FingerprintGestureControllerTest.java
@@ -131,7 +131,8 @@
mFingerprintGestureController.registerFingerprintGestureCallback(
mMockFingerprintGestureCallback, null);
mFingerprintGestureController.onGesture(FINGERPRINT_GESTURE_SWIPE_DOWN);
- verify(mMockFingerprintGestureCallback, times(1)).onGesture(FINGERPRINT_GESTURE_SWIPE_DOWN);
+ verify(mMockFingerprintGestureCallback, times(1))
+ .onGestureDetected(FINGERPRINT_GESTURE_SWIPE_DOWN);
reset(mMockFingerprintGestureCallback);
mFingerprintGestureController.unregisterFingerprintGestureCallback(
@@ -150,9 +151,11 @@
mFingerprintGestureController.registerFingerprintGestureCallback(
mMockFingerprintGestureCallback, messageCapturingHandler);
mFingerprintGestureController.onGesture(FINGERPRINT_GESTURE_SWIPE_DOWN);
- verify(mMockFingerprintGestureCallback, times(0)).onGesture(FINGERPRINT_GESTURE_SWIPE_DOWN);
+ verify(mMockFingerprintGestureCallback, times(0))
+ .onGestureDetected(FINGERPRINT_GESTURE_SWIPE_DOWN);
messageCapturingHandler.sendLastMessage();
- verify(mMockFingerprintGestureCallback, times(1)).onGesture(FINGERPRINT_GESTURE_SWIPE_DOWN);
+ verify(mMockFingerprintGestureCallback, times(1))
+ .onGestureDetected(FINGERPRINT_GESTURE_SWIPE_DOWN);
reset(mMockFingerprintGestureCallback);
mFingerprintGestureController.unregisterFingerprintGestureCallback(
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/GestureDescriptionTest.java b/services/tests/servicestests/src/com/android/server/accessibility/GestureDescriptionTest.java
index b876a5f..8d389a2 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/GestureDescriptionTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/GestureDescriptionTest.java
@@ -16,7 +16,6 @@
package com.android.server.accessibility;
-import static android.accessibilityservice.GestureDescription.StrokeDescription.INVALID_STROKE_ID;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.CoreMatchers.everyItem;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -246,7 +245,7 @@
swipePath.moveTo(10, 20);
swipePath.lineTo(30, 40);
StrokeDescription stroke1 =
- new StrokeDescription(swipePath, 0, 100, 0, true);
+ new StrokeDescription(swipePath, 0, 100, true);
GestureDescription gesture = new GestureDescription.Builder().addStroke(stroke1).build();
List<GestureStep> steps = MotionEventGenerator
.getGestureStepsFromGestureDescription(gesture, 10);
@@ -260,9 +259,8 @@
swipePath.moveTo(10, 20);
swipePath.lineTo(30, 40);
StrokeDescription stroke1 =
- new StrokeDescription(swipePath, 0, 100, INVALID_STROKE_ID, true);
- StrokeDescription stroke2 =
- new StrokeDescription(swipePath, 0, 100, stroke1.getId(), false);
+ new StrokeDescription(swipePath, 0, 100, true);
+ StrokeDescription stroke2 = stroke1.continueStroke(swipePath, 0, 100, false);
GestureDescription gesture = new GestureDescription.Builder().addStroke(stroke2).build();
List<GestureStep> steps = MotionEventGenerator
.getGestureStepsFromGestureDescription(gesture, 10);
diff --git a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java
index 20839c5..36e9b3f8 100644
--- a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java
@@ -22,6 +22,7 @@
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.nullable;
import static org.mockito.Mockito.times;
@@ -80,6 +81,7 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
+import java.util.HashMap;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
@@ -2443,7 +2445,6 @@
@SmallTest
public void testGetAccountsByFeaturesError() throws Exception {
unlockSystemUser();
-
mAms.addAccountExplicitly(AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS, "p11", null);
mAms.addAccountExplicitly(AccountManagerServiceTestFixtures.ACCOUNT_ERROR, "p12", null);
@@ -2511,28 +2512,37 @@
updateBroadcastCounters(2);
assertEquals(mVisibleAccountsChangedBroadcasts, 0); // broadcast was not sent
assertEquals(mLoginAccountsChangedBroadcasts, 2);
- assertEquals(mAccountRemovedBroadcasts, 0);
}
@SmallTest
public void testRegisterAccountListenerWithAddingTwoAccounts() throws Exception {
unlockSystemUser();
+
+ HashMap<String, Integer> visibility = new HashMap<>();
+ visibility.put(AccountManagerServiceTestFixtures.CALLER_PACKAGE,
+ AccountManager.VISIBILITY_USER_MANAGED_VISIBLE);
+
mAms.registerAccountListener(
new String [] {AccountManagerServiceTestFixtures.ACCOUNT_TYPE_1},
- "testpackage"); // opPackageName
- mAms.addAccountExplicitly(AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS, "p11", null);
+ AccountManagerServiceTestFixtures.CALLER_PACKAGE);
+ mAms.addAccountExplicitlyWithVisibility(
+ AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS, "p11", null, visibility);
mAms.unregisterAccountListener(
new String [] {AccountManagerServiceTestFixtures.ACCOUNT_TYPE_1},
- "testpackage"); // opPackageName
- mAms.addAccountExplicitly(
- AccountManagerServiceTestFixtures.ACCOUNT_INTERVENE, "p11", null);
+ AccountManagerServiceTestFixtures.CALLER_PACKAGE);
+
+ addAccountRemovedReceiver(AccountManagerServiceTestFixtures.CALLER_PACKAGE);
+ mAms.addAccountExplicitlyWithVisibility(
+ AccountManagerServiceTestFixtures.ACCOUNT_INTERVENE, "p11", null, visibility);
updateBroadcastCounters(3);
assertEquals(mVisibleAccountsChangedBroadcasts, 1);
assertEquals(mLoginAccountsChangedBroadcasts, 2);
+ assertEquals(mAccountRemovedBroadcasts, 0);
mAms.removeAccountInternal(AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS);
- mAms.registerAccountListener( null /* accountTypes */, "testpackage");
+ mAms.registerAccountListener( null /* accountTypes */,
+ AccountManagerServiceTestFixtures.CALLER_PACKAGE);
mAms.removeAccountInternal(AccountManagerServiceTestFixtures.ACCOUNT_INTERVENE);
updateBroadcastCounters(8);
@@ -2544,6 +2554,13 @@
@SmallTest
public void testRegisterAccountListenerForThreePackages() throws Exception {
unlockSystemUser();
+
+ addAccountRemovedReceiver("testpackage1");
+ HashMap<String, Integer> visibility = new HashMap<>();
+ visibility.put("testpackage1", AccountManager.VISIBILITY_USER_MANAGED_VISIBLE);
+ visibility.put("testpackage2", AccountManager.VISIBILITY_USER_MANAGED_VISIBLE);
+ visibility.put("testpackage3", AccountManager.VISIBILITY_USER_MANAGED_VISIBLE);
+
mAms.registerAccountListener(
new String [] {AccountManagerServiceTestFixtures.ACCOUNT_TYPE_1},
"testpackage1"); // opPackageName
@@ -2553,7 +2570,8 @@
mAms.registerAccountListener(
new String [] {AccountManagerServiceTestFixtures.ACCOUNT_TYPE_1},
"testpackage3"); // opPackageName
- mAms.addAccountExplicitly(AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS, "p11", null);
+ mAms.addAccountExplicitlyWithVisibility(
+ AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS, "p11", null, visibility);
updateBroadcastCounters(4);
assertEquals(mVisibleAccountsChangedBroadcasts, 3);
assertEquals(mLoginAccountsChangedBroadcasts, 1);
@@ -2572,13 +2590,47 @@
mAms.addAccountExplicitly(
AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS_TYPE_2, "p11", null);
- updateBroadcastCounters(9);
+ updateBroadcastCounters(8);
assertEquals(mVisibleAccountsChangedBroadcasts, 5);
assertEquals(mLoginAccountsChangedBroadcasts, 3);
assertEquals(mAccountRemovedBroadcasts, 1);
}
@SmallTest
+ public void testRegisterAccountListenerForAddingAccountWithVisibility() throws Exception {
+ unlockSystemUser();
+
+ HashMap<String, Integer> visibility = new HashMap<>();
+ visibility.put("testpackage1", AccountManager.VISIBILITY_NOT_VISIBLE);
+ visibility.put("testpackage2", AccountManager.VISIBILITY_USER_MANAGED_NOT_VISIBLE);
+ visibility.put("testpackage3", AccountManager.VISIBILITY_USER_MANAGED_VISIBLE);
+
+ addAccountRemovedReceiver("testpackage1");
+ mAms.registerAccountListener(
+ new String [] {AccountManagerServiceTestFixtures.ACCOUNT_TYPE_1},
+ "testpackage1"); // opPackageName
+ mAms.registerAccountListener(
+ new String [] {AccountManagerServiceTestFixtures.ACCOUNT_TYPE_1},
+ "testpackage2"); // opPackageName
+ mAms.registerAccountListener(
+ new String [] {AccountManagerServiceTestFixtures.ACCOUNT_TYPE_1},
+ "testpackage3"); // opPackageName
+ mAms.addAccountExplicitlyWithVisibility(
+ AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS, "p11", null, visibility);
+
+ updateBroadcastCounters(2);
+ assertEquals(mVisibleAccountsChangedBroadcasts, 1);
+ assertEquals(mLoginAccountsChangedBroadcasts, 1);
+
+ mAms.removeAccountInternal(AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS);
+
+ updateBroadcastCounters(4);
+ assertEquals(mVisibleAccountsChangedBroadcasts, 2);
+ assertEquals(mLoginAccountsChangedBroadcasts, 2);
+ assertEquals(mAccountRemovedBroadcasts, 0); // account was never visible.
+ }
+
+ @SmallTest
public void testRegisterAccountListenerCredentialsUpdate() throws Exception {
unlockSystemUser();
mAms.registerAccountListener(
@@ -2609,21 +2661,31 @@
mLoginAccountsChangedBroadcasts = 0;
mAccountRemovedBroadcasts = 0;
ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
- verify(mMockContext, times(expectedBroadcasts)).sendBroadcastAsUser(captor.capture(),
+ verify(mMockContext, atLeast(expectedBroadcasts)).sendBroadcastAsUser(captor.capture(),
any(UserHandle.class));
for (Intent intent : captor.getAllValues()) {
if (AccountManager.ACTION_VISIBLE_ACCOUNTS_CHANGED.equals(intent.getAction())) {
mVisibleAccountsChangedBroadcasts++;
- }
- if (AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION.equals(intent.getAction())) {
+ } else if (AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION.equals(intent.getAction())) {
mLoginAccountsChangedBroadcasts++;
- }
- if (AccountManager.ACTION_ACCOUNT_REMOVED.equals(intent.getAction())) {
+ } else if (AccountManager.ACTION_ACCOUNT_REMOVED.equals(intent.getAction())) {
mAccountRemovedBroadcasts++;
}
}
}
+ private void addAccountRemovedReceiver(String packageName) {
+ ResolveInfo resolveInfo = new ResolveInfo();
+ resolveInfo.activityInfo = new ActivityInfo();
+ resolveInfo.activityInfo.applicationInfo = new ApplicationInfo();
+ resolveInfo.activityInfo.applicationInfo.packageName = packageName;
+
+ List<ResolveInfo> accountRemovedReceivers = new ArrayList<>();
+ accountRemovedReceivers.add(resolveInfo);
+ when(mMockPackageManager.queryBroadcastReceiversAsUser(any(Intent.class), anyInt(),
+ anyInt())).thenReturn(accountRemovedReceivers);
+ }
+
@SmallTest
public void testConcurrencyReadWrite() throws Exception {
// Test 2 threads calling getAccounts and 1 thread setAuthToken
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
index 58166b6..c87eaed 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
@@ -22,6 +22,7 @@
import static org.junit.Assert.assertTrue;
import android.content.ComponentName;
+import android.content.pm.ActivityInfo;
import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -84,4 +85,16 @@
// Make sure the resumed activity is untouched.
assertEquals(testStack.mResumedActivity, activityRecord);
}
+
+ @Test
+ public void testStopActivityWhenActivityDestroyed() throws Exception {
+ final ActivityManagerService service = createActivityManagerService();
+ final TaskRecord task = createTask(service, testActivityComponent, TEST_STACK_ID);
+ final ActivityRecord activityRecord = createActivity(service, testActivityComponent, task);
+ activityRecord.info.flags |= ActivityInfo.FLAG_NO_HISTORY;
+ final ActivityStack testStack = service.mStackSupervisor.getStack(TEST_STACK_ID);
+ service.mStackSupervisor.setFocusStackUnchecked("testStopActivityWithDestroy", testStack);
+
+ testStack.stopActivityLocked(activityRecord);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
index 0827084..28051f9 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
@@ -161,6 +161,11 @@
void moveHomeStackToFront(String reason) {
}
+ @Override
+ boolean moveHomeStackTaskToTop(String reason) {
+ return true;
+ }
+
// Invoked during {@link ActivityStack} creation.
@Override
void updateUIDsPresentOnDisplay() {
@@ -225,9 +230,17 @@
if (mStack == null) {
final RecentTasks recents =
new RecentTasks(mService, mService.mStackSupervisor);
- mStack = mStackId == ActivityManager.StackId.PINNED_STACK_ID
- ? new PinnedActivityStack(this, recents, mOnTop)
- : new TestActivityStack(this, recents, mOnTop);
+ if (mStackId == ActivityManager.StackId.PINNED_STACK_ID) {
+ mStack = new PinnedActivityStack(this, recents, mOnTop) {
+ @Override
+ Rect getPictureInPictureBounds(float aspectRatio,
+ boolean useExistingStackBounds) {
+ return new Rect(50, 50, 100, 100);
+ }
+ };
+ } else {
+ mStack = new TestActivityStack(this, recents, mOnTop);
+ }
}
return mStack;
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java
index b440095..be1d07b 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java
@@ -15,31 +15,28 @@
*/
package com.android.server.devicepolicy;
-import com.android.server.LocalServices;
-import com.android.server.SystemService;
-import com.android.server.devicepolicy.DevicePolicyManagerServiceTestable.OwnersTestable;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.when;
-import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
-import android.util.Pair;
+import android.provider.Settings;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
+import com.android.server.LocalServices;
+import com.android.server.SystemService;
+import com.android.server.devicepolicy.DevicePolicyManagerServiceTestable.OwnersTestable;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.when;
+import java.util.Set;
public class DevicePolicyManagerServiceMigrationTest extends DpmTestBase {
private DpmMockContext mContext;
@@ -57,7 +54,7 @@
public void testMigration() throws Exception {
final File user10dir = mMockContext.addUser(10, 0);
final File user11dir = mMockContext.addUser(11, UserInfo.FLAG_MANAGED_PROFILE);
- final File user12dir = mMockContext.addUser(12, 0);
+ mMockContext.addUser(12, 0);
setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
setUpPackageManagerForAdmin(admin2, UserHandle.getUid(10, 123));
@@ -109,16 +106,13 @@
final Map<Integer, Bundle> newBaseRestrictions = new HashMap<>();
- doAnswer(new Answer<Void>() {
- @Override
- public Void answer(InvocationOnMock invocation) throws Throwable {
- Integer userId = (Integer) invocation.getArguments()[0];
- Bundle bundle = (Bundle) invocation.getArguments()[1];
+ doAnswer(invocation -> {
+ Integer userId = (Integer) invocation.getArguments()[0];
+ Bundle bundle = (Bundle) invocation.getArguments()[1];
- newBaseRestrictions.put(userId, bundle);
+ newBaseRestrictions.put(userId, bundle);
- return null;
- }
+ return null;
}).when(mContext.userManagerInternal).setBaseUserRestrictionsByDpmsForMigration(
anyInt(), any(Bundle.class));
@@ -225,16 +219,13 @@
final Map<Integer, Bundle> newBaseRestrictions = new HashMap<>();
- doAnswer(new Answer<Void>() {
- @Override
- public Void answer(InvocationOnMock invocation) throws Throwable {
- Integer userId = (Integer) invocation.getArguments()[0];
- Bundle bundle = (Bundle) invocation.getArguments()[1];
+ doAnswer(invocation -> {
+ Integer userId = (Integer) invocation.getArguments()[0];
+ Bundle bundle = (Bundle) invocation.getArguments()[1];
- newBaseRestrictions.put(userId, bundle);
+ newBaseRestrictions.put(userId, bundle);
- return null;
- }
+ return null;
}).when(mContext.userManagerInternal).setBaseUserRestrictionsByDpmsForMigration(
anyInt(), any(Bundle.class));
@@ -278,4 +269,63 @@
),
dpms.getProfileOwnerAdminLocked(UserHandle.USER_SYSTEM).ensureUserRestrictions());
}
+
+ // Test setting default restrictions for managed profile.
+ public void testMigration3_managedProfileOwner() throws Exception {
+ // Create a managed profile user.
+ final File user10dir = mMockContext.addUser(10, UserInfo.FLAG_MANAGED_PROFILE);
+ // Profile owner package for managed profile user.
+ setUpPackageManagerForAdmin(admin1, UserHandle.getUid(10, 123));
+ // Set up fake UserManager to make it look like a managed profile.
+ when(mMockContext.userManager.isManagedProfile(eq(10))).thenReturn(true);
+ // Set up fake Settings to make it look like INSTALL_NON_MARKET_APPS was reversed.
+ when(mMockContext.settings.settingsSecureGetIntForUser(
+ eq(Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED),
+ eq(0), eq(10))).thenReturn(1);
+ // Write policy and owners files.
+ DpmTestUtils.writeToFile(
+ (new File(mContext.systemUserDataDir, "device_policies.xml")).getAbsoluteFile(),
+ DpmTestUtils.readAsset(mRealTestContext,
+ "DevicePolicyManagerServiceMigrationTest3/system_device_policies.xml"));
+ DpmTestUtils.writeToFile(
+ (new File(user10dir, "device_policies.xml")).getAbsoluteFile(),
+ DpmTestUtils.readAsset(mRealTestContext,
+ "DevicePolicyManagerServiceMigrationTest3/profile_device_policies.xml"));
+ DpmTestUtils.writeToFile(
+ (new File(user10dir, "profile_owner.xml")).getAbsoluteFile(),
+ DpmTestUtils.readAsset(mRealTestContext,
+ "DevicePolicyManagerServiceMigrationTest3/profile_owner.xml"));
+
+ final DevicePolicyManagerServiceTestable dpms;
+
+ // Initialize DPM/DPMS and let it migrate the persisted information.
+ // (Need clearCallingIdentity() to pass permission checks.)
+ final long ident = mContext.binder.clearCallingIdentity();
+ try {
+ LocalServices.removeServiceForTest(DevicePolicyManagerInternal.class);
+
+ dpms = new DevicePolicyManagerServiceTestable(mContext, dataDir);
+
+ dpms.systemReady(SystemService.PHASE_LOCK_SETTINGS_READY);
+ dpms.systemReady(SystemService.PHASE_BOOT_COMPLETED);
+ } finally {
+ mContext.binder.restoreCallingIdentity(ident);
+ }
+
+ assertFalse(dpms.mOwners.hasDeviceOwner());
+ assertTrue(dpms.mOwners.hasProfileOwner(10));
+
+ // Check that default restrictions were applied.
+ DpmTestUtils.assertRestrictions(
+ DpmTestUtils.newRestrictions(
+ UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES,
+ UserManager.DISALLOW_BLUETOOTH_SHARING
+ ),
+ dpms.getProfileOwnerAdminLocked(10).ensureUserRestrictions());
+
+ final Set<String> alreadySet =
+ dpms.getProfileOwnerAdminLocked(10).defaultEnabledRestrictionsAlreadySet;
+ assertEquals(alreadySet.size(), 1);
+ assertTrue(alreadySet.contains(UserManager.DISALLOW_BLUETOOTH_SHARING));
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
index a6ce1d5..46da3de 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
@@ -21,7 +21,6 @@
import android.app.backup.IBackupManager;
import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManagerInternal;
import android.database.ContentObserver;
@@ -56,17 +55,17 @@
public static class OwnersTestable extends Owners {
public static final String LEGACY_FILE = "legacy.xml";
public static final String DEVICE_OWNER_FILE = "device_owner2.xml";
- public static final String PROFILE_OWNER_FILE_BASE = "profile_owner.xml";
+ public static final String PROFILE_OWNER_FILE = "profile_owner.xml";
private final File mLegacyFile;
private final File mDeviceOwnerFile;
- private final File mProfileOwnerBase;
+ private final File mUsersDataDir;
public OwnersTestable(DpmMockContext context) {
super(context.userManager, context.userManagerInternal, context.packageManagerInternal);
mLegacyFile = new File(context.dataDir, LEGACY_FILE);
mDeviceOwnerFile = new File(context.dataDir, DEVICE_OWNER_FILE);
- mProfileOwnerBase = new File(context.dataDir, PROFILE_OWNER_FILE_BASE);
+ mUsersDataDir = new File(context.dataDir, "users");
}
@Override
@@ -81,7 +80,8 @@
@Override
File getProfileOwnerFileWithTestOverride(int userId) {
- return new File(mDeviceOwnerFile.getAbsoluteFile() + "-" + userId);
+ final File userDir = new File(mUsersDataDir, String.valueOf(userId));
+ return new File(userDir, PROFILE_OWNER_FILE);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index 6a01c1c..c2b0ea5 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -1217,7 +1217,8 @@
}
/**
- * Setup a package in the package manager mock. Useful for faking installed applications.
+ * Setup a package in the package manager mock for {@link DpmMockContext#CALLER_USER_HANDLE}.
+ * Useful for faking installed applications.
*
* @param packageName the name of the package to be setup
* @param appId the application ID to be given to the package
@@ -1225,19 +1226,41 @@
*/
private int setupPackageInPackageManager(final String packageName, final int appId)
throws Exception {
+ return setupPackageInPackageManager(
+ packageName, DpmMockContext.CALLER_USER_HANDLE, appId,
+ ApplicationInfo.FLAG_HAS_CODE);
+ }
+
+ /**
+ * Setup a package in the package manager mock. Useful for faking installed applications.
+ *
+ * @param packageName the name of the package to be setup
+ * @param userId the user id where the package will be "installed"
+ * @param appId the application ID to be given to the package
+ * @param flags flags to set in the ApplicationInfo for this package
+ * @return the UID of the package as known by the mock package manager
+ */
+ private int setupPackageInPackageManager(
+ final String packageName, int userId, final int appId, int flags)
+ throws Exception {
// Make the PackageManager return the package instead of throwing a NameNotFoundException
final PackageInfo pi = new PackageInfo();
pi.applicationInfo = new ApplicationInfo();
- pi.applicationInfo.flags = ApplicationInfo.FLAG_HAS_CODE;
+ pi.applicationInfo.flags = flags;
doReturn(pi).when(mContext.ipackageManager).getPackageInfo(
eq(packageName),
anyInt(),
- eq(DpmMockContext.CALLER_USER_HANDLE));
+ eq(userId));
+ doReturn(pi.applicationInfo).when(mContext.ipackageManager).getApplicationInfo(
+ eq(packageName),
+ anyInt(),
+ eq(userId));
+
// Setup application UID with the PackageManager
- final int uid = UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, appId);
+ final int uid = UserHandle.getUid(userId, appId);
doReturn(uid).when(mContext.packageManager).getPackageUidAsUser(
eq(packageName),
- eq(DpmMockContext.CALLER_USER_HANDLE));
+ eq(userId));
// Associate packageName to uid
doReturn(packageName).when(mContext.ipackageManager).getNameForUid(eq(uid));
doReturn(new String[]{packageName})
@@ -2154,7 +2177,7 @@
// Have the profile owner specify a set of affiliation ids. Check that the test user remains
// unaffiliated.
- final List<String> userAffiliationIds = new ArrayList<>();
+ final Set<String> userAffiliationIds = new ArraySet<>();
userAffiliationIds.add("red");
userAffiliationIds.add("green");
userAffiliationIds.add("blue");
@@ -2164,7 +2187,7 @@
// Have the device owner specify a set of affiliation ids that do not intersect with those
// specified by the profile owner. Check that the test user remains unaffiliated.
- final List<String> deviceAffiliationIds = new ArrayList<>();
+ final Set<String> deviceAffiliationIds = new ArraySet<>();
deviceAffiliationIds.add("cyan");
deviceAffiliationIds.add("yellow");
deviceAffiliationIds.add("magenta");
@@ -2184,7 +2207,7 @@
assertTrue(dpm.isAffiliatedUser());
// Clear affiliation ids for the profile owner. The user becomes unaffiliated.
- dpm.setAffiliationIds(admin2, Collections.emptyList());
+ dpm.setAffiliationIds(admin2, Collections.emptySet());
assertTrue(dpm.getAffiliationIds(admin2).isEmpty());
assertFalse(dpm.isAffiliatedUser());
@@ -3377,7 +3400,7 @@
MoreAsserts.assertEmpty(targetUsers);
// Setting affiliation ids
- final List<String> userAffiliationIds = Arrays.asList("some.affiliation-id");
+ final Set<String> userAffiliationIds = Collections.singleton("some.affiliation-id");
mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
dpm.setAffiliationIds(admin1, userAffiliationIds);
@@ -3397,7 +3420,7 @@
MoreAsserts.assertContentsInAnyOrder(targetUsers, UserHandle.SYSTEM);
// Changing affiliation ids in one
- dpm.setAffiliationIds(admin1, Arrays.asList("some-different-affiliation-id"));
+ dpm.setAffiliationIds(admin1, Collections.singleton("some-different-affiliation-id"));
// Since the managed profile is not affiliated any more, they should not be allowed to talk
// to each other.
@@ -3422,7 +3445,7 @@
addManagedProfile(adminDifferentPackage, MANAGED_PROFILE_ADMIN_UID, admin2);
// Setting affiliation ids
- final List<String> userAffiliationIds = Arrays.asList("some-affiliation-id");
+ final Set<String> userAffiliationIds = Collections.singleton("some-affiliation-id");
dpm.setAffiliationIds(admin1, userAffiliationIds);
mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
@@ -3484,7 +3507,7 @@
assertFalse(dpm.isLockTaskPermitted("doPackage1"));
// Setting same affiliation ids
- final List<String> userAffiliationIds = Arrays.asList("some-affiliation-id");
+ final Set<String> userAffiliationIds = Collections.singleton("some-affiliation-id");
mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
dpm.setAffiliationIds(admin1, userAffiliationIds);
@@ -3500,7 +3523,7 @@
.updateLockTaskPackages(eq(MANAGED_PROFILE_USER_ID), eq(poPackages));
// Unaffiliate the profile, lock task mode no longer available on the profile.
- dpm.setAffiliationIds(adminDifferentPackage, Collections.<String>emptyList());
+ dpm.setAffiliationIds(adminDifferentPackage, Collections.emptySet());
assertFalse(dpm.isLockTaskPermitted("poPackage1"));
// Lock task packages cleared when loading user data and when the user becomes unaffiliated.
verify(mContext.iactivityManager, times(2))
@@ -3971,6 +3994,210 @@
assertFalse(dpm.isCurrentInputMethodSetByOwner());
}
+ public void testSetPermittedCrossProfileNotificationListeners_unavailableForDo()
+ throws Exception {
+ // Set up a device owner.
+ mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
+ setupDeviceOwner();
+ assertSetPermittedCrossProfileNotificationListenersUnavailable(mContext.binder.callingUid);
+ }
+
+ public void testSetPermittedCrossProfileNotificationListeners_unavailableForPoOnUser()
+ throws Exception {
+ // Set up a profile owner.
+ mContext.binder.callingUid = DpmMockContext.CALLER_UID;
+ setupProfileOwner();
+ assertSetPermittedCrossProfileNotificationListenersUnavailable(mContext.binder.callingUid);
+ }
+
+ private void assertSetPermittedCrossProfileNotificationListenersUnavailable(
+ int adminUid) throws Exception {
+ mContext.binder.callingUid = adminUid;
+ final int userId = UserHandle.getUserId(adminUid);
+
+ final String packageName = "some.package";
+ assertFalse(dpms.setPermittedCrossProfileNotificationListeners(
+ admin1, Collections.singletonList(packageName)));
+ assertNull(dpms.getPermittedCrossProfileNotificationListeners(admin1));
+
+ mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
+ assertTrue(dpms.isNotificationListenerServicePermitted(packageName, userId));
+
+ // Attempt to set to empty list (which means no listener is whitelisted)
+ mContext.binder.callingUid = adminUid;
+ assertFalse(dpms.setPermittedCrossProfileNotificationListeners(
+ admin1, Collections.<String>emptyList()));
+ assertNull(dpms.getPermittedCrossProfileNotificationListeners(admin1));
+
+ mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
+ assertTrue(dpms.isNotificationListenerServicePermitted(packageName, userId));
+ }
+
+ public void testIsNotificationListenerServicePermitted_onlySystemCanCall() throws Exception {
+ // Set up a managed profile
+ final int MANAGED_PROFILE_USER_ID = 15;
+ final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
+ addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
+ mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
+
+ final String permittedListener = "some.package";
+ setupPackageInPackageManager(
+ permittedListener,
+ UserHandle.USER_SYSTEM, // We check the packageInfo from the primary user.
+ /*appId=*/ 12345, /*flags=*/ 0);
+
+ assertTrue(dpms.setPermittedCrossProfileNotificationListeners(
+ admin1, Collections.singletonList(permittedListener)));
+
+ try {
+ dpms.isNotificationListenerServicePermitted(
+ permittedListener, MANAGED_PROFILE_USER_ID);
+ fail("isNotificationListenerServicePermitted should throw if not called from System");
+ } catch (SecurityException expected) {
+ }
+
+ mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ permittedListener, MANAGED_PROFILE_USER_ID));
+ }
+
+ public void testSetPermittedCrossProfileNotificationListeners_managedProfile()
+ throws Exception {
+ // Set up a managed profile
+ final int MANAGED_PROFILE_USER_ID = 15;
+ final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
+ addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
+ mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
+
+ final String permittedListener = "permitted.package";
+ int appId = 12345;
+ setupPackageInPackageManager(
+ permittedListener,
+ UserHandle.USER_SYSTEM, // We check the packageInfo from the primary user.
+ appId, /*flags=*/ 0);
+
+ final String notPermittedListener = "not.permitted.package";
+ setupPackageInPackageManager(
+ notPermittedListener,
+ UserHandle.USER_SYSTEM, // We check the packageInfo from the primary user.
+ ++appId, /*flags=*/ 0);
+
+ final String systemListener = "system.package";
+ setupPackageInPackageManager(
+ systemListener,
+ UserHandle.USER_SYSTEM, // We check the packageInfo from the primary user.
+ ++appId, ApplicationInfo.FLAG_SYSTEM);
+
+ // By default all packages are allowed
+ assertNull(dpms.getPermittedCrossProfileNotificationListeners(admin1));
+
+ mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ permittedListener, MANAGED_PROFILE_USER_ID));
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ notPermittedListener, MANAGED_PROFILE_USER_ID));
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ systemListener, MANAGED_PROFILE_USER_ID));
+
+ // Setting only one package in the whitelist
+ mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
+ assertTrue(dpms.setPermittedCrossProfileNotificationListeners(
+ admin1, Collections.singletonList(permittedListener)));
+ List<String> permittedListeners =
+ dpms.getPermittedCrossProfileNotificationListeners(admin1);
+ assertEquals(1, permittedListeners.size());
+ assertEquals(permittedListener, permittedListeners.get(0));
+
+ mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ permittedListener, MANAGED_PROFILE_USER_ID));
+ assertFalse(dpms.isNotificationListenerServicePermitted(
+ notPermittedListener, MANAGED_PROFILE_USER_ID));
+ // System packages are always allowed (even if not in the whitelist)
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ systemListener, MANAGED_PROFILE_USER_ID));
+
+ // Setting an empty whitelist - only system listeners allowed
+ mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
+ assertTrue(dpms.setPermittedCrossProfileNotificationListeners(
+ admin1, Collections.<String>emptyList()));
+ assertEquals(0, dpms.getPermittedCrossProfileNotificationListeners(admin1).size());
+
+ mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
+ assertFalse(dpms.isNotificationListenerServicePermitted(
+ permittedListener, MANAGED_PROFILE_USER_ID));
+ assertFalse(dpms.isNotificationListenerServicePermitted(
+ notPermittedListener, MANAGED_PROFILE_USER_ID));
+ // System packages are always allowed (even if not in the whitelist)
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ systemListener, MANAGED_PROFILE_USER_ID));
+
+ // Setting a null whitelist - all listeners allowed
+ mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
+ assertTrue(dpms.setPermittedCrossProfileNotificationListeners(admin1, null));
+ assertNull(dpms.getPermittedCrossProfileNotificationListeners(admin1));
+
+ mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ permittedListener, MANAGED_PROFILE_USER_ID));
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ notPermittedListener, MANAGED_PROFILE_USER_ID));
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ systemListener, MANAGED_PROFILE_USER_ID));
+ }
+
+ public void testSetPermittedCrossProfileNotificationListeners_doesNotAffectPrimaryProfile()
+ throws Exception {
+ // Set up a managed profile
+ final int MANAGED_PROFILE_USER_ID = 15;
+ final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
+ addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
+ mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
+
+ final String nonSystemPackage = "non.system.package";
+ int appId = 12345;
+ setupPackageInPackageManager(
+ nonSystemPackage,
+ UserHandle.USER_SYSTEM, // We check the packageInfo from the primary user.
+ appId, /*flags=*/ 0);
+
+ final String systemListener = "system.package";
+ setupPackageInPackageManager(
+ systemListener,
+ UserHandle.USER_SYSTEM, // We check the packageInfo from the primary user.
+ ++appId, ApplicationInfo.FLAG_SYSTEM);
+
+ // By default all packages are allowed (for all profiles)
+ assertNull(dpms.getPermittedCrossProfileNotificationListeners(admin1));
+
+ mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ nonSystemPackage, MANAGED_PROFILE_USER_ID));
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ systemListener, MANAGED_PROFILE_USER_ID));
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ nonSystemPackage, UserHandle.USER_SYSTEM));
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ systemListener, UserHandle.USER_SYSTEM));
+
+ // Setting an empty whitelist - only system listeners allowed in managed profile, but
+ // all allowed in primary profile
+ mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
+ assertTrue(dpms.setPermittedCrossProfileNotificationListeners(
+ admin1, Collections.<String>emptyList()));
+ assertEquals(0, dpms.getPermittedCrossProfileNotificationListeners(admin1).size());
+
+ mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
+ assertFalse(dpms.isNotificationListenerServicePermitted(
+ nonSystemPackage, MANAGED_PROFILE_USER_ID));
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ systemListener, MANAGED_PROFILE_USER_ID));
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ nonSystemPackage, UserHandle.USER_SYSTEM));
+ assertTrue(dpms.isNotificationListenerServicePermitted(
+ systemListener, UserHandle.USER_SYSTEM));
+ }
+
public void testGetOwnerInstalledCaCertsForDeviceOwner() throws Exception {
mContext.packageName = mRealTestContext.getPackageName();
setDeviceOwner();
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java
index 1ea12d8..23fada4 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java
@@ -468,7 +468,7 @@
when(accountManager.getAccountsAsUser(anyInt())).thenReturn(new Account[0]);
// Create a data directory.
- final File dir = new File(dataDir, "user" + userId);
+ final File dir = new File(dataDir, "users/" + userId);
DpmTestUtils.clearDir(dir);
when(environment.getUserSystemDirectory(eq(userId))).thenReturn(dir);
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/NetworkEventTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/NetworkEventTest.java
index 315d37c..db317a0 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/NetworkEventTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/NetworkEventTest.java
@@ -35,7 +35,7 @@
p.setDataPosition(0);
ConnectEvent unparceledEvent = p.readParcelable(NetworkEventTest.class.getClassLoader());
p.recycle();
- assertEquals(event.getIpAddress(), unparceledEvent.getIpAddress());
+ assertEquals(event.getInetAddress(), unparceledEvent.getInetAddress());
assertEquals(event.getPort(), unparceledEvent.getPort());
assertEquals(event.getPackageName(), unparceledEvent.getPackageName());
assertEquals(event.getTimestamp(), unparceledEvent.getTimestamp());
@@ -53,9 +53,10 @@
DnsEvent unparceledEvent = p.readParcelable(NetworkEventTest.class.getClassLoader());
p.recycle();
assertEquals(event.getHostname(), unparceledEvent.getHostname());
- assertEquals(event.getIpAddresses()[0], unparceledEvent.getIpAddresses()[0]);
- assertEquals(event.getIpAddresses()[1], unparceledEvent.getIpAddresses()[1]);
- assertEquals(event.getIpAddressesCount(), unparceledEvent.getIpAddressesCount());
+ assertEquals(event.getInetAddresses().get(0), unparceledEvent.getInetAddresses().get(0));
+ assertEquals(event.getInetAddresses().get(1), unparceledEvent.getInetAddresses().get(1));
+ assertEquals(event.getTotalResolvedAddressCount(),
+ unparceledEvent.getTotalResolvedAddressCount());
assertEquals(event.getPackageName(), unparceledEvent.getPackageName());
assertEquals(event.getTimestamp(), unparceledEvent.getTimestamp());
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
index d8db331..1284b1b 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
@@ -15,7 +15,6 @@
*/
package com.android.server.pm;
-import android.annotation.TestApi;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ConfigurationInfo;
@@ -338,7 +337,7 @@
// Sanity check for InstrumentationInfo.
assertEquals(a.info.targetPackage, b.info.targetPackage);
- assertEquals(a.info.targetProcess, b.info.targetProcess);
+ assertEquals(a.info.targetProcesses, b.info.targetProcesses);
assertEquals(a.info.sourceDir, b.info.sourceDir);
assertEquals(a.info.publicSourceDir, b.info.publicSourceDir);
}
diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
index 967b0a4..d12c07a 100644
--- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
@@ -16,10 +16,19 @@
package com.android.server.power;
+import android.content.Context;
import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
+import android.os.PowerManager;
import android.os.PowerSaveState;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
+import android.text.TextUtils;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import org.junit.Rule;
+import org.junit.rules.TemporaryFolder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -35,11 +44,16 @@
private static final float PRECISION = 0.001f;
private static final float BRIGHTNESS_FACTOR = 0.7f;
private static final boolean BATTERY_SAVER_ENABLED = true;
+ private static final String LAST_REBOOT_REASON = "last_reboot_reason";
private @Mock BatterySaverPolicy mBatterySaverPolicy;
private PowerManagerService mService;
private PowerSaveState mPowerSaveState;
private DisplayPowerRequest mDisplayPowerRequest;
+ private File mTempReason;
+
+ @Rule
+ public TemporaryFolder temporaryFolder = new TemporaryFolder();
public void setUp() throws Exception {
super.setUp();
@@ -54,6 +68,8 @@
.thenReturn(mPowerSaveState);
mDisplayPowerRequest = new DisplayPowerRequest();
mService = new PowerManagerService(getContext(), mBatterySaverPolicy);
+ temporaryFolder.create();
+ mTempReason = temporaryFolder.newFile(LAST_REBOOT_REASON);
}
@SmallTest
@@ -63,4 +79,17 @@
assertThat(mDisplayPowerRequest.screenLowPowerBrightnessFactor)
.isWithin(PRECISION).of(BRIGHTNESS_FACTOR);
}
+
+ @SmallTest
+ public void testGetLastShutdownReasonInternal() {
+ try {
+ FileWriter writer = new FileWriter(mTempReason);
+ writer.append("thermal-shutdown\n");
+ writer.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ int reason = mService.getLastShutdownReasonInternal(mTempReason);
+ assertThat(reason).isEqualTo(PowerManager.SHUTDOWN_REASON_THERMAL_SHUTDOWN);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/AppBoundsTests.java b/services/tests/servicestests/src/com/android/server/wm/AppBoundsTests.java
index f68e06a..a599427 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AppBoundsTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AppBoundsTests.java
@@ -19,7 +19,6 @@
import android.app.ActivityManager;
import android.content.res.Configuration;
import android.graphics.Rect;
-import android.os.Debug;
import android.view.DisplayInfo;
import org.junit.Test;
@@ -53,11 +52,11 @@
*/
@Test
public void testRootConfigurationBounds() throws Exception {
- final DisplayInfo info = sDisplayContent.getDisplayInfo();
+ final DisplayInfo info = mDisplayContent.getDisplayInfo();
info.appWidth = 1024;
info.appHeight = 768;
- final Configuration config = sWm.computeNewConfiguration(sDisplayContent.getDisplayId());
+ final Configuration config = sWm.computeNewConfiguration(mDisplayContent.getDisplayId());
// The bounds should always be positioned in the top left.
assertEquals(config.appBounds.left, 0);
assertEquals(config.appBounds.top, 0);
@@ -116,8 +115,8 @@
*/
@Test
public void testFullScreenFreeFormBounds() throws Exception {
- final Rect fullScreenBounds = new Rect(0, 0, sDisplayInfo.logicalWidth,
- sDisplayInfo.logicalHeight);
+ final Rect fullScreenBounds = new Rect(0, 0, mDisplayInfo.logicalWidth,
+ mDisplayInfo.logicalHeight);
testStackBoundsConfiguration(null /*stackId*/, mParentBounds, fullScreenBounds,
mParentBounds);
}
@@ -126,16 +125,16 @@
private void testStackBoundsConfiguration(Integer stackId, Rect parentBounds, Rect bounds,
Rect expectedConfigBounds) {
final StackWindowController stackController = stackId != null ?
- createStackControllerOnStackOnDisplay(stackId, sDisplayContent)
- : createStackControllerOnDisplay(sDisplayContent);
+ createStackControllerOnStackOnDisplay(stackId, mDisplayContent)
+ : createStackControllerOnDisplay(mDisplayContent);
- final Configuration parentConfig = sDisplayContent.getConfiguration();
+ final Configuration parentConfig = mDisplayContent.getConfiguration();
parentConfig.setAppBounds(parentBounds);
final Configuration config = new Configuration();
stackController.adjustConfigurationForBounds(bounds, null /*insetBounds*/,
new Rect() /*nonDecorBounds*/, new Rect() /*stableBounds*/, false /*overrideWidth*/,
- false /*overrideHeight*/, sDisplayInfo.logicalDensityDpi, config, parentConfig);
+ false /*overrideHeight*/, mDisplayInfo.logicalDensityDpi, config, parentConfig);
// Assert that both expected and actual are null or are equal to each other
assertTrue((expectedConfigBounds == null && config.appBounds == null)
diff --git a/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java
index d206407..dcbedb6 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java
@@ -48,14 +48,14 @@
createAppWindowController();
// Assert token was added to display.
- assertNotNull(sDisplayContent.getWindowToken(controller.mToken.asBinder()));
+ assertNotNull(mDisplayContent.getWindowToken(controller.mToken.asBinder()));
// Assert that the container was created and linked.
assertNotNull(controller.mContainer);
- controller.removeContainer(sDisplayContent.getDisplayId());
+ controller.removeContainer(mDisplayContent.getDisplayId());
// Assert token was remove from display.
- assertNull(sDisplayContent.getWindowToken(controller.mToken.asBinder()));
+ assertNull(mDisplayContent.getWindowToken(controller.mToken.asBinder()));
// Assert that the container was removed.
assertNull(controller.mContainer);
}
@@ -68,11 +68,11 @@
// Assert orientation is unspecified to start.
assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, controller.getOrientation());
- controller.setOrientation(SCREEN_ORIENTATION_LANDSCAPE, sDisplayContent.getDisplayId(),
+ controller.setOrientation(SCREEN_ORIENTATION_LANDSCAPE, mDisplayContent.getDisplayId(),
EMPTY /* displayConfig */, false /* freezeScreenIfNeeded */);
assertEquals(SCREEN_ORIENTATION_LANDSCAPE, controller.getOrientation());
- controller.removeContainer(sDisplayContent.getDisplayId());
+ controller.removeContainer(mDisplayContent.getDisplayId());
// Assert orientation is unspecified to after container is removed.
assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, controller.getOrientation());
@@ -99,7 +99,7 @@
controller.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(),
android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true);
waitUntilHandlersIdle();
- final AppWindowToken atoken = controller.getAppWindowToken();
+ final AppWindowToken atoken = controller.getAppWindowToken(mDisplayContent);
assertHasStartingWindow(atoken);
controller.removeStartingWindow();
waitUntilHandlersIdle();
@@ -119,8 +119,8 @@
android.R.style.Theme, null, "Test", 0, 0, 0, 0, controller1.mToken.asBinder(),
true, true, false, true);
waitUntilHandlersIdle();
- assertNoStartingWindow(controller1.getAppWindowToken());
- assertHasStartingWindow(controller2.getAppWindowToken());
+ assertNoStartingWindow(controller1.getAppWindowToken(mDisplayContent));
+ assertHasStartingWindow(controller2.getAppWindowToken(mDisplayContent));
}
@Test
@@ -129,7 +129,7 @@
createAppWindowController();
final WindowTestUtils.TestAppWindowContainerController controller2 =
createAppWindowController();
- sPolicy.setRunnableWhenAddingSplashScreen(() -> {
+ ((TestWindowManagerPolicy) sWm.mPolicy).setRunnableWhenAddingSplashScreen(() -> {
// Surprise, ...! Transfer window in the middle of the creation flow.
controller2.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(),
@@ -139,14 +139,14 @@
controller1.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(),
android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true);
waitUntilHandlersIdle();
- assertNoStartingWindow(controller1.getAppWindowToken());
- assertHasStartingWindow(controller2.getAppWindowToken());
+ assertNoStartingWindow(controller1.getAppWindowToken(mDisplayContent));
+ assertHasStartingWindow(controller2.getAppWindowToken(mDisplayContent));
}
@Test
public void testReparent() throws Exception {
final StackWindowController stackController =
- createStackControllerOnDisplay(sDisplayContent);
+ createStackControllerOnDisplay(mDisplayContent);
final WindowTestUtils.TestTaskWindowContainerController taskController1 =
new WindowTestUtils.TestTaskWindowContainerController(stackController);
final WindowTestUtils.TestAppWindowContainerController appWindowController1 =
@@ -183,7 +183,8 @@
}
private WindowTestUtils.TestAppWindowContainerController createAppWindowController() {
- return createAppWindowController(new WindowTestUtils.TestTaskWindowContainerController());
+ return createAppWindowController(
+ new WindowTestUtils.TestTaskWindowContainerController(this));
}
private WindowTestUtils.TestAppWindowContainerController createAppWindowController(
diff --git a/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java b/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
index 7a7ca3f..876008b 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
@@ -17,7 +17,6 @@
package com.android.server.wm;
import org.junit.Test;
-import org.junit.Ignore;
import org.junit.runner.RunWith;
import android.platform.test.annotations.Presubmit;
@@ -52,7 +51,7 @@
@Test
public void testAddWindow_Order() throws Exception {
final WindowTestUtils.TestAppWindowToken token =
- new WindowTestUtils.TestAppWindowToken(sDisplayContent);
+ new WindowTestUtils.TestAppWindowToken(mDisplayContent);
assertEquals(0, token.getWindowsCount());
@@ -80,7 +79,7 @@
@Test
public void testFindMainWindow() throws Exception {
final WindowTestUtils.TestAppWindowToken token =
- new WindowTestUtils.TestAppWindowToken(sDisplayContent);
+ new WindowTestUtils.TestAppWindowToken(mDisplayContent);
assertNull(token.findMainWindow());
@@ -102,10 +101,10 @@
sWm.mDisplayEnabled = true;
// Create an app window with token on a display.
- final TaskStack stack = createTaskStackOnDisplay(sDisplayContent);
+ final TaskStack stack = createTaskStackOnDisplay(mDisplayContent);
final Task task = createTaskInStack(stack, 0 /* userId */);
final WindowTestUtils.TestAppWindowToken appWindowToken =
- new WindowTestUtils.TestAppWindowToken(sDisplayContent);
+ new WindowTestUtils.TestAppWindowToken(mDisplayContent);
task.addChild(appWindowToken, 0);
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(
TYPE_BASE_APPLICATION);
@@ -115,17 +114,17 @@
// Set initial orientation and update.
appWindowToken.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
- sWm.updateOrientationFromAppTokens(sDisplayContent.getOverrideConfiguration(), null,
- sDisplayContent.getDisplayId());
- assertEquals(SCREEN_ORIENTATION_LANDSCAPE, sDisplayContent.getLastOrientation());
+ sWm.updateOrientationFromAppTokens(mDisplayContent.getOverrideConfiguration(), null,
+ mDisplayContent.getDisplayId());
+ assertEquals(SCREEN_ORIENTATION_LANDSCAPE, mDisplayContent.getLastOrientation());
appWindow.resizeReported = false;
// Update the orientation to perform 180 degree rotation and check that resize was reported.
appWindowToken.setOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
- sWm.updateOrientationFromAppTokens(sDisplayContent.getOverrideConfiguration(), null,
- sDisplayContent.getDisplayId());
+ sWm.updateOrientationFromAppTokens(mDisplayContent.getOverrideConfiguration(), null,
+ mDisplayContent.getDisplayId());
sWm.mRoot.performSurfacePlacement(false /* recoveringMemory */);
- assertEquals(SCREEN_ORIENTATION_REVERSE_LANDSCAPE, sDisplayContent.getLastOrientation());
+ assertEquals(SCREEN_ORIENTATION_REVERSE_LANDSCAPE, mDisplayContent.getLastOrientation());
assertTrue(appWindow.resizeReported);
appWindow.removeImmediately();
}
@@ -170,7 +169,7 @@
@Test
public void testGetOrientation() throws Exception {
final WindowTestUtils.TestAppWindowToken token =
- new WindowTestUtils.TestAppWindowToken(sDisplayContent);
+ new WindowTestUtils.TestAppWindowToken(mDisplayContent);
token.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
token.setFillsParent(false);
diff --git a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
index 837ce56..e8dc69f 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
@@ -52,74 +52,74 @@
@Test
public void testForAllWindows() throws Exception {
final WindowState exitingAppWindow = createWindow(null, TYPE_BASE_APPLICATION,
- sDisplayContent, "exiting app");
+ mDisplayContent, "exiting app");
final AppWindowToken exitingAppToken = exitingAppWindow.mAppToken;
exitingAppToken.mIsExiting = true;
exitingAppToken.getTask().mStack.mExitingAppTokens.add(exitingAppToken);
assertForAllWindowsOrder(Arrays.asList(
- sWallpaperWindow,
+ mWallpaperWindow,
exitingAppWindow,
- sChildAppWindowBelow,
- sAppWindow,
- sChildAppWindowAbove,
- sDockedDividerWindow,
- sStatusBarWindow,
- sNavBarWindow,
- sImeWindow,
- sImeDialogWindow));
+ mChildAppWindowBelow,
+ mAppWindow,
+ mChildAppWindowAbove,
+ mDockedDividerWindow,
+ mStatusBarWindow,
+ mNavBarWindow,
+ mImeWindow,
+ mImeDialogWindow));
}
@Test
public void testForAllWindows_WithAppImeTarget() throws Exception {
final WindowState imeAppTarget =
- createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "imeAppTarget");
+ createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "imeAppTarget");
sWm.mInputMethodTarget = imeAppTarget;
assertForAllWindowsOrder(Arrays.asList(
- sWallpaperWindow,
- sChildAppWindowBelow,
- sAppWindow,
- sChildAppWindowAbove,
+ mWallpaperWindow,
+ mChildAppWindowBelow,
+ mAppWindow,
+ mChildAppWindowAbove,
imeAppTarget,
- sImeWindow,
- sImeDialogWindow,
- sDockedDividerWindow,
- sStatusBarWindow,
- sNavBarWindow));
+ mImeWindow,
+ mImeDialogWindow,
+ mDockedDividerWindow,
+ mStatusBarWindow,
+ mNavBarWindow));
}
@Test
public void testForAllWindows_WithChildWindowImeTarget() throws Exception {
- sWm.mInputMethodTarget = sChildAppWindowAbove;
+ sWm.mInputMethodTarget = mChildAppWindowAbove;
assertForAllWindowsOrder(Arrays.asList(
- sWallpaperWindow,
- sChildAppWindowBelow,
- sAppWindow,
- sChildAppWindowAbove,
- sImeWindow,
- sImeDialogWindow,
- sDockedDividerWindow,
- sStatusBarWindow,
- sNavBarWindow));
+ mWallpaperWindow,
+ mChildAppWindowBelow,
+ mAppWindow,
+ mChildAppWindowAbove,
+ mImeWindow,
+ mImeDialogWindow,
+ mDockedDividerWindow,
+ mStatusBarWindow,
+ mNavBarWindow));
}
@Test
public void testForAllWindows_WithStatusBarImeTarget() throws Exception {
- sWm.mInputMethodTarget = sStatusBarWindow;
+ sWm.mInputMethodTarget = mStatusBarWindow;
assertForAllWindowsOrder(Arrays.asList(
- sWallpaperWindow,
- sChildAppWindowBelow,
- sAppWindow,
- sChildAppWindowAbove,
- sDockedDividerWindow,
- sStatusBarWindow,
- sImeWindow,
- sImeDialogWindow,
- sNavBarWindow));
+ mWallpaperWindow,
+ mChildAppWindowBelow,
+ mAppWindow,
+ mChildAppWindowAbove,
+ mDockedDividerWindow,
+ mStatusBarWindow,
+ mImeWindow,
+ mImeDialogWindow,
+ mNavBarWindow));
}
@Test
@@ -127,28 +127,28 @@
// This window is set-up to be z-ordered between some windows that go in the same token like
// the nav bar and status bar.
final WindowState voiceInteractionWindow = createWindow(null, TYPE_VOICE_INTERACTION,
- sDisplayContent, "voiceInteractionWindow");
+ mDisplayContent, "voiceInteractionWindow");
assertForAllWindowsOrder(Arrays.asList(
- sWallpaperWindow,
- sChildAppWindowBelow,
- sAppWindow,
- sChildAppWindowAbove,
- sDockedDividerWindow,
+ mWallpaperWindow,
+ mChildAppWindowBelow,
+ mAppWindow,
+ mChildAppWindowAbove,
+ mDockedDividerWindow,
voiceInteractionWindow,
- sStatusBarWindow,
- sNavBarWindow,
- sImeWindow,
- sImeDialogWindow));
+ mStatusBarWindow,
+ mNavBarWindow,
+ mImeWindow,
+ mImeDialogWindow));
}
@Test
public void testComputeImeTarget() throws Exception {
// Verify that an app window can be an ime target.
- final WindowState appWin = createWindow(null, TYPE_APPLICATION, sDisplayContent, "appWin");
+ final WindowState appWin = createWindow(null, TYPE_APPLICATION, mDisplayContent, "appWin");
appWin.setHasSurface(true);
assertTrue(appWin.canBeImeTarget());
- WindowState imeTarget = sDisplayContent.computeImeTarget(false /* updateImeTarget */);
+ WindowState imeTarget = mDisplayContent.computeImeTarget(false /* updateImeTarget */);
assertEquals(appWin, imeTarget);
// Verify that an child window can be an ime target.
@@ -156,7 +156,7 @@
TYPE_APPLICATION_ATTACHED_DIALOG, "childWin");
childWin.setHasSurface(true);
assertTrue(childWin.canBeImeTarget());
- imeTarget = sDisplayContent.computeImeTarget(false /* updateImeTarget */);
+ imeTarget = mDisplayContent.computeImeTarget(false /* updateImeTarget */);
assertEquals(childWin, imeTarget);
}
@@ -182,12 +182,12 @@
assertEquals(dc, token.getDisplayContent());
// Move stack to first display.
- sDisplayContent.moveStackToDisplay(stack, true /* onTop */);
- assertEquals(sDisplayContent.getDisplayId(), stack.getDisplayContent().getDisplayId());
- assertEquals(sDisplayContent, stack.getParent().getParent());
- assertEquals(sDisplayContent, stack.getDisplayContent());
- assertEquals(sDisplayContent, task.getDisplayContent());
- assertEquals(sDisplayContent, token.getDisplayContent());
+ mDisplayContent.moveStackToDisplay(stack, true /* onTop */);
+ assertEquals(mDisplayContent.getDisplayId(), stack.getDisplayContent().getDisplayId());
+ assertEquals(mDisplayContent, stack.getParent().getParent());
+ assertEquals(mDisplayContent, stack.getDisplayContent());
+ assertEquals(mDisplayContent, task.getDisplayContent());
+ assertEquals(mDisplayContent, token.getDisplayContent());
}
/**
@@ -195,8 +195,8 @@
*/
@Test
public void testDisplayOverrideConfigUpdate() throws Exception {
- final int displayId = sDisplayContent.getDisplayId();
- final Configuration currentOverrideConfig = sDisplayContent.getOverrideConfiguration();
+ final int displayId = mDisplayContent.getDisplayId();
+ final Configuration currentOverrideConfig = mDisplayContent.getOverrideConfiguration();
// Create new, slightly changed override configuration and apply it to the display.
final Configuration newOverrideConfig = new Configuration(currentOverrideConfig);
@@ -206,7 +206,7 @@
sWm.setNewDisplayOverrideConfiguration(newOverrideConfig, displayId);
// Check that override config is applied.
- assertEquals(newOverrideConfig, sDisplayContent.getOverrideConfiguration());
+ assertEquals(newOverrideConfig, mDisplayContent.getOverrideConfiguration());
}
/**
@@ -214,7 +214,7 @@
*/
@Test
public void testDefaultDisplayOverrideConfigUpdate() throws Exception {
- final Configuration currentConfig = sDisplayContent.getConfiguration();
+ final Configuration currentConfig = mDisplayContent.getConfiguration();
// Create new, slightly changed override configuration and apply it to the display.
final Configuration newOverrideConfig = new Configuration(currentConfig);
@@ -239,7 +239,7 @@
public void testFocusedWindowMultipleDisplays() throws Exception {
// Create a focusable window and check that focus is calcualted correctly
final WindowState window1 =
- createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "window1");
+ createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "window1");
assertEquals(window1, sWm.mRoot.computeFocusedWindow());
// Check that a new display doesn't affect focus
@@ -264,30 +264,30 @@
final int baseHeight = 2560;
final int baseDensity = 300;
- sDisplayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity);
+ mDisplayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity);
final int maxWidth = 300;
final int resultingHeight = (maxWidth * baseHeight) / baseWidth;
final int resultingDensity = (maxWidth * baseDensity) / baseWidth;
- sDisplayContent.setMaxUiWidth(maxWidth);
- verifySizes(sDisplayContent, maxWidth, resultingHeight, resultingDensity);
+ mDisplayContent.setMaxUiWidth(maxWidth);
+ verifySizes(mDisplayContent, maxWidth, resultingHeight, resultingDensity);
// Assert setting values again does not change;
- sDisplayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity);
- verifySizes(sDisplayContent, maxWidth, resultingHeight, resultingDensity);
+ mDisplayContent.updateBaseDisplayMetrics(baseWidth, baseHeight, baseDensity);
+ verifySizes(mDisplayContent, maxWidth, resultingHeight, resultingDensity);
final int smallerWidth = 200;
final int smallerHeight = 400;
final int smallerDensity = 100;
// Specify smaller dimension, verify that it is honored
- sDisplayContent.updateBaseDisplayMetrics(smallerWidth, smallerHeight, smallerDensity);
- verifySizes(sDisplayContent, smallerWidth, smallerHeight, smallerDensity);
+ mDisplayContent.updateBaseDisplayMetrics(smallerWidth, smallerHeight, smallerDensity);
+ verifySizes(mDisplayContent, smallerWidth, smallerHeight, smallerDensity);
// Verify that setting the max width to a greater value than the base width has no effect
- sDisplayContent.setMaxUiWidth(maxWidth);
- verifySizes(sDisplayContent, smallerWidth, smallerHeight, smallerDensity);
+ mDisplayContent.setMaxUiWidth(maxWidth);
+ verifySizes(mDisplayContent, smallerWidth, smallerHeight, smallerDensity);
}
/**
@@ -295,17 +295,17 @@
*/
@Test
public void testPinnedStackLocation() {
- createStackControllerOnStackOnDisplay(PINNED_STACK_ID, sDisplayContent);
- final int initialStackCount = sDisplayContent.getStackCount();
+ createStackControllerOnStackOnDisplay(PINNED_STACK_ID, mDisplayContent);
+ final int initialStackCount = mDisplayContent.getStackCount();
// Ensure that the pinned stack was placed at the end
- assertEquals(initialStackCount - 1, sDisplayContent.getStaskPosById(PINNED_STACK_ID));
+ assertEquals(initialStackCount - 1, mDisplayContent.getStaskPosById(PINNED_STACK_ID));
// By default, this should try to create a new stack on top
- createTaskStackOnDisplay(sDisplayContent);
- final int afterStackCount = sDisplayContent.getStackCount();
+ createTaskStackOnDisplay(mDisplayContent);
+ final int afterStackCount = mDisplayContent.getStackCount();
// Make sure the stack count has increased
assertEquals(initialStackCount + 1, afterStackCount);
// Ensure that the pinned stack is still on top
- assertEquals(afterStackCount - 1, sDisplayContent.getStaskPosById(PINNED_STACK_ID));
+ assertEquals(afterStackCount - 1, mDisplayContent.getStaskPosById(PINNED_STACK_ID));
}
private static void verifySizes(DisplayContent displayContent, int expectedBaseWidth,
@@ -319,7 +319,7 @@
final LinkedList<WindowState> actualWindows = new LinkedList();
// Test forward traversal.
- sDisplayContent.forAllWindows(actualWindows::addLast, false /* traverseTopToBottom */);
+ mDisplayContent.forAllWindows(actualWindows::addLast, false /* traverseTopToBottom */);
assertEquals(expectedWindows.size(), actualWindows.size());
for (WindowState w : expectedWindows) {
assertEquals(w, actualWindows.pollFirst());
@@ -327,7 +327,7 @@
assertTrue(actualWindows.isEmpty());
// Test backward traversal.
- sDisplayContent.forAllWindows(actualWindows::addLast, true /* traverseTopToBottom */);
+ mDisplayContent.forAllWindows(actualWindows::addLast, true /* traverseTopToBottom */);
assertEquals(expectedWindows.size(), actualWindows.size());
for (WindowState w : expectedWindows) {
assertEquals(w, actualWindows.pollLast());
diff --git a/services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java
index 61f7f57..d9b99ee 100644
--- a/services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java
@@ -42,7 +42,7 @@
@Test
public void testRemoveContainer() throws Exception {
final StackWindowController stackController =
- createStackControllerOnDisplay(sDisplayContent);
+ createStackControllerOnDisplay(mDisplayContent);
final WindowTestUtils.TestTaskWindowContainerController taskController =
new WindowTestUtils.TestTaskWindowContainerController(stackController);
@@ -62,7 +62,7 @@
@Test
public void testRemoveContainer_deferRemoval() throws Exception {
final StackWindowController stackController =
- createStackControllerOnDisplay(sDisplayContent);
+ createStackControllerOnDisplay(mDisplayContent);
final WindowTestUtils.TestTaskWindowContainerController taskController =
new WindowTestUtils.TestTaskWindowContainerController(stackController);
@@ -89,7 +89,7 @@
public void testReparent() throws Exception {
// Create first stack on primary display.
final StackWindowController stack1Controller =
- createStackControllerOnDisplay(sDisplayContent);
+ createStackControllerOnDisplay(mDisplayContent);
final TaskStack stack1 = stack1Controller.mContainer;
final WindowTestUtils.TestTaskWindowContainerController taskController =
new WindowTestUtils.TestTaskWindowContainerController(stack1Controller);
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskPositionerTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskPositionerTests.java
index e6975e7..887def7 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskPositionerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskPositionerTests.java
@@ -22,16 +22,12 @@
import org.junit.runner.RunWith;
import android.graphics.Rect;
-import android.os.Binder;
-import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
-import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static com.android.server.wm.TaskPositioner.MIN_ASPECT;
import static com.android.server.wm.WindowManagerService.dipToPixel;
import static com.android.server.wm.WindowState.MINIMUM_VISIBLE_HEIGHT_IN_DP;
@@ -61,7 +57,7 @@
@Before
public void setUp() throws Exception {
super.setUp();
- final Display display = sDisplayContent.getDisplay();
+ final Display display = mDisplayContent.getDisplay();
final DisplayMetrics dm = new DisplayMetrics();
display.getMetrics(dm);
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotCacheTest.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotCacheTest.java
index c61076d..a23a6b22 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotCacheTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotCacheTest.java
@@ -16,28 +16,13 @@
package com.android.server.wm;
-import static android.graphics.GraphicBuffer.USAGE_HW_TEXTURE;
-import static android.graphics.GraphicBuffer.USAGE_SW_READ_NEVER;
-import static android.graphics.GraphicBuffer.USAGE_SW_READ_RARELY;
-import static android.graphics.GraphicBuffer.USAGE_SW_WRITE_NEVER;
-import static android.graphics.GraphicBuffer.create;
import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
-import android.app.ActivityManager.TaskSnapshot;
-import android.content.res.Configuration;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.GraphicBuffer;
-import android.graphics.PixelFormat;
-import android.graphics.Rect;
-import android.os.Debug;
-import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotControllerTest.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotControllerTest.java
index 2752340..2b4d9fb 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotControllerTest.java
@@ -75,12 +75,12 @@
@Test
public void testGetSnapshotMode() throws Exception {
final WindowState disabledWindow = createWindow(null,
- FIRST_APPLICATION_WINDOW, sDisplayContent, "disabledWindow");
+ FIRST_APPLICATION_WINDOW, mDisplayContent, "disabledWindow");
disabledWindow.mAppToken.setDisablePreviewSnapshots(true);
assertEquals(SNAPSHOT_MODE_APP_THEME,
sWm.mTaskSnapshotController.getSnapshotMode(disabledWindow.getTask()));
final WindowState normalWindow = createWindow(null,
- FIRST_APPLICATION_WINDOW, sDisplayContent, "normalWindow");
+ FIRST_APPLICATION_WINDOW, mDisplayContent, "normalWindow");
assertEquals(SNAPSHOT_MODE_REAL,
sWm.mTaskSnapshotController.getSnapshotMode(normalWindow.getTask()));
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java
index 4121447..8108909 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java
@@ -24,9 +24,7 @@
import android.app.ActivityManager.TaskSnapshot;
import android.content.res.Configuration;
-import android.graphics.Bitmap;
import android.graphics.Rect;
-import android.os.Debug;
import android.os.SystemClock;
import android.platform.test.annotations.Presubmit;
import android.support.test.filters.MediumTest;
@@ -55,13 +53,13 @@
@Test
public void testPersistAndLoadSnapshot() {
- mPersister.persistSnapshot(1 , sTestUserId, createSnapshot());
+ mPersister.persistSnapshot(1 , mTestUserId, createSnapshot());
mPersister.waitForQueueEmpty();
final File[] files = new File[] { new File(sFilesDir.getPath() + "/snapshots/1.proto"),
new File(sFilesDir.getPath() + "/snapshots/1.jpg"),
new File(sFilesDir.getPath() + "/snapshots/1_reduced.jpg")};
assertTrueForFiles(files, File::exists, " must exist");
- final TaskSnapshot snapshot = mLoader.loadTask(1, sTestUserId, false /* reduced */);
+ final TaskSnapshot snapshot = mLoader.loadTask(1, mTestUserId, false /* reduced */);
assertNotNull(snapshot);
assertEquals(TEST_INSETS, snapshot.getContentInsets());
assertNotNull(snapshot.getSnapshot());
@@ -76,8 +74,8 @@
@Test
public void testTaskRemovedFromRecents() {
- mPersister.persistSnapshot(1, sTestUserId, createSnapshot());
- mPersister.onTaskRemovedFromRecents(1, sTestUserId);
+ mPersister.persistSnapshot(1, mTestUserId, createSnapshot());
+ mPersister.onTaskRemovedFromRecents(1, mTestUserId);
mPersister.waitForQueueEmpty();
assertFalse(new File(sFilesDir.getPath() + "/snapshots/1.proto").exists());
assertFalse(new File(sFilesDir.getPath() + "/snapshots/1.jpg").exists());
@@ -90,12 +88,12 @@
@Test
public void testThrottling() {
long ms = SystemClock.elapsedRealtime();
- mPersister.persistSnapshot(1, sTestUserId, createSnapshot());
- mPersister.persistSnapshot(2, sTestUserId, createSnapshot());
- mPersister.persistSnapshot(3, sTestUserId, createSnapshot());
- mPersister.persistSnapshot(4, sTestUserId, createSnapshot());
- mPersister.persistSnapshot(5, sTestUserId, createSnapshot());
- mPersister.persistSnapshot(6, sTestUserId, createSnapshot());
+ mPersister.persistSnapshot(1, mTestUserId, createSnapshot());
+ mPersister.persistSnapshot(2, mTestUserId, createSnapshot());
+ mPersister.persistSnapshot(3, mTestUserId, createSnapshot());
+ mPersister.persistSnapshot(4, mTestUserId, createSnapshot());
+ mPersister.persistSnapshot(5, mTestUserId, createSnapshot());
+ mPersister.persistSnapshot(6, mTestUserId, createSnapshot());
mPersister.waitForQueueEmpty();
assertTrue(SystemClock.elapsedRealtime() - ms > 500);
}
@@ -115,11 +113,11 @@
@Test
public void testRemoveObsoleteFiles() {
- mPersister.persistSnapshot(1, sTestUserId, createSnapshot());
- mPersister.persistSnapshot(2, sTestUserId, createSnapshot());
+ mPersister.persistSnapshot(1, mTestUserId, createSnapshot());
+ mPersister.persistSnapshot(2, mTestUserId, createSnapshot());
final ArraySet<Integer> taskIds = new ArraySet<>();
taskIds.add(1);
- mPersister.removeObsoleteFiles(taskIds, new int[] { sTestUserId });
+ mPersister.removeObsoleteFiles(taskIds, new int[] { mTestUserId });
mPersister.waitForQueueEmpty();
final File[] existsFiles = new File[] {
new File(sFilesDir.getPath() + "/snapshots/1.proto"),
@@ -135,11 +133,11 @@
@Test
public void testRemoveObsoleteFiles_addedOneInTheMeantime() {
- mPersister.persistSnapshot(1, sTestUserId, createSnapshot());
+ mPersister.persistSnapshot(1, mTestUserId, createSnapshot());
final ArraySet<Integer> taskIds = new ArraySet<>();
taskIds.add(1);
- mPersister.removeObsoleteFiles(taskIds, new int[] { sTestUserId });
- mPersister.persistSnapshot(2, sTestUserId, createSnapshot());
+ mPersister.removeObsoleteFiles(taskIds, new int[] { mTestUserId });
+ mPersister.persistSnapshot(2, mTestUserId, createSnapshot());
mPersister.waitForQueueEmpty();
final File[] existsFiles = new File[] {
new File(sFilesDir.getPath() + "/snapshots/1.proto"),
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java
index 5e7389d..18d0c32 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java
@@ -21,7 +21,6 @@
import static android.graphics.GraphicBuffer.USAGE_SW_READ_RARELY;
import android.app.ActivityManager.TaskSnapshot;
-import android.content.pm.UserInfo;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.GraphicBuffer;
@@ -31,8 +30,6 @@
import android.support.test.InstrumentationRegistry;
import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
@@ -43,32 +40,24 @@
*/
class TaskSnapshotPersisterTestBase extends WindowTestsBase {
- private static final String TEST_USER_NAME = "TaskSnapshotPersisterTest User";
private static final Rect TEST_INSETS = new Rect(10, 20, 30, 40);
TaskSnapshotPersister mPersister;
TaskSnapshotLoader mLoader;
- static int sTestUserId;
+ int mTestUserId;
static File sFilesDir;
- private static UserManager sUserManager;
@BeforeClass
public static void setUpUser() {
- sUserManager = UserManager.get(InstrumentationRegistry.getContext());
- sTestUserId = createUser(TEST_USER_NAME, 0);
sFilesDir = InstrumentationRegistry.getContext().getFilesDir();
}
- @AfterClass
- public static void tearDownUser() {
- removeUser(sTestUserId);
- }
-
@Before
public void setUp() throws Exception {
super.setUp();
- mPersister = new TaskSnapshotPersister(
- userId -> sFilesDir);
+ final UserManager um = UserManager.get(InstrumentationRegistry.getContext());
+ mTestUserId = um.getUserHandle();
+ mPersister = new TaskSnapshotPersister(userId -> sFilesDir);
mLoader = new TaskSnapshotLoader(mPersister);
mPersister.start();
}
@@ -78,20 +67,6 @@
cleanDirectory();
}
- private static int createUser(String name, int flags) {
- UserInfo user = sUserManager.createUser(name, flags);
- if (user == null) {
- Assert.fail("Error while creating the test user: " + TEST_USER_NAME);
- }
- return user.id;
- }
-
- private static void removeUser(int userId) {
- if (!sUserManager.removeUser(userId)) {
- Assert.fail("Error while removing the test user: " + TEST_USER_NAME);
- }
- }
-
private void cleanDirectory() {
for (File file : new File(sFilesDir, "snapshots").listFiles()) {
if (!file.isDirectory()) {
@@ -101,7 +76,7 @@
}
TaskSnapshot createSnapshot() {
- GraphicBuffer buffer = GraphicBuffer.create(100, 100, PixelFormat.RGBA_8888,
+ final GraphicBuffer buffer = GraphicBuffer.create(100, 100, PixelFormat.RGBA_8888,
USAGE_HW_TEXTURE | USAGE_SW_READ_RARELY | USAGE_SW_READ_RARELY);
Canvas c = buffer.lockCanvas();
c.drawColor(Color.RED);
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java
index 82ea2313..5feda41 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java
@@ -51,12 +51,13 @@
public void setUp() throws Exception {
super.setUp();
mPinnedStack = new StackWindowController(PINNED_STACK_ID, null,
- sDisplayContent.getDisplayId(), true /* onTop */, new Rect(), sWm).mContainer;
+ mDisplayContent.getDisplayId(), true /* onTop */, new Rect(), sWm).mContainer;
// Stack should contain visible app window to be considered visible.
final Task pinnedTask = createTaskInStack(mPinnedStack, 0 /* userId */);
assertFalse(mPinnedStack.isVisible());
- final WindowTestUtils.TestAppWindowToken pinnedApp = new WindowTestUtils.TestAppWindowToken(sDisplayContent);
+ final WindowTestUtils.TestAppWindowToken pinnedApp = new WindowTestUtils.TestAppWindowToken(
+ mDisplayContent);
pinnedTask.addChild(pinnedApp, 0 /* addPos */);
assertTrue(mPinnedStack.isVisible());
}
@@ -69,8 +70,8 @@
@Test
public void testStackPositionChildAt() throws Exception {
// Test that always-on-top stack can't be moved to position other than top.
- final TaskStack stack1 = createTaskStackOnDisplay(sDisplayContent);
- final TaskStack stack2 = createTaskStackOnDisplay(sDisplayContent);
+ final TaskStack stack1 = createTaskStackOnDisplay(mDisplayContent);
+ final TaskStack stack2 = createTaskStackOnDisplay(mDisplayContent);
final WindowContainer taskStackContainer = stack1.getParent();
@@ -94,7 +95,7 @@
@Test
public void testStackPositionBelowPinnedStack() throws Exception {
// Test that no stack can be above pinned stack.
- final TaskStack stack1 = createTaskStackOnDisplay(sDisplayContent);
+ final TaskStack stack1 = createTaskStackOnDisplay(mDisplayContent);
final WindowContainer taskStackContainer = stack1.getParent();
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java
index 267e5f7..b846fd0 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java
@@ -45,7 +45,7 @@
@Test
public void testStackPositionChildAt() throws Exception {
- final TaskStack stack = createTaskStackOnDisplay(sDisplayContent);
+ final TaskStack stack = createTaskStackOnDisplay(mDisplayContent);
final Task task1 = createTaskInStack(stack, 0 /* userId */);
final Task task2 = createTaskInStack(stack, 1 /* userId */);
@@ -62,16 +62,16 @@
@Test
public void testClosingAppDifferentStackOrientation() throws Exception {
- final TaskStack stack = createTaskStackOnDisplay(sDisplayContent);
+ final TaskStack stack = createTaskStackOnDisplay(mDisplayContent);
final Task task1 = createTaskInStack(stack, 0 /* userId */);
WindowTestUtils.TestAppWindowToken appWindowToken1 =
- new WindowTestUtils.TestAppWindowToken(sDisplayContent);
+ new WindowTestUtils.TestAppWindowToken(mDisplayContent);
task1.addChild(appWindowToken1, 0);
appWindowToken1.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
final Task task2 = createTaskInStack(stack, 1 /* userId */);
WindowTestUtils.TestAppWindowToken appWindowToken2 =
- new WindowTestUtils.TestAppWindowToken(sDisplayContent);
+ new WindowTestUtils.TestAppWindowToken(mDisplayContent);
task2.addChild(appWindowToken2, 0);
appWindowToken2.setOrientation(SCREEN_ORIENTATION_PORTRAIT);
@@ -82,16 +82,16 @@
@Test
public void testMoveTaskToBackDifferentStackOrientation() throws Exception {
- final TaskStack stack = createTaskStackOnDisplay(sDisplayContent);
+ final TaskStack stack = createTaskStackOnDisplay(mDisplayContent);
final Task task1 = createTaskInStack(stack, 0 /* userId */);
WindowTestUtils.TestAppWindowToken appWindowToken1 =
- new WindowTestUtils.TestAppWindowToken(sDisplayContent);
+ new WindowTestUtils.TestAppWindowToken(mDisplayContent);
task1.addChild(appWindowToken1, 0);
appWindowToken1.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
final Task task2 = createTaskInStack(stack, 1 /* userId */);
WindowTestUtils.TestAppWindowToken appWindowToken2 =
- new WindowTestUtils.TestAppWindowToken(sDisplayContent);
+ new WindowTestUtils.TestAppWindowToken(mDisplayContent);
task2.addChild(appWindowToken2, 0);
appWindowToken2.setOrientation(SCREEN_ORIENTATION_PORTRAIT);
@@ -102,17 +102,17 @@
@Test
public void testStackRemoveImmediately() throws Exception {
- final TaskStack stack = createTaskStackOnDisplay(sDisplayContent);
+ final TaskStack stack = createTaskStackOnDisplay(mDisplayContent);
final Task task = createTaskInStack(stack, 0 /* userId */);
assertEquals(stack, task.mStack);
- assertTrue(sDisplayContent.mDimLayerController.hasDimLayerUser(stack));
- assertTrue(sDisplayContent.mDimLayerController.hasDimLayerUser(task));
+ assertTrue(mDisplayContent.mDimLayerController.hasDimLayerUser(stack));
+ assertTrue(mDisplayContent.mDimLayerController.hasDimLayerUser(task));
// Remove stack and check if its child is also removed.
stack.removeImmediately();
assertNull(stack.getDisplayContent());
assertNull(task.mStack);
- assertFalse(sDisplayContent.mDimLayerController.hasDimLayerUser(stack));
- assertFalse(sDisplayContent.mDimLayerController.hasDimLayerUser(task));
+ assertFalse(mDisplayContent.mDimLayerController.hasDimLayerUser(stack));
+ assertFalse(mDisplayContent.mDimLayerController.hasDimLayerUser(task));
}
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java
index 98d20a2..1dd9365 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java
@@ -41,7 +41,7 @@
@Test
public void testRemoveContainer() throws Exception {
final WindowTestUtils.TestTaskWindowContainerController taskController =
- new WindowTestUtils.TestTaskWindowContainerController();
+ new WindowTestUtils.TestTaskWindowContainerController(this);
final WindowTestUtils.TestAppWindowContainerController appController =
new WindowTestUtils.TestAppWindowContainerController(taskController);
@@ -54,7 +54,7 @@
@Test
public void testRemoveContainer_deferRemoval() throws Exception {
final WindowTestUtils.TestTaskWindowContainerController taskController =
- new WindowTestUtils.TestTaskWindowContainerController();
+ new WindowTestUtils.TestTaskWindowContainerController(this);
final WindowTestUtils.TestAppWindowContainerController appController =
new WindowTestUtils.TestAppWindowContainerController(taskController);
@@ -79,11 +79,11 @@
@Test
public void testReparent() throws Exception {
final StackWindowController stackController1 =
- createStackControllerOnDisplay(sDisplayContent);
+ createStackControllerOnDisplay(mDisplayContent);
final WindowTestUtils.TestTaskWindowContainerController taskController =
new WindowTestUtils.TestTaskWindowContainerController(stackController1);
final StackWindowController stackController2 =
- createStackControllerOnDisplay(sDisplayContent);
+ createStackControllerOnDisplay(mDisplayContent);
final WindowTestUtils.TestTaskWindowContainerController taskController2 =
new WindowTestUtils.TestTaskWindowContainerController(stackController2);
@@ -96,7 +96,7 @@
assertTrue("Should not be able to reparent to the same parent", gotException);
final StackWindowController stackController3 =
- createStackControllerOnDisplay(sDisplayContent);
+ createStackControllerOnDisplay(mDisplayContent);
stackController3.setContainer(null);
gotException = false;
try {
@@ -117,13 +117,13 @@
public void testReparent_BetweenDisplays() throws Exception {
// Create first stack on primary display.
final StackWindowController stack1Controller =
- createStackControllerOnDisplay(sDisplayContent);
+ createStackControllerOnDisplay(mDisplayContent);
final TaskStack stack1 = stack1Controller.mContainer;
final WindowTestUtils.TestTaskWindowContainerController taskController =
new WindowTestUtils.TestTaskWindowContainerController(stack1Controller);
final WindowTestUtils.TestTask task1 = (WindowTestUtils.TestTask) taskController.mContainer;
task1.mOnDisplayChangedCalled = false;
- assertEquals(sDisplayContent, stack1.getDisplayContent());
+ assertEquals(mDisplayContent, stack1.getDisplayContent());
// Create second display and put second stack on it.
final DisplayContent dc = createNewDisplay();
diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
index 9392e8e..be53667 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
@@ -23,7 +23,6 @@
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doAnswer;
-import android.content.pm.ActivityInfo;
import android.os.PowerSaveState;
import org.mockito.invocation.InvocationOnMock;
@@ -199,7 +198,7 @@
final com.android.server.wm.WindowState window;
final AppWindowToken atoken;
synchronized (sWm.mWindowMap) {
- atoken = WindowTestsBase.sDisplayContent.getAppWindowToken(appToken);
+ atoken = sWm.mRoot.getAppWindowToken(appToken);
window = WindowTestsBase.createWindow(null, TYPE_APPLICATION_STARTING, atoken,
"Starting window");
atoken.startingWindow = window;
diff --git a/services/tests/servicestests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java b/services/tests/servicestests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java
index 0eaf5bc..5a4bb27 100644
--- a/services/tests/servicestests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java
@@ -36,8 +36,6 @@
@RunWith(AndroidJUnit4.class)
public class UnknownAppVisibilityControllerTest extends WindowTestsBase {
- private WindowManagerService mWm;
-
@Before
public void setUp() throws Exception {
super.setUp();
@@ -46,7 +44,7 @@
@Test
public void testFlow() throws Exception {
- final AppWindowToken token = new WindowTestUtils.TestAppWindowToken(sDisplayContent);
+ final AppWindowToken token = new WindowTestUtils.TestAppWindowToken(mDisplayContent);
sWm.mUnknownAppVisibilityController.notifyLaunched(token);
sWm.mUnknownAppVisibilityController.notifyAppResumedFinished(token);
sWm.mUnknownAppVisibilityController.notifyRelayouted(token);
@@ -58,8 +56,8 @@
@Test
public void testMultiple() throws Exception {
- final AppWindowToken token1 = new WindowTestUtils.TestAppWindowToken(sDisplayContent);
- final AppWindowToken token2 = new WindowTestUtils.TestAppWindowToken(sDisplayContent);
+ final AppWindowToken token1 = new WindowTestUtils.TestAppWindowToken(mDisplayContent);
+ final AppWindowToken token2 = new WindowTestUtils.TestAppWindowToken(mDisplayContent);
sWm.mUnknownAppVisibilityController.notifyLaunched(token1);
sWm.mUnknownAppVisibilityController.notifyAppResumedFinished(token1);
sWm.mUnknownAppVisibilityController.notifyLaunched(token2);
@@ -74,7 +72,7 @@
@Test
public void testClear() throws Exception {
- final AppWindowToken token = new WindowTestUtils.TestAppWindowToken(sDisplayContent);
+ final AppWindowToken token = new WindowTestUtils.TestAppWindowToken(mDisplayContent);
sWm.mUnknownAppVisibilityController.notifyLaunched(token);
sWm.mUnknownAppVisibilityController.clear();;
assertTrue(sWm.mUnknownAppVisibilityController.allResolved());
@@ -82,7 +80,7 @@
@Test
public void testAppRemoved() throws Exception {
- final AppWindowToken token = new WindowTestUtils.TestAppWindowToken(sDisplayContent);
+ final AppWindowToken token = new WindowTestUtils.TestAppWindowToken(mDisplayContent);
sWm.mUnknownAppVisibilityController.notifyLaunched(token);
sWm.mUnknownAppVisibilityController.appRemoved(token);
assertTrue(sWm.mUnknownAppVisibilityController.allResolved());
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowContainerControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowContainerControllerTests.java
index 956735c..f1e15d9 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowContainerControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowContainerControllerTests.java
@@ -17,7 +17,6 @@
package com.android.server.wm;
import org.junit.Test;
-import org.junit.runner.RunWith;
import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java
index a2aa058..8fe4116 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java
@@ -96,8 +96,7 @@
@Before
public void setUp() throws Exception {
- final Context context = InstrumentationRegistry.getTargetContext();
- sWm = TestWindowManagerPolicy.getWindowManagerService(context);
+ super.setUp();
// Just any non zero value.
sWm.mSystemDecorLayer = 10000;
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowLayersControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowLayersControllerTests.java
index d5e6b6d..e1f318d 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowLayersControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowLayersControllerTests.java
@@ -45,45 +45,45 @@
@Test
public void testAssignWindowLayers_ForImeWithNoTarget() throws Exception {
sWm.mInputMethodTarget = null;
- sLayersController.assignWindowLayers(sDisplayContent);
+ mLayersController.assignWindowLayers(mDisplayContent);
// The Ime has an higher base layer than app windows and lower base layer than system
// windows, so it should be above app windows and below system windows if there isn't an IME
// target.
- assertWindowLayerGreaterThan(sImeWindow, sChildAppWindowAbove);
- assertWindowLayerGreaterThan(sImeWindow, sAppWindow);
- assertWindowLayerGreaterThan(sImeWindow, sDockedDividerWindow);
- assertWindowLayerGreaterThan(sNavBarWindow, sImeWindow);
- assertWindowLayerGreaterThan(sStatusBarWindow, sImeWindow);
+ assertWindowLayerGreaterThan(mImeWindow, mChildAppWindowAbove);
+ assertWindowLayerGreaterThan(mImeWindow, mAppWindow);
+ assertWindowLayerGreaterThan(mImeWindow, mDockedDividerWindow);
+ assertWindowLayerGreaterThan(mNavBarWindow, mImeWindow);
+ assertWindowLayerGreaterThan(mStatusBarWindow, mImeWindow);
// And, IME dialogs should always have an higher layer than the IME.
- assertWindowLayerGreaterThan(sImeDialogWindow, sImeWindow);
+ assertWindowLayerGreaterThan(mImeDialogWindow, mImeWindow);
}
@Test
public void testAssignWindowLayers_ForImeWithAppTarget() throws Exception {
final WindowState imeAppTarget =
- createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "imeAppTarget");
+ createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "imeAppTarget");
sWm.mInputMethodTarget = imeAppTarget;
- sLayersController.assignWindowLayers(sDisplayContent);
+ mLayersController.assignWindowLayers(mDisplayContent);
// Ime should be above all app windows and below system windows if it is targeting an app
// window.
- assertWindowLayerGreaterThan(sImeWindow, imeAppTarget);
- assertWindowLayerGreaterThan(sImeWindow, sChildAppWindowAbove);
- assertWindowLayerGreaterThan(sImeWindow, sAppWindow);
- assertWindowLayerGreaterThan(sImeWindow, sDockedDividerWindow);
- assertWindowLayerGreaterThan(sNavBarWindow, sImeWindow);
- assertWindowLayerGreaterThan(sStatusBarWindow, sImeWindow);
+ assertWindowLayerGreaterThan(mImeWindow, imeAppTarget);
+ assertWindowLayerGreaterThan(mImeWindow, mChildAppWindowAbove);
+ assertWindowLayerGreaterThan(mImeWindow, mAppWindow);
+ assertWindowLayerGreaterThan(mImeWindow, mDockedDividerWindow);
+ assertWindowLayerGreaterThan(mNavBarWindow, mImeWindow);
+ assertWindowLayerGreaterThan(mStatusBarWindow, mImeWindow);
// And, IME dialogs should always have an higher layer than the IME.
- assertWindowLayerGreaterThan(sImeDialogWindow, sImeWindow);
+ assertWindowLayerGreaterThan(mImeDialogWindow, mImeWindow);
}
@Test
public void testAssignWindowLayers_ForImeWithAppTargetWithChildWindows() throws Exception {
final WindowState imeAppTarget =
- createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "imeAppTarget");
+ createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "imeAppTarget");
final WindowState imeAppTargetChildAboveWindow = createWindow(imeAppTarget,
TYPE_APPLICATION_ATTACHED_DIALOG, imeAppTarget.mToken,
"imeAppTargetChildAboveWindow");
@@ -92,84 +92,84 @@
"imeAppTargetChildBelowWindow");
sWm.mInputMethodTarget = imeAppTarget;
- sLayersController.assignWindowLayers(sDisplayContent);
+ mLayersController.assignWindowLayers(mDisplayContent);
// Ime should be above all app windows except for child windows that are z-ordered above it
// and below system windows if it is targeting an app window.
- assertWindowLayerGreaterThan(sImeWindow, imeAppTarget);
- assertWindowLayerGreaterThan(imeAppTargetChildAboveWindow, sImeWindow);
- assertWindowLayerGreaterThan(sImeWindow, imeAppTargetChildBelowWindow);
- assertWindowLayerGreaterThan(sImeWindow, sChildAppWindowAbove);
- assertWindowLayerGreaterThan(sImeWindow, sAppWindow);
- assertWindowLayerGreaterThan(sImeWindow, sDockedDividerWindow);
- assertWindowLayerGreaterThan(sNavBarWindow, sImeWindow);
- assertWindowLayerGreaterThan(sStatusBarWindow, sImeWindow);
+ assertWindowLayerGreaterThan(mImeWindow, imeAppTarget);
+ assertWindowLayerGreaterThan(imeAppTargetChildAboveWindow, mImeWindow);
+ assertWindowLayerGreaterThan(mImeWindow, imeAppTargetChildBelowWindow);
+ assertWindowLayerGreaterThan(mImeWindow, mChildAppWindowAbove);
+ assertWindowLayerGreaterThan(mImeWindow, mAppWindow);
+ assertWindowLayerGreaterThan(mImeWindow, mDockedDividerWindow);
+ assertWindowLayerGreaterThan(mNavBarWindow, mImeWindow);
+ assertWindowLayerGreaterThan(mStatusBarWindow, mImeWindow);
// And, IME dialogs should always have an higher layer than the IME.
- assertWindowLayerGreaterThan(sImeDialogWindow, sImeWindow);
+ assertWindowLayerGreaterThan(mImeDialogWindow, mImeWindow);
}
@Test
public void testAssignWindowLayers_ForImeWithAppTargetAndAppAbove() throws Exception {
final WindowState appBelowImeTarget =
- createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "appBelowImeTarget");
+ createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "appBelowImeTarget");
final WindowState imeAppTarget =
- createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "imeAppTarget");
+ createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "imeAppTarget");
final WindowState appAboveImeTarget =
- createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "appAboveImeTarget");
+ createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "appAboveImeTarget");
sWm.mInputMethodTarget = imeAppTarget;
- sLayersController.assignWindowLayers(sDisplayContent);
+ mLayersController.assignWindowLayers(mDisplayContent);
// Ime should be above all app windows except for non-fullscreen app window above it and
// below system windows if it is targeting an app window.
- assertWindowLayerGreaterThan(sImeWindow, imeAppTarget);
- assertWindowLayerGreaterThan(sImeWindow, appBelowImeTarget);
- assertWindowLayerGreaterThan(appAboveImeTarget, sImeWindow);
- assertWindowLayerGreaterThan(sImeWindow, sChildAppWindowAbove);
- assertWindowLayerGreaterThan(sImeWindow, sAppWindow);
- assertWindowLayerGreaterThan(sImeWindow, sDockedDividerWindow);
- assertWindowLayerGreaterThan(sNavBarWindow, sImeWindow);
- assertWindowLayerGreaterThan(sStatusBarWindow, sImeWindow);
+ assertWindowLayerGreaterThan(mImeWindow, imeAppTarget);
+ assertWindowLayerGreaterThan(mImeWindow, appBelowImeTarget);
+ assertWindowLayerGreaterThan(appAboveImeTarget, mImeWindow);
+ assertWindowLayerGreaterThan(mImeWindow, mChildAppWindowAbove);
+ assertWindowLayerGreaterThan(mImeWindow, mAppWindow);
+ assertWindowLayerGreaterThan(mImeWindow, mDockedDividerWindow);
+ assertWindowLayerGreaterThan(mNavBarWindow, mImeWindow);
+ assertWindowLayerGreaterThan(mStatusBarWindow, mImeWindow);
// And, IME dialogs should always have an higher layer than the IME.
- assertWindowLayerGreaterThan(sImeDialogWindow, sImeWindow);
+ assertWindowLayerGreaterThan(mImeDialogWindow, mImeWindow);
}
@Test
public void testAssignWindowLayers_ForImeNonAppImeTarget() throws Exception {
final WindowState imeSystemOverlayTarget = createWindow(null, TYPE_SYSTEM_OVERLAY,
- sDisplayContent, "imeSystemOverlayTarget",
+ mDisplayContent, "imeSystemOverlayTarget",
true /* ownerCanAddInternalSystemWindow */);
sWm.mInputMethodTarget = imeSystemOverlayTarget;
- sLayersController.assignWindowLayers(sDisplayContent);
+ mLayersController.assignWindowLayers(mDisplayContent);
// The IME target base layer is higher than all window except for the nav bar window, so the
// IME should be above all windows except for the nav bar.
- assertWindowLayerGreaterThan(sImeWindow, imeSystemOverlayTarget);
- assertWindowLayerGreaterThan(sImeWindow, sChildAppWindowAbove);
- assertWindowLayerGreaterThan(sImeWindow, sAppWindow);
- assertWindowLayerGreaterThan(sImeWindow, sDockedDividerWindow);
- assertWindowLayerGreaterThan(sImeWindow, sStatusBarWindow);
- assertWindowLayerGreaterThan(sNavBarWindow, sImeWindow);
+ assertWindowLayerGreaterThan(mImeWindow, imeSystemOverlayTarget);
+ assertWindowLayerGreaterThan(mImeWindow, mChildAppWindowAbove);
+ assertWindowLayerGreaterThan(mImeWindow, mAppWindow);
+ assertWindowLayerGreaterThan(mImeWindow, mDockedDividerWindow);
+ assertWindowLayerGreaterThan(mImeWindow, mStatusBarWindow);
+ assertWindowLayerGreaterThan(mNavBarWindow, mImeWindow);
// And, IME dialogs should always have an higher layer than the IME.
- assertWindowLayerGreaterThan(sImeDialogWindow, sImeWindow);
+ assertWindowLayerGreaterThan(mImeDialogWindow, mImeWindow);
}
@Test
public void testStackLayers() throws Exception {
WindowState pinnedStackWindow = createWindowOnStack(null, PINNED_STACK_ID,
- TYPE_BASE_APPLICATION, sDisplayContent, "pinnedStackWindow");
+ TYPE_BASE_APPLICATION, mDisplayContent, "pinnedStackWindow");
WindowState dockedStackWindow = createWindowOnStack(null, DOCKED_STACK_ID,
- TYPE_BASE_APPLICATION, sDisplayContent, "dockedStackWindow");
+ TYPE_BASE_APPLICATION, mDisplayContent, "dockedStackWindow");
WindowState assistantStackWindow = createWindowOnStack(null, ASSISTANT_STACK_ID,
- TYPE_BASE_APPLICATION, sDisplayContent, "assistantStackWindow");
+ TYPE_BASE_APPLICATION, mDisplayContent, "assistantStackWindow");
- sLayersController.assignWindowLayers(sDisplayContent);
+ mLayersController.assignWindowLayers(mDisplayContent);
- assertWindowLayerGreaterThan(dockedStackWindow, sAppWindow);
+ assertWindowLayerGreaterThan(dockedStackWindow, mAppWindow);
assertWindowLayerGreaterThan(assistantStackWindow, dockedStackWindow);
assertWindowLayerGreaterThan(pinnedStackWindow, assistantStackWindow);
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java
index ae3eb52..47ced99 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java
@@ -92,7 +92,7 @@
public static class TestAppWindowToken extends AppWindowToken {
TestAppWindowToken(DisplayContent dc) {
- super(WindowTestsBase.sWm, null, false, dc, true /* fillsParent */,
+ super(dc.mService, null, false, dc, true /* fillsParent */,
null /* overrideConfig */, null /* bounds */);
}
@@ -137,7 +137,7 @@
}
TestWindowToken(int type, DisplayContent dc, boolean persistOnEmpty) {
- super(WindowTestsBase.sWm, mock(IBinder.class), type, persistOnEmpty, dc,
+ super(dc.mService, mock(IBinder.class), type, persistOnEmpty, dc,
false /* ownerCanManageAppTokens */);
}
@@ -201,8 +201,8 @@
*/
public static class TestTaskWindowContainerController extends TaskWindowContainerController {
- TestTaskWindowContainerController() {
- this(WindowTestsBase.createStackControllerOnDisplay(WindowTestsBase.sDisplayContent));
+ TestTaskWindowContainerController(WindowTestsBase testsBase) {
+ this(testsBase.createStackControllerOnDisplay(testsBase.mDisplayContent));
}
TestTaskWindowContainerController(StackWindowController stackController) {
@@ -219,7 +219,8 @@
}, stackController, 0 /* userId */, null /* bounds */,
EMPTY /* overrideConfig*/, RESIZE_MODE_UNRESIZEABLE,
false /* supportsPictureInPicture */, false /* homeTask*/, true /* toTop*/,
- true /* showForAllUsers */, new ActivityManager.TaskDescription(), WindowTestsBase.sWm);
+ true /* showForAllUsers */, new ActivityManager.TaskDescription(),
+ stackController.mService);
}
@Override
@@ -246,8 +247,8 @@
true /* showForAllUsers */, 0 /* configChanges */, false /* voiceInteraction */,
false /* launchTaskBehind */, false /* alwaysFocusable */,
0 /* targetSdkVersion */, 0 /* rotationAnimationHint */,
- 0 /* inputDispatchingTimeoutNanos */, WindowTestsBase.sWm, null /* overrideConfig */,
- null /* bounds */);
+ 0 /* inputDispatchingTimeoutNanos */, taskController.mService,
+ null /* overrideConfig */, null /* bounds */);
mToken = token;
}
@@ -265,8 +266,8 @@
controller, overrideConfig, bounds);
}
- AppWindowToken getAppWindowToken() {
- return (AppWindowToken) WindowTestsBase.sDisplayContent.getWindowToken(mToken.asBinder());
+ AppWindowToken getAppWindowToken(DisplayContent dc) {
+ return (AppWindowToken) dc.getWindowToken(mToken.asBinder());
}
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
index 218af73..0167654 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
@@ -16,9 +16,9 @@
package com.android.server.wm;
+import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.View.VISIBLE;
-import android.app.ActivityManager.TaskDescription;
import android.graphics.Rect;
import android.hardware.display.DisplayManagerGlobal;
import android.view.Display;
@@ -61,85 +61,67 @@
*/
class WindowTestsBase {
static WindowManagerService sWm = null;
- static TestWindowManagerPolicy sPolicy = null;
- private final static IWindow sIWindow = new TestIWindow();
- private final static Session sMockSession = mock(Session.class);
+ private static final IWindow sIWindow = new TestIWindow();
+ private static final Session sMockSession = mock(Session.class);
// The default display is removed in {@link #setUp} and then we iterate over all displays to
// make sure we don't collide with any existing display. If we run into no other display, the
// added display should be treated as default. This cannot be the default display
- private static int sNextDisplayId = Display.DEFAULT_DISPLAY + 1;
+ private static int sNextDisplayId = DEFAULT_DISPLAY + 1;
private static int sNextStackId = FIRST_DYNAMIC_STACK_ID;
private static boolean sOneTimeSetupDone = false;
- static DisplayContent sDisplayContent;
- static DisplayInfo sDisplayInfo = new DisplayInfo();
- static WindowLayersController sLayersController;
- static WindowState sWallpaperWindow;
- static WindowState sImeWindow;
- static WindowState sImeDialogWindow;
- static WindowState sStatusBarWindow;
- static WindowState sDockedDividerWindow;
- static WindowState sNavBarWindow;
- static WindowState sAppWindow;
- static WindowState sChildAppWindowAbove;
- static WindowState sChildAppWindowBelow;
- static HashSet<WindowState> sCommonWindows;
+ DisplayContent mDisplayContent;
+ DisplayInfo mDisplayInfo = new DisplayInfo();
+ WindowLayersController mLayersController;
+ WindowState mWallpaperWindow;
+ WindowState mImeWindow;
+ WindowState mImeDialogWindow;
+ WindowState mStatusBarWindow;
+ WindowState mDockedDividerWindow;
+ WindowState mNavBarWindow;
+ WindowState mAppWindow;
+ WindowState mChildAppWindowAbove;
+ WindowState mChildAppWindowBelow;
+ HashSet<WindowState> mCommonWindows;
@Before
public void setUp() throws Exception {
- if (sOneTimeSetupDone) {
- return;
+ if (!sOneTimeSetupDone) {
+ sOneTimeSetupDone = true;
+ MockitoAnnotations.initMocks(this);
}
- sOneTimeSetupDone = true;
- MockitoAnnotations.initMocks(this);
+
final Context context = InstrumentationRegistry.getTargetContext();
AttributeCache.init(context);
sWm = TestWindowManagerPolicy.getWindowManagerService(context);
- sPolicy = (TestWindowManagerPolicy) sWm.mPolicy;
- sLayersController = new WindowLayersController(sWm);
+ mLayersController = new WindowLayersController(sWm);
- // Make sure that display ids don't overlap, so there won't be several displays with same
- // ids among RootWindowContainer children.
- for (DisplayContent dc : sWm.mRoot.mChildren) {
- if (dc.getDisplayId() >= sNextDisplayId) {
- sNextDisplayId = dc.getDisplayId() + 1;
- }
-
- // The default display must be preserved as some tests require it to function
- // (such as policy rotation).
- if (dc.getDisplayId() != Display.DEFAULT_DISPLAY) {
- // It is safe to remove these displays as new displays will always be created with
- // new ids.
- dc.removeImmediately();
- }
- }
-
- context.getDisplay().getDisplayInfo(sDisplayInfo);
- sDisplayContent = createNewDisplay();
+ context.getDisplay().getDisplayInfo(mDisplayInfo);
+ mDisplayContent = createNewDisplay();
sWm.mDisplayEnabled = true;
sWm.mDisplayReady = true;
// Set-up some common windows.
- sCommonWindows = new HashSet();
- sWallpaperWindow = createCommonWindow(null, TYPE_WALLPAPER, "wallpaperWindow");
- sImeWindow = createCommonWindow(null, TYPE_INPUT_METHOD, "sImeWindow");
- sWm.mInputMethodWindow = sImeWindow;
- sImeDialogWindow = createCommonWindow(null, TYPE_INPUT_METHOD_DIALOG, "sImeDialogWindow");
- sStatusBarWindow = createCommonWindow(null, TYPE_STATUS_BAR, "sStatusBarWindow");
- sNavBarWindow = createCommonWindow(null, TYPE_NAVIGATION_BAR, "sNavBarWindow");
- sDockedDividerWindow = createCommonWindow(null, TYPE_DOCK_DIVIDER, "sDockedDividerWindow");
- sAppWindow = createCommonWindow(null, TYPE_BASE_APPLICATION, "sAppWindow");
- sChildAppWindowAbove = createCommonWindow(sAppWindow, TYPE_APPLICATION_ATTACHED_DIALOG,
- "sChildAppWindowAbove");
- sChildAppWindowBelow = createCommonWindow(sAppWindow, TYPE_APPLICATION_MEDIA_OVERLAY,
- "sChildAppWindowBelow");
+ mCommonWindows = new HashSet();
+ mWallpaperWindow = createCommonWindow(null, TYPE_WALLPAPER, "wallpaperWindow");
+ mImeWindow = createCommonWindow(null, TYPE_INPUT_METHOD, "mImeWindow");
+ sWm.mInputMethodWindow = mImeWindow;
+ mImeDialogWindow = createCommonWindow(null, TYPE_INPUT_METHOD_DIALOG, "mImeDialogWindow");
+ mStatusBarWindow = createCommonWindow(null, TYPE_STATUS_BAR, "mStatusBarWindow");
+ mNavBarWindow = createCommonWindow(null, TYPE_NAVIGATION_BAR, "mNavBarWindow");
+ mDockedDividerWindow = createCommonWindow(null, TYPE_DOCK_DIVIDER, "mDockedDividerWindow");
+ mAppWindow = createCommonWindow(null, TYPE_BASE_APPLICATION, "mAppWindow");
+ mChildAppWindowAbove = createCommonWindow(mAppWindow, TYPE_APPLICATION_ATTACHED_DIALOG,
+ "mChildAppWindowAbove");
+ mChildAppWindowBelow = createCommonWindow(mAppWindow, TYPE_APPLICATION_MEDIA_OVERLAY,
+ "mChildAppWindowBelow");
}
@After
public void tearDown() throws Exception {
final LinkedList<WindowState> nonCommonWindows = new LinkedList();
sWm.mRoot.forAllWindows(w -> {
- if (!sCommonWindows.contains(w)) {
+ if (!mCommonWindows.contains(w)) {
nonCommonWindows.addLast(w);
}
}, true /* traverseTopToBottom */);
@@ -148,12 +130,13 @@
nonCommonWindows.pollLast().removeImmediately();
}
+ mDisplayContent.removeImmediately();
sWm.mInputMethodTarget = null;
}
- private static WindowState createCommonWindow(WindowState parent, int type, String name) {
+ private WindowState createCommonWindow(WindowState parent, int type, String name) {
final WindowState win = createWindow(parent, type, name);
- sCommonWindows.add(win);
+ mCommonWindows.add(win);
// Prevent common windows from been IMe targets
win.mAttrs.flags |= FLAG_NOT_FOCUSABLE;
return win;
@@ -172,7 +155,7 @@
sWm.mAnimationHandler.runWithScissors(() -> { }, 0);
}
- private static WindowToken createWindowToken(DisplayContent dc, int stackId, int type) {
+ private WindowToken createWindowToken(DisplayContent dc, int stackId, int type) {
if (type < FIRST_APPLICATION_WINDOW || type > LAST_APPLICATION_WINDOW) {
return new WindowTestUtils.TestWindowToken(type, dc);
}
@@ -186,30 +169,30 @@
return token;
}
- static WindowState createWindow(WindowState parent, int type, String name) {
+ WindowState createWindow(WindowState parent, int type, String name) {
return (parent == null)
- ? createWindow(parent, type, sDisplayContent, name)
+ ? createWindow(parent, type, mDisplayContent, name)
: createWindow(parent, type, parent.mToken, name);
}
- static WindowState createWindowOnStack(WindowState parent, int stackId, int type,
+ WindowState createWindowOnStack(WindowState parent, int stackId, int type,
DisplayContent dc, String name) {
final WindowToken token = createWindowToken(dc, stackId, type);
return createWindow(parent, type, token, name);
}
WindowState createAppWindow(Task task, int type, String name) {
- final AppWindowToken token = new WindowTestUtils.TestAppWindowToken(sDisplayContent);
+ final AppWindowToken token = new WindowTestUtils.TestAppWindowToken(mDisplayContent);
task.addChild(token, 0);
return createWindow(null, type, token, name);
}
- static WindowState createWindow(WindowState parent, int type, DisplayContent dc, String name) {
+ WindowState createWindow(WindowState parent, int type, DisplayContent dc, String name) {
final WindowToken token = createWindowToken(dc, INVALID_STACK_ID, type);
return createWindow(parent, type, token, name);
}
- static WindowState createWindow(WindowState parent, int type, DisplayContent dc, String name,
+ WindowState createWindow(WindowState parent, int type, DisplayContent dc, String name,
boolean ownerCanAddInternalSystemWindow) {
final WindowToken token = createWindowToken(dc, INVALID_STACK_ID, type);
return createWindow(parent, type, token, name, ownerCanAddInternalSystemWindow);
@@ -233,23 +216,23 @@
}
/** Creates a {@link TaskStack} and adds it to the specified {@link DisplayContent}. */
- static TaskStack createTaskStackOnDisplay(DisplayContent dc) {
+ TaskStack createTaskStackOnDisplay(DisplayContent dc) {
return createStackControllerOnDisplay(dc).mContainer;
}
- static StackWindowController createStackControllerOnDisplay(DisplayContent dc) {
+ StackWindowController createStackControllerOnDisplay(DisplayContent dc) {
final int stackId = ++sNextStackId;
return createStackControllerOnStackOnDisplay(stackId, dc);
}
- static StackWindowController createStackControllerOnStackOnDisplay(int stackId,
+ StackWindowController createStackControllerOnStackOnDisplay(int stackId,
DisplayContent dc) {
return new StackWindowController(stackId, null, dc.getDisplayId(),
true /* onTop */, new Rect(), sWm);
}
/** Creates a {@link Task} and adds it to the specified {@link TaskStack}. */
- static Task createTaskInStack(TaskStack stack, int userId) {
+ Task createTaskInStack(TaskStack stack, int userId) {
return WindowTestUtils.createTaskInStack(sWm, stack, userId);
}
@@ -257,8 +240,8 @@
DisplayContent createNewDisplay() {
final int displayId = sNextDisplayId++;
final Display display = new Display(DisplayManagerGlobal.getInstance(), displayId,
- sDisplayInfo, DEFAULT_DISPLAY_ADJUSTMENTS);
- return new DisplayContent(display, sWm, sLayersController, new WallpaperController(sWm));
+ mDisplayInfo, DEFAULT_DISPLAY_ADJUSTMENTS);
+ return new DisplayContent(display, sWm, mLayersController, new WallpaperController(sWm));
}
/** Creates a {@link com.android.server.wm.WindowTestUtils.TestWindowState} */
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java
index 4f7ad41..692e08b 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java
@@ -47,7 +47,7 @@
@Test
public void testAddWindow() throws Exception {
final WindowTestUtils.TestWindowToken token =
- new WindowTestUtils.TestWindowToken(0, sDisplayContent);
+ new WindowTestUtils.TestWindowToken(0, mDisplayContent);
assertEquals(0, token.getWindowsCount());
@@ -76,7 +76,7 @@
@Test
public void testChildRemoval() throws Exception {
- final DisplayContent dc = sDisplayContent;
+ final DisplayContent dc = mDisplayContent;
final WindowTestUtils.TestWindowToken token = new WindowTestUtils.TestWindowToken(0, dc);
assertEquals(token, dc.getWindowToken(token.token));
@@ -97,7 +97,7 @@
@Test
public void testAdjustAnimLayer() throws Exception {
final WindowTestUtils.TestWindowToken token =
- new WindowTestUtils.TestWindowToken(0, sDisplayContent);
+ new WindowTestUtils.TestWindowToken(0, mDisplayContent);
final WindowState window1 = createWindow(null, TYPE_APPLICATION, token, "window1");
final WindowState window11 = createWindow(window1, FIRST_SUB_WINDOW, token, "window11");
final WindowState window12 = createWindow(window1, FIRST_SUB_WINDOW, token, "window12");
@@ -109,7 +109,7 @@
// We assign layers once, to get the base values computed by
// the controller.
- sLayersController.assignWindowLayers(sDisplayContent);
+ mLayersController.assignWindowLayers(mDisplayContent);
final int window1StartLayer = window1.mWinAnimator.mAnimLayer;
final int window11StartLayer = window11.mWinAnimator.mAnimLayer;
@@ -120,7 +120,7 @@
// Then we set an adjustment, and assign them again, they should
// be offset.
int adj = token.adj = 50;
- sLayersController.assignWindowLayers(sDisplayContent);
+ mLayersController.assignWindowLayers(mDisplayContent);
final int highestLayer = token.getHighestAnimLayer();
assertEquals(window1StartLayer + adj, window1.mWinAnimator.mAnimLayer);
@@ -138,18 +138,18 @@
@Test
public void testTokenRemovalProcess() throws Exception {
final WindowTestUtils.TestWindowToken token =
- new WindowTestUtils.TestWindowToken(TYPE_TOAST, sDisplayContent,
+ new WindowTestUtils.TestWindowToken(TYPE_TOAST, mDisplayContent,
true /* persistOnEmpty */);
// Verify that the token is on the display
- assertNotNull(sDisplayContent.getWindowToken(token.token));
+ assertNotNull(mDisplayContent.getWindowToken(token.token));
final WindowState window1 = createWindow(null, TYPE_TOAST, token, "window1");
final WindowState window2 = createWindow(null, TYPE_TOAST, token, "window2");
- sDisplayContent.removeWindowToken(token.token);
+ mDisplayContent.removeWindowToken(token.token);
// Verify that the token is no longer mapped on the display
- assertNull(sDisplayContent.getWindowToken(token.token));
+ assertNull(mDisplayContent.getWindowToken(token.token));
// Verify that the token is still attached to its parent
assertNotNull(token.getParent());
// Verify that the token windows are still around.
diff --git a/services/usage/java/com/android/server/usage/StorageStatsService.java b/services/usage/java/com/android/server/usage/StorageStatsService.java
index 2ebf5fc..e13665b 100644
--- a/services/usage/java/com/android/server/usage/StorageStatsService.java
+++ b/services/usage/java/com/android/server/usage/StorageStatsService.java
@@ -157,7 +157,7 @@
@Override
public long getTotalBytes(String volumeUuid, String callingPackage) {
- enforcePermission(Binder.getCallingUid(), callingPackage);
+ // NOTE: No permissions required
if (volumeUuid == StorageManager.UUID_PRIVATE_INTERNAL) {
return FileUtils.roundStorageSize(mStorage.getPrimaryStorageSize());
@@ -173,7 +173,7 @@
@Override
public long getFreeBytes(String volumeUuid, String callingPackage) {
- enforcePermission(Binder.getCallingUid(), callingPackage);
+ // NOTE: No permissions required
long cacheBytes = 0;
final long token = Binder.clearCallingIdentity();
@@ -187,14 +187,14 @@
}
if (volumeUuid == StorageManager.UUID_PRIVATE_INTERNAL) {
- return Environment.getDataDirectory().getUsableSpace() + cacheBytes;
+ return Environment.getDataDirectory().getFreeSpace() + cacheBytes;
} else {
final VolumeInfo vol = mStorage.findVolumeByUuid(volumeUuid);
if (vol == null) {
throw new ParcelableException(
new IOException("Failed to find storage device for UUID " + volumeUuid));
}
- return vol.getPath().getUsableSpace() + cacheBytes;
+ return vol.getPath().getFreeSpace() + cacheBytes;
}
}
@@ -213,7 +213,6 @@
@Override
public StorageStats queryStatsForPackage(String volumeUuid, String packageName, int userId,
String callingPackage) {
- enforcePermission(Binder.getCallingUid(), callingPackage);
if (userId != UserHandle.getCallingUserId()) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS, TAG);
@@ -227,6 +226,12 @@
throw new ParcelableException(e);
}
+ if (Binder.getCallingUid() == appInfo.uid) {
+ // No permissions required when asking about themselves
+ } else {
+ enforcePermission(Binder.getCallingUid(), callingPackage);
+ }
+
if (mPackage.getPackagesForUid(appInfo.uid).length == 1) {
// Only one package inside UID means we can fast-path
return queryStatsForUid(volumeUuid, appInfo.uid, callingPackage);
@@ -257,14 +262,19 @@
@Override
public StorageStats queryStatsForUid(String volumeUuid, int uid, String callingPackage) {
- enforcePermission(Binder.getCallingUid(), callingPackage);
- if (UserHandle.getUserId(uid) != UserHandle.getCallingUserId()) {
+ final int userId = UserHandle.getUserId(uid);
+ final int appId = UserHandle.getAppId(uid);
+
+ if (userId != UserHandle.getCallingUserId()) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS, TAG);
}
- final int userId = UserHandle.getUserId(uid);
- final int appId = UserHandle.getAppId(uid);
+ if (Binder.getCallingUid() == uid) {
+ // No permissions required when asking about themselves
+ } else {
+ enforcePermission(Binder.getCallingUid(), callingPackage);
+ }
final String[] packageNames = mPackage.getPackagesForUid(uid);
final long[] ceDataInodes = new long[packageNames.length];
@@ -304,12 +314,14 @@
@Override
public StorageStats queryStatsForUser(String volumeUuid, int userId, String callingPackage) {
- enforcePermission(Binder.getCallingUid(), callingPackage);
if (userId != UserHandle.getCallingUserId()) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS, TAG);
}
+ // Always require permission to see user-level stats
+ enforcePermission(Binder.getCallingUid(), callingPackage);
+
final int[] appIds = getAppIds(userId);
final PackageStats stats = new PackageStats(TAG);
try {
@@ -329,12 +341,14 @@
@Override
public ExternalStorageStats queryExternalStatsForUser(String volumeUuid, int userId,
String callingPackage) {
- enforcePermission(Binder.getCallingUid(), callingPackage);
if (userId != UserHandle.getCallingUserId()) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS, TAG);
}
+ // Always require permission to see user-level stats
+ enforcePermission(Binder.getCallingUid(), callingPackage);
+
final int[] appIds = getAppIds(userId);
final long[] stats;
try {
diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
index 3f6f8ec..7cb176d 100644
--- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -843,18 +843,20 @@
updateUsbNotification();
updateAdbNotification();
+ if (mBootCompleted) {
+ Slog.i(TAG, "update state " + mConnected + " " + mConfigured);
+ updateUsbStateBroadcastIfNeeded(false);
+ }
if (UsbManager.containsFunction(mCurrentFunctions,
UsbManager.USB_FUNCTION_ACCESSORY)) {
updateCurrentAccessory();
}
if (mBootCompleted) {
- Slog.i(TAG, "update state " + mConnected + " " + mConfigured);
if (!mConnected) {
// restore defaults when USB is disconnected
Slog.i(TAG, "Disconnect, setting usb functions to null");
setEnabledFunctions(null, false, false);
}
- updateUsbStateBroadcastIfNeeded(false);
updateUsbFunctions();
} else {
mPendingBootBroadcast = true;
@@ -1076,7 +1078,7 @@
.setContentIntent(pi)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.extend(new Notification.TvExtender()
- .setChannel(ADB_NOTIFICATION_CHANNEL_ID_TV))
+ .setChannelId(ADB_NOTIFICATION_CHANNEL_ID_TV))
.build();
mAdbNotificationShown = true;
mNotificationManager.notifyAsUser(null, id, notification,
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index 6c4ced4..4ffacfd 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -1203,6 +1203,50 @@
}
@Override
+ public void onPackageModified(String pkgName) {
+ // If the package modified is not in the current user, then don't bother making
+ // any changes as we are going to do any initialization needed when we switch users.
+ if (mCurUser != getChangingUserId()) {
+ return;
+ }
+ // Package getting updated will be handled by {@link #onSomePackagesChanged}.
+ if (isPackageAppearing(pkgName) != PACKAGE_UNCHANGED) {
+ return;
+ }
+ final ComponentName curInteractor = getCurInteractor(mCurUser);
+ if (curInteractor == null) {
+ final VoiceInteractionServiceInfo availInteractorInfo
+ = findAvailInteractor(mCurUser, pkgName);
+ if (availInteractorInfo != null) {
+ final ComponentName availInteractor = new ComponentName(
+ availInteractorInfo.getServiceInfo().packageName,
+ availInteractorInfo.getServiceInfo().name);
+ setCurInteractor(availInteractor, mCurUser);
+ if (getCurRecognizer(mCurUser) == null &&
+ availInteractorInfo.getRecognitionService() != null) {
+ setCurRecognizer(new ComponentName(
+ availInteractorInfo.getServiceInfo().packageName,
+ availInteractorInfo.getRecognitionService()), mCurUser);
+ }
+ }
+ } else {
+ if (didSomePackagesChange()) {
+ // Package is changed
+ if (curInteractor != null && pkgName.equals(
+ curInteractor.getPackageName())) {
+ switchImplementationIfNeeded(true);
+ }
+ } else {
+ // Only some components are changed
+ if (curInteractor != null
+ && isComponentModified(curInteractor.getClassName())) {
+ switchImplementationIfNeeded(true);
+ }
+ }
+ }
+ }
+
+ @Override
public void onSomePackagesChanged() {
int userHandle = getChangingUserId();
if (DEBUG) Slog.d(TAG, "onSomePackagesChanged user=" + userHandle);
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 7998359..dc0c485 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -865,6 +865,7 @@
* {@link Call#sendRttRequest()}
*/
public static final class RttModifyStatus {
+ private RttModifyStatus() {}
/**
* Session modify request was successful.
*/
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 0b4a3e8..7174a70 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -993,6 +993,20 @@
"carrier_default_actions_on_dcfailure_string_array";
/**
+ * Defines carrier-specific actions which act upon
+ * com.android.internal.telephony.CARRIER_SIGNAL_RESET, used for customization of the
+ * default carrier app
+ * Format: "CARRIER_ACTION_IDX, ..."
+ * Where {@code CARRIER_ACTION_IDX} is an integer defined in
+ * {@link com.android.carrierdefaultapp.CarrierActionUtils CarrierActionUtils}
+ * Example:
+ * {@link com.android.carrierdefaultapp.CarrierActionUtils
+ * #CARRIER_ACTION_CANCEL_ALL_NOTIFICATIONS clear all notifications on reset}
+ * @hide
+ */
+ public static final String KEY_CARRIER_DEFAULT_ACTIONS_ON_RESET =
+ "carrier_default_actions_on_reset_string_array";
+ /**
* Defines a list of acceptable redirection url for default carrier app
* @hides
*/
@@ -1594,7 +1608,8 @@
sDefaults.putStringArray(KEY_CARRIER_APP_WAKE_SIGNAL_CONFIG_STRING_ARRAY,
new String[]{
"com.android.carrierdefaultapp/.CarrierDefaultBroadcastReceiver:" +
- "com.android.internal.telephony.CARRIER_SIGNAL_REDIRECTED"
+ "com.android.internal.telephony.CARRIER_SIGNAL_REDIRECTED," +
+ "com.android.internal.telephony.CARRIER_SIGNAL_RESET"
});
sDefaults.putStringArray(KEY_CARRIER_APP_NO_WAKE_SIGNAL_CONFIG_STRING_ARRAY, null);
@@ -1606,6 +1621,9 @@
//4: CARRIER_ACTION_DISABLE_METERED_APNS
//1: CARRIER_ACTION_SHOW_PORTAL_NOTIFICATION
});
+ sDefaults.putStringArray(KEY_CARRIER_DEFAULT_ACTIONS_ON_RESET, new String[]{
+ "6" //6: CARRIER_ACTION_CANCEL_ALL_NOTIFICATIONS
+ });
sDefaults.putStringArray(KEY_CARRIER_DEFAULT_REDIRECTION_URL_STRING_ARRAY, null);
sDefaults.putInt(KEY_MONTHLY_DATA_CYCLE_DAY_INT, DATA_CYCLE_USE_PLATFORM_DEFAULT);
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 81f6600..7f616ad 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -342,6 +342,32 @@
public static final String SUB_DEFAULT_CHANGED_ACTION =
"android.intent.action.SUB_DEFAULT_CHANGED";
+ /**
+ * Broadcast Action: The default subscription has changed. This has the following
+ * extra values:</p>
+ * The {@link #EXTRA_SUBSCRIPTION_INDEX} extra indicates the current default subscription index
+ */
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_DEFAULT_SUBSCRIPTION_CHANGED
+ = "android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED";
+
+ /**
+ * Broadcast Action: The default sms subscription has changed. This has the following
+ * extra values:</p>
+ * {@link #EXTRA_SUBSCRIPTION_INDEX} extra indicates the current default sms
+ * subscription index
+ */
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED
+ = "android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED";
+
+ /**
+ * Integer extra used with {@link #ACTION_DEFAULT_SUBSCRIPTION_CHANGED} and
+ * {@link #ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED} to indicate the subscription
+ * which has changed.
+ */
+ public static final String EXTRA_SUBSCRIPTION_INDEX = "android.telephony.extra.SUBSCRIPTION_INDEX";
+
private final Context mContext;
/**
@@ -1178,7 +1204,7 @@
public static void putPhoneIdAndSubIdExtra(Intent intent, int phoneId, int subId) {
if (VDBG) logd("putPhoneIdAndSubIdExtra: phoneId=" + phoneId + " subId=" + subId);
intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, subId);
- intent.putExtra(Intent.EXTRA_SUBSCRIPTION_INDEX, subId);
+ intent.putExtra(EXTRA_SUBSCRIPTION_INDEX, subId);
intent.putExtra(PhoneConstants.PHONE_KEY, phoneId);
//FIXME this is using phoneId and slotIndex interchangeably
//Eventually, this should be removed as it is not the slot id
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 85f84ba..b8e24f0 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -45,6 +45,7 @@
import android.service.carrier.CarrierIdentifier;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
+import android.telephony.VisualVoicemailService.VisualVoicemailTask;
import android.telephony.ims.feature.ImsFeature;
import android.util.Log;
@@ -322,9 +323,6 @@
* a String.
*
* <p class="note">
- * Requires the READ_PHONE_STATE permission.
- *
- * <p class="note">
* This was a {@link android.content.Context#sendStickyBroadcast sticky}
* broadcast in version 1.0, but it is no longer sticky.
* Instead, use {@link #getCallState} to synchronously query the current call state.
@@ -334,6 +332,7 @@
* @see #getCallState
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public static final String ACTION_PHONE_STATE_CHANGED =
"android.intent.action.PHONE_STATE";
@@ -877,6 +876,30 @@
public static final String VVM_TYPE_CVVM = "vvm_type_cvvm";
/**
+ * Key in bundle returned by {@link #getVisualVoicemailPackageName()}, indicating whether visual
+ * voicemail was enabled or disabled by the user. If the user never explicitly changed this
+ * setting, this key will not exist.
+ *
+ * @see #getVisualVoicemailSettings()
+ * @hide
+ */
+ @SystemApi
+ public static final String EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL =
+ "android.telephony.extra.VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL";
+
+ /**
+ * Key in bundle returned by {@link #getVisualVoicemailPackageName()}, indicating the voicemail
+ * access PIN scrambled during the auto provisioning process. The user is expected to reset
+ * their PIN if this value is not {@code null}.
+ *
+ * @see #getVisualVoicemailSettings()
+ * @hide
+ */
+ @SystemApi
+ public static final String EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING =
+ "android.telephony.extra.VOICEMAIL_SCRAMBLED_PIN_STRING";
+
+ /**
* @hide
*/
public static final String USSD_RESPONSE = "USSD_RESPONSE";
@@ -914,10 +937,8 @@
* Returns the software version number for the device, for example,
* the IMEI/SV for GSM phones. Return null if the software version is
* not available.
- *
- * <p>Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getDeviceSoftwareVersion() {
return getDeviceSoftwareVersion(getSlotIndex());
}
@@ -927,12 +948,10 @@
* the IMEI/SV for GSM phones. Return null if the software version is
* not available.
*
- * <p>Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- *
* @param slotIndex of which deviceID is returned
*/
/** {@hide} */
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getDeviceSoftwareVersion(int slotIndex) {
ITelephony telephony = getITelephony();
if (telephony == null) return null;
@@ -950,13 +969,11 @@
* Returns the unique device ID, for example, the IMEI for GSM and the MEID
* or ESN for CDMA phones. Return null if device ID is not available.
*
- * <p>Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- *
* @deprecated Use (@link getImei} which returns IMEI for GSM or (@link getMeid} which returns
* MEID for CDMA.
*/
@Deprecated
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getDeviceId() {
try {
ITelephony telephony = getITelephony();
@@ -974,15 +991,13 @@
* Returns the unique device ID of a subscription, for example, the IMEI for
* GSM and the MEID for CDMA phones. Return null if device ID is not available.
*
- * <p>Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- *
* @param slotIndex of which deviceID is returned
*
* @deprecated Use (@link getImei} which returns IMEI for GSM or (@link getMeid} which returns
* MEID for CDMA.
*/
@Deprecated
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getDeviceId(int slotIndex) {
// FIXME this assumes phoneId == slotIndex
try {
@@ -1000,10 +1015,8 @@
/**
* Returns the IMEI (International Mobile Equipment Identity). Return null if IMEI is not
* available.
- *
- * <p>Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getImei() {
return getImei(getSlotIndex());
}
@@ -1012,11 +1025,9 @@
* Returns the IMEI (International Mobile Equipment Identity). Return null if IMEI is not
* available.
*
- * <p>Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- *
* @param slotIndex of which IMEI is returned
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getImei(int slotIndex) {
ITelephony telephony = getITelephony();
if (telephony == null) return null;
@@ -1032,10 +1043,8 @@
/**
* Returns the MEID (Mobile Equipment Identifier). Return null if MEID is not available.
- *
- * <p>Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getMeid() {
return getMeid(getSlotIndex());
}
@@ -1043,11 +1052,9 @@
/**
* Returns the MEID (Mobile Equipment Identifier). Return null if MEID is not available.
*
- * <p>Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- *
* @param slotIndex of which MEID is returned
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getMeid(int slotIndex) {
ITelephony telephony = getITelephony();
if (telephony == null) return null;
@@ -1103,13 +1110,13 @@
*<p>
* @return Current location of the device or null if not available.
*
- * <p>Requires Permission:
- * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION} or
- * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_FINE_LOCATION}.
- *
* @deprecated use {@link #getAllCellInfo} instead, which returns a superset of this API.
*/
@Deprecated
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.ACCESS_COARSE_LOCATION,
+ android.Manifest.permission.ACCESS_FINE_LOCATION
+ })
public CellLocation getCellLocation() {
try {
ITelephony telephony = getITelephony();
@@ -1141,11 +1148,9 @@
* Enables location update notifications. {@link PhoneStateListener#onCellLocationChanged
* PhoneStateListener.onCellLocationChanged} will be called on location updates.
*
- * <p>Requires Permission: {@link android.Manifest.permission#CONTROL_LOCATION_UPDATES
- * CONTROL_LOCATION_UPDATES}
- *
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.CONTROL_LOCATION_UPDATES)
public void enableLocationUpdates() {
enableLocationUpdates(getSubId());
}
@@ -1155,12 +1160,10 @@
* {@link PhoneStateListener#onCellLocationChanged
* PhoneStateListener.onCellLocationChanged} will be called on location updates.
*
- * <p>Requires Permission: {@link android.Manifest.permission#CONTROL_LOCATION_UPDATES
- * CONTROL_LOCATION_UPDATES}
- *
* @param subId for which the location updates are enabled
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.CONTROL_LOCATION_UPDATES)
public void enableLocationUpdates(int subId) {
try {
ITelephony telephony = getITelephony();
@@ -1175,11 +1178,9 @@
* Disables location update notifications. {@link PhoneStateListener#onCellLocationChanged
* PhoneStateListener.onCellLocationChanged} will be called on location updates.
*
- * <p>Requires Permission: {@link android.Manifest.permission#CONTROL_LOCATION_UPDATES
- * CONTROL_LOCATION_UPDATES}
- *
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.CONTROL_LOCATION_UPDATES)
public void disableLocationUpdates() {
disableLocationUpdates(getSubId());
}
@@ -1198,15 +1199,13 @@
/**
* Returns the neighboring cell information of the device.
*
- * <p>Requires Permission:
- * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}
- *
* @return List of NeighboringCellInfo or null if info unavailable.
*
* @deprecated Use {@link #getAllCellInfo} which returns a superset of the information
* from NeighboringCellInfo.
*/
@Deprecated
+ @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION)
public List<NeighboringCellInfo> getNeighboringCellInfo() {
try {
ITelephony telephony = getITelephony();
@@ -1562,14 +1561,12 @@
* invalid subscription ID is pinned to the TelephonyManager, the returned config will contain
* default values.
*
- * <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE
- * READ_PHONE_STATE}
- *
* @see CarrierConfigManager#getConfigForSubId(int)
* @see #createForSubscriptionId(int)
* @see #createForPhoneAccountHandle(PhoneAccountHandle)
*/
@WorkerThread
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public PersistableBundle getCarrierConfig() {
CarrierConfigManager carrierConfigManager = mContext
.getSystemService(CarrierConfigManager.class);
@@ -1729,11 +1726,9 @@
* @see #NETWORK_TYPE_EHRPD
* @see #NETWORK_TYPE_HSPAP
*
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public int getNetworkType(int subId) {
try {
ITelephony telephony = getITelephony();
@@ -1759,10 +1754,6 @@
* If this object has been created with {@link #createForSubscriptionId}, applies to the given
* subId. Otherwise, applies to {@link SubscriptionManager#getDefaultDataSubscriptionId()}
*
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- *
* @return the network type
*
* @see #NETWORK_TYPE_UNKNOWN
@@ -1782,6 +1773,7 @@
* @see #NETWORK_TYPE_EHRPD
* @see #NETWORK_TYPE_HSPAP
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public int getDataNetworkType() {
return getDataNetworkType(getSubId(SubscriptionManager.getDefaultDataSubscriptionId()));
}
@@ -1792,12 +1784,9 @@
* @return the network type
*
* @param subId for which network type is returned
- *
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public int getDataNetworkType(int subId) {
try{
ITelephony telephony = getITelephony();
@@ -1818,23 +1807,17 @@
/**
* Returns the NETWORK_TYPE_xxxx for voice
- *
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public int getVoiceNetworkType() {
return getVoiceNetworkType(getSubId());
}
/**
* Returns the NETWORK_TYPE_xxxx for voice for a subId
- *
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public int getVoiceNetworkType(int subId) {
try{
ITelephony telephony = getITelephony();
@@ -2236,10 +2219,8 @@
/**
* Returns the serial number of the SIM, if applicable. Return null if it is
* unavailable.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getSimSerialNumber() {
return getSimSerialNumber(getSubId());
}
@@ -2249,10 +2230,9 @@
* unavailable.
* <p>
* @param subId for which Sim Serial number is returned
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getSimSerialNumber(int subId) {
try {
IPhoneSubInfo info = getSubscriberInfo();
@@ -2275,12 +2255,9 @@
* @return {@link PhoneConstants#LTE_ON_CDMA_UNKNOWN}, {@link PhoneConstants#LTE_ON_CDMA_FALSE}
* or {@link PhoneConstants#LTE_ON_CDMA_TRUE}
*
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- *
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public int getLteOnCdmaMode() {
return getLteOnCdmaMode(getSubId());
}
@@ -2293,12 +2270,9 @@
* @param subId for which radio is LTE on CDMA is returned
* @return {@link PhoneConstants#LTE_ON_CDMA_UNKNOWN}, {@link PhoneConstants#LTE_ON_CDMA_FALSE}
* or {@link PhoneConstants#LTE_ON_CDMA_TRUE}
- *
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public int getLteOnCdmaMode(int subId) {
try {
ITelephony telephony = getITelephony();
@@ -2323,10 +2297,8 @@
/**
* Returns the unique subscriber ID, for example, the IMSI for a GSM phone.
* Return null if it is unavailable.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getSubscriberId() {
return getSubscriberId(getSubId());
}
@@ -2335,13 +2307,11 @@
* Returns the unique subscriber ID, for example, the IMSI for a GSM phone
* for a subscription.
* Return null if it is unavailable.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*
* @param subId whose subscriber id is returned
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getSubscriberId(int subId) {
try {
IPhoneSubInfo info = getSubscriberInfo();
@@ -2359,10 +2329,8 @@
/**
* Returns the Group Identifier Level1 for a GSM phone.
* Return null if it is unavailable.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getGroupIdLevel1() {
try {
IPhoneSubInfo info = getSubscriberInfo();
@@ -2380,13 +2348,11 @@
/**
* Returns the Group Identifier Level1 for a GSM phone for a particular subscription.
* Return null if it is unavailable.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*
* @param subId whose subscriber id is returned
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getGroupIdLevel1(int subId) {
try {
IPhoneSubInfo info = getSubscriberInfo();
@@ -2405,15 +2371,13 @@
* Returns the phone number string for line 1, for example, the MSISDN
* for a GSM phone. Return null if it is unavailable.
* <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- * OR
- * {@link android.Manifest.permission#READ_SMS}
- * OR
- * {@link android.Manifest.permission#READ_PHONE_NUMBERS}
- * <p>
* The default SMS app can also use this.
*/
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.READ_PHONE_STATE,
+ android.Manifest.permission.READ_SMS,
+ android.Manifest.permission.READ_PHONE_NUMBERS
+ })
public String getLine1Number() {
return getLine1Number(getSubId());
}
@@ -2422,18 +2386,16 @@
* Returns the phone number string for line 1, for example, the MSISDN
* for a GSM phone for a particular subscription. Return null if it is unavailable.
* <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- * OR
- * {@link android.Manifest.permission#READ_SMS}
- * OR
- * {@link android.Manifest.permission#READ_PHONE_NUMBERS}
- * <p>
* The default SMS app can also use this.
*
* @param subId whose phone number for line 1 is returned
* @hide
*/
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.READ_PHONE_STATE,
+ android.Manifest.permission.READ_SMS,
+ android.Manifest.permission.READ_PHONE_NUMBERS
+ })
public String getLine1Number(int subId) {
String number = null;
try {
@@ -2505,12 +2467,10 @@
/**
* Returns the alphabetic identifier associated with the line 1 number.
* Return null if it is unavailable.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
* nobody seems to call this.
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getLine1AlphaTag() {
return getLine1AlphaTag(getSubId());
}
@@ -2519,13 +2479,11 @@
* Returns the alphabetic identifier associated with the line 1 number
* for a subscription.
* Return null if it is unavailable.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @param subId whose alphabetic identifier associated with line 1 is returned
* nobody seems to call this.
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getLine1AlphaTag(int subId) {
String alphaTag = null;
try {
@@ -2574,12 +2532,10 @@
/**
* Returns the MSISDN string.
* for a GSM phone. Return null if it is unavailable.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getMsisdn() {
return getMsisdn(getSubId());
}
@@ -2587,13 +2543,11 @@
/**
* Returns the MSISDN string.
* for a GSM phone. Return null if it is unavailable.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*
* @param subId for which msisdn is returned
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getMsisdn(int subId) {
try {
IPhoneSubInfo info = getSubscriberInfo();
@@ -2610,10 +2564,8 @@
/**
* Returns the voice mail number. Return null if it is unavailable.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getVoiceMailNumber() {
return getVoiceMailNumber(getSubId());
}
@@ -2621,12 +2573,10 @@
/**
* Returns the voice mail number for a subscription.
* Return null if it is unavailable.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @param subId whose voice mail number is returned
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getVoiceMailNumber(int subId) {
try {
IPhoneSubInfo info = getSubscriberInfo();
@@ -2643,25 +2593,21 @@
/**
* Returns the complete voice mail number. Return null if it is unavailable.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#CALL_PRIVILEGED CALL_PRIVILEGED}
*
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.CALL_PRIVILEGED)
public String getCompleteVoiceMailNumber() {
return getCompleteVoiceMailNumber(getSubId());
}
/**
* Returns the complete voice mail number. Return null if it is unavailable.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#CALL_PRIVILEGED CALL_PRIVILEGED}
*
* @param subId
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.CALL_PRIVILEGED)
public String getCompleteVoiceMailNumber(int subId) {
try {
IPhoneSubInfo info = getSubscriberInfo();
@@ -2732,9 +2678,6 @@
/**
* Returns whether the visual voicemail client is enabled.
*
- * <p>Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- *
* @param phoneAccountHandle the phone account to check for.
* @return {@code true} when the visual voicemail client is enabled for this client
* @hide
@@ -2742,24 +2685,50 @@
* be implemented instead.
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public boolean isVisualVoicemailEnabled(PhoneAccountHandle phoneAccountHandle){
return false;
}
+ /**
+ * Returns an opaque bundle of settings formerly used by the visual voicemail client for the
+ * subscription ID pinned to the TelephonyManager, or {@code null} if the subscription ID is
+ * invalid. This method allows the system dialer to migrate settings out of the pre-O visual
+ * voicemail client in telephony.
+ *
+ * <p>Requires the caller to be the system dialer.
+ *
+ * @see #KEY_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL
+ * @see #KEY_VOICEMAIL_SCRAMBLED_PIN_STRING
+ *
+ * @hide
+ */
+ @SystemApi
+ @Nullable
+ public Bundle getVisualVoicemailSettings(){
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ return telephony
+ .getVisualVoicemailSettings(mContext.getOpPackageName(), mSubId);
+ }
+ } catch (RemoteException ex) {
+ } catch (NullPointerException ex) {
+ }
+ return null;
+ }
/**
* Returns the package responsible of processing visual voicemail for the subscription ID pinned
* to the TelephonyManager. Returns {@code null} when there is no package responsible for
* processing visual voicemail for the subscription.
*
- * <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE
- * READ_PHONE_STATE}
- *
* @see #createForSubscriptionId(int)
* @see #createForPhoneAccountHandle(PhoneAccountHandle)
* @see VisualVoicemailService
*/
@Nullable
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getVisualVoicemailPackageName() {
try {
ITelephony telephony = getITelephony();
@@ -2774,6 +2743,54 @@
}
/**
+ * Set the visual voicemail SMS filter settings for the subscription ID pinned
+ * to the TelephonyManager.
+ * When the filter is enabled, {@link
+ * VisualVoicemailService#onSmsReceived(VisualVoicemailTask, VisualVoicemailSms)} will be
+ * called when a SMS matching the settings is received. The caller should have
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} and implement a
+ * VisualVoicemailService.
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
+ *
+ * @param settings The settings for the filter, or {@code null} to disable the filter.
+ */
+ public void setVisualVoicemailSmsFilterSettings(VisualVoicemailSmsFilterSettings settings) {
+ if (settings == null) {
+ disableVisualVoicemailSmsFilter(mSubId);
+ } else {
+ enableVisualVoicemailSmsFilter(mSubId, settings);
+ }
+ }
+
+ /**
+ * Send a visual voicemail SMS. The caller must be the current default dialer.
+ * A {@link VisualVoicemailService} uses this method to send a command via SMS to the carrier's
+ * visual voicemail server. Some examples for carriers using the OMTP standard include
+ * activating and deactivating visual voicemail, or requesting the current visual voicemail
+ * provisioning status. See the OMTP Visual Voicemail specification for more information on the
+ * format of these SMS messages.
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#SEND_SMS SEND_SMS}
+ *
+ * @param number The destination number.
+ * @param port The destination port for data SMS, or 0 for text SMS.
+ * @param text The message content. For data sms, it will be encoded as a UTF-8 byte stream.
+ * @param sentIntent The sent intent passed to the {@link SmsManager}
+ *
+ * @throws SecurityException if the caller is not the current default dialer
+ *
+ * @see SmsManager#sendDataMessage(String, String, short, byte[], PendingIntent, PendingIntent)
+ * @see SmsManager#sendTextMessage(String, String, String, PendingIntent, PendingIntent)
+ */
+ public void sendVisualVoicemailSms(String number, int port, String text,
+ PendingIntent sentIntent) {
+ sendVisualVoicemailSmsForSubscriber(mSubId, number, port, text, sentIntent);
+ }
+
+ /**
* Enables the visual voicemail SMS filter for a phone account. When the filter is
* enabled, Incoming SMS messages matching the OMTP VVM SMS interface will be redirected to the
* visual voicemail client with
@@ -2871,9 +2888,6 @@
/**
* Send a visual voicemail SMS. The IPC caller must be the current default dialer.
*
- * <p>Requires Permission:
- * {@link android.Manifest.permission#SEND_SMS SEND_SMS}
- *
* @param phoneAccountHandle The account to send the SMS with.
* @param number The destination number.
* @param port The destination port for data SMS, or 0 for text SMS.
@@ -2885,6 +2899,7 @@
*
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.SEND_SMS)
public void sendVisualVoicemailSmsForSubscriber(int subId, String number, int port,
String text, PendingIntent sentIntent) {
try {
@@ -2989,9 +3004,6 @@
/**
* Returns the voice activation state for the given subscriber.
*
- * <p>Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE}
- *
* @param subId The subscription id.
*
* @return voiceActivationState for the given subscriber
@@ -3001,6 +3013,7 @@
* @see #SIM_ACTIVATION_STATE_DEACTIVATED
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public int getVoiceActivationState(int subId) {
try {
ITelephony telephony = getITelephony();
@@ -3015,9 +3028,6 @@
/**
* Returns the data activation state for the given subscriber.
*
- * <p>Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE}
- *
* @param subId The subscription id.
*
* @return dataActivationState for the given subscriber
@@ -3028,6 +3038,7 @@
* @see #SIM_ACTIVATION_STATE_RESTRICTED
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public int getDataActivationState(int subId) {
try {
ITelephony telephony = getITelephony();
@@ -3042,23 +3053,19 @@
/**
* Returns the voice mail count. Return 0 if unavailable, -1 if there are unread voice messages
* but the count is unknown.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public int getVoiceMessageCount() {
return getVoiceMessageCount(getSubId());
}
/**
* Returns the voice mail count for a subscription. Return 0 if unavailable.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @param subId whose voice message count is returned
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public int getVoiceMessageCount(int subId) {
try {
ITelephony telephony = getITelephony();
@@ -3076,10 +3083,8 @@
/**
* Retrieves the alphabetic identifier associated with the voice
* mail number.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getVoiceMailAlphaTag() {
return getVoiceMailAlphaTag(getSubId());
}
@@ -3087,13 +3092,11 @@
/**
* Retrieves the alphabetic identifier associated with the voice
* mail number for a subscription.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @param subId whose alphabetic identifier associated with the
* voice mail number is returned
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getVoiceMailAlphaTag(int subId) {
try {
IPhoneSubInfo info = getSubscriberInfo();
@@ -3404,23 +3407,18 @@
/**
* Returns the CDMA ERI icon index to display
- *
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public int getCdmaEriIconIndex() {
return getCdmaEriIconIndex(getSubId());
}
/**
* Returns the CDMA ERI icon index to display for a subscription
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public int getCdmaEriIconIndex(int subId) {
try {
ITelephony telephony = getITelephony();
@@ -3440,11 +3438,9 @@
* 0 - ON
* 1 - FLASHING
*
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public int getCdmaEriIconMode() {
return getCdmaEriIconMode(getSubId());
}
@@ -3454,11 +3450,9 @@
* 0 - ON
* 1 - FLASHING
*
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public int getCdmaEriIconMode(int subId) {
try {
ITelephony telephony = getITelephony();
@@ -3476,11 +3470,9 @@
/**
* Returns the CDMA ERI text,
*
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getCdmaEriText() {
return getCdmaEriText(getSubId());
}
@@ -3488,11 +3480,9 @@
/**
* Returns the CDMA ERI text, of a subscription
*
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String getCdmaEriText(int subId) {
try {
ITelephony telephony = getITelephony();
@@ -3575,13 +3565,10 @@
* android.telephony.TelephonyManager#getCellLocation getCellLocation()}
* instead.
*
- * <p>Requires permission:
- * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}
- *
* @return List of {@link android.telephony.CellInfo}; null if cell
* information is unavailable.
- *
*/
+ @RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION)
public List<CellInfo> getAllCellInfo() {
try {
ITelephony telephony = getITelephony();
@@ -4435,11 +4422,9 @@
* Returns an array of Forbidden PLMNs from the USIM App
* Returns null if the query fails.
*
- *
- * <p>Requires that the caller has READ_PHONE_STATE
- *
* @return an array of forbidden PLMNs or null if not available
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String[] getForbiddenPlmns() {
return getForbiddenPlmns(getSubId(), APPTYPE_USIM);
}
@@ -4448,14 +4433,12 @@
* Returns an array of Forbidden PLMNs from the specified SIM App
* Returns null if the query fails.
*
- *
- * <p>Requires that the calling app has READ_PHONE_STATE
- *
* @param subId subscription ID used for authentication
* @param appType the icc application type, like {@link #APPTYPE_USIM}
* @return fplmns an array of forbidden PLMNs
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public String[] getForbiddenPlmns(int subId, int appType) {
try {
ITelephony telephony = getITelephony();
@@ -6143,10 +6126,8 @@
/**
* Returns the current {@link ServiceState} information.
- *
- * <p>Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public ServiceState getServiceState() {
return getServiceStateForSubscriber(getSubId());
}
diff --git a/telephony/java/android/telephony/VisualVoicemailService.java b/telephony/java/android/telephony/VisualVoicemailService.java
index e211f76..fe30eb7 100644
--- a/telephony/java/android/telephony/VisualVoicemailService.java
+++ b/telephony/java/android/telephony/VisualVoicemailService.java
@@ -18,6 +18,7 @@
import android.annotation.MainThread;
import android.annotation.SdkConstant;
+import android.annotation.SystemApi;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
@@ -199,7 +200,8 @@
/**
* Called when a SMS matching the {@link VisualVoicemailSmsFilterSettings} set by
- * {@link #setSmsFilterSettings(Context, PhoneAccountHandle, VisualVoicemailSmsFilterSettings)}
+ * {@link TelephonyManager#setVisualVoicemailSmsFilterSettings(VisualVoicemailSmsFilterSettings)
+ * }
* is received.
*
* @param task The task representing this event. {@link VisualVoicemailTask#finish()} must be
@@ -240,8 +242,11 @@
*
* @param phoneAccountHandle The account to apply the settings to.
* @param settings The settings for the filter, or {@code null} to disable the filter.
+ *
+ * @hide
*/
- public final static void setSmsFilterSettings(Context context,
+ @SystemApi
+ public static final void setSmsFilterSettings(Context context,
PhoneAccountHandle phoneAccountHandle,
VisualVoicemailSmsFilterSettings settings) {
TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
@@ -269,8 +274,11 @@
*
* @see SmsManager#sendDataMessage(String, String, short, byte[], PendingIntent, PendingIntent)
* @see SmsManager#sendTextMessage(String, String, String, PendingIntent, PendingIntent)
+ *
+ * @hide
*/
- public final static void sendVisualVoicemailSms(Context context,
+ @SystemApi
+ public static final void sendVisualVoicemailSms(Context context,
PhoneAccountHandle phoneAccountHandle, String number,
short port, String text, PendingIntent sentIntent) {
TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
diff --git a/telephony/java/android/telephony/VisualVoicemailSmsFilterSettings.java b/telephony/java/android/telephony/VisualVoicemailSmsFilterSettings.java
index 56a8c62..8ed96a3 100644
--- a/telephony/java/android/telephony/VisualVoicemailSmsFilterSettings.java
+++ b/telephony/java/android/telephony/VisualVoicemailSmsFilterSettings.java
@@ -38,7 +38,7 @@
* <p>Use {@link android.telephony.VisualVoicemailSmsFilterSettings.Builder} to construct this
* class.
*
- * @see VisualVoicemailService#setSmsFilterSettings(Context, PhoneAccountHandle, VisualVoicemailSmsFilterSettings)
+ * @see TelephonyManager#setVisualVoicemailSmsFilterSettings(VisualVoicemailSmsFilterSettings)
*/
public final class VisualVoicemailSmsFilterSettings implements Parcelable {
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index dd08f67..da333ae 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -498,6 +498,8 @@
*/
boolean isConcurrentVoiceAndDataAllowed(int subId);
+ Bundle getVisualVoicemailSettings(String callingPackage, int subId);
+
String getVisualVoicemailPackageName(String callingPackage, int subId);
// Not oneway, caller needs to make sure the vaule is set before receiving a SMS
diff --git a/telephony/java/com/android/internal/telephony/TelephonyIntents.java b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
index f9875c5..1f32766 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyIntents.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
@@ -17,6 +17,7 @@
package com.android.internal.telephony;
import android.content.Intent;
+import android.telephony.SubscriptionManager;
/**
* The intents that the telephony services broadcast.
@@ -335,11 +336,11 @@
* <ul>
* <li><em>subscription</em> - A int, the current default subscription.</li>
* </ul>
- * @deprecated Use {@link Intent#ACTION_DEFAULT_SUBSCRIPTION_CHANGED}
+ * @deprecated Use {@link SubscriptionManager#ACTION_DEFAULT_SUBSCRIPTION_CHANGED}
*/
@Deprecated
public static final String ACTION_DEFAULT_SUBSCRIPTION_CHANGED
- = Intent.ACTION_DEFAULT_SUBSCRIPTION_CHANGED;
+ = SubscriptionManager.ACTION_DEFAULT_SUBSCRIPTION_CHANGED;
/**
* Broadcast Action: The default data subscription has changed. This has the following
@@ -367,11 +368,11 @@
* <ul>
* <li><em>subscription</em> - A int, the current sms default subscription.</li>
* </ul>
- * @deprecated Use {@link Intent#ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED}
+ * @deprecated Use {@link SubscriptionManager#ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED}
*/
@Deprecated
public static final String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED
- = Intent.ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED;
+ = SubscriptionManager.ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED;
/*
* Broadcast Action: An attempt to set phone radio type and access technology has changed.
@@ -402,7 +403,7 @@
* <ul>
* <li>apnType</li><dd>A string with the apn type.</dd>
* <li>redirectionUrl</li><dd>redirection url string</dd>
- * <li>subId</dt><li>Sub Id which associated the data connection failure.</dd>
+ * <li>subId</li><dd>Sub Id which associated the data connection failure.</dd>
* </ul>
* <p class="note">This is a protected intent that can only be sent by the system.</p>
*/
@@ -415,7 +416,7 @@
* <ul>
* <li>apnType</li><dd>A string with the apn type.</dd>
* <li>errorCode</li><dd>A integer with dataFailCause.</dd>
- * <li>subId</dt><li>Sub Id which associated the data connection failure.</dd>
+ * <li>subId</li><dd>Sub Id which associated the data connection failure.</dd>
* </ul>
* <p class="note">This is a protected intent that can only be sent by the system. </p>
*/
@@ -432,13 +433,25 @@
* IPV4V6)</dd>
* <li>pcoId</li><dd>An integer indicating the pco id for the data.</dd>
* <li>pcoValue</li><dd>A byte array of pco data read from modem.</dd>
- * <li>subId</dt><li>Sub Id which associated the data connection.</dd>
+ * <li>subId</li><dd>Sub Id which associated the data connection.</dd>
* </ul>
* <p class="note">This is a protected intent that can only be sent by the system. </p>
*/
public static final String ACTION_CARRIER_SIGNAL_PCO_VALUE =
"com.android.internal.telephony.CARRIER_SIGNAL_PCO_VALUE";
+ /**
+ * <p>Broadcast Action: when framework reset all carrier actions on sim load or absent.
+ * intended for carrier apps clean up (clear UI e.g.) and only sent to the specified carrier app
+ * The intent will have the following extra values:</p>
+ * <ul>
+ * <li>subId</li><dd>Sub Id which associated the data connection failure.</dd>
+ * </ul>
+ * <p class="note">This is a protected intent that can only be sent by the system.</p>
+ */
+ public static final String ACTION_CARRIER_SIGNAL_RESET =
+ "com.android.internal.telephony.CARRIER_SIGNAL_RESET";
+
// CARRIER_SIGNAL_ACTION extra keys
public static final String EXTRA_REDIRECTION_URL_KEY = "redirectionUrl";
public static final String EXTRA_ERROR_CODE_KEY = "errorCode";
diff --git a/tests/FeatureSplit/feature1/AndroidManifest.xml b/tests/FeatureSplit/feature1/AndroidManifest.xml
index 42619b6..b87361f 100644
--- a/tests/FeatureSplit/feature1/AndroidManifest.xml
+++ b/tests/FeatureSplit/feature1/AndroidManifest.xml
@@ -16,7 +16,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.test.split.feature"
- featureName="feature1">
+ featureSplit="feature1">
<uses-sdk android:minSdkVersion="21" />
diff --git a/tests/FeatureSplit/feature1/res/layout/included.xml b/tests/FeatureSplit/feature1/res/layout/included.xml
new file mode 100644
index 0000000..c64bdb7
--- /dev/null
+++ b/tests/FeatureSplit/feature1/res/layout/included.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
diff --git a/tests/FeatureSplit/feature1/res/layout/main.xml b/tests/FeatureSplit/feature1/res/layout/main.xml
new file mode 100644
index 0000000..dbea42a
--- /dev/null
+++ b/tests/FeatureSplit/feature1/res/layout/main.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <include layout="@layout/included"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+</FrameLayout>
diff --git a/tests/FeatureSplit/feature1/src/com/android/test/split/feature/one/One.java b/tests/FeatureSplit/feature1/src/com/android/test/split/feature/one/One.java
index def1339..61ac9df 100644
--- a/tests/FeatureSplit/feature1/src/com/android/test/split/feature/one/One.java
+++ b/tests/FeatureSplit/feature1/src/com/android/test/split/feature/one/One.java
@@ -15,17 +15,16 @@
*/
package com.android.test.split.feature.one;
-import com.android.test.split.feature.ActivityMain;
-
+import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;
-public class One extends ActivityMain {
+public class One extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- ((TextView) findViewById(com.android.test.split.feature.R.id.text))
- .setText(R.string.feature_string);
+ setContentView(R.layout.main);
+ ((TextView) findViewById(R.id.text)).setText(R.string.feature_string);
}
}
diff --git a/tests/FeatureSplit/feature2/AndroidManifest.xml b/tests/FeatureSplit/feature2/AndroidManifest.xml
index b50044a..abd0b5e 100644
--- a/tests/FeatureSplit/feature2/AndroidManifest.xml
+++ b/tests/FeatureSplit/feature2/AndroidManifest.xml
@@ -16,7 +16,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.test.split.feature"
- featureName="feature2">
+ featureSplit="feature2">
<uses-sdk android:minSdkVersion="21" />
diff --git a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
index c49be88..93677e3 100644
--- a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
+++ b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java
@@ -124,7 +124,6 @@
Notification n = new Notification.Builder(NotificationTestList.this,
"phone call")
.setSmallIcon(R.drawable.icon2)
- .setChannel(phoneCall.getId())
.setFullScreenIntent(makeIntent2(), true)
.build();
mNM.notify(7001, n);
@@ -366,7 +365,7 @@
Notification n = new Notification.Builder(NotificationTestList.this, "default")
.setSmallIcon(R.drawable.icon2)
.setContentTitle("timeout in a minute")
- .setTimeout(System.currentTimeMillis() + (1000 * 60))
+ .setTimeoutAfter(System.currentTimeMillis() + (1000 * 60))
.build();
mNM.notify("timeout_min", 7013, n);
}
@@ -378,7 +377,7 @@
.setSmallIcon(R.drawable.icon2)
.setContentTitle("RED IS BEST")
.setContentText("or is blue?")
- .setTimeout(System.currentTimeMillis() + (1000 * 60))
+ .setTimeoutAfter(System.currentTimeMillis() + (1000 * 60))
.setColor(Color.RED)
.setFlag(Notification.FLAG_ONGOING_EVENT, true)
.setColorized(true)
diff --git a/tests/net/java/com/android/server/connectivity/TetheringTest.java b/tests/net/java/com/android/server/connectivity/TetheringTest.java
index 47630e2..7a1c239 100644
--- a/tests/net/java/com/android/server/connectivity/TetheringTest.java
+++ b/tests/net/java/com/android/server/connectivity/TetheringTest.java
@@ -223,8 +223,6 @@
@Test
public void workingLocalOnlyHotspot() throws Exception {
when(mConnectivityManager.isTetheringSupported()).thenReturn(true);
- when(mWifiManager.setWifiApEnabled(any(WifiConfiguration.class), anyBoolean()))
- .thenReturn(true);
// Emulate externally-visible WifiManager effects, causing the
// per-interface state machine to start up, and telling us that
@@ -238,6 +236,9 @@
verify(mNMService, times(1)).setIpForwardingEnabled(true);
verify(mNMService, times(1)).startTethering(any(String[].class));
verifyNoMoreInteractions(mNMService);
+ verify(mWifiManager).updateInterfaceIpState(
+ mTestIfname, WifiManager.IFACE_IP_MODE_LOCAL_ONLY);
+ verifyNoMoreInteractions(mWifiManager);
verifyTetheringBroadcast(mTestIfname, ConnectivityManager.EXTRA_ACTIVE_LOCAL_ONLY);
// UpstreamNetworkMonitor will be started, and will register two callbacks:
// a "listen all" and a "track default".
@@ -263,6 +264,7 @@
verify(mNMService, times(1)).stopTethering();
verify(mNMService, times(1)).setIpForwardingEnabled(false);
verifyNoMoreInteractions(mNMService);
+ verifyNoMoreInteractions(mWifiManager);
// Asking for the last error after the per-interface state machine
// has been reaped yields an unknown interface error.
assertEquals(ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE,
@@ -272,13 +274,12 @@
@Test
public void workingWifiTethering() throws Exception {
when(mConnectivityManager.isTetheringSupported()).thenReturn(true);
- when(mWifiManager.setWifiApEnabled(any(WifiConfiguration.class), anyBoolean()))
- .thenReturn(true);
+ when(mWifiManager.startSoftAp(any(WifiConfiguration.class))).thenReturn(true);
// Emulate pressing the WiFi tethering button.
mTethering.startTethering(ConnectivityManager.TETHERING_WIFI, null, false);
mLooper.dispatchAll();
- verify(mWifiManager, times(1)).setWifiApEnabled(null, true);
+ verify(mWifiManager, times(1)).startSoftAp(null);
verifyNoMoreInteractions(mWifiManager);
verifyNoMoreInteractions(mConnectivityManager);
verifyNoMoreInteractions(mNMService);
@@ -295,6 +296,9 @@
verify(mNMService, times(1)).setIpForwardingEnabled(true);
verify(mNMService, times(1)).startTethering(any(String[].class));
verifyNoMoreInteractions(mNMService);
+ verify(mWifiManager).updateInterfaceIpState(
+ mTestIfname, WifiManager.IFACE_IP_MODE_TETHERED);
+ verifyNoMoreInteractions(mWifiManager);
verifyTetheringBroadcast(mTestIfname, ConnectivityManager.EXTRA_ACTIVE_TETHER);
// UpstreamNetworkMonitor will be started, and will register two callbacks:
// a "listen all" and a "track default".
@@ -322,7 +326,7 @@
// Emulate pressing the WiFi tethering button.
mTethering.stopTethering(ConnectivityManager.TETHERING_WIFI);
mLooper.dispatchAll();
- verify(mWifiManager, times(1)).setWifiApEnabled(null, false);
+ verify(mWifiManager, times(1)).stopSoftAp();
verifyNoMoreInteractions(mWifiManager);
verifyNoMoreInteractions(mConnectivityManager);
verifyNoMoreInteractions(mNMService);
@@ -341,6 +345,7 @@
verify(mNMService, times(1)).stopTethering();
verify(mNMService, times(1)).setIpForwardingEnabled(false);
verifyNoMoreInteractions(mNMService);
+ verifyNoMoreInteractions(mWifiManager);
// Asking for the last error after the per-interface state machine
// has been reaped yields an unknown interface error.
assertEquals(ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE,
diff --git a/tests/testables/src/android/testing/AndroidTestingRunner.java b/tests/testables/src/android/testing/AndroidTestingRunner.java
index 816ed03..a425f70 100644
--- a/tests/testables/src/android/testing/AndroidTestingRunner.java
+++ b/tests/testables/src/android/testing/AndroidTestingRunner.java
@@ -18,7 +18,7 @@
import android.support.test.internal.runner.junit4.statement.RunBefores;
import android.support.test.internal.runner.junit4.statement.UiThreadStatement;
-import android.testing.TestableLooper.LooperStatement;
+import android.testing.TestableLooper.LooperFrameworkMethod;
import android.testing.TestableLooper.RunWithLooper;
import org.junit.After;
@@ -30,6 +30,7 @@
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.Statement;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -49,28 +50,21 @@
@Override
protected Statement methodInvoker(FrameworkMethod method, Object test) {
- return shouldRunOnUiThread(method) ? new UiThreadStatement(
- methodInvokerInt(method, test), true) : methodInvokerInt(method, test);
- }
-
- protected Statement methodInvokerInt(FrameworkMethod method, Object test) {
- RunWithLooper annotation = method.getAnnotation(RunWithLooper.class);
- if (annotation == null) annotation = mKlass.getAnnotation(RunWithLooper.class);
- if (annotation != null) {
- return new LooperStatement(super.methodInvoker(method, test),
- annotation.setAsMainLooper(), test);
- }
- return super.methodInvoker(method, test);
+ method = looperWrap(method, test, method);
+ final Statement statement = super.methodInvoker(method, test);
+ return shouldRunOnUiThread(method) ? new UiThreadStatement(statement, true) : statement;
}
protected Statement withBefores(FrameworkMethod method, Object target, Statement statement) {
- List befores = this.getTestClass().getAnnotatedMethods(Before.class);
+ List befores = looperWrap(method, target,
+ this.getTestClass().getAnnotatedMethods(Before.class));
return befores.isEmpty() ? statement : new RunBefores(method, statement,
befores, target);
}
protected Statement withAfters(FrameworkMethod method, Object target, Statement statement) {
- List afters = this.getTestClass().getAnnotatedMethods(After.class);
+ List afters = looperWrap(method, target,
+ this.getTestClass().getAnnotatedMethods(After.class));
return afters.isEmpty() ? statement : new RunAfters(method, statement, afters,
target);
}
@@ -88,6 +82,30 @@
return annotation == null ? 0L : annotation.timeout();
}
+ protected List<FrameworkMethod> looperWrap(FrameworkMethod method, Object test,
+ List<FrameworkMethod> methods) {
+ RunWithLooper annotation = method.getAnnotation(RunWithLooper.class);
+ if (annotation == null) annotation = mKlass.getAnnotation(RunWithLooper.class);
+ if (annotation != null) {
+ methods = new ArrayList<>(methods);
+ for (int i = 0; i < methods.size(); i++) {
+ methods.set(i, LooperFrameworkMethod.get(methods.get(i),
+ annotation.setAsMainLooper(), test));
+ }
+ }
+ return methods;
+ }
+
+ protected FrameworkMethod looperWrap(FrameworkMethod method, Object test,
+ FrameworkMethod base) {
+ RunWithLooper annotation = method.getAnnotation(RunWithLooper.class);
+ if (annotation == null) annotation = mKlass.getAnnotation(RunWithLooper.class);
+ if (annotation != null) {
+ return LooperFrameworkMethod.get(base, annotation.setAsMainLooper(), test);
+ }
+ return base;
+ }
+
public boolean shouldRunOnUiThread(FrameworkMethod method) {
if (mKlass.getAnnotation(UiThreadTest.class) != null) {
return true;
diff --git a/tests/testables/src/android/testing/BaseFragmentTest.java b/tests/testables/src/android/testing/BaseFragmentTest.java
index b09bcde..32ee091 100644
--- a/tests/testables/src/android/testing/BaseFragmentTest.java
+++ b/tests/testables/src/android/testing/BaseFragmentTest.java
@@ -161,12 +161,12 @@
protected void attachFragmentToWindow() {
ViewUtils.attachView(mView);
- TestableLooper.get(this).processMessages(1);
+ TestableLooper.get(this).processAllMessages();
}
protected void detachFragmentToWindow() {
ViewUtils.detachView(mView);
- TestableLooper.get(this).processMessages(1);
+ TestableLooper.get(this).processAllMessages();
}
protected void destroyFragments() {
diff --git a/tests/testables/src/android/testing/TestableContext.java b/tests/testables/src/android/testing/TestableContext.java
index cb5d4cb..630a287 100644
--- a/tests/testables/src/android/testing/TestableContext.java
+++ b/tests/testables/src/android/testing/TestableContext.java
@@ -43,7 +43,7 @@
* <ul>
* <li>System services can be mocked out with {@link #addMockSystemService}</li>
* <li>Service binding can be mocked out with {@link #addMockService}</li>
- * <li>Settings support {@link TestableSettings}</li>
+ * <li>Settings support {@link TestableSettingsProvider}</li>
* <li>Has support for {@link LeakCheck} for services and receivers</li>
* </ul>
*
@@ -59,7 +59,7 @@
public class TestableContext extends ContextWrapper implements TestRule {
private final TestableContentResolver mTestableContentResolver;
- private final TestableSettings mSettingsProvider;
+ private final TestableSettingsProvider mSettingsProvider;
private ArrayMap<String, Object> mMockSystemServices;
private ArrayMap<ComponentName, IBinder> mMockServices;
@@ -79,9 +79,8 @@
mTestableContentResolver = new TestableContentResolver(base);
ContentProviderClient settings = base.getContentResolver()
.acquireContentProviderClient(Settings.AUTHORITY);
- mSettingsProvider = TestableSettings.getFakeSettingsProvider(settings,
- mTestableContentResolver);
- mTestableContentResolver.addProvider(Settings.AUTHORITY, mSettingsProvider.getProvider());
+ mSettingsProvider = TestableSettingsProvider.getFakeSettingsProvider(settings);
+ mTestableContentResolver.addProvider(Settings.AUTHORITY, mSettingsProvider);
mReceiver = check != null ? check.getTracker("receiver") : null;
mService = check != null ? check.getTracker("service") : null;
mComponent = check != null ? check.getTracker("component") : null;
@@ -129,7 +128,7 @@
return super.getSystemService(name);
}
- public TestableSettings getSettingsProvider() {
+ TestableSettingsProvider getSettingsProvider() {
return mSettingsProvider;
}
@@ -236,12 +235,12 @@
return new TestWatcher() {
@Override
protected void succeeded(Description description) {
- mSettingsProvider.clearOverrides();
+ mSettingsProvider.clearValuesAndCheck(TestableContext.this);
}
@Override
protected void failed(Throwable e, Description description) {
- mSettingsProvider.clearOverrides();
+ mSettingsProvider.clearValuesAndCheck(TestableContext.this);
}
}.apply(base, description);
}
diff --git a/tests/testables/src/android/testing/TestableLooper.java b/tests/testables/src/android/testing/TestableLooper.java
index 8a33cf9..9eddc51 100644
--- a/tests/testables/src/android/testing/TestableLooper.java
+++ b/tests/testables/src/android/testing/TestableLooper.java
@@ -15,20 +15,21 @@
package android.testing;
import android.os.Handler;
+import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.os.MessageQueue;
+import android.os.TestLooperManager;
+import android.support.test.InstrumentationRegistry;
import android.util.ArrayMap;
-import org.junit.runners.model.Statement;
+import org.junit.runners.model.FrameworkMethod;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
-import java.lang.reflect.Method;
import java.util.Map;
/**
@@ -38,65 +39,35 @@
*/
public class TestableLooper {
- private final Method mNext;
- private final Method mRecycleUnchecked;
-
private Looper mLooper;
private MessageQueue mQueue;
private boolean mMain;
private Object mOriginalMain;
private MessageHandler mMessageHandler;
- private int mParsedCount;
private Handler mHandler;
- private Message mEmptyMessage;
+ private Runnable mEmptyMessage;
+ private TestLooperManager mQueueWrapper;
- public TestableLooper() throws Exception {
- this(true);
+ public TestableLooper(Looper l) throws Exception {
+ this(InstrumentationRegistry.getInstrumentation().acquireLooperManager(l), l);
}
- public TestableLooper(boolean setMyLooper) throws Exception {
- setupQueue(setMyLooper);
- mNext = mQueue.getClass().getDeclaredMethod("next");
- mNext.setAccessible(true);
- mRecycleUnchecked = Message.class.getDeclaredMethod("recycleUnchecked");
- mRecycleUnchecked.setAccessible(true);
+ private TestableLooper(TestLooperManager wrapper, Looper l) throws Exception {
+ mQueueWrapper = wrapper;
+ setupQueue(l);
+ }
+
+ private TestableLooper(Looper looper, boolean b) throws Exception {
+ setupQueue(looper);
}
public Looper getLooper() {
return mLooper;
}
- private void clearLooper() throws NoSuchFieldException, IllegalAccessException {
- Field field = Looper.class.getDeclaredField("sThreadLocal");
- field.setAccessible(true);
- ThreadLocal<Looper> sThreadLocal = (ThreadLocal<Looper>) field.get(null);
- sThreadLocal.set(null);
- }
-
- private boolean setForCurrentThread() throws NoSuchFieldException, IllegalAccessException {
- if (Looper.myLooper() != mLooper) {
- Field field = Looper.class.getDeclaredField("sThreadLocal");
- field.setAccessible(true);
- ThreadLocal<Looper> sThreadLocal = (ThreadLocal<Looper>) field.get(null);
- sThreadLocal.set(mLooper);
- return true;
- }
- return false;
- }
-
- private void setupQueue(boolean setMyLooper) throws Exception {
- if (setMyLooper) {
- clearLooper();
- Looper.prepare();
- mLooper = Looper.myLooper();
- } else {
- Constructor<Looper> constructor = Looper.class.getDeclaredConstructor(
- boolean.class);
- constructor.setAccessible(true);
- mLooper = constructor.newInstance(true);
- }
-
+ private void setupQueue(Looper l) throws Exception {
+ mLooper = l;
mQueue = mLooper.getQueue();
mHandler = new Handler(mLooper);
}
@@ -121,9 +92,7 @@
* tests.
*/
public void destroy() throws NoSuchFieldException, IllegalAccessException {
- if (Looper.myLooper() == mLooper) {
- clearLooper();
- }
+ mQueueWrapper.release();
if (mMain && mOriginalMain != null) {
Field field = mLooper.getClass().getDeclaredField("sMainLooper");
field.setAccessible(true);
@@ -156,34 +125,35 @@
private int processQueuedMessages() {
int count = 0;
- mEmptyMessage = mHandler.obtainMessage(1);
- mHandler.sendMessageDelayed(mEmptyMessage, 1);
+ mEmptyMessage = () -> { };
+ mHandler.post(mEmptyMessage);
+ waitForMessage(mQueueWrapper, mHandler, mEmptyMessage);
while (parseMessageInt()) count++;
return count;
}
private boolean parseMessageInt() {
try {
- Message result = (Message) mNext.invoke(mQueue);
+ Message result = mQueueWrapper.next();
if (result != null) {
// This is a break message.
- if (result == mEmptyMessage) {
- mRecycleUnchecked.invoke(result);
+ if (result.getCallback() == mEmptyMessage) {
+ mQueueWrapper.recycle(result);
return false;
}
if (mMessageHandler != null) {
if (mMessageHandler.onMessageHandled(result)) {
result.getTarget().dispatchMessage(result);
- mRecycleUnchecked.invoke(result);
+ mQueueWrapper.recycle(result);
} else {
- mRecycleUnchecked.invoke(result);
+ mQueueWrapper.recycle(result);
// Message handler indicated it doesn't want us to continue.
return false;
}
} else {
result.getTarget().dispatchMessage(result);
- mRecycleUnchecked.invoke(result);
+ mQueueWrapper.recycle(result);
}
} else {
// No messages, don't continue parsing
@@ -199,10 +169,14 @@
* Runs an executable with myLooper set and processes all messages added.
*/
public void runWithLooper(RunnableWithException runnable) throws Exception {
- boolean set = setForCurrentThread();
- runnable.run();
+ new Handler(getLooper()).post(() -> {
+ try {
+ runnable.run();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ });
processAllMessages();
- if (set) clearLooper();
}
public interface RunnableWithException {
@@ -215,39 +189,132 @@
boolean setAsMainLooper() default false;
}
+ private static void waitForMessage(TestLooperManager queueWrapper, Handler handler,
+ Runnable execute) {
+ for (int i = 0; i < 10; i++) {
+ if (!queueWrapper.hasMessages(handler, null, execute)) {
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+ if (!queueWrapper.hasMessages(handler, null, execute)) {
+ throw new RuntimeException("Message didn't queue...");
+ }
+ }
+
private static final Map<Object, TestableLooper> sLoopers = new ArrayMap<>();
public static TestableLooper get(Object test) {
return sLoopers.get(test);
}
- public static class LooperStatement extends Statement {
- private final boolean mSetAsMain;
- private final Statement mBase;
- private final TestableLooper mLooper;
+ public static class LooperFrameworkMethod extends FrameworkMethod {
+ private HandlerThread mHandlerThread;
- public LooperStatement(Statement base, boolean setAsMain, Object test) {
- mBase = base;
+ private final TestableLooper mTestableLooper;
+ private final Looper mLooper;
+ private final Handler mHandler;
+
+ public LooperFrameworkMethod(FrameworkMethod base, boolean setAsMain, Object test) {
+ super(base.getMethod());
try {
- mLooper = new TestableLooper(false);
- sLoopers.put(test, mLooper);
- mSetAsMain = setAsMain;
+ mLooper = setAsMain ? Looper.getMainLooper() : createLooper();
+ mTestableLooper = new TestableLooper(mLooper, false);
} catch (Exception e) {
throw new RuntimeException(e);
}
+ sLoopers.put(test, mTestableLooper);
+ mHandler = new Handler(mLooper);
+ }
+
+ public LooperFrameworkMethod(TestableLooper other, FrameworkMethod base) {
+ super(base.getMethod());
+ mLooper = other.mLooper;
+ mTestableLooper = other;
+ mHandler = new Handler(mLooper);
+ }
+
+ public static FrameworkMethod get(FrameworkMethod base, boolean setAsMain, Object test) {
+ if (sLoopers.containsKey(test)) {
+ return new LooperFrameworkMethod(sLoopers.get(test), base);
+ }
+ return new LooperFrameworkMethod(base, setAsMain, test);
}
@Override
- public void evaluate() throws Throwable {
- mLooper.setForCurrentThread();
- if (mSetAsMain) {
- mLooper.setAsMainLooper();
+ public Object invokeExplosively(Object target, Object... params) throws Throwable {
+ if (Looper.myLooper() == mLooper) {
+ // Already on the right thread from another statement, just execute then.
+ return super.invokeExplosively(target, params);
+ }
+ boolean set = mTestableLooper.mQueueWrapper == null;
+ if (set) {
+ mTestableLooper.mQueueWrapper = InstrumentationRegistry.getInstrumentation()
+ .acquireLooperManager(mLooper);
+ }
+ try {
+ Object[] ret = new Object[1];
+ // Run the execution on the looper thread.
+ Runnable execute = () -> {
+ try {
+ ret[0] = super.invokeExplosively(target, params);
+ } catch (Throwable throwable) {
+ throw new LooperException(throwable);
+ }
+ };
+ Message m = Message.obtain(mHandler, execute);
+
+ // Dispatch our message.
+ try {
+ mTestableLooper.mQueueWrapper.execute(m);
+ } catch (LooperException e) {
+ throw e.getSource();
+ } catch (RuntimeException re) {
+ // If the TestLooperManager has to post, it will wrap what it throws in a
+ // RuntimeException, make sure we grab the actual source.
+ if (re.getCause() instanceof LooperException) {
+ throw ((LooperException) re.getCause()).getSource();
+ } else {
+ throw re.getCause();
+ }
+ } finally {
+ m.recycle();
+ }
+ return ret[0];
+ } finally {
+ if (set) {
+ mTestableLooper.mQueueWrapper.release();
+ mTestableLooper.mQueueWrapper = null;
+ }
+ }
+ }
+
+ private Looper createLooper() {
+ // TODO: Find way to share these.
+ mHandlerThread = new HandlerThread(TestableLooper.class.getSimpleName());
+ mHandlerThread.start();
+ return mHandlerThread.getLooper();
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ super.finalize();
+ if (mHandlerThread != null) {
+ mHandlerThread.quit();
+ }
+ }
+
+ private static class LooperException extends RuntimeException {
+ private final Throwable mSource;
+
+ public LooperException(Throwable t) {
+ mSource = t;
}
- try {
- mBase.evaluate();
- } finally {
- mLooper.destroy();
+ public Throwable getSource() {
+ return mSource;
}
}
}
diff --git a/tests/testables/src/android/testing/TestableSettings.java b/tests/testables/src/android/testing/TestableSettings.java
deleted file mode 100644
index d19f1ef..0000000
--- a/tests/testables/src/android/testing/TestableSettings.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package android.testing;
-
-import android.content.ContentProvider;
-import android.content.ContentProviderClient;
-import android.content.ContentResolver;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.provider.Settings;
-import android.support.annotation.VisibleForTesting;
-import android.test.mock.MockContentProvider;
-import android.testing.TestableSettings.SettingOverrider.Builder;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.Log;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Allows calls to android.provider.Settings to be tested easier. A SettingOverride
- * can be acquired and a set of specific settings can be set to a value (and not changed
- * in the system when set), so that they can be tested without breaking the test device.
- * <p>
- * To use, in the before method acquire the override add all settings that will affect if
- * your test passes or not.
- *
- * <pre class="prettyprint">
- * {@literal
- * mSettingOverride = mTestableContext.getSettingsProvider().acquireOverridesBuilder()
- * .addSetting("secure", Secure.USER_SETUP_COMPLETE, "0")
- * .build();
- * }
- * </pre>
- *
- * Then in the after free up the settings.
- *
- * <pre class="prettyprint">
- * {@literal
- * mSettingOverride.release();
- * }
- * </pre>
- */
-public class TestableSettings {
-
- private static final String TAG = "TestableSettings";
- private static final boolean DEBUG = false;
-
- // Number of times to try to acquire a setting if in use.
- private static final int MAX_TRIES = 10;
- // Time to wait for each setting. WAIT_TIMEOUT * MAX_TRIES will be the maximum wait time
- // for a setting.
- private static final long WAIT_TIMEOUT = 1000;
-
- private static TestableSettingsProvider sInstance;
-
- private final TestableSettingsProvider mProvider;
-
- private TestableSettings(TestableSettingsProvider provider) {
- mProvider = provider;
- }
-
- public Builder acquireOverridesBuilder() {
- return new Builder(this);
- }
-
- public void clearOverrides() {
- List<SettingOverrider> overrides = mProvider.mOwners.remove(this);
- if (overrides != null) {
- overrides.forEach(override -> override.ensureReleased());
- }
- }
-
- private void acquireSettings(SettingOverrider overridder, Set<String> keys)
- throws AcquireTimeoutException {
- mProvider.acquireSettings(overridder, keys, this);
- }
-
- ContentProvider getProvider() {
- return mProvider;
- }
-
- @VisibleForTesting
- Object getLock() {
- return mProvider.mOverrideMap;
- }
-
- public static class SettingOverrider {
- private final Set<String> mValidKeys;
- private final Map<String, String> mValueMap = new ArrayMap<>();
- private final TestableSettings mSettings;
- private boolean mReleased;
- public Throwable mObtain;
-
- private SettingOverrider(Set<String> keys, TestableSettings provider) {
- mValidKeys = new ArraySet<>(keys);
- mSettings = provider;
- }
-
- private void ensureReleased() {
- if (!mReleased) {
- release();
- }
- }
-
- public void release() {
- mSettings.mProvider.releaseSettings(mValidKeys);
- mReleased = true;
- }
-
- private void putDirect(String key, String value) {
- mValueMap.put(key, value);
- }
-
- public void put(String table, String key, String value) {
- if (!mValidKeys.contains(key(table, key))) {
- throw new IllegalArgumentException("Key " + table + " " + key
- + " not acquired for this overrider");
- }
- mValueMap.put(key(table, key), value);
- }
-
- public void remove(String table, String key) {
- if (!mValidKeys.contains(key(table, key))) {
- throw new IllegalArgumentException("Key " + table + " " + key
- + " not acquired for this overrider");
- }
- mValueMap.remove(key(table, key));
- }
-
- public String get(String table, String key) {
- if (!mValidKeys.contains(key(table, key))) {
- throw new IllegalArgumentException("Key " + table + " " + key
- + " not acquired for this overrider");
- }
- Log.d(TAG, "Get " + table + " " + key + " " + mValueMap.get(key(table, key)));
- return mValueMap.get(key(table, key));
- }
-
- public static class Builder {
- private final TestableSettings mProvider;
- private Set<String> mKeys = new ArraySet<>();
- private Map<String, String> mValues = new ArrayMap<>();
-
- private Builder(TestableSettings provider) {
- mProvider = provider;
- }
-
- public Builder addSetting(String table, String key) {
- mKeys.add(key(table, key));
- return this;
- }
-
- public Builder addSetting(String table, String key, String value) {
- addSetting(table, key);
- mValues.put(key(table, key), value);
- return this;
- }
-
- public SettingOverrider build() throws AcquireTimeoutException {
- SettingOverrider overrider = new SettingOverrider(mKeys, mProvider);
- mProvider.acquireSettings(overrider, mKeys);
- mValues.forEach((key, value) -> overrider.putDirect(key, value));
- return overrider;
- }
- }
- }
-
- private static class TestableSettingsProvider extends MockContentProvider {
-
- private final Map<String, SettingOverrider> mOverrideMap = new ArrayMap<>();
- private final Map<Object, List<SettingOverrider>> mOwners = new ArrayMap<>();
-
- private final ContentProviderClient mSettings;
- private final ContentResolver mResolver;
-
- public TestableSettingsProvider(ContentProviderClient settings, ContentResolver resolver) {
- mSettings = settings;
- mResolver = resolver;
- }
-
- private void releaseSettings(Set<String> keys) {
- synchronized (mOverrideMap) {
- for (String key : keys) {
- if (DEBUG) Log.d(TAG, "Releasing " + key);
- mOverrideMap.remove(key);
- }
- if (DEBUG) Log.d(TAG, "Notifying");
- mOverrideMap.notify();
- }
- }
-
- private boolean checkKeysLocked(Set<String> keys, boolean shouldThrow)
- throws AcquireTimeoutException {
- for (String key : keys) {
- if (mOverrideMap.containsKey(key)) {
- if (shouldThrow) {
- if (DEBUG) Log.e(TAG, "Lock obtained at",
- mOverrideMap.get(key).mObtain);
- throw new AcquireTimeoutException("Could not acquire " + key,
- mOverrideMap.get(key).mObtain);
- }
- return false;
- }
- }
- return true;
- }
-
- private void acquireSettings(SettingOverrider overridder, Set<String> keys,
- Object owner) throws AcquireTimeoutException {
- synchronized (mOwners) {
- List<SettingOverrider> list = mOwners.get(owner);
- if (list == null) {
- list = new ArrayList<>();
- mOwners.put(owner, list);
- }
- list.add(overridder);
- }
- synchronized (mOverrideMap) {
- for (int i = 0; i < MAX_TRIES; i++) {
- if (checkKeysLocked(keys, false)) break;
- try {
- if (DEBUG) Log.d(TAG, "Waiting for contention to finish");
- mOverrideMap.wait(WAIT_TIMEOUT);
- } catch (InterruptedException e) {
- }
- }
- overridder.mObtain = new Throwable();
- checkKeysLocked(keys, true);
- for (String key : keys) {
- if (DEBUG) Log.d(TAG, "Acquiring " + key);
- mOverrideMap.put(key, overridder);
- }
- }
- }
-
- public Bundle call(String method, String arg, Bundle extras) {
- // Methods are "GET_system", "GET_global", "PUT_secure", etc.
- final String[] commands = method.split("_", 2);
- final String op = commands[0];
- final String table = commands[1];
-
- synchronized (mOverrideMap) {
- SettingOverrider overrider = mOverrideMap.get(key(table, arg));
- if (overrider == null) {
- // Fall through to real settings.
- try {
- if (DEBUG) Log.d(TAG, "Falling through to real settings " + method);
- // TODO: Add our own version of caching to handle this.
- Bundle call = mSettings.call(method, arg, extras);
- call.remove(Settings.CALL_METHOD_TRACK_GENERATION_KEY);
- return call;
- } catch (RemoteException e) {
- throw new RuntimeException(e);
- }
- }
- String value;
- Bundle out = new Bundle();
- switch (op) {
- case "GET":
- value = overrider.get(table, arg);
- if (value != null) {
- out.putString(Settings.NameValueTable.VALUE, value);
- }
- break;
- case "PUT":
- value = extras.getString(Settings.NameValueTable.VALUE, null);
- if (value != null) {
- overrider.put(table, arg, value);
- } else {
- overrider.remove(table, arg);
- }
- break;
- default:
- throw new UnsupportedOperationException("Unknown command " + method);
- }
- return out;
- }
- }
- }
-
- public static class AcquireTimeoutException extends Exception {
- public AcquireTimeoutException(String str, Throwable cause) {
- super(str, cause);
- }
- }
-
- private static String key(String table, String key) {
- return table + "_" + key;
- }
-
- /**
- * Since the settings provider is cached inside android.provider.Settings, this must
- * be gotten statically to ensure there is only one instance referenced.
- */
- public static TestableSettings getFakeSettingsProvider(ContentProviderClient settings,
- ContentResolver resolver) {
- if (sInstance == null) {
- sInstance = new TestableSettingsProvider(settings, resolver);
- }
- return new TestableSettings(sInstance);
- }
-}
diff --git a/tests/testables/src/android/testing/TestableSettingsProvider.java b/tests/testables/src/android/testing/TestableSettingsProvider.java
new file mode 100644
index 0000000..13056cf
--- /dev/null
+++ b/tests/testables/src/android/testing/TestableSettingsProvider.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package android.testing;
+
+import android.content.ContentProviderClient;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.provider.Settings;
+import android.test.mock.MockContentProvider;
+import android.util.Log;
+
+import java.util.HashMap;
+
+import static org.junit.Assert.*;
+
+/**
+ * Allows calls to android.provider.Settings to be tested easier.
+ *
+ * This provides a simple copy-on-write implementation of settings that gets cleared
+ * at the end of each test.
+ */
+public class TestableSettingsProvider extends MockContentProvider {
+
+ private static final String TAG = "TestableSettingsProvider";
+ private static final boolean DEBUG = false;
+ private static final String MY_UNIQUE_KEY = "Key_" + TestableSettingsProvider.class.getName();
+ private static TestableSettingsProvider sInstance;
+
+ private final ContentProviderClient mSettings;
+
+ private final HashMap<String, String> mValues = new HashMap<>();
+
+ private TestableSettingsProvider(ContentProviderClient settings) {
+ mSettings = settings;
+ }
+
+ void clearValuesAndCheck(Context context) {
+ mValues.put(key("global", MY_UNIQUE_KEY), MY_UNIQUE_KEY);
+ mValues.put(key("secure", MY_UNIQUE_KEY), MY_UNIQUE_KEY);
+ mValues.put(key("system", MY_UNIQUE_KEY), MY_UNIQUE_KEY);
+
+ // Verify that if any test is using TestableContext, they all have the correct settings
+ // provider.
+ assertEquals("Incorrect settings provider, test using incorrect Context?", MY_UNIQUE_KEY,
+ Settings.Global.getString(context.getContentResolver(), MY_UNIQUE_KEY));
+ assertEquals("Incorrect settings provider, test using incorrect Context?", MY_UNIQUE_KEY,
+ Settings.Secure.getString(context.getContentResolver(), MY_UNIQUE_KEY));
+ assertEquals("Incorrect settings provider, test using incorrect Context?", MY_UNIQUE_KEY,
+ Settings.System.getString(context.getContentResolver(), MY_UNIQUE_KEY));
+
+ mValues.clear();
+ }
+
+ public Bundle call(String method, String arg, Bundle extras) {
+ // Methods are "GET_system", "GET_global", "PUT_secure", etc.
+ final String[] commands = method.split("_", 2);
+ final String op = commands[0];
+ final String table = commands[1];
+
+ String k = key(table, arg);
+ String value;
+ Bundle out = new Bundle();
+ switch (op) {
+ case "GET":
+ if (mValues.containsKey(k)) {
+ value = mValues.get(k);
+ if (value != null) {
+ out.putString(Settings.NameValueTable.VALUE, value);
+ }
+ } else {
+ // Fall through to real settings.
+ try {
+ if (DEBUG) Log.d(TAG, "Falling through to real settings " + method);
+ // TODO: Add our own version of caching to handle this.
+ Bundle call = mSettings.call(method, arg, extras);
+ call.remove(Settings.CALL_METHOD_TRACK_GENERATION_KEY);
+ return call;
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ break;
+ case "PUT":
+ value = extras.getString(Settings.NameValueTable.VALUE, null);
+ mValues.put(k, value);
+ break;
+ default:
+ throw new UnsupportedOperationException("Unknown command " + method);
+ }
+ return out;
+ }
+
+ private static String key(String table, String key) {
+ return table + "_" + key;
+ }
+
+ /**
+ * Since the settings provider is cached inside android.provider.Settings, this must
+ * be gotten statically to ensure there is only one instance referenced.
+ */
+ static TestableSettingsProvider getFakeSettingsProvider(ContentProviderClient settings) {
+ if (sInstance == null) {
+ sInstance = new TestableSettingsProvider(settings);
+ }
+ return sInstance;
+ }
+}
diff --git a/tests/testables/tests/src/android/testing/TestableLooperTest.java b/tests/testables/tests/src/android/testing/TestableLooperTest.java
index 18e5fff..12f1d0a 100644
--- a/tests/testables/tests/src/android/testing/TestableLooperTest.java
+++ b/tests/testables/tests/src/android/testing/TestableLooperTest.java
@@ -24,17 +24,16 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.testing.TestableLooper.MessageHandler;
import android.testing.TestableLooper.RunWithLooper;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
public class TestableLooperTest {
@@ -46,11 +45,6 @@
mTestableLooper = TestableLooper.get(this);
}
- @After
- public void tearDown() throws Exception {
- mTestableLooper.destroy();
- }
-
@Test
public void testMessageExecuted() throws Exception {
Handler h = new Handler();
@@ -133,39 +127,23 @@
@Test
public void testMainLooper() throws Exception {
assertNotEquals(Looper.myLooper(), Looper.getMainLooper());
-
- Looper originalMain = Looper.getMainLooper();
- mTestableLooper.setAsMainLooper();
- assertEquals(Looper.myLooper(), Looper.getMainLooper());
- Runnable r = mock(Runnable.class);
-
- new Handler(Looper.getMainLooper()).post(r);
- mTestableLooper.processAllMessages();
-
- verify(r).run();
- mTestableLooper.destroy();
-
- assertEquals(originalMain, Looper.getMainLooper());
- }
-
- @Test
- public void testNotMyLooper() throws Exception {
- TestableLooper looper = new TestableLooper(false);
-
- assertEquals(Looper.myLooper(), mTestableLooper.getLooper());
- assertNotEquals(Looper.myLooper(), looper.getLooper());
-
Runnable r = mock(Runnable.class);
Runnable r2 = mock(Runnable.class);
- new Handler().post(r);
- new Handler(looper.getLooper()).post(r2);
+ TestableLooper testableLooper = new TestableLooper(Looper.getMainLooper());
- looper.processAllMessages();
- verify(r2).run();
- verify(r, never()).run();
+ try {
+ testableLooper.setMessageHandler(m -> {
+ if (m.getCallback() == r) return true;
+ return false;
+ });
+ new Handler(Looper.getMainLooper()).post(r);
+ testableLooper.processAllMessages();
- mTestableLooper.processAllMessages();
- verify(r).run();
+ verify(r).run();
+ verify(r2, never()).run();
+ } finally {
+ testableLooper.destroy();
+ }
}
@Test
diff --git a/tests/testables/tests/src/android/testing/TestableSettingsProviderTest.java b/tests/testables/tests/src/android/testing/TestableSettingsProviderTest.java
new file mode 100644
index 0000000..1f71867
--- /dev/null
+++ b/tests/testables/tests/src/android/testing/TestableSettingsProviderTest.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package android.testing;
+
+import android.content.ContentResolver;
+import android.provider.Settings;
+import android.provider.Settings.Global;
+import android.provider.Settings.Secure;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+@RunWith(AndroidJUnit4.class)
+public class TestableSettingsProviderTest {
+
+ public static final String NONEXISTENT_SETTING = "nonexistent_setting";
+ private static final String TAG = "TestableSettingsProviderTest";
+ private ContentResolver mContentResolver;
+ @Rule
+ public final TestableContext mContext =
+ new TestableContext(InstrumentationRegistry.getContext());
+
+ @Before
+ public void setup() {
+ mContentResolver = mContext.getContentResolver();
+ Settings.Secure.putString(mContentResolver, NONEXISTENT_SETTING, null);
+ Settings.Global.putString(mContentResolver, NONEXISTENT_SETTING, "initial value");
+ Settings.Global.putString(mContentResolver, Global.DEVICE_PROVISIONED, null);
+ }
+
+ @Test
+ public void testInitialValueSecure() {
+ String value = Secure.getString(mContentResolver, NONEXISTENT_SETTING);
+ assertNull(value);
+ }
+
+ @Test
+ public void testInitialValueGlobal() {
+ String value = Global.getString(mContentResolver, NONEXISTENT_SETTING);
+ assertEquals("initial value", value);
+ }
+
+ @Test
+ public void testSeparateTables() {
+ Secure.putString(mContentResolver, NONEXISTENT_SETTING, "something");
+ Global.putString(mContentResolver, NONEXISTENT_SETTING, "else");
+ assertEquals("something", Secure.getString(mContentResolver, NONEXISTENT_SETTING));
+ assertEquals("else", Global.getString(mContentResolver, NONEXISTENT_SETTING));
+ }
+
+ @Test
+ public void testPassThrough() {
+ // Grab the value of a setting that is not overridden.
+ assertTrue(Secure.getInt(mContentResolver, Secure.USER_SETUP_COMPLETE, 0) != 0);
+ }
+
+ @Test
+ public void testOverrideExisting() {
+ // Grab the value of a setting that is overridden and will be different than the actual
+ // value.
+ assertNull(Global.getString(mContentResolver, Global.DEVICE_PROVISIONED));
+ }
+
+ @Test
+ public void testRelease() {
+ // Verify different value.
+ assertNull(Global.getString(mContentResolver, Global.DEVICE_PROVISIONED));
+ mContext.getSettingsProvider().clearValuesAndCheck(mContext);
+ // Verify actual value after release.
+ assertEquals("1", Global.getString(mContentResolver, Global.DEVICE_PROVISIONED));
+ }
+}
diff --git a/tests/testables/tests/src/android/testing/TestableSettingsTest.java b/tests/testables/tests/src/android/testing/TestableSettingsTest.java
deleted file mode 100644
index 1b01542..0000000
--- a/tests/testables/tests/src/android/testing/TestableSettingsTest.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package android.testing;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import android.content.ContentResolver;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.provider.Settings;
-import android.provider.Settings.Global;
-import android.provider.Settings.Secure;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-import android.testing.TestableSettings.AcquireTimeoutException;
-import android.testing.TestableSettings.SettingOverrider;
-import android.util.Log;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class TestableSettingsTest {
-
- public static final String NONEXISTENT_SETTING = "nonexistent_setting";
- private static final String TAG = "TestableSettingsTest";
- private SettingOverrider mOverrider;
- private ContentResolver mContentResolver;
- @Rule
- public final TestableContext mContext =
- new TestableContext(InstrumentationRegistry.getContext());
-
- @Before
- public void setup() throws AcquireTimeoutException {
- mOverrider = mContext.getSettingsProvider().acquireOverridesBuilder()
- .addSetting("secure", NONEXISTENT_SETTING)
- .addSetting("global", NONEXISTENT_SETTING, "initial value")
- .addSetting("global", Global.DEVICE_PROVISIONED)
- .build();
- mContentResolver = mContext.getContentResolver();
- }
-
- @Test
- public void testInitialValueSecure() {
- String value = Secure.getString(mContentResolver, NONEXISTENT_SETTING);
- assertNull(value);
- }
-
- @Test
- public void testInitialValueGlobal() {
- String value = Global.getString(mContentResolver, NONEXISTENT_SETTING);
- assertEquals("initial value", value);
- }
-
- @Test
- public void testSeparateTables() {
- Secure.putString(mContentResolver, NONEXISTENT_SETTING, "something");
- Global.putString(mContentResolver, NONEXISTENT_SETTING, "else");
- assertEquals("something", Secure.getString(mContentResolver, NONEXISTENT_SETTING));
- assertEquals("something", mOverrider.get("secure", NONEXISTENT_SETTING));
- assertEquals("else", Global.getString(mContentResolver, NONEXISTENT_SETTING));
- assertEquals("else", mOverrider.get("global", NONEXISTENT_SETTING));
- }
-
- @Test
- public void testPassThrough() {
- // Grab the value of a setting that is not overridden.
- assertTrue(Secure.getInt(mContentResolver, Secure.USER_SETUP_COMPLETE, 0) != 0);
- }
-
- @Test
- public void testOverrideExisting() {
- // Grab the value of a setting that is overridden and will be different than the actual
- // value.
- assertNull(Global.getString(mContentResolver, Global.DEVICE_PROVISIONED));
- }
-
- @Test
- public void testRelease() {
- // Verify different value.
- assertNull(Global.getString(mContentResolver, Global.DEVICE_PROVISIONED));
- mOverrider.release();
- mOverrider = null;
- // Verify actual value after release.
- assertEquals("1", Global.getString(mContentResolver, Global.DEVICE_PROVISIONED));
- }
-
- @Test
- public void testAutoRelease() throws Exception {
- mOverrider.release();
- mOverrider = null;
- mContext.getSettingsProvider().acquireOverridesBuilder()
- .addSetting("global", Global.DEVICE_PROVISIONED)
- .build();
- }
-
- @Test
- public void testContention() throws AcquireTimeoutException, InterruptedException {
- SettingOverrider[] overriders = new SettingOverrider[2];
- Object lock = new Object();
- String secure = "secure";
- String key = "something shared";
- String[] result = new String[1];
- overriders[0] = mContext.getSettingsProvider().acquireOverridesBuilder()
- .addSetting(secure, key, "Some craziness")
- .build();
- synchronized (lock) {
- HandlerThread t = runOnHandler(() -> {
- try {
- // Grab the lock that will be used for the settings ownership to ensure
- // we have some contention going on.
- synchronized (mContext.getSettingsProvider().getLock()) {
- synchronized (lock) {
- // Let the other thread know to release the settings, but it won't
- // be able to until this thread waits in the build() method.
- lock.notify();
- }
- overriders[1] = mContext.getSettingsProvider()
- .acquireOverridesBuilder()
- .addSetting(secure, key, "default value")
- .build();
- // Ensure that the default is the one we set, and not left over from
- // the other setting override.
- result[0] = Settings.Secure.getString(mContentResolver, key);
- synchronized (lock) {
- // Let the main thread know we are done.
- lock.notify();
- }
- }
- } catch (AcquireTimeoutException e) {
- Log.e(TAG, "Couldn't acquire setting", e);
- }
- });
- // Wait for the thread to hold the acquire lock, then release the settings.
- lock.wait();
- overriders[0].release();
- // Wait for the thread to be done getting the value.
- lock.wait();
- // Quit and cleanup.
- t.quitSafely();
- assertNotNull(overriders[1]);
- overriders[1].release();
- }
- // Verify the value was the expected one from the thread's SettingOverride.
- assertEquals("default value", result[0]);
- }
-
- private HandlerThread runOnHandler(Runnable r) {
- HandlerThread t = new HandlerThread("Test Thread");
- t.start();
- new Handler(t.getLooper()).post(r);
- return t;
- }
-}
diff --git a/tools/aapt2/Debug.cpp b/tools/aapt2/Debug.cpp
index 60b01e3..b872ebb 100644
--- a/tools/aapt2/Debug.cpp
+++ b/tools/aapt2/Debug.cpp
@@ -274,7 +274,13 @@
if (!attr.namespace_uri.empty()) {
std::cerr << attr.namespace_uri << ":";
}
- std::cerr << attr.name << "=" << attr.value << "\n";
+ std::cerr << attr.name;
+
+ if (attr.compiled_attribute) {
+ std::cerr << "(" << attr.compiled_attribute.value().id.value_or_default(ResourceId(0x0))
+ << ")";
+ }
+ std::cerr << "=" << attr.value << "\n";
}
const size_t previous_size = prefix_.size();
diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp
index 87fda16..01930d0 100644
--- a/tools/aapt2/Main.cpp
+++ b/tools/aapt2/Main.cpp
@@ -19,13 +19,15 @@
#include "androidfw/StringPiece.h"
+#include "Diagnostics.h"
+
namespace aapt {
// DO NOT UPDATE, this is more of a marketing version.
static const char* sMajorVersion = "2";
// Update minor version whenever a feature or flag is added.
-static const char* sMinorVersion = "13";
+static const char* sMinorVersion = "14";
int PrintVersion() {
std::cerr << "Android Asset Packaging Tool (aapt) " << sMajorVersion << "."
@@ -33,8 +35,8 @@
return 0;
}
-extern int Compile(const std::vector<android::StringPiece>& args);
-extern int Link(const std::vector<android::StringPiece>& args);
+extern int Compile(const std::vector<android::StringPiece>& args, IDiagnostics* diagnostics);
+extern int Link(const std::vector<android::StringPiece>& args, IDiagnostics* diagnostics);
extern int Dump(const std::vector<android::StringPiece>& args);
extern int Diff(const std::vector<android::StringPiece>& args);
extern int Optimize(const std::vector<android::StringPiece>& args);
@@ -53,9 +55,11 @@
android::StringPiece command(argv[0]);
if (command == "compile" || command == "c") {
- return aapt::Compile(args);
+ aapt::StdErrDiagnostics diagnostics;
+ return aapt::Compile(args, &diagnostics);
} else if (command == "link" || command == "l") {
- return aapt::Link(args);
+ aapt::StdErrDiagnostics diagnostics;
+ return aapt::Link(args, &diagnostics);
} else if (command == "dump" || command == "d") {
return aapt::Dump(args);
} else if (command == "diff") {
diff --git a/tools/aapt2/cmd/Compile.cpp b/tools/aapt2/cmd/Compile.cpp
index 578a8fb..5413b33 100644
--- a/tools/aapt2/cmd/Compile.cpp
+++ b/tools/aapt2/cmd/Compile.cpp
@@ -365,6 +365,21 @@
return true;
}
+static bool IsValidFile(IAaptContext* context, const StringPiece& input_path) {
+ const file::FileType file_type = file::GetFileType(input_path);
+ if (file_type != file::FileType::kRegular && file_type != file::FileType::kSymlink) {
+ if (file_type == file::FileType::kDirectory) {
+ context->GetDiagnostics()->Error(DiagMessage(input_path)
+ << "resource file cannot be a directory");
+ } else {
+ context->GetDiagnostics()->Error(DiagMessage(input_path)
+ << "not a valid resource file");
+ }
+ return false;
+ }
+ return true;
+}
+
static bool CompileXml(IAaptContext* context, const CompileOptions& options,
const ResourcePathData& path_data, IArchiveWriter* writer,
const std::string& output_path) {
@@ -569,7 +584,8 @@
std::string error_str;
Maybe<android::FileMap> f = file::MmapPath(path_data.source.path, &error_str);
if (!f) {
- context->GetDiagnostics()->Error(DiagMessage(path_data.source) << error_str);
+ context->GetDiagnostics()->Error(DiagMessage(path_data.source) << "failed to mmap file: "
+ << error_str);
return false;
}
@@ -582,6 +598,14 @@
class CompileContext : public IAaptContext {
public:
+ CompileContext(IDiagnostics* diagnostics) : diagnostics_(diagnostics) {
+ }
+
+ PackageType GetPackageType() override {
+ // Every compilation unit starts as an app and then gets linked as potentially something else.
+ return PackageType::kApp;
+ }
+
void SetVerbose(bool val) {
verbose_ = val;
}
@@ -591,7 +615,7 @@
}
IDiagnostics* GetDiagnostics() override {
- return &diagnostics_;
+ return diagnostics_;
}
NameMangler* GetNameMangler() override {
@@ -618,7 +642,7 @@
}
private:
- StdErrDiagnostics diagnostics_;
+ IDiagnostics* diagnostics_;
bool verbose_ = false;
};
@@ -626,8 +650,8 @@
* Entry point for compilation phase. Parses arguments and dispatches to the
* correct steps.
*/
-int Compile(const std::vector<StringPiece>& args) {
- CompileContext context;
+int Compile(const std::vector<StringPiece>& args, IDiagnostics* diagnostics) {
+ CompileContext context(diagnostics);
CompileOptions options;
bool verbose = false;
@@ -692,6 +716,11 @@
context.GetDiagnostics()->Note(DiagMessage(path_data.source) << "processing");
}
+ if (!IsValidFile(&context, path_data.source.path)) {
+ error = true;
+ continue;
+ }
+
if (path_data.resource_dir == "values") {
// Overwrite the extension.
path_data.extension = "arsc";
diff --git a/tools/aapt2/cmd/Diff.cpp b/tools/aapt2/cmd/Diff.cpp
index fdc89b2..1a6f348 100644
--- a/tools/aapt2/cmd/Diff.cpp
+++ b/tools/aapt2/cmd/Diff.cpp
@@ -31,6 +31,11 @@
DiffContext() : name_mangler_({}), symbol_table_(&name_mangler_) {
}
+ PackageType GetPackageType() override {
+ // Doesn't matter.
+ return PackageType::kApp;
+ }
+
const std::string& GetCompilationPackage() override {
return empty_;
}
diff --git a/tools/aapt2/cmd/Dump.cpp b/tools/aapt2/cmd/Dump.cpp
index 1bbfb28..57c45742 100644
--- a/tools/aapt2/cmd/Dump.cpp
+++ b/tools/aapt2/cmd/Dump.cpp
@@ -144,6 +144,11 @@
class DumpContext : public IAaptContext {
public:
+ PackageType GetPackageType() override {
+ // Doesn't matter.
+ return PackageType::kApp;
+ }
+
IDiagnostics* GetDiagnostics() override {
return &diagnostics_;
}
diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp
index b86188f..8accfa8 100644
--- a/tools/aapt2/cmd/Link.cpp
+++ b/tools/aapt2/cmd/Link.cpp
@@ -65,16 +65,7 @@
namespace aapt {
-// The type of package to build.
-enum class PackageType {
- kApp,
- kSharedLib,
- kStaticLib,
-};
-
struct LinkOptions {
- PackageType package_type = PackageType::kApp;
-
std::string output_path;
std::string manifest_path;
std::vector<std::string> include_paths;
@@ -127,11 +118,20 @@
class LinkContext : public IAaptContext {
public:
- LinkContext() : name_mangler_({}), symbols_(&name_mangler_) {
+ LinkContext(IDiagnostics* diagnostics)
+ : diagnostics_(diagnostics), name_mangler_({}), symbols_(&name_mangler_) {
+ }
+
+ PackageType GetPackageType() override {
+ return package_type_;
+ }
+
+ void SetPackageType(PackageType type) {
+ package_type_ = type;
}
IDiagnostics* GetDiagnostics() override {
- return &diagnostics_;
+ return diagnostics_;
}
NameMangler* GetNameMangler() override {
@@ -181,7 +181,8 @@
private:
DISALLOW_COPY_AND_ASSIGN(LinkContext);
- StdErrDiagnostics diagnostics_;
+ PackageType package_type_ = PackageType::kApp;
+ IDiagnostics* diagnostics_;
NameMangler name_mangler_;
std::string compilation_package_;
uint8_t package_id_ = 0x0;
@@ -190,6 +191,62 @@
int min_sdk_version_ = 0;
};
+// A custom delegate that generates compatible pre-O IDs for use with feature splits.
+// Feature splits use package IDs > 7f, which in Java (since Java doesn't have unsigned ints)
+// is interpreted as a negative number. Some verification was wrongly assuming negative values
+// were invalid.
+//
+// This delegate will attempt to masquerade any '@id/' references with ID 0xPPTTEEEE,
+// where PP > 7f, as 0x7fPPEEEE. Any potential overlapping is verified and an error occurs if such
+// an overlap exists.
+class FeatureSplitSymbolTableDelegate : public DefaultSymbolTableDelegate {
+ public:
+ FeatureSplitSymbolTableDelegate(IAaptContext* context) : context_(context) {
+ }
+
+ virtual ~FeatureSplitSymbolTableDelegate() = default;
+
+ virtual std::unique_ptr<SymbolTable::Symbol> FindByName(
+ const ResourceName& name,
+ const std::vector<std::unique_ptr<ISymbolSource>>& sources) override {
+ std::unique_ptr<SymbolTable::Symbol> symbol =
+ DefaultSymbolTableDelegate::FindByName(name, sources);
+ if (symbol == nullptr) {
+ return {};
+ }
+
+ // Check to see if this is an 'id' with the target package.
+ if (name.type == ResourceType::kId && symbol->id) {
+ ResourceId* id = &symbol->id.value();
+ if (id->package_id() > kAppPackageId) {
+ // Rewrite the resource ID to be compatible pre-O.
+ ResourceId rewritten_id(kAppPackageId, id->package_id(), id->entry_id());
+
+ // Check that this doesn't overlap another resource.
+ if (DefaultSymbolTableDelegate::FindById(rewritten_id, sources) != nullptr) {
+ // The ID overlaps, so log a message (since this is a weird failure) and fail.
+ context_->GetDiagnostics()->Error(DiagMessage() << "Failed to rewrite " << name
+ << " for pre-O feature split support");
+ return {};
+ }
+
+ if (context_->IsVerbose()) {
+ context_->GetDiagnostics()->Note(DiagMessage() << "rewriting " << name << " (" << *id
+ << ") -> (" << rewritten_id << ")");
+ }
+
+ *id = rewritten_id;
+ }
+ }
+ return symbol;
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(FeatureSplitSymbolTableDelegate);
+
+ IAaptContext* context_;
+};
+
static bool FlattenXml(xml::XmlResource* xml_res, const StringPiece& path,
Maybe<size_t> max_sdk_level, bool keep_raw_values, IArchiveWriter* writer,
IAaptContext* context) {
@@ -627,7 +684,7 @@
std::string error_str;
std::unique_ptr<ResourceTable> include_static = LoadStaticLibrary(path, &error_str);
if (include_static) {
- if (options_.package_type != PackageType::kStaticLib) {
+ if (context_->GetPackageType() != PackageType::kStaticLib) {
// Can't include static libraries when not building a static library (they have no IDs
// assigned).
context_->GetDiagnostics()->Error(
@@ -1300,7 +1357,7 @@
*/
bool WriteApk(IArchiveWriter* writer, proguard::KeepSet* keep_set, xml::XmlResource* manifest,
ResourceTable* table) {
- const bool keep_raw_values = options_.package_type == PackageType::kStaticLib;
+ const bool keep_raw_values = context_->GetPackageType() == PackageType::kStaticLib;
bool result =
FlattenXml(manifest, "AndroidManifest.xml", {}, keep_raw_values, writer, context_);
if (!result) {
@@ -1325,7 +1382,7 @@
return false;
}
- if (options_.package_type == PackageType::kStaticLib) {
+ if (context_->GetPackageType() == PackageType::kStaticLib) {
if (!FlattenTableToPb(table, writer)) {
return false;
}
@@ -1374,7 +1431,7 @@
context_->SetPackageId(0x01);
// Verify we're building a regular app.
- if (options_.package_type != PackageType::kApp) {
+ if (context_->GetPackageType() != PackageType::kApp) {
context_->GetDiagnostics()->Error(
DiagMessage() << "package 'android' can only be built as a regular app");
return 1;
@@ -1414,7 +1471,7 @@
return 1;
}
- if (options_.package_type != PackageType::kStaticLib) {
+ if (context_->GetPackageType() != PackageType::kStaticLib) {
PrivateAttributeMover mover;
if (!mover.Consume(context_, &final_table_)) {
context_->GetDiagnostics()->Error(DiagMessage() << "failed moving private attributes");
@@ -1463,13 +1520,26 @@
context_->GetExternalSymbols()->PrependSource(
util::make_unique<ResourceTableSymbolSource>(&final_table_));
+ // Workaround for pre-O runtime that would treat negative resource IDs
+ // (any ID with a package ID > 7f) as invalid. Intercept any ID (PPTTEEEE) with PP > 0x7f
+ // and type == 'id', and return the ID 0x7fPPEEEE. IDs don't need to be real resources, they
+ // are just identifiers.
+ if (context_->GetMinSdkVersion() < SDK_O && context_->GetPackageType() == PackageType::kApp) {
+ if (context_->IsVerbose()) {
+ context_->GetDiagnostics()->Note(DiagMessage()
+ << "enabling pre-O feature split ID rewriting");
+ }
+ context_->GetExternalSymbols()->SetDelegate(
+ util::make_unique<FeatureSplitSymbolTableDelegate>(context_));
+ }
+
ReferenceLinker linker;
if (!linker.Consume(context_, &final_table_)) {
context_->GetDiagnostics()->Error(DiagMessage() << "failed linking references");
return 1;
}
- if (options_.package_type == PackageType::kStaticLib) {
+ if (context_->GetPackageType() == PackageType::kStaticLib) {
if (!options_.products.empty()) {
context_->GetDiagnostics()->Warn(DiagMessage()
<< "can't select products when building static library");
@@ -1490,7 +1560,7 @@
}
}
- if (options_.package_type != PackageType::kStaticLib && context_->GetMinSdkVersion() > 0) {
+ if (context_->GetPackageType() != PackageType::kStaticLib && context_->GetMinSdkVersion() > 0) {
if (context_->IsVerbose()) {
context_->GetDiagnostics()->Note(DiagMessage()
<< "collapsing resource versions for minimum SDK "
@@ -1514,7 +1584,7 @@
proguard::KeepSet proguard_keep_set;
proguard::KeepSet proguard_main_dex_keep_set;
- if (options_.package_type == PackageType::kStaticLib) {
+ if (context_->GetPackageType() == PackageType::kStaticLib) {
if (options_.table_splitter_options.config_filter != nullptr ||
!options_.table_splitter_options.preferred_densities.empty()) {
context_->GetDiagnostics()->Warn(DiagMessage()
@@ -1641,11 +1711,12 @@
template_options.types = JavaClassGeneratorOptions::SymbolTypes::kAll;
template_options.javadoc_annotations = options_.javadoc_annotations;
- if (options_.package_type == PackageType::kStaticLib || options_.generate_non_final_ids) {
+ if (context_->GetPackageType() == PackageType::kStaticLib ||
+ options_.generate_non_final_ids) {
template_options.use_final = false;
}
- if (options_.package_type == PackageType::kSharedLib) {
+ if (context_->GetPackageType() == PackageType::kSharedLib) {
template_options.use_final = false;
template_options.rewrite_callback_options = OnResourcesLoadedCallbackOptions{};
}
@@ -1735,8 +1806,8 @@
std::map<size_t, std::string> shared_libs_;
};
-int Link(const std::vector<StringPiece>& args) {
- LinkContext context;
+int Link(const std::vector<StringPiece>& args, IDiagnostics* diagnostics) {
+ LinkContext context(diagnostics);
LinkOptions options;
std::vector<std::string> overlay_arg_list;
std::vector<std::string> extra_java_packages;
@@ -1922,18 +1993,18 @@
}
if (shared_lib) {
- options.package_type = PackageType::kSharedLib;
+ context.SetPackageType(PackageType::kSharedLib);
context.SetPackageId(0x00);
} else if (static_lib) {
- options.package_type = PackageType::kStaticLib;
+ context.SetPackageType(PackageType::kStaticLib);
context.SetPackageId(kAppPackageId);
} else {
- options.package_type = PackageType::kApp;
+ context.SetPackageType(PackageType::kApp);
context.SetPackageId(kAppPackageId);
}
if (package_id) {
- if (options.package_type != PackageType::kApp) {
+ if (context.GetPackageType() != PackageType::kApp) {
context.GetDiagnostics()->Error(
DiagMessage() << "can't specify --package-id when not building a regular app");
return 1;
@@ -2000,7 +2071,7 @@
}
}
- if (options.package_type != PackageType::kStaticLib && stable_id_file_path) {
+ if (context.GetPackageType() != PackageType::kStaticLib && stable_id_file_path) {
if (!LoadStableIdMap(context.GetDiagnostics(), stable_id_file_path.value(),
&options.stable_id_map)) {
return 1;
@@ -2015,7 +2086,7 @@
".3gpp2", ".amr", ".awb", ".wma", ".wmv", ".webm", ".mkv"});
// Turn off auto versioning for static-libs.
- if (options.package_type == PackageType::kStaticLib) {
+ if (context.GetPackageType() == PackageType::kStaticLib) {
options.no_auto_version = true;
options.no_version_vectors = true;
options.no_version_transitions = true;
diff --git a/tools/aapt2/cmd/Optimize.cpp b/tools/aapt2/cmd/Optimize.cpp
index e99ee8a..194c0c8 100644
--- a/tools/aapt2/cmd/Optimize.cpp
+++ b/tools/aapt2/cmd/Optimize.cpp
@@ -59,6 +59,14 @@
class OptimizeContext : public IAaptContext {
public:
+ OptimizeContext() = default;
+
+ PackageType GetPackageType() override {
+ // Not important here. Using anything other than kApp adds EXTRA validation, which we want to
+ // avoid.
+ return PackageType::kApp;
+ }
+
IDiagnostics* GetDiagnostics() override {
return &diagnostics_;
}
@@ -99,6 +107,8 @@
}
private:
+ DISALLOW_COPY_AND_ASSIGN(OptimizeContext);
+
StdErrDiagnostics diagnostics_;
bool verbose_ = false;
int sdk_version_ = 0;
@@ -203,10 +213,10 @@
if (file_ref->file == nullptr) {
ResourceNameRef name(pkg->name, type->type, entry->name);
- context_->GetDiagnostics()->Error(DiagMessage(file_ref->GetSource())
+ context_->GetDiagnostics()->Warn(DiagMessage(file_ref->GetSource())
<< "file for resource " << name << " with config '"
<< config_value->config << "' not found");
- return false;
+ continue;
}
const StringPiece entry_name = entry->name;
diff --git a/tools/aapt2/flatten/TableFlattener.cpp b/tools/aapt2/flatten/TableFlattener.cpp
index 3098458..f4d0226 100644
--- a/tools/aapt2/flatten/TableFlattener.cpp
+++ b/tools/aapt2/flatten/TableFlattener.cpp
@@ -230,15 +230,18 @@
ResTable_package* pkg_header = pkg_writer.StartChunk<ResTable_package>(RES_TABLE_PACKAGE_TYPE);
pkg_header->id = util::HostToDevice32(package_->id.value());
- if (package_->name.size() >= arraysize(pkg_header->name)) {
+ // AAPT truncated the package name, so do the same.
+ // Shared libraries require full package names, so don't truncate theirs.
+ if (context_->GetPackageType() != PackageType::kApp &&
+ package_->name.size() >= arraysize(pkg_header->name)) {
diag_->Error(DiagMessage() << "package name '" << package_->name
- << "' is too long");
+ << "' is too long. "
+ "Shared libraries cannot have truncated package names");
return false;
}
// Copy the package name in device endianness.
- strcpy16_htod(pkg_header->name, arraysize(pkg_header->name),
- util::Utf8ToUtf16(package_->name));
+ strcpy16_htod(pkg_header->name, arraysize(pkg_header->name), util::Utf8ToUtf16(package_->name));
// Serialize the types. We do this now so that our type and key strings
// are populated. We write those first.
@@ -570,10 +573,17 @@
// Write the ResTable header.
ChunkWriter table_writer(buffer_);
- ResTable_header* table_header =
- table_writer.StartChunk<ResTable_header>(RES_TABLE_TYPE);
+ ResTable_header* table_header = table_writer.StartChunk<ResTable_header>(RES_TABLE_TYPE);
table_header->packageCount = util::HostToDevice32(table->packages.size());
+ // Write a self mapping entry for this package if the ID is non-standard (0x7f).
+ if (context->GetPackageType() == PackageType::kApp) {
+ const uint8_t package_id = context->GetPackageId();
+ if (package_id != kFrameworkPackageId && package_id != kAppPackageId) {
+ table->included_packages_[package_id] = context->GetCompilationPackage();
+ }
+ }
+
// Flatten the values string pool.
StringPool::FlattenUtf8(table_writer.buffer(), table->string_pool);
diff --git a/tools/aapt2/flatten/TableFlattener_test.cpp b/tools/aapt2/flatten/TableFlattener_test.cpp
index 4196187..6d1350d 100644
--- a/tools/aapt2/flatten/TableFlattener_test.cpp
+++ b/tools/aapt2/flatten/TableFlattener_test.cpp
@@ -400,7 +400,7 @@
const DynamicRefTable* dynamic_ref_table = result.getDynamicRefTableForCookie(1);
ASSERT_NE(nullptr, dynamic_ref_table);
- const KeyedVector<String16, uint8_t> entries = dynamic_ref_table->entries();
+ const KeyedVector<String16, uint8_t>& entries = dynamic_ref_table->entries();
ssize_t idx = entries.indexOfKey(android::String16("lib_one"));
ASSERT_GE(idx, 0);
@@ -411,4 +411,60 @@
EXPECT_EQ(0x03u, entries.valueAt(idx));
}
+TEST_F(TableFlattenerTest, PackageWithNonStandardIdHasDynamicRefTable) {
+ std::unique_ptr<IAaptContext> context =
+ test::ContextBuilder().SetCompilationPackage("app").SetPackageId(0x80).Build();
+ std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
+ .SetPackageId("app", 0x80)
+ .AddSimple("app:id/foo", ResourceId(0x80010000))
+ .Build();
+
+ ResTable result;
+ ASSERT_TRUE(Flatten(context.get(), {}, table.get(), &result));
+
+ const DynamicRefTable* dynamic_ref_table = result.getDynamicRefTableForCookie(1);
+ ASSERT_NE(nullptr, dynamic_ref_table);
+
+ const KeyedVector<String16, uint8_t>& entries = dynamic_ref_table->entries();
+ ssize_t idx = entries.indexOfKey(android::String16("app"));
+ ASSERT_GE(idx, 0);
+ EXPECT_EQ(0x80u, entries.valueAt(idx));
+}
+
+TEST_F(TableFlattenerTest, LongPackageNameIsTruncated) {
+ std::string kPackageName(256, 'F');
+
+ std::unique_ptr<IAaptContext> context =
+ test::ContextBuilder().SetCompilationPackage(kPackageName).SetPackageId(0x7f).Build();
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .SetPackageId(kPackageName, 0x7f)
+ .AddSimple(kPackageName + ":id/foo", ResourceId(0x7f010000))
+ .Build();
+
+ ResTable result;
+ ASSERT_TRUE(Flatten(context.get(), {}, table.get(), &result));
+
+ ASSERT_EQ(1u, result.getBasePackageCount());
+ EXPECT_EQ(127u, result.getBasePackageName(0).size());
+}
+
+TEST_F(TableFlattenerTest, LongSharedLibraryPackageNameIsIllegal) {
+ std::string kPackageName(256, 'F');
+
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder()
+ .SetCompilationPackage(kPackageName)
+ .SetPackageId(0x7f)
+ .SetPackageType(PackageType::kSharedLib)
+ .Build();
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .SetPackageId(kPackageName, 0x7f)
+ .AddSimple(kPackageName + ":id/foo", ResourceId(0x7f010000))
+ .Build();
+
+ ResTable result;
+ ASSERT_FALSE(Flatten(context.get(), {}, table.get(), &result));
+}
+
} // namespace aapt
diff --git a/tools/aapt2/flatten/XmlFlattener.cpp b/tools/aapt2/flatten/XmlFlattener.cpp
index 366c373..e98d2d7 100644
--- a/tools/aapt2/flatten/XmlFlattener.cpp
+++ b/tools/aapt2/flatten/XmlFlattener.cpp
@@ -99,7 +99,11 @@
flat_node->comment.index = util::HostToDevice32(-1);
ResXMLTree_cdataExt* flat_text = writer.NextBlock<ResXMLTree_cdataExt>();
- AddString(node->text, kLowPriority, &flat_text->data);
+
+ // Process plain strings to make sure they get properly escaped.
+ util::StringBuilder builder;
+ builder.Append(node->text);
+ AddString(builder.ToString(), kLowPriority, &flat_text->data);
writer.Finish();
}
@@ -184,17 +188,14 @@
writer.Finish();
}
- void WriteAttributes(xml::Element* node, ResXMLTree_attrExt* flat_elem,
- ChunkWriter* writer) {
+ void WriteAttributes(xml::Element* node, ResXMLTree_attrExt* flat_elem, ChunkWriter* writer) {
filtered_attrs_.clear();
filtered_attrs_.reserve(node->attributes.size());
// Filter the attributes.
for (xml::Attribute& attr : node->attributes) {
- if (options_.max_sdk_level && attr.compiled_attribute &&
- attr.compiled_attribute.value().id) {
- size_t sdk_level =
- FindAttributeSdkLevel(attr.compiled_attribute.value().id.value());
+ if (options_.max_sdk_level && attr.compiled_attribute && attr.compiled_attribute.value().id) {
+ size_t sdk_level = FindAttributeSdkLevel(attr.compiled_attribute.value().id.value());
if (sdk_level > options_.max_sdk_level.value()) {
continue;
}
@@ -211,8 +212,7 @@
const ResourceId kIdAttr(0x010100d0);
- std::sort(filtered_attrs_.begin(), filtered_attrs_.end(),
- cmp_xml_attribute_by_id);
+ std::sort(filtered_attrs_.begin(), filtered_attrs_.end(), cmp_xml_attribute_by_id);
flat_elem->attributeCount = util::HostToDevice16(filtered_attrs_.size());
@@ -234,18 +234,15 @@
}
attribute_index++;
- // Add the namespaceUri to the list of StringRefs to encode. Use null if
- // the namespace
+ // Add the namespaceUri to the list of StringRefs to encode. Use null if the namespace
// is empty (doesn't exist).
AddString(xml_attr->namespace_uri, kLowPriority, &flat_attr->ns,
true /* treat_empty_string_as_null */);
flat_attr->rawValue.index = util::HostToDevice32(-1);
- if (!xml_attr->compiled_attribute ||
- !xml_attr->compiled_attribute.value().id) {
- // The attribute has no associated ResourceID, so the string order
- // doesn't matter.
+ if (!xml_attr->compiled_attribute || !xml_attr->compiled_attribute.value().id) {
+ // The attribute has no associated ResourceID, so the string order doesn't matter.
AddString(xml_attr->name, kLowPriority, &flat_attr->name);
} else {
// Attribute names are stored without packages, but we use
@@ -255,8 +252,7 @@
// pools that we later combine.
//
// Lookup the StringPool for this package and make the reference there.
- const xml::AaptAttribute& aapt_attr =
- xml_attr->compiled_attribute.value();
+ const xml::AaptAttribute& aapt_attr = xml_attr->compiled_attribute.value();
StringPool::Ref name_ref =
package_pools[aapt_attr.id.value().package_id()].MakeRef(
@@ -266,10 +262,18 @@
AddString(name_ref, &flat_attr->name);
}
+ // Process plain strings to make sure they get properly escaped.
+ StringPiece raw_value = xml_attr->value;
+ util::StringBuilder str_builder;
+ if (!options_.keep_raw_values) {
+ str_builder.Append(xml_attr->value);
+ raw_value = str_builder.ToString();
+ }
+
if (options_.keep_raw_values || !xml_attr->compiled_value) {
// Keep raw values if the value is not compiled or
// if we're building a static library (need symbols).
- AddString(xml_attr->value, kLowPriority, &flat_attr->rawValue);
+ AddString(raw_value, kLowPriority, &flat_attr->rawValue);
}
if (xml_attr->compiled_value) {
@@ -277,12 +281,12 @@
} else {
// Flatten as a regular string type.
flat_attr->typedValue.dataType = android::Res_value::TYPE_STRING;
- AddString(xml_attr->value, kLowPriority,
- (ResStringPool_ref*)&flat_attr->typedValue.data);
+
+ AddString(str_builder.ToString(), kLowPriority,
+ (ResStringPool_ref*) &flat_attr->typedValue.data);
}
- flat_attr->typedValue.size =
- util::HostToDevice16(sizeof(flat_attr->typedValue));
+ flat_attr->typedValue.size = util::HostToDevice16(sizeof(flat_attr->typedValue));
flat_attr++;
}
}
diff --git a/tools/aapt2/flatten/XmlFlattener_test.cpp b/tools/aapt2/flatten/XmlFlattener_test.cpp
index 494d9d2..cfa89bb 100644
--- a/tools/aapt2/flatten/XmlFlattener_test.cpp
+++ b/tools/aapt2/flatten/XmlFlattener_test.cpp
@@ -35,13 +35,16 @@
.SetNameManglerPolicy(NameManglerPolicy{"com.app.test"})
.AddSymbolSource(
test::StaticSymbolSourceBuilder()
- .AddSymbol("android:attr/id", ResourceId(0x010100d0),
- test::AttributeBuilder().Build())
+ .AddPublicSymbol("android:attr/id", ResourceId(0x010100d0),
+ test::AttributeBuilder().Build())
.AddSymbol("com.app.test:id/id", ResourceId(0x7f020000))
.AddPublicSymbol("android:attr/paddingStart", ResourceId(0x010103b3),
test::AttributeBuilder().Build())
.AddPublicSymbol("android:attr/colorAccent", ResourceId(0x01010435),
test::AttributeBuilder().Build())
+ .AddSymbol("com.app.test.feature:id/foo", ResourceId(0x80020000))
+ .AddSymbol("com.app.test.feature:attr/foo", ResourceId(0x80010000),
+ test::AttributeBuilder().Build())
.Build())
.Build();
}
@@ -65,7 +68,7 @@
}
protected:
- std::unique_ptr<IAaptContext> context_;
+ std::unique_ptr<test::Context> context_;
};
TEST_F(XmlFlattenerTest, FlattenXmlWithNoCompiledAttributes) {
@@ -79,72 +82,71 @@
android::ResXMLTree tree;
ASSERT_TRUE(Flatten(doc.get(), &tree));
- ASSERT_EQ(tree.next(), android::ResXMLTree::START_NAMESPACE);
+ ASSERT_EQ(android::ResXMLTree::START_NAMESPACE, tree.next());
size_t len;
const char16_t* namespace_prefix = tree.getNamespacePrefix(&len);
- EXPECT_EQ(StringPiece16(namespace_prefix, len), u"test");
+ EXPECT_EQ(StringPiece16(u"test"), StringPiece16(namespace_prefix, len));
const char16_t* namespace_uri = tree.getNamespaceUri(&len);
- ASSERT_EQ(StringPiece16(namespace_uri, len), u"http://com.test");
+ ASSERT_EQ(StringPiece16(u"http://com.test"), StringPiece16(namespace_uri, len));
- ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
+ ASSERT_EQ(android::ResXMLTree::START_TAG, tree.next());
- ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
+ ASSERT_EQ(nullptr, tree.getElementNamespace(&len));
const char16_t* tag_name = tree.getElementName(&len);
- EXPECT_EQ(StringPiece16(tag_name, len), u"View");
+ EXPECT_EQ(StringPiece16(u"View"), StringPiece16(tag_name, len));
ASSERT_EQ(1u, tree.getAttributeCount());
- ASSERT_EQ(tree.getAttributeNamespace(0, &len), nullptr);
+ ASSERT_EQ(nullptr, tree.getAttributeNamespace(0, &len));
const char16_t* attr_name = tree.getAttributeName(0, &len);
- EXPECT_EQ(StringPiece16(attr_name, len), u"attr");
+ EXPECT_EQ(StringPiece16(u"attr"), StringPiece16(attr_name, len));
- EXPECT_EQ(0, tree.indexOfAttribute(nullptr, 0, u"attr",
- StringPiece16(u"attr").size()));
+ EXPECT_EQ(0, tree.indexOfAttribute(nullptr, 0, u"attr", StringPiece16(u"attr").size()));
- ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
+ ASSERT_EQ(android::ResXMLTree::START_TAG, tree.next());
- ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
+ ASSERT_EQ(nullptr, tree.getElementNamespace(&len));
tag_name = tree.getElementName(&len);
- EXPECT_EQ(StringPiece16(tag_name, len), u"Layout");
+ EXPECT_EQ(StringPiece16(u"Layout"), StringPiece16(tag_name, len));
ASSERT_EQ(1u, tree.getAttributeCount());
const char16_t* attr_namespace = tree.getAttributeNamespace(0, &len);
- EXPECT_EQ(StringPiece16(attr_namespace, len), u"http://com.test");
+ EXPECT_EQ(StringPiece16(u"http://com.test"), StringPiece16(attr_namespace, len));
attr_name = tree.getAttributeName(0, &len);
- EXPECT_EQ(StringPiece16(attr_name, len), u"hello");
+ EXPECT_EQ(StringPiece16(u"hello"), StringPiece16(attr_name, len));
- ASSERT_EQ(tree.next(), android::ResXMLTree::END_TAG);
- ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
+ ASSERT_EQ(android::ResXMLTree::END_TAG, tree.next());
+ ASSERT_EQ(android::ResXMLTree::START_TAG, tree.next());
- ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
+ ASSERT_EQ(nullptr, tree.getElementNamespace(&len));
tag_name = tree.getElementName(&len);
- EXPECT_EQ(StringPiece16(tag_name, len), u"Layout");
+ EXPECT_EQ(StringPiece16(u"Layout"), StringPiece16(tag_name, len));
ASSERT_EQ(0u, tree.getAttributeCount());
- ASSERT_EQ(tree.next(), android::ResXMLTree::TEXT);
+ ASSERT_EQ(android::ResXMLTree::TEXT, tree.next());
const char16_t* text = tree.getText(&len);
- EXPECT_EQ(StringPiece16(text, len), u"Some text\\");
+ EXPECT_EQ(StringPiece16(u"Some text\\"), StringPiece16(text, len));
- ASSERT_EQ(tree.next(), android::ResXMLTree::END_TAG);
- ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
+ ASSERT_EQ(android::ResXMLTree::END_TAG, tree.next());
+ ASSERT_EQ(nullptr, tree.getElementNamespace(&len));
tag_name = tree.getElementName(&len);
- EXPECT_EQ(StringPiece16(tag_name, len), u"Layout");
+ EXPECT_EQ(StringPiece16(u"Layout"), StringPiece16(tag_name, len));
- ASSERT_EQ(tree.next(), android::ResXMLTree::END_TAG);
- ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
+ ASSERT_EQ(android::ResXMLTree::END_TAG, tree.next());
+ ASSERT_EQ(nullptr, tree.getElementNamespace(&len));
tag_name = tree.getElementName(&len);
- EXPECT_EQ(StringPiece16(tag_name, len), u"View");
+ EXPECT_EQ(StringPiece16(u"View"), StringPiece16(tag_name, len));
- ASSERT_EQ(tree.next(), android::ResXMLTree::END_NAMESPACE);
+ ASSERT_EQ(android::ResXMLTree::END_NAMESPACE, tree.next());
namespace_prefix = tree.getNamespacePrefix(&len);
- EXPECT_EQ(StringPiece16(namespace_prefix, len), u"test");
+ EXPECT_EQ(StringPiece16(u"test"), StringPiece16(namespace_prefix, len));
namespace_uri = tree.getNamespaceUri(&len);
- ASSERT_EQ(StringPiece16(namespace_uri, len), u"http://com.test");
+ ASSERT_EQ(StringPiece16(u"http://com.test"), StringPiece16(namespace_uri, len));
- ASSERT_EQ(tree.next(), android::ResXMLTree::END_DOCUMENT);
+ ASSERT_EQ(android::ResXMLTree::END_DOCUMENT, tree.next());
}
TEST_F(XmlFlattenerTest, FlattenCompiledXmlAndStripSdk21) {
@@ -218,14 +220,10 @@
EXPECT_EQ(tree.indexOfStyle(), 1);
}
-/*
- * The device ResXMLParser in libandroidfw differentiates between empty
- * namespace and null
- * namespace.
- */
+// The device ResXMLParser in libandroidfw differentiates between empty namespace and null
+// namespace.
TEST_F(XmlFlattenerTest, NoNamespaceIsNotTheSameAsEmptyNamespace) {
- std::unique_ptr<xml::XmlResource> doc =
- test::BuildXmlDom("<View package=\"android\"/>");
+ std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom("<View package=\"android\"/>");
android::ResXMLTree tree;
ASSERT_TRUE(Flatten(doc.get(), &tree));
@@ -261,4 +259,81 @@
EXPECT_NE(nullptr, tree.getAttributeStringValue(idx, &len));
}
+TEST_F(XmlFlattenerTest, FlattenNonStandardPackageId) {
+ context_->SetCompilationPackage("com.app.test.feature");
+ context_->SetPackageId(0x80);
+ context_->SetNameManglerPolicy({"com.app.test.feature"});
+
+ std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
+ <View xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@id/foo"
+ app:foo="@id/foo" />)EOF");
+
+ XmlReferenceLinker linker;
+ ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
+
+ // The tree needs a custom DynamicRefTable since it is not using a standard app ID (0x7f).
+ android::DynamicRefTable dynamic_ref_table;
+ dynamic_ref_table.addMapping(0x80, 0x80);
+
+ android::ResXMLTree tree(&dynamic_ref_table);
+ ASSERT_TRUE(Flatten(doc.get(), &tree));
+
+ while (tree.next() != android::ResXMLTree::START_TAG) {
+ ASSERT_NE(android::ResXMLTree::BAD_DOCUMENT, tree.getEventType());
+ ASSERT_NE(android::ResXMLTree::END_DOCUMENT, tree.getEventType());
+ }
+
+ ssize_t idx;
+
+ idx = tree.indexOfAttribute(xml::kSchemaAndroid, "id");
+ ASSERT_GE(idx, 0);
+ EXPECT_EQ(idx, tree.indexOfID());
+ EXPECT_EQ(ResourceId(0x010100d0), ResourceId(tree.getAttributeNameResID(idx)));
+
+ idx = tree.indexOfAttribute(xml::kSchemaAuto, "foo");
+ ASSERT_GE(idx, 0);
+ EXPECT_EQ(ResourceId(0x80010000), ResourceId(tree.getAttributeNameResID(idx)));
+ EXPECT_EQ(android::Res_value::TYPE_REFERENCE, tree.getAttributeDataType(idx));
+ EXPECT_EQ(ResourceId(0x80020000), tree.getAttributeData(idx));
+}
+
+TEST_F(XmlFlattenerTest, ProcessEscapedStrings) {
+ std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(
+ R"EOF(<element value="\?hello" pattern="\\d{5}">\\d{5}</element>)EOF");
+
+ android::ResXMLTree tree;
+ ASSERT_TRUE(Flatten(doc.get(), &tree));
+
+ while (tree.next() != android::ResXMLTree::START_TAG) {
+ ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
+ ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
+ }
+
+ const StringPiece16 kValue = u"value";
+ const StringPiece16 kPattern = u"pattern";
+
+ size_t len;
+ ssize_t idx;
+ const char16_t* str16;
+
+ idx = tree.indexOfAttribute(nullptr, 0, kValue.data(), kValue.size());
+ ASSERT_GE(idx, 0);
+ str16 = tree.getAttributeStringValue(idx, &len);
+ ASSERT_NE(nullptr, str16);
+ EXPECT_EQ(StringPiece16(u"?hello"), StringPiece16(str16, len));
+
+ idx = tree.indexOfAttribute(nullptr, 0, kPattern.data(), kPattern.size());
+ ASSERT_GE(idx, 0);
+ str16 = tree.getAttributeStringValue(idx, &len);
+ ASSERT_NE(nullptr, str16);
+ EXPECT_EQ(StringPiece16(u"\\d{5}"), StringPiece16(str16, len));
+
+ ASSERT_EQ(android::ResXMLTree::TEXT, tree.next());
+ str16 = tree.getText(&len);
+ ASSERT_NE(nullptr, str16);
+ EXPECT_EQ(StringPiece16(u"\\d{5}"), StringPiece16(str16, len));
+}
+
} // namespace aapt
diff --git a/tools/aapt2/java/JavaClassGenerator.cpp b/tools/aapt2/java/JavaClassGenerator.cpp
index a8226c0..2a23aa9 100644
--- a/tools/aapt2/java/JavaClassGenerator.cpp
+++ b/tools/aapt2/java/JavaClassGenerator.cpp
@@ -31,6 +31,7 @@
#include "Resource.h"
#include "ResourceTable.h"
#include "ResourceValues.h"
+#include "SdkConstants.h"
#include "ValueVisitor.h"
#include "java/AnnotationProcessor.h"
#include "java/ClassDefinition.h"
@@ -430,9 +431,15 @@
const ResourceEntry& entry, ClassDefinition* out_class_def,
MethodDefinition* out_rewrite_method,
std::ostream* out_r_txt) {
+ ResourceId real_id = id;
+ if (context_->GetMinSdkVersion() < SDK_O && name.type == ResourceType::kId &&
+ id.package_id() > kAppPackageId) {
+ real_id = ResourceId(kAppPackageId, id.package_id(), id.entry_id());
+ }
+
const std::string field_name = TransformToFieldName(name.entry);
std::unique_ptr<ResourceMember> resource_member =
- util::make_unique<ResourceMember>(field_name, id);
+ util::make_unique<ResourceMember>(field_name, real_id);
// Build the comments and annotations for this entry.
AnnotationProcessor* processor = resource_member->GetCommentBuilder();
@@ -458,7 +465,7 @@
out_class_def->AddMember(std::move(resource_member));
if (out_r_txt != nullptr) {
- *out_r_txt << "int " << name.type << " " << field_name << " " << id << "\n";
+ *out_r_txt << "int " << name.type << " " << field_name << " " << real_id << "\n";
}
if (out_rewrite_method != nullptr) {
diff --git a/tools/aapt2/jni/aapt2_jni.cpp b/tools/aapt2/jni/aapt2_jni.cpp
index ce3d282..ad5ad4c 100644
--- a/tools/aapt2/jni/aapt2_jni.cpp
+++ b/tools/aapt2/jni/aapt2_jni.cpp
@@ -24,13 +24,14 @@
#include "android-base/logging.h"
#include "ScopedUtfChars.h"
+#include "Diagnostics.h"
#include "util/Util.h"
using android::StringPiece;
namespace aapt {
-extern int Compile(const std::vector<StringPiece> &args);
-extern int Link(const std::vector<StringPiece> &args);
+extern int Compile(const std::vector<StringPiece>& args, IDiagnostics* iDiagnostics);
+extern int Link(const std::vector<StringPiece>& args, IDiagnostics* iDiagnostics);
}
/*
@@ -77,20 +78,66 @@
return pieces;
}
+class JniDiagnostics : public aapt::IDiagnostics {
+ public:
+ JniDiagnostics(JNIEnv* env, jobject diagnostics_obj)
+ : env_(env), diagnostics_obj_(diagnostics_obj) {
+ mid_ = NULL;
+ }
+
+ void Log(Level level, aapt::DiagMessageActual& actual_msg) override {
+ jint level_value;
+ switch (level) {
+ case Level::Error:
+ level_value = 3;
+ break;
+
+ case Level::Warn:
+ level_value = 2;
+ break;
+
+ case Level::Note:
+ level_value = 1;
+ break;
+ }
+ jstring message = env_->NewStringUTF(actual_msg.message.c_str());
+ jstring path = env_->NewStringUTF(actual_msg.source.path.c_str());
+ jlong line = -1;
+ if (actual_msg.source.line) {
+ line = actual_msg.source.line.value();
+ }
+ if (!mid_) {
+ jclass diagnostics_cls = env_->GetObjectClass(diagnostics_obj_);
+ mid_ = env_->GetMethodID(diagnostics_cls, "log", "(ILjava/lang/String;JLjava/lang/String;)V");
+ }
+ env_->CallVoidMethod(diagnostics_obj_, mid_, level_value, path, line, message);
+ }
+
+ private:
+ JNIEnv* env_;
+ jobject diagnostics_obj_;
+ jmethodID mid_;
+ DISALLOW_COPY_AND_ASSIGN(JniDiagnostics);
+};
+
JNIEXPORT jint JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeCompile(
- JNIEnv *env, jclass aapt_obj, jobject arguments_obj) {
+ JNIEnv* env, jclass aapt_obj, jobject arguments_obj, jobject diagnostics_obj) {
std::vector<ScopedUtfChars> compile_args_jni =
list_to_utfchars(env, arguments_obj);
std::vector<StringPiece> compile_args = extract_pieces(compile_args_jni);
- return aapt::Compile(compile_args);
+ JniDiagnostics diagnostics(env, diagnostics_obj);
+ return aapt::Compile(compile_args, &diagnostics);
}
-JNIEXPORT jint JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeLink(
- JNIEnv *env, jclass aapt_obj, jobject arguments_obj) {
+JNIEXPORT jint JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeLink(JNIEnv* env,
+ jclass aapt_obj,
+ jobject arguments_obj,
+ jobject diagnostics_obj) {
std::vector<ScopedUtfChars> link_args_jni =
list_to_utfchars(env, arguments_obj);
std::vector<StringPiece> link_args = extract_pieces(link_args_jni);
- return aapt::Link(link_args);
+ JniDiagnostics diagnostics(env, diagnostics_obj);
+ return aapt::Link(link_args, &diagnostics);
}
JNIEXPORT void JNICALL Java_com_android_tools_aapt2_Aapt2Jni_ping(
diff --git a/tools/aapt2/jni/com_android_tools_aapt2_Aapt2Jni.h b/tools/aapt2/jni/com_android_tools_aapt2_Aapt2Jni.h
index 90150b4..3cd9865 100644
--- a/tools/aapt2/jni/com_android_tools_aapt2_Aapt2Jni.h
+++ b/tools/aapt2/jni/com_android_tools_aapt2_Aapt2Jni.h
@@ -18,18 +18,18 @@
/*
* Class: com_android_tools_aapt2_Aapt2Jni
* Method: nativeCompile
- * Signature: (Ljava/util/List;)I
+ * Signature: (Ljava/util/List;Lcom/android/tools/aapt2/Aapt2JniDiagnostics;)I
*/
-JNIEXPORT jint JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeCompile
- (JNIEnv *, jclass, jobject);
+JNIEXPORT jint JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeCompile(JNIEnv*, jclass, jobject,
+ jobject);
/*
* Class: com_android_tools_aapt2_Aapt2Jni
* Method: nativeLink
- * Signature: (Ljava/util/List;)I
+ * Signature: (Ljava/util/List;Lcom/android/tools/aapt2/Aapt2JniDiagnostics;)I
*/
-JNIEXPORT jint JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeLink
- (JNIEnv *, jclass, jobject);
+JNIEXPORT jint JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeLink(JNIEnv*, jclass, jobject,
+ jobject);
#ifdef __cplusplus
}
diff --git a/tools/aapt2/link/ManifestFixer.cpp b/tools/aapt2/link/ManifestFixer.cpp
index 0c19c7a..f998d31 100644
--- a/tools/aapt2/link/ManifestFixer.cpp
+++ b/tools/aapt2/link/ManifestFixer.cpp
@@ -332,8 +332,8 @@
// Provider actions.
application_action["provider"] = component_action;
- application_action["provider"]["grant-uri-permissions"];
- application_action["provider"]["path-permissions"];
+ application_action["provider"]["grant-uri-permission"];
+ application_action["provider"]["path-permission"];
return true;
}
diff --git a/tools/aapt2/link/XmlReferenceLinker_test.cpp b/tools/aapt2/link/XmlReferenceLinker_test.cpp
index cc59416..66ecc15 100644
--- a/tools/aapt2/link/XmlReferenceLinker_test.cpp
+++ b/tools/aapt2/link/XmlReferenceLinker_test.cpp
@@ -81,6 +81,7 @@
android:layout_width="match_parent"
android:background="@color/green"
android:text="hello"
+ android:attr="\?hello"
nonAaptAttr="1"
nonAaptAttrRef="@id/id"
class="hello" />)EOF");
@@ -89,35 +90,40 @@
ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
xml::Element* view_el = xml::FindRootElement(doc.get());
- ASSERT_NE(view_el, nullptr);
+ ASSERT_NE(nullptr, view_el);
xml::Attribute* xml_attr = view_el->FindAttribute(xml::kSchemaAndroid, "layout_width");
- ASSERT_NE(xml_attr, nullptr);
+ ASSERT_NE(nullptr, xml_attr);
AAPT_ASSERT_TRUE(xml_attr->compiled_attribute);
AAPT_ASSERT_TRUE(xml_attr->compiled_attribute.value().id);
- EXPECT_EQ(xml_attr->compiled_attribute.value().id.value(), ResourceId(0x01010000));
- ASSERT_NE(xml_attr->compiled_value, nullptr);
- ASSERT_NE(ValueCast<BinaryPrimitive>(xml_attr->compiled_value.get()), nullptr);
+ EXPECT_EQ(ResourceId(0x01010000), xml_attr->compiled_attribute.value().id.value());
+ ASSERT_NE(nullptr, xml_attr->compiled_value);
+ ASSERT_NE(nullptr, ValueCast<BinaryPrimitive>(xml_attr->compiled_value.get()));
xml_attr = view_el->FindAttribute(xml::kSchemaAndroid, "background");
- ASSERT_NE(xml_attr, nullptr);
+ ASSERT_NE(nullptr, xml_attr);
AAPT_ASSERT_TRUE(xml_attr->compiled_attribute);
AAPT_ASSERT_TRUE(xml_attr->compiled_attribute.value().id);
- EXPECT_EQ(xml_attr->compiled_attribute.value().id.value(), ResourceId(0x01010001));
- ASSERT_NE(xml_attr->compiled_value, nullptr);
+ EXPECT_EQ(ResourceId(0x01010001), xml_attr->compiled_attribute.value().id.value());
+ ASSERT_NE(nullptr, xml_attr->compiled_value);
Reference* ref = ValueCast<Reference>(xml_attr->compiled_value.get());
- ASSERT_NE(ref, nullptr);
+ ASSERT_NE(nullptr, ref);
AAPT_ASSERT_TRUE(ref->name);
- EXPECT_EQ(ref->name.value(), test::ParseNameOrDie("color/green")); // Make sure the name
+ EXPECT_EQ(test::ParseNameOrDie("color/green"), ref->name.value()); // Make sure the name
// didn't change.
AAPT_ASSERT_TRUE(ref->id);
- EXPECT_EQ(ref->id.value(), ResourceId(0x7f020000));
+ EXPECT_EQ(ResourceId(0x7f020000), ref->id.value());
xml_attr = view_el->FindAttribute(xml::kSchemaAndroid, "text");
- ASSERT_NE(xml_attr, nullptr);
+ ASSERT_NE(nullptr, xml_attr);
AAPT_ASSERT_TRUE(xml_attr->compiled_attribute);
ASSERT_FALSE(xml_attr->compiled_value); // Strings don't get compiled for memory sake.
+ xml_attr = view_el->FindAttribute(xml::kSchemaAndroid, "attr");
+ ASSERT_NE(nullptr, xml_attr);
+ AAPT_ASSERT_TRUE(xml_attr->compiled_attribute);
+ ASSERT_FALSE(xml_attr->compiled_value); // Should be a plain string.
+
xml_attr = view_el->FindAttribute("", "nonAaptAttr");
ASSERT_NE(nullptr, xml_attr);
AAPT_ASSERT_FALSE(xml_attr->compiled_attribute);
@@ -131,9 +137,9 @@
ASSERT_NE(nullptr, ValueCast<Reference>(xml_attr->compiled_value.get()));
xml_attr = view_el->FindAttribute("", "class");
- ASSERT_NE(xml_attr, nullptr);
+ ASSERT_NE(nullptr, xml_attr);
AAPT_ASSERT_FALSE(xml_attr->compiled_attribute);
- ASSERT_EQ(xml_attr->compiled_value, nullptr);
+ ASSERT_EQ(nullptr, xml_attr->compiled_value);
}
TEST_F(XmlReferenceLinkerTest, PrivateSymbolsAreNotLinked) {
diff --git a/tools/aapt2/process/IResourceTableConsumer.h b/tools/aapt2/process/IResourceTableConsumer.h
index 4526a79..30dad802 100644
--- a/tools/aapt2/process/IResourceTableConsumer.h
+++ b/tools/aapt2/process/IResourceTableConsumer.h
@@ -32,9 +32,17 @@
class ResourceTable;
class SymbolTable;
+// The type of package to build.
+enum class PackageType {
+ kApp,
+ kSharedLib,
+ kStaticLib,
+};
+
struct IAaptContext {
virtual ~IAaptContext() = default;
+ virtual PackageType GetPackageType() = 0;
virtual SymbolTable* GetExternalSymbols() = 0;
virtual IDiagnostics* GetDiagnostics() = 0;
virtual const std::string& GetCompilationPackage() = 0;
diff --git a/tools/aapt2/process/SymbolTable.cpp b/tools/aapt2/process/SymbolTable.cpp
index bcafbca..1a648bf 100644
--- a/tools/aapt2/process/SymbolTable.cpp
+++ b/tools/aapt2/process/SymbolTable.cpp
@@ -34,6 +34,21 @@
namespace aapt {
+SymbolTable::SymbolTable(NameMangler* mangler)
+ : mangler_(mangler),
+ delegate_(util::make_unique<DefaultSymbolTableDelegate>()),
+ cache_(200),
+ id_cache_(200) {
+}
+
+void SymbolTable::SetDelegate(std::unique_ptr<ISymbolTableDelegate> delegate) {
+ CHECK(delegate != nullptr) << "can't set a nullptr delegate";
+ delegate_ = std::move(delegate);
+
+ // Clear the cache in case this delegate changes the order of lookup.
+ cache_.clear();
+}
+
void SymbolTable::AppendSource(std::unique_ptr<ISymbolSource> source) {
sources_.push_back(std::move(source));
@@ -75,28 +90,27 @@
mangled_name = &mangled_name_impl.value();
}
- for (auto& symbolSource : sources_) {
- std::unique_ptr<Symbol> symbol = symbolSource->FindByName(*mangled_name);
- if (symbol) {
- // Take ownership of the symbol into a shared_ptr. We do this because
- // LruCache doesn't support unique_ptr.
- std::shared_ptr<Symbol> shared_symbol(std::move(symbol));
-
- // Since we look in the cache with the unmangled, but package prefixed
- // name, we must put the same name into the cache.
- cache_.put(*name_with_package, shared_symbol);
-
- if (shared_symbol->id) {
- // The symbol has an ID, so we can also cache this!
- id_cache_.put(shared_symbol->id.value(), shared_symbol);
- }
-
- // Returns the raw pointer. Callers are not expected to hold on to this
- // between calls to Find*.
- return shared_symbol.get();
- }
+ std::unique_ptr<Symbol> symbol = delegate_->FindByName(*mangled_name, sources_);
+ if (symbol == nullptr) {
+ return nullptr;
}
- return nullptr;
+
+ // Take ownership of the symbol into a shared_ptr. We do this because
+ // LruCache doesn't support unique_ptr.
+ std::shared_ptr<Symbol> shared_symbol(std::move(symbol));
+
+ // Since we look in the cache with the unmangled, but package prefixed
+ // name, we must put the same name into the cache.
+ cache_.put(*name_with_package, shared_symbol);
+
+ if (shared_symbol->id) {
+ // The symbol has an ID, so we can also cache this!
+ id_cache_.put(shared_symbol->id.value(), shared_symbol);
+ }
+
+ // Returns the raw pointer. Callers are not expected to hold on to this
+ // between calls to Find*.
+ return shared_symbol.get();
}
const SymbolTable::Symbol* SymbolTable::FindById(const ResourceId& id) {
@@ -105,20 +119,19 @@
}
// We did not find it in the cache, so look through the sources.
- for (auto& symbolSource : sources_) {
- std::unique_ptr<Symbol> symbol = symbolSource->FindById(id);
- if (symbol) {
- // Take ownership of the symbol into a shared_ptr. We do this because LruCache
- // doesn't support unique_ptr.
- std::shared_ptr<Symbol> shared_symbol(std::move(symbol));
- id_cache_.put(id, shared_symbol);
-
- // Returns the raw pointer. Callers are not expected to hold on to this
- // between calls to Find*.
- return shared_symbol.get();
- }
+ std::unique_ptr<Symbol> symbol = delegate_->FindById(id, sources_);
+ if (symbol == nullptr) {
+ return nullptr;
}
- return nullptr;
+
+ // Take ownership of the symbol into a shared_ptr. We do this because LruCache
+ // doesn't support unique_ptr.
+ std::shared_ptr<Symbol> shared_symbol(std::move(symbol));
+ id_cache_.put(id, shared_symbol);
+
+ // Returns the raw pointer. Callers are not expected to hold on to this
+ // between calls to Find*.
+ return shared_symbol.get();
}
const SymbolTable::Symbol* SymbolTable::FindByReference(const Reference& ref) {
@@ -140,6 +153,28 @@
return symbol;
}
+std::unique_ptr<SymbolTable::Symbol> DefaultSymbolTableDelegate::FindByName(
+ const ResourceName& name, const std::vector<std::unique_ptr<ISymbolSource>>& sources) {
+ for (auto& source : sources) {
+ std::unique_ptr<SymbolTable::Symbol> symbol = source->FindByName(name);
+ if (symbol) {
+ return symbol;
+ }
+ }
+ return {};
+}
+
+std::unique_ptr<SymbolTable::Symbol> DefaultSymbolTableDelegate::FindById(
+ ResourceId id, const std::vector<std::unique_ptr<ISymbolSource>>& sources) {
+ for (auto& source : sources) {
+ std::unique_ptr<SymbolTable::Symbol> symbol = source->FindById(id);
+ if (symbol) {
+ return symbol;
+ }
+ }
+ return {};
+}
+
std::unique_ptr<SymbolTable::Symbol> ResourceTableSymbolSource::FindByName(
const ResourceName& name) {
Maybe<ResourceTable::SearchResult> result = table_->FindResource(name);
diff --git a/tools/aapt2/process/SymbolTable.h b/tools/aapt2/process/SymbolTable.h
index 298da4d..bd252d2 100644
--- a/tools/aapt2/process/SymbolTable.h
+++ b/tools/aapt2/process/SymbolTable.h
@@ -47,6 +47,7 @@
}
class ISymbolSource;
+class ISymbolTableDelegate;
class NameMangler;
class SymbolTable {
@@ -73,7 +74,11 @@
bool is_public = false;
};
- SymbolTable(NameMangler* mangler) : mangler_(mangler), cache_(200), id_cache_(200) {}
+ SymbolTable(NameMangler* mangler);
+
+ // Overrides the default ISymbolTableDelegate, which allows a custom defined strategy for
+ // looking up resources from a set of sources.
+ void SetDelegate(std::unique_ptr<ISymbolTableDelegate> delegate);
// Appends a symbol source. The cache is not cleared since entries that
// have already been found would take precedence due to ordering.
@@ -99,6 +104,7 @@
private:
NameMangler* mangler_;
+ std::unique_ptr<ISymbolTableDelegate> delegate_;
std::vector<std::unique_ptr<ISymbolSource>> sources_;
// We use shared_ptr because unique_ptr is not supported and
@@ -109,11 +115,41 @@
DISALLOW_COPY_AND_ASSIGN(SymbolTable);
};
-/**
- * An interface that a symbol source implements in order to surface symbol
- * information
- * to the symbol table.
- */
+// Allows the customization of the lookup strategy/order of a symbol from a set of
+// symbol sources.
+class ISymbolTableDelegate {
+ public:
+ ISymbolTableDelegate() = default;
+ virtual ~ISymbolTableDelegate() = default;
+
+ // The name is already mangled and does not need further processing.
+ virtual std::unique_ptr<SymbolTable::Symbol> FindByName(
+ const ResourceName& name, const std::vector<std::unique_ptr<ISymbolSource>>& sources) = 0;
+
+ virtual std::unique_ptr<SymbolTable::Symbol> FindById(
+ ResourceId id, const std::vector<std::unique_ptr<ISymbolSource>>& sources) = 0;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ISymbolTableDelegate);
+};
+
+class DefaultSymbolTableDelegate : public ISymbolTableDelegate {
+ public:
+ DefaultSymbolTableDelegate() = default;
+ virtual ~DefaultSymbolTableDelegate() = default;
+
+ virtual std::unique_ptr<SymbolTable::Symbol> FindByName(
+ const ResourceName& name,
+ const std::vector<std::unique_ptr<ISymbolSource>>& sources) override;
+ virtual std::unique_ptr<SymbolTable::Symbol> FindById(
+ ResourceId id, const std::vector<std::unique_ptr<ISymbolSource>>& sources) override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(DefaultSymbolTableDelegate);
+};
+
+// An interface that a symbol source implements in order to surface symbol information
+// to the symbol table.
class ISymbolSource {
public:
virtual ~ISymbolSource() = default;
@@ -122,9 +158,7 @@
const ResourceName& name) = 0;
virtual std::unique_ptr<SymbolTable::Symbol> FindById(ResourceId id) = 0;
- /**
- * Default implementation tries the name if it exists, else the ID.
- */
+ // Default implementation tries the name if it exists, else the ID.
virtual std::unique_ptr<SymbolTable::Symbol> FindByReference(
const Reference& ref) {
if (ref.name) {
@@ -136,11 +170,9 @@
}
};
-/**
- * Exposes the resources in a ResourceTable as symbols for SymbolTable.
- * Instances of this class must outlive the encompassed ResourceTable.
- * Lookups by ID are ignored.
- */
+// Exposes the resources in a ResourceTable as symbols for SymbolTable.
+// Instances of this class must outlive the encompassed ResourceTable.
+// Lookups by ID are ignored.
class ResourceTableSymbolSource : public ISymbolSource {
public:
explicit ResourceTableSymbolSource(ResourceTable* table) : table_(table) {}
diff --git a/tools/aapt2/readme.md b/tools/aapt2/readme.md
index daf1ebc..0291720 100644
--- a/tools/aapt2/readme.md
+++ b/tools/aapt2/readme.md
@@ -1,5 +1,19 @@
# Android Asset Packaging Tool 2.0 (AAPT2) release notes
+## Version 2.14
+### `aapt2 link ...`
+- If an app is building with a minSdkVersion < 26 and a --package-id XX where XX > 7F, aapt2
+ will automatically convert any 'id' resource references from the resource ID 0xPPTTEEEE to
+ 0x7FPPEEEE.
+- This is done to workaround a bug in previous versions of the platform that would validate
+ a resource ID by assuming it is larger than 0. In Java, a resource ID with package ID greater
+ than 0x7F is interpreted as a negative number, causing valid feature split IDs like 0x80010000
+ to fail the check.
+- '@id/foo' resources are just sentinel values and do not actually need to resolve to anything.
+ Rewriting these resource IDs to use the package ID 7F while maintaining their definitions under
+ the original package ID is safe. Collisions against the base APK are checked to ensure these
+ rewritten IDs to not overlap with the base.
+
## Version 2.13
### `aapt2 optimize ...`
- aapt2 optimize can now split a binary APK with the same --split parameters as the link
diff --git a/tools/aapt2/test/Context.h b/tools/aapt2/test/Context.h
index 557cd1b..0564db0 100644
--- a/tools/aapt2/test/Context.h
+++ b/tools/aapt2/test/Context.h
@@ -35,31 +35,58 @@
public:
Context() : name_mangler_({}), symbols_(&name_mangler_), min_sdk_version_(0) {}
- SymbolTable* GetExternalSymbols() override { return &symbols_; }
+ PackageType GetPackageType() override {
+ return package_type_;
+ }
- IDiagnostics* GetDiagnostics() override { return &diagnostics_; }
+ SymbolTable* GetExternalSymbols() override {
+ return &symbols_;
+ }
+
+ IDiagnostics* GetDiagnostics() override {
+ return &diagnostics_;
+ }
const std::string& GetCompilationPackage() override {
CHECK(bool(compilation_package_)) << "package name not set";
return compilation_package_.value();
}
+ void SetCompilationPackage(const android::StringPiece& package) {
+ compilation_package_ = package.to_string();
+ }
+
uint8_t GetPackageId() override {
CHECK(bool(package_id_)) << "package ID not set";
return package_id_.value();
}
- NameMangler* GetNameMangler() override { return &name_mangler_; }
+ void SetPackageId(uint8_t package_id) {
+ package_id_ = package_id;
+ }
- bool IsVerbose() override { return false; }
+ NameMangler* GetNameMangler() override {
+ return &name_mangler_;
+ }
- int GetMinSdkVersion() override { return min_sdk_version_; }
+ void SetNameManglerPolicy(const NameManglerPolicy& policy) {
+ name_mangler_ = NameMangler(policy);
+ }
+
+ bool IsVerbose() override {
+ return false;
+ }
+
+ int GetMinSdkVersion() override {
+ return min_sdk_version_;
+ }
private:
DISALLOW_COPY_AND_ASSIGN(Context);
friend class ContextBuilder;
+ PackageType package_type_ = PackageType::kApp;
Maybe<std::string> compilation_package_;
Maybe<uint8_t> package_id_;
StdErrDiagnostics diagnostics_;
@@ -70,6 +97,11 @@
class ContextBuilder {
public:
+ ContextBuilder& SetPackageType(PackageType type) {
+ context_->package_type_ = type;
+ return *this;
+ }
+
ContextBuilder& SetCompilationPackage(const android::StringPiece& package) {
context_->compilation_package_ = package.to_string();
return *this;
@@ -123,15 +155,16 @@
return *this;
}
- std::unique_ptr<ISymbolSource> Build() { return std::move(symbol_source_); }
+ std::unique_ptr<ISymbolSource> Build() {
+ return std::move(symbol_source_);
+ }
private:
class StaticSymbolSource : public ISymbolSource {
public:
StaticSymbolSource() = default;
- std::unique_ptr<SymbolTable::Symbol> FindByName(
- const ResourceName& name) override {
+ std::unique_ptr<SymbolTable::Symbol> FindByName(const ResourceName& name) override {
auto iter = name_map_.find(name);
if (iter != name_map_.end()) {
return CloneSymbol(iter->second);
@@ -153,12 +186,10 @@
private:
std::unique_ptr<SymbolTable::Symbol> CloneSymbol(SymbolTable::Symbol* sym) {
- std::unique_ptr<SymbolTable::Symbol> clone =
- util::make_unique<SymbolTable::Symbol>();
+ std::unique_ptr<SymbolTable::Symbol> clone = util::make_unique<SymbolTable::Symbol>();
clone->id = sym->id;
if (sym->attribute) {
- clone->attribute =
- std::unique_ptr<Attribute>(sym->attribute->Clone(nullptr));
+ clone->attribute = std::unique_ptr<Attribute>(sym->attribute->Clone(nullptr));
}
clone->is_public = sym->is_public;
return clone;
@@ -167,8 +198,7 @@
DISALLOW_COPY_AND_ASSIGN(StaticSymbolSource);
};
- std::unique_ptr<StaticSymbolSource> symbol_source_ =
- util::make_unique<StaticSymbolSource>();
+ std::unique_ptr<StaticSymbolSource> symbol_source_ = util::make_unique<StaticSymbolSource>();
};
} // namespace test
diff --git a/tools/aapt2/unflatten/BinaryResourceParser.cpp b/tools/aapt2/unflatten/BinaryResourceParser.cpp
index 20a4531..f311670 100644
--- a/tools/aapt2/unflatten/BinaryResourceParser.cpp
+++ b/tools/aapt2/unflatten/BinaryResourceParser.cpp
@@ -22,6 +22,7 @@
#include "android-base/logging.h"
#include "android-base/macros.h"
+#include "android-base/stringprintf.h"
#include "androidfw/ResourceTypes.h"
#include "androidfw/TypeWrappers.h"
@@ -37,6 +38,8 @@
using namespace android;
+using android::base::StringPrintf;
+
namespace {
/*
@@ -87,26 +90,35 @@
bool BinaryResourceParser::Parse() {
ResChunkPullParser parser(data_, data_len_);
- bool error = false;
- while (ResChunkPullParser::IsGoodEvent(parser.Next())) {
- if (parser.chunk()->type != android::RES_TABLE_TYPE) {
- context_->GetDiagnostics()->Warn(DiagMessage(source_)
- << "unknown chunk of type '"
- << (int)parser.chunk()->type << "'");
- continue;
- }
-
- if (!ParseTable(parser.chunk())) {
- error = true;
- }
- }
-
- if (parser.event() == ResChunkPullParser::Event::kBadDocument) {
- context_->GetDiagnostics()->Error(
- DiagMessage(source_) << "corrupt resource table: " << parser.error());
+ if (!ResChunkPullParser::IsGoodEvent(parser.Next())) {
+ context_->GetDiagnostics()->Error(DiagMessage(source_)
+ << "corrupt resources.arsc: " << parser.error());
return false;
}
- return !error;
+
+ if (parser.chunk()->type != android::RES_TABLE_TYPE) {
+ context_->GetDiagnostics()->Error(DiagMessage(source_)
+ << StringPrintf("unknown chunk of type 0x%02x",
+ (int)parser.chunk()->type));
+ return false;
+ }
+
+ if (!ParseTable(parser.chunk())) {
+ return false;
+ }
+
+ if (parser.Next() != ResChunkPullParser::Event::kEndDocument) {
+ if (parser.event() == ResChunkPullParser::Event::kBadDocument) {
+ context_->GetDiagnostics()->Warn(
+ DiagMessage(source_) << "invalid chunk trailing RES_TABLE_TYPE: " << parser.error());
+ } else {
+ context_->GetDiagnostics()->Warn(
+ DiagMessage(source_) << StringPrintf(
+ "unexpected chunk of type 0x%02x trailing RES_TABLE_TYPE",
+ (int)parser.chunk()->type));
+ }
+ }
+ return true;
}
/**
@@ -427,11 +439,10 @@
if (file_ref != nullptr) {
file_ref->file = files_->FindFile(*file_ref->path);
if (file_ref->file == nullptr) {
- context_->GetDiagnostics()->Error(DiagMessage() << "resource " << name << " for config '"
+ context_->GetDiagnostics()->Warn(DiagMessage() << "resource " << name << " for config '"
<< config << "' is a file reference to '"
<< *file_ref->path
<< "' but no such path exists");
- return {};
}
}
}
diff --git a/tools/aapt2/unflatten/ResChunkPullParser.cpp b/tools/aapt2/unflatten/ResChunkPullParser.cpp
index 5d71ff3..8d92bd9 100644
--- a/tools/aapt2/unflatten/ResChunkPullParser.cpp
+++ b/tools/aapt2/unflatten/ResChunkPullParser.cpp
@@ -16,9 +16,11 @@
#include "unflatten/ResChunkPullParser.h"
+#include <inttypes.h>
#include <cstddef>
#include "android-base/logging.h"
+#include "android-base/stringprintf.h"
#include "androidfw/ResourceTypes.h"
#include "util/Util.h"
@@ -26,6 +28,13 @@
namespace aapt {
using android::ResChunk_header;
+using android::base::StringPrintf;
+
+static std::string ChunkHeaderDump(const ResChunk_header* header) {
+ return StringPrintf("(type=%02" PRIx16 " header_size=%" PRIu16 " size=%" PRIu32 ")",
+ util::DeviceToHost16(header->type), util::DeviceToHost16(header->headerSize),
+ util::DeviceToHost32(header->size));
+}
ResChunkPullParser::Event ResChunkPullParser::Next() {
if (!IsGoodEvent(event_)) {
@@ -53,18 +62,17 @@
return (event_ = Event::kBadDocument);
}
- if (util::DeviceToHost16(current_chunk_->headerSize) <
- sizeof(ResChunk_header)) {
+ if (util::DeviceToHost16(current_chunk_->headerSize) < sizeof(ResChunk_header)) {
error_ = "chunk has too small header";
current_chunk_ = nullptr;
return (event_ = Event::kBadDocument);
} else if (util::DeviceToHost32(current_chunk_->size) <
util::DeviceToHost16(current_chunk_->headerSize)) {
- error_ = "chunk's total size is smaller than header";
+ error_ = "chunk's total size is smaller than header " + ChunkHeaderDump(current_chunk_);
current_chunk_ = nullptr;
return (event_ = Event::kBadDocument);
} else if (offset + util::DeviceToHost32(current_chunk_->size) > len_) {
- error_ = "chunk's data extends past the end of the document";
+ error_ = "chunk's data extends past the end of the document " + ChunkHeaderDump(current_chunk_);
current_chunk_ = nullptr;
return (event_ = Event::kBadDocument);
}
diff --git a/tools/aapt2/xml/XmlDom.cpp b/tools/aapt2/xml/XmlDom.cpp
index 6055190..98f5f1d 100644
--- a/tools/aapt2/xml/XmlDom.cpp
+++ b/tools/aapt2/xml/XmlDom.cpp
@@ -42,7 +42,6 @@
std::stack<xml::Node*> node_stack;
std::string pending_comment;
std::unique_ptr<xml::Text> last_text_node;
- util::StringBuilder pending_text;
};
/**
@@ -66,14 +65,12 @@
static void FinishPendingText(Stack* stack) {
if (stack->last_text_node != nullptr) {
- if (!stack->pending_text.IsEmpty()) {
- stack->last_text_node->text = stack->pending_text.ToString();
- stack->pending_text = {};
+ if (!stack->last_text_node->text.empty()) {
stack->node_stack.top()->AppendChild(std::move(stack->last_text_node));
} else {
// Drop an empty text node.
- stack->last_text_node = nullptr;
}
+ stack->last_text_node = nullptr;
}
}
@@ -138,13 +135,11 @@
while (*attrs) {
Attribute attribute;
SplitName(*attrs++, &attribute.namespace_uri, &attribute.name);
- util::StringBuilder builder;
- builder.Append(*attrs++);
- attribute.value = builder.ToString();
+ attribute.value = *attrs++;
// Insert in sorted order.
- auto iter = std::lower_bound(el->attributes.begin(), el->attributes.end(),
- attribute, less_attribute);
+ auto iter = std::lower_bound(el->attributes.begin(), el->attributes.end(), attribute,
+ less_attribute);
el->attributes.insert(iter, std::move(attribute));
}
@@ -173,14 +168,14 @@
// See if we can just append the text to a previous text node.
if (stack->last_text_node != nullptr) {
- stack->pending_text.Append(str);
+ stack->last_text_node->text.append(str.data(), str.size());
return;
}
stack->last_text_node = util::make_unique<Text>();
stack->last_text_node->line_number = XML_GetCurrentLineNumber(parser);
stack->last_text_node->column_number = XML_GetCurrentColumnNumber(parser);
- stack->pending_text.Append(str);
+ stack->last_text_node->text = str.to_string();
}
static void XMLCALL CommentDataHandler(void* user_data, const char* comment) {
diff --git a/tools/aapt2/xml/XmlDom_test.cpp b/tools/aapt2/xml/XmlDom_test.cpp
index 0fc3cec6..fb18ea3 100644
--- a/tools/aapt2/xml/XmlDom_test.cpp
+++ b/tools/aapt2/xml/XmlDom_test.cpp
@@ -49,23 +49,26 @@
EXPECT_EQ(ns->namespace_prefix, "android");
}
-TEST(XmlDomTest, HandleEscapes) {
- std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(
- R"EOF(<shortcode pattern="\\d{5}">\\d{5}</shortcode>)EOF");
+// Escaping is handled after parsing of the values for resource-specific values.
+TEST(XmlDomTest, ForwardEscapes) {
+ std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"EOF(
+ <element value="\?hello" pattern="\\d{5}">\\d{5}</element>)EOF");
xml::Element* el = xml::FindRootElement(doc->root.get());
ASSERT_NE(nullptr, el);
xml::Attribute* attr = el->FindAttribute({}, "pattern");
ASSERT_NE(nullptr, attr);
+ EXPECT_EQ("\\\\d{5}", attr->value);
- EXPECT_EQ("\\d{5}", attr->value);
+ attr = el->FindAttribute({}, "value");
+ ASSERT_NE(nullptr, attr);
+ EXPECT_EQ("\\?hello", attr->value);
ASSERT_EQ(1u, el->children.size());
-
xml::Text* text = xml::NodeCast<xml::Text>(el->children[0].get());
ASSERT_NE(nullptr, text);
- EXPECT_EQ("\\d{5}", text->text);
+ EXPECT_EQ("\\\\d{5}", text->text);
}
} // namespace aapt
diff --git a/tools/apilint/apilint.py b/tools/apilint/apilint.py
index 3fedea2..53501f9 100644
--- a/tools/apilint/apilint.py
+++ b/tools/apilint/apilint.py
@@ -259,14 +259,19 @@
def verify_constants(clazz):
"""All static final constants must be FOO_NAME style."""
if re.match("android\.R\.[a-z]+", clazz.fullname): return
+ if clazz.fullname.startswith("android.os.Build"): return
+ if clazz.fullname == "android.system.OsConstants": return
+ req = ["java.lang.String","byte","short","int","long","float","double","boolean","char"]
for f in clazz.fields:
if "static" in f.split and "final" in f.split:
if re.match("[A-Z0-9_]+", f.name) is None:
error(clazz, f, "C2", "Constant field names must be FOO_NAME")
- elif f.typ != "java.lang.String":
+ if f.typ != "java.lang.String":
if f.name.startswith("MIN_") or f.name.startswith("MAX_"):
warn(clazz, f, "C8", "If min/max could change in future, make them dynamic methods")
+ if f.typ in req and f.value is None:
+ error(clazz, f, None, "All constants must be defined at compile time")
def verify_enums(clazz):
@@ -352,6 +357,7 @@
if f.value is None: continue
if f.name.startswith("EXTRA_"): continue
if f.name == "SERVICE_INTERFACE" or f.name == "PROVIDER_INTERFACE": continue
+ if "INTERACTION" in f.name: continue
if "static" in f.split and "final" in f.split and f.typ == "java.lang.String":
if "_ACTION" in f.name or "ACTION_" in f.name or ".action." in f.value.lower():
@@ -447,10 +453,14 @@
"android.app.Notification",
"android.content.pm.ActivityInfo",
"android.content.pm.ApplicationInfo",
+ "android.content.pm.ComponentInfo",
+ "android.content.pm.ResolveInfo",
"android.content.pm.FeatureGroupInfo",
"android.content.pm.InstrumentationInfo",
"android.content.pm.PackageInfo",
"android.content.pm.PackageItemInfo",
+ "android.content.res.Configuration",
+ "android.graphics.BitmapFactory.Options",
"android.os.Message",
"android.system.StructPollfd",
]
@@ -786,6 +796,10 @@
for c in clazz.ctors:
error(clazz, c, None, "Managers must always be obtained from Context; no direct constructors")
+ for m in clazz.methods:
+ if m.typ == clazz.fullname:
+ error(clazz, m, None, "Managers must always be obtained from Context")
+
def verify_boxed(clazz):
"""Verifies that methods avoid boxed primitives."""
@@ -812,17 +826,19 @@
def verify_static_utils(clazz):
"""Verifies that helper classes can't be constructed."""
if clazz.fullname.startswith("android.opengl"): return
- if re.match("android\.R\.[a-z]+", clazz.fullname): return
+ if clazz.fullname.startswith("android.R"): return
- if len(clazz.fields) > 0: return
- if len(clazz.methods) == 0: return
+ # Only care about classes with default constructors
+ if len(clazz.ctors) == 1 and len(clazz.ctors[0].args) == 0:
+ test = []
+ test.extend(clazz.fields)
+ test.extend(clazz.methods)
- for m in clazz.methods:
- if "static" not in m.split:
- return
+ if len(test) == 0: return
+ for t in test:
+ if "static" not in t.split:
+ return
- # At this point, we have no fields, and all methods are static
- if len(clazz.ctors) > 0:
error(clazz, None, None, "Fully-static utility classes must not have constructor")
@@ -920,6 +936,9 @@
if len(m.args) > 1 and m.args[0] != "android.content.Context":
if "android.content.Context" in m.args[1:]:
error(clazz, m, "M3", "Context is distinct, so it must be the first argument")
+ if len(m.args) > 1 and m.args[0] != "android.content.ContentResolver":
+ if "android.content.ContentResolver" in m.args[1:]:
+ error(clazz, m, "M3", "ContentResolver is distinct, so it must be the first argument")
def verify_listener_last(clazz):
@@ -1001,6 +1020,112 @@
warn(clazz, None, None, "Abstract inner classes should be static to improve testability")
+def verify_runtime_exceptions(clazz):
+ """Verifies that runtime exceptions aren't listed in throws."""
+
+ banned = [
+ "java.lang.NullPointerException",
+ "java.lang.ClassCastException",
+ "java.lang.IndexOutOfBoundsException",
+ "java.lang.reflect.UndeclaredThrowableException",
+ "java.lang.reflect.MalformedParametersException",
+ "java.lang.reflect.MalformedParameterizedTypeException",
+ "java.lang.invoke.WrongMethodTypeException",
+ "java.lang.EnumConstantNotPresentException",
+ "java.lang.IllegalMonitorStateException",
+ "java.lang.SecurityException",
+ "java.lang.UnsupportedOperationException",
+ "java.lang.annotation.AnnotationTypeMismatchException",
+ "java.lang.annotation.IncompleteAnnotationException",
+ "java.lang.TypeNotPresentException",
+ "java.lang.IllegalStateException",
+ "java.lang.ArithmeticException",
+ "java.lang.IllegalArgumentException",
+ "java.lang.ArrayStoreException",
+ "java.lang.NegativeArraySizeException",
+ "java.util.MissingResourceException",
+ "java.util.EmptyStackException",
+ "java.util.concurrent.CompletionException",
+ "java.util.concurrent.RejectedExecutionException",
+ "java.util.IllformedLocaleException",
+ "java.util.ConcurrentModificationException",
+ "java.util.NoSuchElementException",
+ "java.io.UncheckedIOException",
+ "java.time.DateTimeException",
+ "java.security.ProviderException",
+ "java.nio.BufferUnderflowException",
+ "java.nio.BufferOverflowException",
+ ]
+
+ test = []
+ test.extend(clazz.ctors)
+ test.extend(clazz.methods)
+
+ for t in test:
+ if " throws " not in t.raw: continue
+ throws = t.raw[t.raw.index(" throws "):]
+ for b in banned:
+ if b in throws:
+ error(clazz, t, None, "Methods must not mention RuntimeException subclasses in throws clauses")
+
+
+def verify_error(clazz):
+ """Verifies that we always use Exception instead of Error."""
+ if not clazz.extends: return
+ if clazz.extends.endswith("Error"):
+ error(clazz, None, None, "Trouble must be reported through an Exception, not Error")
+ if clazz.extends.endswith("Exception") and not clazz.name.endswith("Exception"):
+ error(clazz, None, None, "Exceptions must be named FooException")
+
+
+def verify_units(clazz):
+ """Verifies that we use consistent naming for units."""
+
+ # If we find K, recommend replacing with V
+ bad = {
+ "Ns": "Nanos",
+ "Ms": "Millis or Micros",
+ "Sec": "Seconds", "Secs": "Seconds",
+ "Hr": "Hours", "Hrs": "Hours",
+ "Mo": "Months", "Mos": "Months",
+ "Yr": "Years", "Yrs": "Years",
+ "Byte": "Bytes", "Space": "Bytes",
+ }
+
+ for m in clazz.methods:
+ if m.typ not in ["short","int","long"]: continue
+ for k, v in bad.iteritems():
+ if m.name.endswith(k):
+ error(clazz, m, None, "Expected method name units to be " + v)
+ if m.name.endswith("Nanos") or m.name.endswith("Micros"):
+ warn(clazz, m, None, "Returned time values are strongly encouraged to be in milliseconds unless you need the extra precision")
+ if m.name.endswith("Seconds"):
+ error(clazz, m, None, "Returned time values must be in milliseconds")
+
+ for m in clazz.methods:
+ typ = m.typ
+ if typ == "void":
+ if len(m.args) != 1: continue
+ typ = m.args[0]
+
+ if m.name.endswith("Fraction") and typ != "float":
+ error(clazz, m, None, "Fractions must use floats")
+ if m.name.endswith("Percentage") and typ != "int":
+ error(clazz, m, None, "Percentage must use ints")
+
+
+def verify_closable(clazz):
+ """Verifies that classes are AutoClosable."""
+ if "implements java.lang.AutoCloseable" in clazz.raw: return
+ if "implements java.io.Closeable" in clazz.raw: return
+
+ for m in clazz.methods:
+ if len(m.args) > 0: continue
+ if m.name in ["close","release","destroy","finish","finalize","disconnect","shutdown","stop","free","quit"]:
+ warn(clazz, m, None, "Classes that release resources should implement AutoClosable and CloseGuard")
+ return
+
+
def examine_clazz(clazz):
"""Find all style issues in the given class."""
if clazz.pkg.name.startswith("java"): return
@@ -1048,6 +1173,10 @@
verify_files(clazz)
verify_manager_list(clazz)
verify_abstract_inner(clazz)
+ verify_runtime_exceptions(clazz)
+ verify_error(clazz)
+ verify_units(clazz)
+ verify_closable(clazz)
def examine_stream(stream):
diff --git a/tools/fonts/fontchain_lint.py b/tools/fonts/fontchain_lint.py
index f5b9042..c0475ee 100755
--- a/tools/fonts/fontchain_lint.py
+++ b/tools/fonts/fontchain_lint.py
@@ -428,7 +428,8 @@
_text_variation_sequences, _emoji_variation_sequences = sequences
_emoji_sequences = parse_unicode_datafile(
path.join(ucd_path, 'emoji-sequences.txt'))
-
+ _emoji_sequences.update(parse_unicode_datafile(
+ path.join(ucd_path, 'additions', 'emoji-sequences.txt')))
_emoji_zwj_sequences = parse_unicode_datafile(
path.join(ucd_path, 'emoji-zwj-sequences.txt'))
_emoji_zwj_sequences.update(parse_unicode_datafile(
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java
index 339019d..ed428ec 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java
@@ -18,6 +18,7 @@
import android.os.IBinder;
import android.os.IPowerManager;
+import android.os.PowerManager;
import android.os.PowerSaveState;
import android.os.RemoteException;
import android.os.WorkSource;
@@ -170,4 +171,9 @@
public boolean isScreenBrightnessBoosted() throws RemoteException {
return false;
}
+
+ @Override
+ public int getLastShutdownReason() {
+ return PowerManager.SHUTDOWN_REASON_UNKNOWN;
+ }
}
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index 229aa97..faae90b 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -81,7 +81,7 @@
boolean disableNetwork(int netId);
- void startScan(in ScanSettings requested, in WorkSource ws);
+ void startScan(in ScanSettings requested, in WorkSource ws, in String packageName);
List<ScanResult> getScanResults(String callingPackage);
@@ -125,10 +125,20 @@
void setWifiApEnabled(in WifiConfiguration wifiConfig, boolean enable);
+ void updateInterfaceIpState(String ifaceName, int mode);
+
boolean startSoftAp(in WifiConfiguration wifiConfig);
boolean stopSoftAp();
+ WifiConfiguration startLocalOnlyHotspot(in Messenger messenger, in IBinder binder);
+
+ void stopLocalOnlyHotspot();
+
+ void startWatchLocalOnlyHotspot(in Messenger messenger, in IBinder binder);
+
+ void stopWatchLocalOnlyHotspot();
+
int getWifiApEnabledState();
WifiConfiguration getWifiApConfiguration();
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 7defa7c..e31a74b 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -228,9 +228,9 @@
*/
public int networkId;
+ // Fixme We need remove this field to use only Quality network selection status only
/**
* The current status of this network configuration entry.
- * Fixme We need remove this field to use only Quality network selection status only
* @see Status
*/
public int status;
@@ -238,8 +238,8 @@
/**
* The network's SSID. Can either be an ASCII string,
* which must be enclosed in double quotation marks
- * (e.g., {@code "MyNetwork"}, or a string of
- * hex digits,which are not enclosed in quotes
+ * (e.g., {@code "MyNetwork"}), or a string of
+ * hex digits, which are not enclosed in quotes
* (e.g., {@code 01a243f405}).
*/
public String SSID;
@@ -290,9 +290,10 @@
* string otherwise.
*/
public String preSharedKey;
+
/**
* Up to four WEP keys. Either an ASCII string enclosed in double
- * quotation marks (e.g., {@code "abcdef"} or a string
+ * quotation marks (e.g., {@code "abcdef"}) or a string
* of hex digits (e.g., {@code 0102030405}).
* <p/>
* When the value of one of these keys is read, the actual key is
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index ed54c3b..8fbf472 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -20,7 +20,6 @@
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi;
-import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.pm.ParceledListSlice;
import android.net.ConnectivityManager;
@@ -41,14 +40,19 @@
import android.util.Log;
import android.util.SparseArray;
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.AsyncChannel;
import com.android.internal.util.Protocol;
import com.android.server.net.NetworkPinner;
+import dalvik.system.CloseGuard;
+
+import java.lang.ref.WeakReference;
import java.net.InetAddress;
+import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
-import java.util.Collections;
/**
* This class provides the primary API for managing all aspects of Wi-Fi
@@ -363,7 +367,7 @@
/**
* The look up key for an int that indicates why softAP started failed
* currently support general and no_channel
- * @see #SAP_START_FAILURE_GENERAL
+ * @see #SAP_START_FAILURE_GENERIC
* @see #SAP_START_FAILURE_NO_CHANNEL
*
* @hide
@@ -446,6 +450,35 @@
* @hide
*/
public static final int SAP_START_FAILURE_NO_CHANNEL = 1;
+
+ /**
+ * Interface IP mode for configuration error.
+ *
+ * @see updateInterfaceIpState(String, int)
+ *
+ * @hide
+ */
+ public static final int IFACE_IP_MODE_CONFIGURATION_ERROR = 0;
+
+ /**
+ * Interface IP mode for tethering.
+ *
+ * @see updateInterfaceIpState(String, int)
+ *
+ * @hide
+ */
+ public static final int IFACE_IP_MODE_TETHERED = 1;
+
+ /**
+ * Interface IP mode for Local Only Hotspot.
+ *
+ * @see updateInterfaceIpState(String, int)
+ *
+ * @hide
+ */
+ public static final int IFACE_IP_MODE_LOCAL_ONLY = 2;
+
+
/**
* Broadcast intent action indicating that a connection to the supplicant has
* been established (and it is now possible
@@ -820,6 +853,22 @@
private CountDownLatch mConnected;
private Looper mLooper;
+ /* LocalOnlyHotspot callback message types */
+ /** @hide */
+ public static final int HOTSPOT_STARTED = 0;
+ /** @hide */
+ public static final int HOTSPOT_STOPPED = 1;
+ /** @hide */
+ public static final int HOTSPOT_FAILED = 2;
+ /** @hide */
+ public static final int HOTSPOT_OBSERVER_REGISTERED = 3;
+
+ private final Object mLock = new Object(); // lock guarding access to the following vars
+ @GuardedBy("mLock")
+ private LocalOnlyHotspotCallbackProxy mLOHSCallbackProxy;
+ @GuardedBy("mLock")
+ private LocalOnlyHotspotObserverProxy mLOHSObserverProxy;
+
/**
* Create a new WifiManager instance.
* Applications will almost always want to use
@@ -1429,19 +1478,15 @@
* @return {@code true} if the operation succeeded, i.e., the scan was initiated
*/
public boolean startScan() {
- try {
- mService.startScan(null, null);
- return true;
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return startScan(null);
}
/** @hide */
@SystemApi
public boolean startScan(WorkSource workSource) {
try {
- mService.startScan(null, workSource);
+ String packageName = mContext.getOpPackageName();
+ mService.startScan(null, workSource, packageName);
return true;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -1732,6 +1777,26 @@
}
/**
+ * Call allowing ConnectivityService to update WifiService with interface mode changes.
+ *
+ * The possible modes include: {@link IFACE_IP_MODE_TETHERED},
+ * {@link IFACE_IP_MODE_LOCAL_ONLY},
+ * {@link IFACE_IP_MODE_CONFIGURATION_ERROR}
+ *
+ * @param ifaceName String name of the updated interface
+ * @param mode int representing the new mode
+ *
+ * @hide
+ */
+ public void updateInterfaceIpState(String ifaceName, int mode) {
+ try {
+ mService.updateInterfaceIpState(ifaceName, mode);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Start SoftAp mode with the specified configuration.
* Note that starting in access point mode disables station
* mode operation
@@ -1765,6 +1830,182 @@
}
/**
+ * Request a local only hotspot that an application can use to communicate between co-located
+ * devices connected to the created WiFi hotspot. The network created by this method will not
+ * have Internet access. Each application can make a single request for the hotspot, but
+ * multiple applications could be requesting the hotspot at the same time. When multiple
+ * applications have successfully registered concurrently, they will be sharing the underlying
+ * hotspot. {@link LocalOnlyHotspotCallback#onStarted(LocalOnlyHotspotReservation)} is called
+ * when the hotspot is ready for use by the application.
+ * <p>
+ * Each application can make a single active call to this method. The {@link
+ * LocalOnlyHotspotCallback#onStarted(LocalOnlyHotspotReservation)} callback supplies the
+ * requestor with a {@link LocalOnlyHotspotReservation} that contains a
+ * {@link WifiConfiguration} with the SSID, security type and credentials needed to connect
+ * to the hotspot. Communicating this information is up to the application.
+ * <p>
+ * If the LocalOnlyHotspot cannot be created, the {@link LocalOnlyHotspotCallback#onFailed(int)}
+ * method will be called. Example failures include errors bringing up the network or if
+ * there is an incompatible operating mode. For example, if the user is currently using Wifi
+ * Tethering to provide an upstream to another device, LocalOnlyHotspot will not start due to
+ * an incompatible mode. The possible error codes include:
+ * {@link LocalOnlyHotspotCallback#ERROR_NO_CHANNEL},
+ * {@link LocalOnlyHotspotCallback#ERROR_GENERIC} and
+ * {@link LocalOnlyHotspotCallback#ERROR_INCOMPATIBLE_MODE}.
+ * <p>
+ * Internally, requests will be tracked to prevent the hotspot from being torn down while apps
+ * are still using it. The {@link LocalOnlyHotspotReservation} object passed in the {@link
+ * LocalOnlyHotspotCallback#onStarted(LocalOnlyHotspotReservation)} call should be closed when
+ * the LocalOnlyHotspot is no longer needed using {@link LocalOnlyHotspotReservation#close()}.
+ * Since the hotspot may be shared among multiple applications, removing the final registered
+ * application request will trigger the hotspot teardown. This means that applications should
+ * not listen to broadcasts containing wifi state to determine if the hotspot was stopped after
+ * they are done using it. Additionally, once {@link LocalOnlyHotspotReservation#close()} is
+ * called, applications will not receive callbacks of any kind.
+ * <p>
+ * Applications should be aware that the user may also stop the LocalOnlyHotspot through the
+ * Settings UI; it is not guaranteed to stay up as long as there is a requesting application.
+ * The requestors will be notified of this case via
+ * {@link LocalOnlyHotspotCallback#onStopped()}. Other cases may arise where the hotspot is
+ * torn down (Emergency mode, etc). Application developers should be aware that it can stop
+ * unexpectedly, but they will receive a notification if they have properly registered.
+ * <p>
+ * Applications should also be aware that this network will be shared with other applications.
+ * Applications are responsible for protecting their data on this network (e.g., TLS).
+ * <p>
+ * Applications need to have the following permissions to start LocalOnlyHotspot: {@link
+ * android.Manifest.permission#CHANGE_WIFI_STATE} and {@link
+ * android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION}. Callers without
+ * the permissions will trigger a {@link java.lang.SecurityException}.
+ * <p>
+ * @param callback LocalOnlyHotspotCallback for the application to receive updates about
+ * operating status.
+ * @param handler Handler to be used for callbacks. If the caller passes a null Handler, the
+ * main thread will be used.
+ *
+ * @hide
+ */
+ public void startLocalOnlyHotspot(LocalOnlyHotspotCallback callback,
+ @Nullable Handler handler) {
+ synchronized (mLock) {
+ Looper looper = (handler == null) ? mContext.getMainLooper() : handler.getLooper();
+ LocalOnlyHotspotCallbackProxy proxy =
+ new LocalOnlyHotspotCallbackProxy(this, looper, callback);
+ try {
+ WifiConfiguration config = mService.startLocalOnlyHotspot(
+ proxy.getMessenger(), new Binder());
+ if (config == null) {
+ // Send message to the proxy to make sure we call back on the correct thread
+ proxy.notifyFailed(
+ LocalOnlyHotspotCallback.ERROR_INCOMPATIBLE_MODE);
+ return;
+ }
+ mLOHSCallbackProxy = proxy;
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
+ * Cancels a pending local only hotspot request. This can be used by the calling application to
+ * cancel the existing request if the provided callback has not been triggered. Calling this
+ * method will be equivalent to closing the returned LocalOnlyHotspotReservation, but it is not
+ * explicitly required.
+ * <p>
+ * When cancelling this request, application developers should be aware that there may still be
+ * outstanding local only hotspot requests and the hotspot may still start, or continue running.
+ * Additionally, if a callback was registered, it will no longer be triggered after calling
+ * cancel.
+ *
+ * @hide
+ */
+ public void cancelLocalOnlyHotspotRequest() {
+ synchronized (mLock) {
+ stopLocalOnlyHotspot();
+ }
+ }
+
+ /**
+ * Method used to inform WifiService that the LocalOnlyHotspot is no longer needed. This
+ * method is used by WifiManager to release LocalOnlyHotspotReservations held by calling
+ * applications and removes the internal tracking for the hotspot request. When all requesting
+ * applications are finished using the hotspot, it will be stopped and WiFi will return to the
+ * previous operational mode.
+ *
+ * This method should not be called by applications. Instead, they should call the close()
+ * method on their LocalOnlyHotspotReservation.
+ */
+ private void stopLocalOnlyHotspot() {
+ synchronized (mLock) {
+ if (mLOHSCallbackProxy == null) {
+ // nothing to do, the callback was already cleaned up.
+ return;
+ }
+ mLOHSCallbackProxy = null;
+ try {
+ mService.stopLocalOnlyHotspot();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
+ * Allow callers (Settings UI) to watch LocalOnlyHotspot state changes. Callers will
+ * receive a {@link LocalOnlyHotspotSubscription} object as a parameter of the
+ * {@link LocalOnlyHotspotObserver#onRegistered(LocalOnlyHotspotSubscription)}. The registered
+ * callers will receive the {@link LocalOnlyHotspotObserver#onStarted(WifiConfiguration)} and
+ * {@link LocalOnlyHotspotObserver#onStopped()} callbacks.
+ * <p>
+ * Applications should have the
+ * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION}
+ * permission. Callers without the permission will trigger a
+ * {@link java.lang.SecurityException}.
+ * <p>
+ * @param observer LocalOnlyHotspotObserver callback.
+ * @param handler Handler to use for callbacks
+ *
+ * @hide
+ */
+ public void watchLocalOnlyHotspot(LocalOnlyHotspotObserver observer,
+ @Nullable Handler handler) {
+ synchronized (mLock) {
+ Looper looper = (handler == null) ? mContext.getMainLooper() : handler.getLooper();
+ mLOHSObserverProxy = new LocalOnlyHotspotObserverProxy(this, looper, observer);
+ try {
+ mService.startWatchLocalOnlyHotspot(
+ mLOHSObserverProxy.getMessenger(), new Binder());
+ mLOHSObserverProxy.registered();
+ } catch (RemoteException e) {
+ mLOHSObserverProxy = null;
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
+ * Allow callers to stop watching LocalOnlyHotspot state changes. After calling this method,
+ * applications will no longer receive callbacks.
+ *
+ * @hide
+ */
+ public void unregisterLocalOnlyHotspotObserver() {
+ synchronized (mLock) {
+ if (mLOHSObserverProxy == null) {
+ // nothing to do, the callback was already cleaned up
+ return;
+ }
+ mLOHSObserverProxy = null;
+ try {
+ mService.stopWatchLocalOnlyHotspot();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
* Gets the Wi-Fi enabled state.
* @return One of {@link #WIFI_AP_STATE_DISABLED},
* {@link #WIFI_AP_STATE_DISABLING}, {@link #WIFI_AP_STATE_ENABLED},
@@ -2020,6 +2261,308 @@
public void onFailure(int reason);
}
+ /**
+ * LocalOnlyHotspotReservation that contains the {@link WifiConfiguration} for the active
+ * LocalOnlyHotspot request.
+ * <p>
+ * Applications requesting LocalOnlyHotspot for sharing will receive an instance of the
+ * LocalOnlyHotspotReservation in the
+ * {@link LocalOnlyHotspotCallback#onStarted(LocalOnlyHotspotReservation)} call. This
+ * reservation contains the relevant {@link WifiConfiguration}.
+ * When an application is done with the LocalOnlyHotspot, they should call {@link
+ * LocalOnlyHotspotReservation#close()}. Once this happens, the application will not receive
+ * any further callbacks. If the LocalOnlyHotspot is stopped due to a
+ * user triggered mode change, applications will be notified via the {@link
+ * LocalOnlyHotspotCallback#onStopped()} callback.
+ *
+ * @hide
+ */
+ public class LocalOnlyHotspotReservation implements AutoCloseable {
+
+ private final CloseGuard mCloseGuard = CloseGuard.get();
+ private final WifiConfiguration mConfig;
+
+ /** @hide */
+ @VisibleForTesting
+ public LocalOnlyHotspotReservation(WifiConfiguration config) {
+ mConfig = config;
+ mCloseGuard.open("close");
+ }
+
+ public WifiConfiguration getConfig() {
+ return mConfig;
+ }
+
+ @Override
+ public void close() {
+ try {
+ stopLocalOnlyHotspot();
+ mCloseGuard.close();
+ } catch (Exception e) {
+ Log.e(TAG, "Failed to stop Local Only Hotspot.");
+ }
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ if (mCloseGuard != null) {
+ mCloseGuard.warnIfOpen();
+ }
+ close();
+ } finally {
+ super.finalize();
+ }
+ }
+ }
+
+ /**
+ * Callback class for applications to receive updates about the LocalOnlyHotspot status.
+ *
+ * @hide
+ */
+ public static class LocalOnlyHotspotCallback {
+ public static final int ERROR_NO_CHANNEL = 1;
+ public static final int ERROR_GENERIC = 2;
+ public static final int ERROR_INCOMPATIBLE_MODE = 3;
+
+ /** LocalOnlyHotspot start succeeded. */
+ public void onStarted(LocalOnlyHotspotReservation reservation) {};
+
+ /**
+ * LocalOnlyHotspot stopped.
+ * <p>
+ * The LocalOnlyHotspot can be disabled at any time by the user. When this happens,
+ * applications will be notified that it was stopped. This will not be invoked when an
+ * application calls {@link LocalOnlyHotspotReservation#close()}.
+ */
+ public void onStopped() {};
+
+ /**
+ * LocalOnlyHotspot failed to start.
+ * <p>
+ * Applications can attempt to call
+ * {@link WifiManager#startLocalOnlyHotspot(LocalOnlyHotspotCallback, Handler)} again at
+ * a later time.
+ * <p>
+ * @param reason The reason for failure could be one of: {@link #ERROR_INCOMPATIBLE_MODE},
+ * {@link #ERROR_NO_CHANNEL}, or {@link #ERROR_GENERIC}.
+ */
+ public void onFailed(int reason) { };
+ }
+
+ /**
+ * Callback proxy for LocalOnlyHotspotCallback objects.
+ */
+ private static class LocalOnlyHotspotCallbackProxy {
+ private final Handler mHandler;
+ private final WeakReference<WifiManager> mWifiManager;
+ private final Looper mLooper;
+ private final Messenger mMessenger;
+
+ /**
+ * Constructs a {@link LocalOnlyHotspotCallback} using the specified looper. All callbacks
+ * will be delivered on the thread of the specified looper.
+ *
+ * @param manager WifiManager
+ * @param looper Looper for delivering callbacks
+ * @param callback LocalOnlyHotspotCallback to notify the calling application.
+ */
+ LocalOnlyHotspotCallbackProxy(WifiManager manager, Looper looper,
+ final LocalOnlyHotspotCallback callback) {
+ mWifiManager = new WeakReference<>(manager);
+ mLooper = looper;
+
+ mHandler = new Handler(looper) {
+ @Override
+ public void handleMessage(Message msg) {
+ Log.d(TAG, "LocalOnlyHotspotCallbackProxy: handle message what: "
+ + msg.what + " msg: " + msg);
+
+ WifiManager manager = mWifiManager.get();
+ if (manager == null) {
+ Log.w(TAG, "LocalOnlyHotspotCallbackProxy: handle message post GC");
+ return;
+ }
+
+ switch (msg.what) {
+ case HOTSPOT_STARTED:
+ WifiConfiguration config = (WifiConfiguration) msg.obj;
+ if (config == null) {
+ Log.e(TAG, "LocalOnlyHotspotCallbackProxy: config cannot be null.");
+ callback.onFailed(LocalOnlyHotspotCallback.ERROR_GENERIC);
+ return;
+ }
+ callback.onStarted(manager.new LocalOnlyHotspotReservation(config));
+ break;
+ case HOTSPOT_STOPPED:
+ Log.w(TAG, "LocalOnlyHotspotCallbackProxy: hotspot stopped");
+ callback.onStopped();
+ break;
+ case HOTSPOT_FAILED:
+ int reasonCode = msg.arg1;
+ Log.w(TAG, "LocalOnlyHotspotCallbackProxy: failed to start. reason: "
+ + reasonCode);
+ callback.onFailed(reasonCode);
+ Log.w(TAG, "done with the callback...");
+ break;
+ default:
+ Log.e(TAG, "LocalOnlyHotspotCallbackProxy unhandled message. type: "
+ + msg.what);
+ }
+ }
+ };
+ mMessenger = new Messenger(mHandler);
+ }
+
+ public Messenger getMessenger() {
+ return mMessenger;
+ }
+
+ /**
+ * Helper method allowing the the incoming application call to move the onFailed callback
+ * over to the desired callback thread.
+ *
+ * @param reason int representing the error type
+ */
+ public void notifyFailed(int reason) throws RemoteException {
+ Message msg = Message.obtain();
+ msg.what = HOTSPOT_FAILED;
+ msg.arg1 = reason;
+ mMessenger.send(msg);
+ }
+ }
+
+ /**
+ * LocalOnlyHotspotSubscription that is an AutoCloseable object for tracking applications
+ * watching for LocalOnlyHotspot changes.
+ *
+ * @hide
+ */
+ public class LocalOnlyHotspotSubscription implements AutoCloseable {
+ private final CloseGuard mCloseGuard = CloseGuard.get();
+
+ /** @hide */
+ @VisibleForTesting
+ public LocalOnlyHotspotSubscription() {
+ mCloseGuard.open("close");
+ }
+
+ @Override
+ public void close() {
+ try {
+ unregisterLocalOnlyHotspotObserver();
+ mCloseGuard.close();
+ } catch (Exception e) {
+ Log.e(TAG, "Failed to unregister LocalOnlyHotspotObserver.");
+ }
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ if (mCloseGuard != null) {
+ mCloseGuard.warnIfOpen();
+ }
+ close();
+ } finally {
+ super.finalize();
+ }
+ }
+ }
+
+ /**
+ * Class to notify calling applications that watch for changes in LocalOnlyHotspot of updates.
+ *
+ * @hide
+ */
+ public static class LocalOnlyHotspotObserver {
+ /**
+ * Confirm registration for LocalOnlyHotspotChanges by returning a
+ * LocalOnlyHotspotSubscription.
+ */
+ public void onRegistered(LocalOnlyHotspotSubscription subscription) {};
+
+ /**
+ * LocalOnlyHotspot started with the supplied config.
+ */
+ public void onStarted(WifiConfiguration config) {};
+
+ /**
+ * LocalOnlyHotspot stopped.
+ */
+ public void onStopped() {};
+ }
+
+ /**
+ * Callback proxy for LocalOnlyHotspotObserver objects.
+ */
+ private static class LocalOnlyHotspotObserverProxy {
+ private final Handler mHandler;
+ private final WeakReference<WifiManager> mWifiManager;
+ private final Looper mLooper;
+ private final Messenger mMessenger;
+
+ /**
+ * Constructs a {@link LocalOnlyHotspotObserverProxy} using the specified looper.
+ * All callbacks will be delivered on the thread of the specified looper.
+ *
+ * @param manager WifiManager
+ * @param looper Looper for delivering callbacks
+ * @param observer LocalOnlyHotspotObserver to notify the calling application.
+ */
+ LocalOnlyHotspotObserverProxy(WifiManager manager, Looper looper,
+ final LocalOnlyHotspotObserver observer) {
+ mWifiManager = new WeakReference<>(manager);
+ mLooper = looper;
+
+ mHandler = new Handler(looper) {
+ @Override
+ public void handleMessage(Message msg) {
+ Log.d(TAG, "LocalOnlyHotspotObserverProxy: handle message what: "
+ + msg.what + " msg: " + msg);
+
+ WifiManager manager = mWifiManager.get();
+ if (manager == null) {
+ Log.w(TAG, "LocalOnlyHotspotObserverProxy: handle message post GC");
+ return;
+ }
+
+ switch (msg.what) {
+ case HOTSPOT_OBSERVER_REGISTERED:
+ observer.onRegistered(manager.new LocalOnlyHotspotSubscription());
+ break;
+ case HOTSPOT_STARTED:
+ WifiConfiguration config = (WifiConfiguration) msg.obj;
+ if (config == null) {
+ Log.e(TAG, "LocalOnlyHotspotObserverProxy: config cannot be null.");
+ return;
+ }
+ observer.onStarted(config);
+ break;
+ case HOTSPOT_STOPPED:
+ observer.onStopped();
+ break;
+ default:
+ Log.e(TAG, "LocalOnlyHotspotObserverProxy unhandled message. type: "
+ + msg.what);
+ }
+ }
+ };
+ mMessenger = new Messenger(mHandler);
+ }
+
+ public Messenger getMessenger() {
+ return mMessenger;
+ }
+
+ public void registered() throws RemoteException {
+ Message msg = Message.obtain();
+ msg.what = HOTSPOT_OBSERVER_REGISTERED;
+ mMessenger.send(msg);
+ }
+ }
+
// Ensure that multiple ServiceHandler threads do not interleave message dispatch.
private static final Object sServiceHandlerDispatchLock = new Object();
diff --git a/wifi/java/android/net/wifi/aware/DiscoverySession.java b/wifi/java/android/net/wifi/aware/DiscoverySession.java
index bf5c42b..c7e1fc7 100644
--- a/wifi/java/android/net/wifi/aware/DiscoverySession.java
+++ b/wifi/java/android/net/wifi/aware/DiscoverySession.java
@@ -38,10 +38,10 @@
* {@link #createNetworkSpecifierOpen(PeerHandle)} or
* {@link #createNetworkSpecifierPassphrase(PeerHandle, String)}.
* </ul>
- * The {@link #destroy()} method must be called to destroy discovery sessions once they are
+ * The {@link #close()} method must be called to destroy discovery sessions once they are
* no longer needed.
*/
-public class DiscoverySession {
+public class DiscoverySession implements AutoCloseable {
private static final String TAG = "DiscoverySession";
private static final boolean DBG = false;
private static final boolean VDBG = false; // STOPSHIP if true
@@ -96,7 +96,8 @@
* exception is a session for which we received a termination callback,
* {@link DiscoverySessionCallback#onSessionTerminated()}.
*/
- public void destroy() {
+ @Override
+ public void close() {
WifiAwareManager mgr = mMgr.get();
if (mgr == null) {
Log.w(TAG, "destroy: called post GC on WifiAwareManager");
@@ -131,7 +132,7 @@
try {
if (!mTerminated) {
mCloseGuard.warnIfOpen();
- destroy();
+ close();
}
} finally {
super.finalize();
diff --git a/wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java b/wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java
index 334205b..d8667e6 100644
--- a/wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java
+++ b/wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java
@@ -84,7 +84,7 @@
/**
* Called when a discovery session (publish or subscribe) terminates. Termination may be due
- * to user-request (either directly through {@link DiscoverySession#destroy()} or
+ * to user-request (either directly through {@link DiscoverySession#close()} or
* application-specified expiration, e.g. {@link PublishConfig.Builder#setTtlSec(int)}
* or {@link SubscribeConfig.Builder#setTtlSec(int)}).
*/
diff --git a/wifi/java/android/net/wifi/aware/PublishConfig.java b/wifi/java/android/net/wifi/aware/PublishConfig.java
index 1ce12f3..0f1e992 100644
--- a/wifi/java/android/net/wifi/aware/PublishConfig.java
+++ b/wifi/java/android/net/wifi/aware/PublishConfig.java
@@ -314,7 +314,7 @@
* {@link #setTerminateNotificationEnabled(boolean)} disables the callback].
* <p>
* Optional. 0 by default - indicating the session doesn't terminate on its own.
- * Session will be terminated when {@link DiscoverySession#destroy()} is
+ * Session will be terminated when {@link DiscoverySession#close()} is
* called.
*
* @param ttlSec Lifetime of a publish session in seconds.
diff --git a/wifi/java/android/net/wifi/aware/SubscribeConfig.java b/wifi/java/android/net/wifi/aware/SubscribeConfig.java
index 97a6a3f..31e7e8e 100644
--- a/wifi/java/android/net/wifi/aware/SubscribeConfig.java
+++ b/wifi/java/android/net/wifi/aware/SubscribeConfig.java
@@ -61,27 +61,6 @@
public static final int SUBSCRIBE_TYPE_ACTIVE = 1;
/** @hide */
- @IntDef({
- MATCH_STYLE_FIRST_ONLY, MATCH_STYLE_ALL })
- @Retention(RetentionPolicy.SOURCE)
- public @interface MatchStyles {
- }
-
- /**
- * Specifies that only the first match of a set of identical matches (same
- * publish) will be reported to the subscriber. Configuration is done using
- * {@link SubscribeConfig.Builder#setMatchStyle(int)}.
- */
- public static final int MATCH_STYLE_FIRST_ONLY = 0;
-
- /**
- * Specifies that all matches of a set of identical matches (same publish)
- * will be reported to the subscriber. Configuration is done using
- * {@link SubscribeConfig.Builder#setMatchStyle(int)}.
- */
- public static final int MATCH_STYLE_ALL = 1;
-
- /** @hide */
public final byte[] mServiceName;
/** @hide */
@@ -97,21 +76,17 @@
public final int mTtlSec;
/** @hide */
- public final int mMatchStyle;
-
- /** @hide */
public final boolean mEnableTerminateNotification;
/** @hide */
public SubscribeConfig(byte[] serviceName, byte[] serviceSpecificInfo, byte[] matchFilter,
- int subscribeType, int ttlSec, int matchStyle,
+ int subscribeType, int ttlSec,
boolean enableTerminateNotification) {
mServiceName = serviceName;
mServiceSpecificInfo = serviceSpecificInfo;
mMatchFilter = matchFilter;
mSubscribeType = subscribeType;
mTtlSec = ttlSec;
- mMatchStyle = matchStyle;
mEnableTerminateNotification = enableTerminateNotification;
}
@@ -121,8 +96,8 @@
(mServiceSpecificInfo == null) ? "null" : HexEncoding.encode(mServiceSpecificInfo))
+ ", mMatchFilter=" + (new TlvBufferUtils.TlvIterable(0, 1,
mMatchFilter)).toString() + ", mSubscribeType=" + mSubscribeType
- + ", mTtlSec=" + mTtlSec + ", mMatchType="
- + mMatchStyle + ", mEnableTerminateNotification=" + mEnableTerminateNotification
+ + ", mTtlSec=" + mTtlSec
+ + ", mEnableTerminateNotification=" + mEnableTerminateNotification
+ "]";
}
@@ -138,7 +113,6 @@
dest.writeByteArray(mMatchFilter);
dest.writeInt(mSubscribeType);
dest.writeInt(mTtlSec);
- dest.writeInt(mMatchStyle);
dest.writeInt(mEnableTerminateNotification ? 1 : 0);
}
@@ -155,11 +129,10 @@
byte[] matchFilter = in.createByteArray();
int subscribeType = in.readInt();
int ttlSec = in.readInt();
- int matchStyle = in.readInt();
boolean enableTerminateNotification = in.readInt() != 0;
return new SubscribeConfig(serviceName, ssi, matchFilter, subscribeType,
- ttlSec, matchStyle, enableTerminateNotification);
+ ttlSec, enableTerminateNotification);
}
};
@@ -178,7 +151,7 @@
return Arrays.equals(mServiceName, lhs.mServiceName) && Arrays.equals(mServiceSpecificInfo,
lhs.mServiceSpecificInfo) && Arrays.equals(mMatchFilter, lhs.mMatchFilter)
&& mSubscribeType == lhs.mSubscribeType
- && mTtlSec == lhs.mTtlSec && mMatchStyle == lhs.mMatchStyle
+ && mTtlSec == lhs.mTtlSec
&& mEnableTerminateNotification == lhs.mEnableTerminateNotification;
}
@@ -191,7 +164,6 @@
result = 31 * result + Arrays.hashCode(mMatchFilter);
result = 31 * result + mSubscribeType;
result = 31 * result + mTtlSec;
- result = 31 * result + mMatchStyle;
result = 31 * result + (mEnableTerminateNotification ? 1 : 0);
return result;
@@ -217,10 +189,6 @@
if (mTtlSec < 0) {
throw new IllegalArgumentException("Invalid ttlSec - must be non-negative");
}
- if (mMatchStyle != MATCH_STYLE_FIRST_ONLY && mMatchStyle != MATCH_STYLE_ALL) {
- throw new IllegalArgumentException(
- "Invalid matchType - must be MATCH_FIRST_ONLY or MATCH_ALL");
- }
if (characteristics != null) {
int maxServiceNameLength = characteristics.getMaxServiceNameLength();
@@ -252,7 +220,6 @@
private byte[] mMatchFilter;
private int mSubscribeType = SUBSCRIBE_TYPE_PASSIVE;
private int mTtlSec = 0;
- private int mMatchStyle = MATCH_STYLE_ALL;
private boolean mEnableTerminateNotification = true;
/**
@@ -346,7 +313,7 @@
* {@link DiscoverySessionCallback#onSessionTerminated()}.
* <p>
* Optional. 0 by default - indicating the session doesn't terminate on its own.
- * Session will be terminated when {@link DiscoverySession#destroy()} is
+ * Session will be terminated when {@link DiscoverySession#close()} is
* called.
*
* @param ttlSec Lifetime of a subscribe session in seconds.
@@ -363,28 +330,6 @@
}
/**
- * Sets the match style of the subscription - how are matches from a
- * single match session (corresponding to the same publish action on the
- * peer) reported to the host (using the
- * {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle, byte[],
- * java.util.List)}). The options are: only report the first match and ignore the rest
- * {@link SubscribeConfig#MATCH_STYLE_FIRST_ONLY} or report every single
- * match {@link SubscribeConfig#MATCH_STYLE_ALL} (the default).
- *
- * @param matchStyle The reporting style for the discovery match.
- * @return The builder to facilitate chaining
- * {@code builder.setXXX(..).setXXX(..)}.
- */
- public Builder setMatchStyle(@MatchStyles int matchStyle) {
- if (matchStyle != MATCH_STYLE_FIRST_ONLY && matchStyle != MATCH_STYLE_ALL) {
- throw new IllegalArgumentException(
- "Invalid matchType - must be MATCH_FIRST_ONLY or MATCH_ALL");
- }
- mMatchStyle = matchStyle;
- return this;
- }
-
- /**
* Configure whether a subscribe terminate notification
* {@link DiscoverySessionCallback#onSessionTerminated()} is reported
* back to the callback.
@@ -406,7 +351,7 @@
*/
public SubscribeConfig build() {
return new SubscribeConfig(mServiceName, mServiceSpecificInfo, mMatchFilter,
- mSubscribeType, mTtlSec, mMatchStyle,
+ mSubscribeType, mTtlSec,
mEnableTerminateNotification);
}
}
diff --git a/wifi/java/android/net/wifi/aware/WifiAwareManager.java b/wifi/java/android/net/wifi/aware/WifiAwareManager.java
index 3fcbd4b..d3ed792 100644
--- a/wifi/java/android/net/wifi/aware/WifiAwareManager.java
+++ b/wifi/java/android/net/wifi/aware/WifiAwareManager.java
@@ -82,7 +82,7 @@
* discovery or connection setup only after receiving confirmation that Aware attach
* succeeded - {@link AttachCallback#onAttached(WifiAwareSession)}. When an
* application is finished using Aware it <b>must</b> use the
- * {@link WifiAwareSession#destroy()} API to indicate to the Aware service that the device
+ * {@link WifiAwareSession#close()} API to indicate to the Aware service that the device
* may detach from the Aware cluster. The device will actually disable Aware once the last
* application detaches.
* <p>
@@ -104,7 +104,7 @@
* also be used to send messages using the
* {@link DiscoverySession#sendMessage(PeerHandle, int, byte[])} APIs. When an
* application is finished with a discovery session it <b>must</b> terminate it using the
- * {@link DiscoverySession#destroy()} API.
+ * {@link DiscoverySession#close()} API.
* <p>
* Creating connections between Aware devices is managed by the standard
* {@link ConnectivityManager#requestNetwork(NetworkRequest,
@@ -215,7 +215,7 @@
* create connections to peers. The device will attach to an existing cluster if it can find
* one or create a new cluster (if it is the first to enable Aware in its vicinity). Results
* (e.g. successful attach to a cluster) are provided to the {@code attachCallback} object.
- * An application <b>must</b> call {@link WifiAwareSession#destroy()} when done with the
+ * An application <b>must</b> call {@link WifiAwareSession#close()} when done with the
* Wi-Fi Aware object.
* <p>
* Note: a Aware cluster is a shared resource - if the device is already attached to a cluster
@@ -237,7 +237,7 @@
* create connections to peers. The device will attach to an existing cluster if it can find
* one or create a new cluster (if it is the first to enable Aware in its vicinity). Results
* (e.g. successful attach to a cluster) are provided to the {@code attachCallback} object.
- * An application <b>must</b> call {@link WifiAwareSession#destroy()} when done with the
+ * An application <b>must</b> call {@link WifiAwareSession#close()} when done with the
* Wi-Fi Aware object.
* <p>
* Note: a Aware cluster is a shared resource - if the device is already attached to a cluster
diff --git a/wifi/java/android/net/wifi/aware/WifiAwareSession.java b/wifi/java/android/net/wifi/aware/WifiAwareSession.java
index ac3a6bb..4e060d5 100644
--- a/wifi/java/android/net/wifi/aware/WifiAwareSession.java
+++ b/wifi/java/android/net/wifi/aware/WifiAwareSession.java
@@ -33,7 +33,7 @@
* This class represents a Wi-Fi Aware session - an attachment to the Wi-Fi Aware service through
* which the app can execute discovery operations.
*/
-public class WifiAwareSession {
+public class WifiAwareSession implements AutoCloseable {
private static final String TAG = "WifiAwareSession";
private static final boolean DBG = false;
private static final boolean VDBG = false; // STOPSHIP if true
@@ -67,7 +67,7 @@
* An application may re-attach after a destroy using
* {@link WifiAwareManager#attach(AttachCallback, Handler)} .
*/
- public void destroy() {
+ public void close() {
WifiAwareManager mgr = mMgr.get();
if (mgr == null) {
Log.w(TAG, "destroy: called post GC on WifiAwareManager");
@@ -85,7 +85,7 @@
try {
if (!mTerminated) {
mCloseGuard.warnIfOpen();
- destroy();
+ close();
}
} finally {
super.finalize();
@@ -110,7 +110,7 @@
* on the {@code callback} object. The resulting publish session can be modified using
* {@link PublishDiscoverySession#updatePublish(PublishConfig)}.
* <p>
- * An application must use the {@link DiscoverySession#destroy()} to
+ * An application must use the {@link DiscoverySession#close()} to
* terminate the publish discovery session once it isn't needed. This will free
* resources as well terminate any on-air transmissions.
* <p>The application must have the {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}
@@ -156,7 +156,7 @@
* on the {@code callback} object. The resulting subscribe session can be modified using
* {@link SubscribeDiscoverySession#updateSubscribe(SubscribeConfig)}.
* <p>
- * An application must use the {@link DiscoverySession#destroy()} to
+ * An application must use the {@link DiscoverySession#close()} to
* terminate the subscribe discovery session once it isn't needed. This will free
* resources as well terminate any on-air transmissions.
* <p>The application must have the {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}
diff --git a/wifi/tests/src/android/net/wifi/WifiManagerTest.java b/wifi/tests/src/android/net/wifi/WifiManagerTest.java
new file mode 100644
index 0000000..3c0fc6e
--- /dev/null
+++ b/wifi/tests/src/android/net/wifi/WifiManagerTest.java
@@ -0,0 +1,761 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.wifi;
+
+import static android.net.wifi.WifiManager.HOTSPOT_FAILED;
+import static android.net.wifi.WifiManager.HOTSPOT_STARTED;
+import static android.net.wifi.WifiManager.HOTSPOT_STOPPED;
+import static android.net.wifi.WifiManager.LocalOnlyHotspotCallback.ERROR_GENERIC;
+import static android.net.wifi.WifiManager.LocalOnlyHotspotCallback.ERROR_INCOMPATIBLE_MODE;
+import static android.net.wifi.WifiManager.LocalOnlyHotspotCallback.ERROR_NO_CHANNEL;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.*;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.net.wifi.WifiManager.LocalOnlyHotspotCallback;
+import android.net.wifi.WifiManager.LocalOnlyHotspotObserver;
+import android.net.wifi.WifiManager.LocalOnlyHotspotReservation;
+import android.net.wifi.WifiManager.LocalOnlyHotspotSubscription;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.test.TestLooper;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * Unit tests for {@link android.net.wifi.WifiManager}.
+ */
+@SmallTest
+public class WifiManagerTest {
+
+ private static final int ERROR_NOT_SET = -1;
+ private static final int ERROR_TEST_REASON = 5;
+
+ @Mock Context mContext;
+ @Mock IWifiManager mWifiService;
+ @Mock ApplicationInfo mApplicationInfo;
+ @Mock WifiConfiguration mApConfig;
+ @Mock IBinder mAppBinder;
+
+ private Handler mHandler;
+ private TestLooper mLooper;
+ private WifiManager mWifiManager;
+ private Messenger mWifiServiceMessenger;
+ final ArgumentCaptor<Messenger> mMessengerCaptor = ArgumentCaptor.forClass(Messenger.class);
+
+ @Before public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mLooper = new TestLooper();
+ mHandler = spy(new Handler(mLooper.getLooper()));
+ when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo);
+
+ mWifiServiceMessenger = new Messenger(mHandler);
+ mWifiManager = new WifiManager(mContext, mWifiService, mLooper.getLooper());
+ }
+
+ /**
+ * Check the call to startSoftAp calls WifiService to startSoftAp with the provided
+ * WifiConfiguration. Verify that the return value is propagated to the caller.
+ */
+ @Test
+ public void testStartSoftApCallsServiceWithWifiConfig() throws Exception {
+ when(mWifiService.startSoftAp(eq(mApConfig))).thenReturn(true);
+ assertTrue(mWifiManager.startSoftAp(mApConfig));
+
+ when(mWifiService.startSoftAp(eq(mApConfig))).thenReturn(false);
+ assertFalse(mWifiManager.startSoftAp(mApConfig));
+ }
+
+ /**
+ * Check the call to startSoftAp calls WifiService to startSoftAp with a null config. Verify
+ * that the return value is propagated to the caller.
+ */
+ @Test
+ public void testStartSoftApCallsServiceWithNullConfig() throws Exception {
+ when(mWifiService.startSoftAp(eq(null))).thenReturn(true);
+ assertTrue(mWifiManager.startSoftAp(null));
+
+ when(mWifiService.startSoftAp(eq(null))).thenReturn(false);
+ assertFalse(mWifiManager.startSoftAp(null));
+ }
+
+ /**
+ * Check the call to stopSoftAp calls WifiService to stopSoftAp.
+ */
+ @Test
+ public void testStopSoftApCallsService() throws Exception {
+ when(mWifiService.stopSoftAp()).thenReturn(true);
+ assertTrue(mWifiManager.stopSoftAp());
+
+ when(mWifiService.stopSoftAp()).thenReturn(false);
+ assertFalse(mWifiManager.stopSoftAp());
+ }
+
+ /**
+ * Test creation of a LocalOnlyHotspotReservation and verify that close properly calls
+ * WifiService.stopLocalOnlyHotspot.
+ */
+ @Test
+ public void testCreationAndCloseOfLocalOnlyHotspotReservation() throws Exception {
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
+ .thenReturn(mApConfig);
+ mWifiManager.startLocalOnlyHotspot(callback, mHandler);
+
+ callback.onStarted(mWifiManager.new LocalOnlyHotspotReservation(mApConfig));
+
+ assertEquals(mApConfig, callback.mRes.getConfig());
+ callback.mRes.close();
+ verify(mWifiService).stopLocalOnlyHotspot();
+ }
+
+ /**
+ * Verify stopLOHS is called when try-with-resources is used properly.
+ */
+ @Test
+ public void testLocalOnlyHotspotReservationCallsStopProperlyInTryWithResources()
+ throws Exception {
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
+ .thenReturn(mApConfig);
+ mWifiManager.startLocalOnlyHotspot(callback, mHandler);
+
+ callback.onStarted(mWifiManager.new LocalOnlyHotspotReservation(mApConfig));
+
+ try (WifiManager.LocalOnlyHotspotReservation res = callback.mRes) {
+ assertEquals(mApConfig, res.getConfig());
+ }
+
+ verify(mWifiService).stopLocalOnlyHotspot();
+ }
+
+ /**
+ * Test creation of a LocalOnlyHotspotSubscription.
+ * TODO: when registrations are tracked, verify removal on close.
+ */
+ @Test
+ public void testCreationOfLocalOnlyHotspotSubscription() throws Exception {
+ try (WifiManager.LocalOnlyHotspotSubscription sub =
+ mWifiManager.new LocalOnlyHotspotSubscription()) {
+ sub.close();
+ }
+ }
+
+ public class TestLocalOnlyHotspotCallback extends LocalOnlyHotspotCallback {
+ public boolean mOnStartedCalled = false;
+ public boolean mOnStoppedCalled = false;
+ public int mFailureReason = -1;
+ public LocalOnlyHotspotReservation mRes = null;
+ public long mCallingThreadId = -1;
+
+ @Override
+ public void onStarted(LocalOnlyHotspotReservation r) {
+ mRes = r;
+ mOnStartedCalled = true;
+ mCallingThreadId = Thread.currentThread().getId();
+ }
+
+ @Override
+ public void onStopped() {
+ mOnStoppedCalled = true;
+ mCallingThreadId = Thread.currentThread().getId();
+ }
+
+ @Override
+ public void onFailed(int reason) {
+ mFailureReason = reason;
+ mCallingThreadId = Thread.currentThread().getId();
+ }
+ }
+
+ /**
+ * Verify callback is properly plumbed when called.
+ */
+ @Test
+ public void testLocalOnlyHotspotCallback() {
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ assertFalse(callback.mOnStartedCalled);
+ assertFalse(callback.mOnStoppedCalled);
+ assertEquals(ERROR_NOT_SET, callback.mFailureReason);
+ assertEquals(null, callback.mRes);
+
+ // test onStarted
+ WifiManager.LocalOnlyHotspotReservation res =
+ mWifiManager.new LocalOnlyHotspotReservation(mApConfig);
+ callback.onStarted(res);
+ assertEquals(res, callback.mRes);
+ assertTrue(callback.mOnStartedCalled);
+ assertFalse(callback.mOnStoppedCalled);
+ assertEquals(ERROR_NOT_SET, callback.mFailureReason);
+
+ // test onStopped
+ callback.onStopped();
+ assertEquals(res, callback.mRes);
+ assertTrue(callback.mOnStartedCalled);
+ assertTrue(callback.mOnStoppedCalled);
+ assertEquals(ERROR_NOT_SET, callback.mFailureReason);
+
+ // test onFailed
+ callback.onFailed(ERROR_TEST_REASON);
+ assertEquals(res, callback.mRes);
+ assertTrue(callback.mOnStartedCalled);
+ assertTrue(callback.mOnStoppedCalled);
+ assertEquals(ERROR_TEST_REASON, callback.mFailureReason);
+ }
+
+ public class TestLocalOnlyHotspotObserver extends LocalOnlyHotspotObserver {
+ public boolean mOnRegistered = false;
+ public boolean mOnStartedCalled = false;
+ public boolean mOnStoppedCalled = false;
+ public WifiConfiguration mConfig = null;
+ public LocalOnlyHotspotSubscription mSub = null;
+ public long mCallingThreadId = -1;
+
+ @Override
+ public void onRegistered(LocalOnlyHotspotSubscription sub) {
+ mOnRegistered = true;
+ mSub = sub;
+ mCallingThreadId = Thread.currentThread().getId();
+ }
+
+ @Override
+ public void onStarted(WifiConfiguration config) {
+ mOnStartedCalled = true;
+ mConfig = config;
+ mCallingThreadId = Thread.currentThread().getId();
+ }
+
+ @Override
+ public void onStopped() {
+ mOnStoppedCalled = true;
+ mCallingThreadId = Thread.currentThread().getId();
+ }
+ }
+
+ /**
+ * Verify observer is properly plumbed when called.
+ */
+ @Test
+ public void testLocalOnlyHotspotObserver() {
+ TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
+ assertFalse(observer.mOnRegistered);
+ assertFalse(observer.mOnStartedCalled);
+ assertFalse(observer.mOnStoppedCalled);
+ assertEquals(null, observer.mConfig);
+ assertEquals(null, observer.mSub);
+
+ WifiManager.LocalOnlyHotspotSubscription sub =
+ mWifiManager.new LocalOnlyHotspotSubscription();
+ observer.onRegistered(sub);
+ assertTrue(observer.mOnRegistered);
+ assertFalse(observer.mOnStartedCalled);
+ assertFalse(observer.mOnStoppedCalled);
+ assertEquals(null, observer.mConfig);
+ assertEquals(sub, observer.mSub);
+
+ observer.onStarted(mApConfig);
+ assertTrue(observer.mOnRegistered);
+ assertTrue(observer.mOnStartedCalled);
+ assertFalse(observer.mOnStoppedCalled);
+ assertEquals(mApConfig, observer.mConfig);
+ assertEquals(sub, observer.mSub);
+
+ observer.onStopped();
+ assertTrue(observer.mOnRegistered);
+ assertTrue(observer.mOnStartedCalled);
+ assertTrue(observer.mOnStoppedCalled);
+ assertEquals(mApConfig, observer.mConfig);
+ assertEquals(sub, observer.mSub);
+ }
+
+ /**
+ * Verify call to startLocalOnlyHotspot goes to WifiServiceImpl.
+ */
+ @Test
+ public void testStartLocalOnlyHotspot() throws Exception {
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ mWifiManager.startLocalOnlyHotspot(callback, mHandler);
+
+ verify(mWifiService).startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class));
+ }
+
+ /**
+ * Verify a SecurityException is thrown for callers without proper permissions for
+ * startLocalOnlyHotspot.
+ */
+ @Test(expected = SecurityException.class)
+ public void testStartLocalOnlyHotspotThrowsSecurityException() throws Exception {
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ doThrow(new SecurityException()).when(mWifiService)
+ .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class));
+ mWifiManager.startLocalOnlyHotspot(callback, mHandler);
+ }
+
+ /**
+ * Verify an IllegalStateException is thrown for callers that already have a pending request for
+ * startLocalOnlyHotspot.
+ */
+ @Test(expected = IllegalStateException.class)
+ public void testStartLocalOnlyHotspotThrowsIllegalStateException() throws Exception {
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ doThrow(new IllegalStateException()).when(mWifiService)
+ .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class));
+ mWifiManager.startLocalOnlyHotspot(callback, mHandler);
+ }
+
+ /**
+ * Verify that the handler provided by the caller is used for the callbacks.
+ */
+ @Test
+ public void testCorrectLooperIsUsedForHandler() throws Exception {
+ // record thread from looper.getThread and check ids.
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
+ .thenReturn(null);
+ mWifiManager.startLocalOnlyHotspot(callback, mHandler);
+ mLooper.dispatchAll();
+ assertEquals(ERROR_INCOMPATIBLE_MODE, callback.mFailureReason);
+ assertEquals(mLooper.getLooper().getThread().getId(), callback.mCallingThreadId);
+ }
+
+ /**
+ * Verify that the main looper's thread is used if a handler is not provided by the reqiestomg
+ * application.
+ */
+ @Test
+ public void testMainLooperIsUsedWhenHandlerNotProvided() throws Exception {
+ // record thread from looper.getThread and check ids.
+ TestLooper altLooper = new TestLooper();
+ when(mContext.getMainLooper()).thenReturn(altLooper.getLooper());
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
+ .thenReturn(null);
+ mWifiManager.startLocalOnlyHotspot(callback, null);
+ altLooper.dispatchAll();
+ assertEquals(ERROR_INCOMPATIBLE_MODE, callback.mFailureReason);
+ assertEquals(altLooper.getLooper().getThread().getId(), callback.mCallingThreadId);
+ }
+
+ /**
+ * Verify the LOHS onStarted callback is triggered when WifiManager receives a HOTSPOT_STARTED
+ * message from WifiServiceImpl.
+ */
+ @Test
+ public void testOnStartedIsCalledWithReservation() throws Exception {
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ TestLooper callbackLooper = new TestLooper();
+ Handler callbackHandler = new Handler(callbackLooper.getLooper());
+ when(mWifiService.startLocalOnlyHotspot(mMessengerCaptor.capture(),
+ any(IBinder.class))).thenReturn(mApConfig);
+ mWifiManager.startLocalOnlyHotspot(callback, callbackHandler);
+ callbackLooper.dispatchAll();
+ mLooper.dispatchAll();
+ assertFalse(callback.mOnStartedCalled);
+ assertEquals(null, callback.mRes);
+ // now trigger the callback
+ Message msg = new Message();
+ msg.what = HOTSPOT_STARTED;
+ msg.obj = mApConfig;
+ mMessengerCaptor.getValue().send(msg);
+ mLooper.dispatchAll();
+ callbackLooper.dispatchAll();
+ assertTrue(callback.mOnStartedCalled);
+ assertEquals(mApConfig, callback.mRes.getConfig());
+ }
+
+ /**
+ * Verify onFailed is called if WifiServiceImpl sends a HOTSPOT_STARTED message with a null
+ * config.
+ */
+ @Test
+ public void testOnStartedIsCalledWithNullConfig() throws Exception {
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ TestLooper callbackLooper = new TestLooper();
+ Handler callbackHandler = new Handler(callbackLooper.getLooper());
+ when(mWifiService.startLocalOnlyHotspot(mMessengerCaptor.capture(),
+ any(IBinder.class))).thenReturn(mApConfig);
+ mWifiManager.startLocalOnlyHotspot(callback, callbackHandler);
+ callbackLooper.dispatchAll();
+ mLooper.dispatchAll();
+ assertFalse(callback.mOnStartedCalled);
+ assertEquals(null, callback.mRes);
+ // now trigger the callback
+ Message msg = new Message();
+ msg.what = HOTSPOT_STARTED;
+ mMessengerCaptor.getValue().send(msg);
+ mLooper.dispatchAll();
+ callbackLooper.dispatchAll();
+ assertFalse(callback.mOnStartedCalled);
+ assertEquals(ERROR_GENERIC, callback.mFailureReason);
+ }
+
+ /**
+ * Verify onStopped is called if WifiServiceImpl sends a HOTSPOT_STOPPED message.
+ */
+ @Test
+ public void testOnStoppedIsCalled() throws Exception {
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ TestLooper callbackLooper = new TestLooper();
+ Handler callbackHandler = new Handler(callbackLooper.getLooper());
+ when(mWifiService.startLocalOnlyHotspot(mMessengerCaptor.capture(),
+ any(IBinder.class))).thenReturn(mApConfig);
+ mWifiManager.startLocalOnlyHotspot(callback, callbackHandler);
+ callbackLooper.dispatchAll();
+ mLooper.dispatchAll();
+ assertFalse(callback.mOnStoppedCalled);
+ // now trigger the callback
+ Message msg = new Message();
+ msg.what = HOTSPOT_STOPPED;
+ mMessengerCaptor.getValue().send(msg);
+ mLooper.dispatchAll();
+ callbackLooper.dispatchAll();
+ assertTrue(callback.mOnStoppedCalled);
+ }
+
+ /**
+ * Verify onFailed is called if WifiServiceImpl sends a HOTSPOT_FAILED message.
+ */
+ @Test
+ public void testOnFailedIsCalled() throws Exception {
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ TestLooper callbackLooper = new TestLooper();
+ Handler callbackHandler = new Handler(callbackLooper.getLooper());
+ when(mWifiService.startLocalOnlyHotspot(mMessengerCaptor.capture(),
+ any(IBinder.class))).thenReturn(mApConfig);
+ mWifiManager.startLocalOnlyHotspot(callback, callbackHandler);
+ callbackLooper.dispatchAll();
+ mLooper.dispatchAll();
+ assertEquals(ERROR_NOT_SET, callback.mFailureReason);
+ // now trigger the callback
+ Message msg = new Message();
+ msg.what = HOTSPOT_FAILED;
+ msg.arg1 = ERROR_NO_CHANNEL;
+ mMessengerCaptor.getValue().send(msg);
+ mLooper.dispatchAll();
+ callbackLooper.dispatchAll();
+ assertEquals(ERROR_NO_CHANNEL, callback.mFailureReason);
+ }
+
+ /**
+ * Verify the handler passed in to startLocalOnlyHotspot is correctly used for callbacks when a
+ * null WifiConfig is returned.
+ */
+ @Test
+ public void testLocalOnlyHotspotCallbackFullOnNullConfig() throws Exception {
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
+ .thenReturn(null);
+ mWifiManager.startLocalOnlyHotspot(callback, mHandler);
+ mLooper.dispatchAll();
+ assertEquals(ERROR_INCOMPATIBLE_MODE, callback.mFailureReason);
+ assertFalse(callback.mOnStartedCalled);
+ assertFalse(callback.mOnStoppedCalled);
+ assertEquals(null, callback.mRes);
+ }
+
+ /**
+ * Verify a SecurityException resulting from an application without necessary permissions will
+ * bubble up through the call to start LocalOnlyHotspot and will not trigger other callbacks.
+ */
+ @Test(expected = SecurityException.class)
+ public void testLocalOnlyHotspotCallbackFullOnSecurityException() throws Exception {
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ doThrow(new SecurityException()).when(mWifiService)
+ .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class));
+ try {
+ mWifiManager.startLocalOnlyHotspot(callback, mHandler);
+ } catch (SecurityException e) {
+ assertEquals(ERROR_NOT_SET, callback.mFailureReason);
+ assertFalse(callback.mOnStartedCalled);
+ assertFalse(callback.mOnStoppedCalled);
+ assertEquals(null, callback.mRes);
+ throw e;
+ }
+
+ }
+
+ /**
+ * Verify the handler passed to startLocalOnlyHotspot is correctly used for callbacks when
+ * SoftApMode fails due to a underlying error.
+ */
+ @Test
+ public void testLocalOnlyHotspotCallbackFullOnNoChannelError() throws Exception {
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
+ .thenReturn(mApConfig);
+ mWifiManager.startLocalOnlyHotspot(callback, mHandler);
+ mLooper.dispatchAll();
+ //assertEquals(ERROR_NO_CHANNEL, callback.mFailureReason);
+ assertFalse(callback.mOnStartedCalled);
+ assertFalse(callback.mOnStoppedCalled);
+ assertEquals(null, callback.mRes);
+ }
+
+ /**
+ * Verify that the call to cancel a LOHS request does call stopLOHS.
+ */
+ @Test
+ public void testCancelLocalOnlyHotspotRequestCallsStopOnWifiService() throws Exception {
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
+ .thenReturn(mApConfig);
+ mWifiManager.startLocalOnlyHotspot(callback, mHandler);
+ mWifiManager.cancelLocalOnlyHotspotRequest();
+ verify(mWifiService).stopLocalOnlyHotspot();
+ }
+
+ /**
+ * Verify that we do not crash if cancelLocalOnlyHotspotRequest is called without an existing
+ * callback stored.
+ */
+ @Test
+ public void testCancelLocalOnlyHotspotReturnsWithoutExistingRequest() {
+ mWifiManager.cancelLocalOnlyHotspotRequest();
+ }
+
+ /**
+ * Verify that the callback is not triggered if the LOHS request was already cancelled.
+ */
+ @Test
+ public void testCallbackAfterLocalOnlyHotspotWasCancelled() throws Exception {
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
+ .thenReturn(mApConfig);
+ mWifiManager.startLocalOnlyHotspot(callback, mHandler);
+ mWifiManager.cancelLocalOnlyHotspotRequest();
+ verify(mWifiService).stopLocalOnlyHotspot();
+ mLooper.dispatchAll();
+ assertEquals(ERROR_NOT_SET, callback.mFailureReason);
+ assertFalse(callback.mOnStartedCalled);
+ assertFalse(callback.mOnStoppedCalled);
+ assertEquals(null, callback.mRes);
+ }
+
+ /**
+ * Verify that calling cancel LOHS request does not crash if an error callback was already
+ * handled.
+ */
+ @Test
+ public void testCancelAfterLocalOnlyHotspotCallbackTriggered() throws Exception {
+ TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
+ .thenReturn(null);
+ mWifiManager.startLocalOnlyHotspot(callback, mHandler);
+ mLooper.dispatchAll();
+ assertEquals(ERROR_INCOMPATIBLE_MODE, callback.mFailureReason);
+ assertFalse(callback.mOnStartedCalled);
+ assertFalse(callback.mOnStoppedCalled);
+ assertEquals(null, callback.mRes);
+ mWifiManager.cancelLocalOnlyHotspotRequest();
+ verify(mWifiService, never()).stopLocalOnlyHotspot();
+ }
+
+ /**
+ * Verify the watchLocalOnlyHotspot call goes to WifiServiceImpl.
+ */
+ public void testWatchLocalOnlyHotspot() throws Exception {
+ TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
+
+ mWifiManager.watchLocalOnlyHotspot(observer, mHandler);
+ verify(mWifiService).startWatchLocalOnlyHotspot(any(Messenger.class), any(IBinder.class));
+ }
+
+ /**
+ * Verify a SecurityException is thrown for callers without proper permissions for
+ * startWatchLocalOnlyHotspot.
+ */
+ @Test(expected = SecurityException.class)
+ public void testStartWatchLocalOnlyHotspotThrowsSecurityException() throws Exception {
+ TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
+ doThrow(new SecurityException()).when(mWifiService)
+ .startWatchLocalOnlyHotspot(any(Messenger.class), any(IBinder.class));
+ mWifiManager.watchLocalOnlyHotspot(observer, mHandler);
+ }
+
+ /**
+ * Verify an IllegalStateException is thrown for callers that already have a pending request for
+ * watchLocalOnlyHotspot.
+ */
+ @Test(expected = IllegalStateException.class)
+ public void testStartWatchLocalOnlyHotspotThrowsIllegalStateException() throws Exception {
+ TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
+ doThrow(new IllegalStateException()).when(mWifiService)
+ .startWatchLocalOnlyHotspot(any(Messenger.class), any(IBinder.class));
+ mWifiManager.watchLocalOnlyHotspot(observer, mHandler);
+ }
+
+ /**
+ * Verify that the handler provided by the caller is used for the observer.
+ */
+ @Test
+ public void testCorrectLooperIsUsedForObserverHandler() throws Exception {
+ // record thread from looper.getThread and check ids.
+ TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
+ mWifiManager.watchLocalOnlyHotspot(observer, mHandler);
+ mLooper.dispatchAll();
+ assertTrue(observer.mOnRegistered);
+ assertEquals(mLooper.getLooper().getThread().getId(), observer.mCallingThreadId);
+ }
+
+ /**
+ * Verify that the main looper's thread is used if a handler is not provided by the requesting
+ * application.
+ */
+ @Test
+ public void testMainLooperIsUsedWhenHandlerNotProvidedForObserver() throws Exception {
+ // record thread from looper.getThread and check ids.
+ TestLooper altLooper = new TestLooper();
+ when(mContext.getMainLooper()).thenReturn(altLooper.getLooper());
+ TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
+ mWifiManager.watchLocalOnlyHotspot(observer, null);
+ altLooper.dispatchAll();
+ assertTrue(observer.mOnRegistered);
+ assertEquals(altLooper.getLooper().getThread().getId(), observer.mCallingThreadId);
+ }
+
+ /**
+ * Verify the LOHS onRegistered observer callback is triggered when WifiManager receives a
+ * HOTSPOT_OBSERVER_REGISTERED message from WifiServiceImpl.
+ */
+ @Test
+ public void testOnRegisteredIsCalledWithSubscription() throws Exception {
+ TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
+ TestLooper observerLooper = new TestLooper();
+ Handler observerHandler = new Handler(observerLooper.getLooper());
+ assertFalse(observer.mOnRegistered);
+ assertEquals(null, observer.mSub);
+ mWifiManager.watchLocalOnlyHotspot(observer, observerHandler);
+ verify(mWifiService).startWatchLocalOnlyHotspot(mMessengerCaptor.capture(),
+ any(IBinder.class));
+ // now trigger the callback
+ observerLooper.dispatchAll();
+ mLooper.dispatchAll();
+ assertTrue(observer.mOnRegistered);
+ assertNotNull(observer.mSub);
+ }
+
+ /**
+ * Verify the LOHS onStarted observer callback is triggered when WifiManager receives a
+ * HOTSPOT_STARTED message from WifiServiceImpl.
+ */
+ @Test
+ public void testObserverOnStartedIsCalledWithWifiConfig() throws Exception {
+ TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
+ TestLooper observerLooper = new TestLooper();
+ Handler observerHandler = new Handler(observerLooper.getLooper());
+ mWifiManager.watchLocalOnlyHotspot(observer, observerHandler);
+ verify(mWifiService).startWatchLocalOnlyHotspot(mMessengerCaptor.capture(),
+ any(IBinder.class));
+ observerLooper.dispatchAll();
+ mLooper.dispatchAll();
+ assertFalse(observer.mOnStartedCalled);
+ // now trigger the callback
+ Message msg = new Message();
+ msg.what = HOTSPOT_STARTED;
+ msg.obj = mApConfig;
+ mMessengerCaptor.getValue().send(msg);
+ mLooper.dispatchAll();
+ observerLooper.dispatchAll();
+ assertTrue(observer.mOnStartedCalled);
+ assertEquals(mApConfig, observer.mConfig);
+ }
+
+ /**
+ * Verify the LOHS onStarted observer callback is triggered not when WifiManager receives a
+ * HOTSPOT_STARTED message from WifiServiceImpl with a null config.
+ */
+ @Test
+ public void testObserverOnStartedNotCalledWithNullConfig() throws Exception {
+ TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
+ TestLooper observerLooper = new TestLooper();
+ Handler observerHandler = new Handler(observerLooper.getLooper());
+ mWifiManager.watchLocalOnlyHotspot(observer, observerHandler);
+ verify(mWifiService).startWatchLocalOnlyHotspot(mMessengerCaptor.capture(),
+ any(IBinder.class));
+ observerLooper.dispatchAll();
+ mLooper.dispatchAll();
+ assertFalse(observer.mOnStartedCalled);
+ // now trigger the callback
+ Message msg = new Message();
+ msg.what = HOTSPOT_STARTED;
+ mMessengerCaptor.getValue().send(msg);
+ mLooper.dispatchAll();
+ observerLooper.dispatchAll();
+ assertFalse(observer.mOnStartedCalled);
+ assertEquals(null, observer.mConfig);
+ }
+
+
+ /**
+ * Verify the LOHS onStopped observer callback is triggered when WifiManager receives a
+ * HOTSPOT_STOPPED message from WifiServiceImpl.
+ */
+ @Test
+ public void testObserverOnStoppedIsCalled() throws Exception {
+ TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
+ TestLooper observerLooper = new TestLooper();
+ Handler observerHandler = new Handler(observerLooper.getLooper());
+ mWifiManager.watchLocalOnlyHotspot(observer, observerHandler);
+ verify(mWifiService).startWatchLocalOnlyHotspot(mMessengerCaptor.capture(),
+ any(IBinder.class));
+ observerLooper.dispatchAll();
+ mLooper.dispatchAll();
+ assertFalse(observer.mOnStoppedCalled);
+ // now trigger the callback
+ Message msg = new Message();
+ msg.what = HOTSPOT_STOPPED;
+ mMessengerCaptor.getValue().send(msg);
+ mLooper.dispatchAll();
+ observerLooper.dispatchAll();
+ assertTrue(observer.mOnStoppedCalled);
+ }
+
+ /**
+ * Verify WifiServiceImpl is not called if there is not a registered LOHS observer callback.
+ */
+ @Test
+ public void testUnregisterWifiServiceImplNotCalledWithoutRegisteredObserver() throws Exception {
+ mWifiManager.unregisterLocalOnlyHotspotObserver();
+ verifyZeroInteractions(mWifiService);
+ }
+
+ /**
+ * Verify WifiServiceImpl is called when there is a registered LOHS observer callback.
+ */
+ @Test
+ public void testUnregisterWifiServiceImplCalledWithRegisteredObserver() throws Exception {
+ TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
+ TestLooper observerLooper = new TestLooper();
+ Handler observerHandler = new Handler(observerLooper.getLooper());
+ mWifiManager.watchLocalOnlyHotspot(observer, observerHandler);
+ mWifiManager.unregisterLocalOnlyHotspotObserver();
+ verify(mWifiService).stopWatchLocalOnlyHotspot();
+ }
+
+}
diff --git a/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java b/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java
index 72a6a7a..694b911 100644
--- a/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java
+++ b/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java
@@ -150,7 +150,7 @@
inOrder.verify(mockAwareService).publish(eq(clientId), eq(publishConfig), any());
// (3) disconnect
- session.destroy();
+ session.close();
inOrder.verify(mockAwareService).disconnect(eq(clientId), eq(binder.getValue()));
// (4) try publishing again - fails silently
@@ -329,7 +329,7 @@
inOrder.verify(mockSessionCallback).onSessionConfigFailed();
// (5) terminate
- publishSession.getValue().destroy();
+ publishSession.getValue().close();
mMockLooper.dispatchAll();
inOrder.verify(mockAwareService).terminateSession(clientId, sessionId);
@@ -466,7 +466,7 @@
inOrder.verify(mockSessionCallback).onSessionConfigFailed();
// (5) terminate
- subscribeSession.getValue().destroy();
+ subscribeSession.getValue().close();
mMockLooper.dispatchAll();
inOrder.verify(mockAwareService).terminateSession(clientId, sessionId);
@@ -687,8 +687,6 @@
collector.checkThat("mSubscribeType", subscribeConfig.mSubscribeType,
equalTo(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE));
collector.checkThat("mTtlSec", subscribeConfig.mTtlSec, equalTo(0));
- collector.checkThat("mMatchStyle", subscribeConfig.mMatchStyle,
- equalTo(SubscribeConfig.MATCH_STYLE_ALL));
collector.checkThat("mEnableTerminateNotification",
subscribeConfig.mEnableTerminateNotification, equalTo(true));
}
@@ -701,14 +699,13 @@
final int subscribeType = SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE;
final int subscribeCount = 10;
final int subscribeTtl = 15;
- final int matchStyle = SubscribeConfig.MATCH_STYLE_FIRST_ONLY;
final boolean enableTerminateNotification = false;
SubscribeConfig subscribeConfig = new SubscribeConfig.Builder().setServiceName(serviceName)
.setServiceSpecificInfo(serviceSpecificInfo.getBytes()).setMatchFilter(
new TlvBufferUtils.TlvIterable(0, 1, matchFilter).toList())
.setSubscribeType(subscribeType)
- .setTtlSec(subscribeTtl).setMatchStyle(matchStyle)
+ .setTtlSec(subscribeTtl)
.setTerminateNotificationEnabled(enableTerminateNotification).build();
collector.checkThat("mServiceName", serviceName.getBytes(),
@@ -719,7 +716,6 @@
collector.checkThat("mSubscribeType", subscribeType,
equalTo(subscribeConfig.mSubscribeType));
collector.checkThat("mTtlSec", subscribeTtl, equalTo(subscribeConfig.mTtlSec));
- collector.checkThat("mMatchStyle", matchStyle, equalTo(subscribeConfig.mMatchStyle));
collector.checkThat("mEnableTerminateNotification", enableTerminateNotification,
equalTo(subscribeConfig.mEnableTerminateNotification));
}
@@ -730,16 +726,14 @@
final String serviceSpecificInfo = "long arbitrary string with some info";
final byte[] matchFilter = { 1, 16, 1, 22 };
final int subscribeType = SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE;
- final int subscribeCount = 10;
final int subscribeTtl = 15;
- final int matchStyle = SubscribeConfig.MATCH_STYLE_FIRST_ONLY;
final boolean enableTerminateNotification = true;
SubscribeConfig subscribeConfig = new SubscribeConfig.Builder().setServiceName(serviceName)
.setServiceSpecificInfo(serviceSpecificInfo.getBytes()).setMatchFilter(
new TlvBufferUtils.TlvIterable(0, 1, matchFilter).toList())
.setSubscribeType(subscribeType)
- .setTtlSec(subscribeTtl).setMatchStyle(matchStyle)
+ .setTtlSec(subscribeTtl)
.setTerminateNotificationEnabled(enableTerminateNotification).build();
Parcel parcelW = Parcel.obtain();
@@ -765,14 +759,6 @@
new SubscribeConfig.Builder().setTtlSec(-100);
}
- /**
- * Validate that a bad match style configuration throws an exception.
- */
- @Test(expected = IllegalArgumentException.class)
- public void testSubscribeConfigBuilderBadMatchStyle() {
- new SubscribeConfig.Builder().setMatchStyle(10);
- }
-
/*
* PublishConfig Tests
*/