Merge "Add persistent state for Bluetooth high quality audio support" into oc-dev
diff --git a/api/current.txt b/api/current.txt
index 0089555..899381b 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 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
@@ -1063,6 +1061,7 @@
field public static final int ratingBarStyleSmall = 16842877; // 0x101007d
field public static final int readPermission = 16842759; // 0x1010007
field public static final int recognitionService = 16843932; // 0x101049c
+ field public static final int recreateOnConfigChanges = 16844105; // 0x1010549
field public static final int recycleEnabled = 16844124; // 0x101055c
field public static final int relinquishTaskIdentity = 16843894; // 0x1010476
field public static final int reparent = 16843964; // 0x10104bc
@@ -1087,7 +1086,6 @@
field public static final int resizeable = 16843405; // 0x101028d
field public static final int resizeableActivity = 16844022; // 0x10104f6
field public static final int resource = 16842789; // 0x1010025
- field public static final int restartOnConfigChanges = 16844105; // 0x1010549
field public static final int restoreAnyVersion = 16843450; // 0x10102ba
field public static final deprecated int restoreNeedsApplication = 16843421; // 0x101029d
field public static final int restrictedAccountType = 16843733; // 0x10103d5
@@ -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 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 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,8 @@
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 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 +3603,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();
@@ -3681,7 +3676,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();
@@ -3759,7 +3753,7 @@
method public void setImmersive(boolean);
method public void setIntent(android.content.Intent);
method public final void setMediaController(android.media.session.MediaController);
- 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);
@@ -3838,7 +3832,6 @@
method public int getLauncherLargeIconDensity();
method public int getLauncherLargeIconSize();
method public int getLockTaskModeState();
- method public static int getMaxNumPictureInPictureActions();
method public int getMemoryClass();
method public void getMemoryInfo(android.app.ActivityManager.MemoryInfo);
method public static void getMyMemoryState(android.app.ActivityManager.RunningAppProcessInfo);
@@ -3942,7 +3935,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
@@ -4029,6 +4022,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();
@@ -4701,7 +4695,6 @@
public abstract class FragmentContainer {
ctor public FragmentContainer();
- method public android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
method public abstract <T extends android.view.View> T onFindViewById(int);
method public abstract boolean onHasView();
}
@@ -4816,6 +4809,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);
@@ -4848,11 +4842,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);
@@ -4860,6 +4853,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);
@@ -4953,7 +4947,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);
}
@@ -4973,7 +4967,6 @@
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 exitKeyguardSecurely(android.app.KeyguardManager.OnKeyguardExitResult);
method public boolean inKeyguardRestrictedInputMode();
method public boolean isDeviceLocked();
@@ -4981,6 +4974,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 {
@@ -5121,7 +5115,7 @@
method public android.app.Notification clone();
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();
@@ -5129,7 +5123,7 @@
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
@@ -5331,7 +5325,7 @@
method public android.app.Notification.Builder setAutoCancel(boolean);
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);
@@ -5375,7 +5369,7 @@
method public android.app.Notification.Builder setSubText(java.lang.CharSequence);
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);
@@ -5537,7 +5531,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();
@@ -5572,7 +5565,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();
@@ -5695,16 +5687,18 @@
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 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;
+ }
+
+ 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 {
@@ -6096,17 +6090,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();
@@ -6129,8 +6112,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);
@@ -6145,7 +6126,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();
@@ -6154,7 +6134,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;
@@ -6179,16 +6158,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;
@@ -6290,7 +6265,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);
@@ -6331,6 +6306,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);
@@ -6376,7 +6352,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);
@@ -6415,6 +6391,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);
@@ -6493,7 +6470,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
@@ -6531,8 +6508,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;
}
@@ -6703,7 +6680,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();
@@ -6738,6 +6714,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;
}
@@ -6766,6 +6743,7 @@
}
public class FullBackupDataOutput {
+ method public long getQuota();
}
public abstract class RestoreObserver {
@@ -6991,8 +6969,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;
@@ -8025,7 +8003,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);
}
@@ -8200,8 +8178,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 {
@@ -8272,21 +8252,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 {
@@ -8422,7 +8402,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);
@@ -8720,17 +8700,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";
@@ -9328,15 +9308,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";
@@ -9494,6 +9471,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";
@@ -9539,7 +9517,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";
@@ -10317,7 +10294,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 {
@@ -10911,8 +10888,8 @@
field public android.content.pm.ActivityInfo activityInfo;
field public android.content.IntentFilter filter;
field public int icon;
- field public boolean instantAppAvailable;
field public boolean isDefault;
+ field public boolean isInstantAppAvailable;
field public int labelRes;
field public int match;
field public java.lang.CharSequence nonLocalizedLabel;
@@ -10949,7 +10926,7 @@
method public java.util.List<android.content.pm.VersionedPackage> getDependentPackages();
method public java.lang.String getName();
method public int getType();
- method public long getVersion();
+ method public int getVersion();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.SharedLibraryInfo> CREATOR;
field public static final int TYPE_BUILTIN = 0; // 0x0
@@ -11037,7 +11014,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;
}
@@ -13283,7 +13260,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);
@@ -13759,6 +13736,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);
@@ -13809,7 +13787,7 @@
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);
@@ -13835,6 +13813,7 @@
package android.graphics.drawable {
public class AdaptiveIconDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+ ctor public AdaptiveIconDrawable(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
method public void draw(android.graphics.Canvas);
method public android.graphics.drawable.Drawable getBackground();
method public static float getExtraInsetFraction();
@@ -14393,17 +14372,13 @@
package android.graphics.fonts {
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 {
@@ -14491,7 +14466,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
@@ -14752,18 +14727,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 {
@@ -19262,9 +19235,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);
@@ -21006,6 +20979,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);
}
@@ -25395,8 +25369,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);
@@ -26551,6 +26525,7 @@
method public void setTdlsEnabled(java.net.InetAddress, boolean);
method public void setTdlsEnabledWithMacAddress(java.lang.String, boolean);
method public boolean setWifiEnabled(boolean);
+ method public void startLocalOnlyHotspot(android.net.wifi.WifiManager.LocalOnlyHotspotCallback, android.os.Handler);
method public boolean startScan();
method public void startWps(android.net.wifi.WpsInfo, android.net.wifi.WifiManager.WpsCallback);
method public int updateNetwork(android.net.wifi.WifiConfiguration);
@@ -26601,6 +26576,22 @@
field public static final int WPS_WEP_PROHIBITED = 4; // 0x4
}
+ public static class WifiManager.LocalOnlyHotspotCallback {
+ ctor public WifiManager.LocalOnlyHotspotCallback();
+ method public void onFailed(int);
+ method public void onStarted(android.net.wifi.WifiManager.LocalOnlyHotspotReservation);
+ method public void onStopped();
+ field public static final int ERROR_GENERIC = 2; // 0x2
+ field public static final int ERROR_INCOMPATIBLE_MODE = 3; // 0x3
+ field public static final int ERROR_NO_CHANNEL = 1; // 0x1
+ field public static final int ERROR_TETHERING_DISALLOWED = 4; // 0x4
+ }
+
+ public class WifiManager.LocalOnlyHotspotReservation implements java.lang.AutoCloseable {
+ method public void close();
+ method public android.net.wifi.WifiConfiguration getWifiConfiguration();
+ }
+
public class WifiManager.MulticastLock {
method public void acquire();
method public boolean isHeld();
@@ -26763,33 +26754,9 @@
ctor public PasspointConfiguration(android.net.wifi.hotspot2.PasspointConfiguration);
method public int describeContents();
method public android.net.wifi.hotspot2.pps.Credential getCredential();
- method public int getCredentialPriority();
method public android.net.wifi.hotspot2.pps.HomeSp getHomeSp();
- method public android.net.wifi.hotspot2.pps.Policy getPolicy();
- method public long getSubscriptionCreationTimeInMs();
- method public long getSubscriptionExpirationTimeInMs();
- method public java.lang.String getSubscriptionType();
- method public android.net.wifi.hotspot2.pps.UpdateParameter getSubscriptionUpdate();
- method public java.util.Map<java.lang.String, byte[]> getTrustRootCertList();
- method public int getUpdateIdentifier();
- method public long getUsageLimitDataLimit();
- method public long getUsageLimitStartTimeInMs();
- method public long getUsageLimitTimeLimitInMinutes();
- method public long getUsageLimitUsageTimePeriodInMinutes();
method public void setCredential(android.net.wifi.hotspot2.pps.Credential);
- method public void setCredentialPriority(int);
method public void setHomeSp(android.net.wifi.hotspot2.pps.HomeSp);
- method public void setPolicy(android.net.wifi.hotspot2.pps.Policy);
- method public void setSubscriptionCreationTimeInMs(long);
- method public void setSubscriptionExpirationTimeInMs(long);
- method public void setSubscriptionType(java.lang.String);
- method public void setSubscriptionUpdate(android.net.wifi.hotspot2.pps.UpdateParameter);
- method public void setTrustRootCertList(java.util.Map<java.lang.String, byte[]>);
- method public void setUpdateIdentifier(int);
- method public void setUsageLimitDataLimit(long);
- method public void setUsageLimitStartTimeInMs(long);
- method public void setUsageLimitTimeLimitInMinutes(long);
- method public void setUsageLimitUsageTimePeriodInMinutes(long);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.PasspointConfiguration> CREATOR;
}
@@ -26812,21 +26779,15 @@
method public int describeContents();
method public java.security.cert.X509Certificate getCaCertificate();
method public android.net.wifi.hotspot2.pps.Credential.CertificateCredential getCertCredential();
- method public boolean getCheckAaaServerCertStatus();
method public java.security.cert.X509Certificate[] getClientCertificateChain();
method public java.security.PrivateKey getClientPrivateKey();
- method public long getCreationTimeInMs();
- method public long getExpirationTimeInMs();
method public java.lang.String getRealm();
method public android.net.wifi.hotspot2.pps.Credential.SimCredential getSimCredential();
method public android.net.wifi.hotspot2.pps.Credential.UserCredential getUserCredential();
method public void setCaCertificate(java.security.cert.X509Certificate);
method public void setCertCredential(android.net.wifi.hotspot2.pps.Credential.CertificateCredential);
- method public void setCheckAaaServerCertStatus(boolean);
method public void setClientCertificateChain(java.security.cert.X509Certificate[]);
method public void setClientPrivateKey(java.security.PrivateKey);
- method public void setCreationTimeInMs(long);
- method public void setExpirationTimeInMs(long);
method public void setRealm(java.lang.String);
method public void setSimCredential(android.net.wifi.hotspot2.pps.Credential.SimCredential);
method public void setUserCredential(android.net.wifi.hotspot2.pps.Credential.UserCredential);
@@ -26862,19 +26823,13 @@
ctor public Credential.UserCredential();
ctor public Credential.UserCredential(android.net.wifi.hotspot2.pps.Credential.UserCredential);
method public int describeContents();
- method public boolean getAbleToShare();
method public int getEapType();
- method public boolean getMachineManaged();
method public java.lang.String getNonEapInnerMethod();
method public java.lang.String getPassword();
- method public java.lang.String getSoftTokenApp();
method public java.lang.String getUsername();
- method public void setAbleToShare(boolean);
method public void setEapType(int);
- method public void setMachineManaged(boolean);
method public void setNonEapInnerMethod(java.lang.String);
method public void setPassword(java.lang.String);
- method public void setSoftTokenApp(java.lang.String);
method public void setUsername(java.lang.String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.UserCredential> CREATOR;
@@ -26886,96 +26841,14 @@
method public int describeContents();
method public java.lang.String getFqdn();
method public java.lang.String getFriendlyName();
- method public java.util.Map<java.lang.String, java.lang.Long> getHomeNetworkIds();
- method public java.lang.String getIconUrl();
- method public long[] getMatchAllOis();
- method public long[] getMatchAnyOis();
- method public java.lang.String[] getOtherHomePartners();
method public long[] getRoamingConsortiumOis();
method public void setFqdn(java.lang.String);
method public void setFriendlyName(java.lang.String);
- method public void setHomeNetworkIds(java.util.Map<java.lang.String, java.lang.Long>);
- method public void setIconUrl(java.lang.String);
- method public void setMatchAllOis(long[]);
- method public void setMatchAnyOis(long[]);
- method public void setOtherHomePartners(java.lang.String[]);
method public void setRoamingConsortiumOis(long[]);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.HomeSp> CREATOR;
}
- public final class Policy implements android.os.Parcelable {
- ctor public Policy();
- ctor public Policy(android.net.wifi.hotspot2.pps.Policy);
- method public int describeContents();
- method public java.lang.String[] getExcludedSsidList();
- method public int getMaximumBssLoadValue();
- method public long getMinHomeDownlinkBandwidth();
- method public long getMinHomeUplinkBandwidth();
- method public long getMinRoamingDownlinkBandwidth();
- method public long getMinRoamingUplinkBandwidth();
- method public android.net.wifi.hotspot2.pps.UpdateParameter getPolicyUpdate();
- method public java.util.List<android.net.wifi.hotspot2.pps.Policy.RoamingPartner> getPreferredRoamingPartnerList();
- method public java.util.Map<java.lang.Integer, java.lang.String> getRequiredProtoPortMap();
- method public void setExcludedSsidList(java.lang.String[]);
- method public void setMaximumBssLoadValue(int);
- method public void setMinHomeDownlinkBandwidth(long);
- method public void setMinHomeUplinkBandwidth(long);
- method public void setMinRoamingDownlinkBandwidth(long);
- method public void setMinRoamingUplinkBandwidth(long);
- method public void setPolicyUpdate(android.net.wifi.hotspot2.pps.UpdateParameter);
- method public void setPreferredRoamingPartnerList(java.util.List<android.net.wifi.hotspot2.pps.Policy.RoamingPartner>);
- method public void setRequiredProtoPortMap(java.util.Map<java.lang.Integer, java.lang.String>);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Policy> CREATOR;
- }
-
- public static final class Policy.RoamingPartner implements android.os.Parcelable {
- ctor public Policy.RoamingPartner();
- ctor public Policy.RoamingPartner(android.net.wifi.hotspot2.pps.Policy.RoamingPartner);
- method public int describeContents();
- method public java.lang.String getCountries();
- method public java.lang.String getFqdn();
- method public boolean getFqdnExactMatch();
- method public int getPriority();
- method public void setCountries(java.lang.String);
- method public void setFqdn(java.lang.String);
- method public void setFqdnExactMatch(boolean);
- method public void setPriority(int);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Policy.RoamingPartner> CREATOR;
- }
-
- public final class UpdateParameter implements android.os.Parcelable {
- ctor public UpdateParameter();
- ctor public UpdateParameter(android.net.wifi.hotspot2.pps.UpdateParameter);
- method public int describeContents();
- method public java.lang.String getBase64EncodedPassword();
- method public java.lang.String getRestriction();
- method public java.lang.String getServerUri();
- method public byte[] getTrustRootCertSha256Fingerprint();
- method public java.lang.String getTrustRootCertUrl();
- method public long getUpdateIntervalInMinutes();
- method public java.lang.String getUpdateMethod();
- method public java.lang.String getUsername();
- method public void setBase64EncodedPassword(java.lang.String);
- method public void setRestriction(java.lang.String);
- method public void setServerUri(java.lang.String);
- method public void setTrustRootCertSha256Fingerprint(byte[]);
- method public void setTrustRootCertUrl(java.lang.String);
- method public void setUpdateIntervalInMinutes(long);
- method public void setUpdateMethod(java.lang.String);
- method public void setUsername(java.lang.String);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.UpdateParameter> CREATOR;
- field public static final long UPDATE_CHECK_INTERVAL_NEVER = 4294967295L; // 0xffffffffL
- field public static final java.lang.String UPDATE_METHOD_OMADM = "OMA-DM-ClientInitiated";
- field public static final java.lang.String UPDATE_METHOD_SSP = "SSP-ClientInitiated";
- field public static final java.lang.String UPDATE_RESTRICTION_HOMESP = "HomeSP";
- field public static final java.lang.String UPDATE_RESTRICTION_ROAMING_PARTNER = "RoamingPartner";
- field public static final java.lang.String UPDATE_RESTRICTION_UNRESTRICTED = "Unrestricted";
- }
-
}
package android.net.wifi.p2p {
@@ -30675,7 +30548,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);
@@ -30700,7 +30572,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);
@@ -31230,7 +31101,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);
@@ -31276,7 +31146,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;
}
@@ -31607,7 +31476,7 @@
public class TestLooperManager {
method public void execute(android.os.Message);
- method public android.os.MessageQueue getQueue();
+ method public android.os.MessageQueue getMessageQueue();
method public boolean hasMessages(android.os.Handler, java.lang.Object, int);
method public boolean hasMessages(android.os.Handler, java.lang.Object, java.lang.Runnable);
method public android.os.Message next();
@@ -31679,6 +31548,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";
@@ -31907,9 +31777,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);
@@ -31922,7 +31792,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;
@@ -31930,7 +31799,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;
}
@@ -34421,7 +34289,6 @@
}
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.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);
@@ -37020,7 +36887,7 @@
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 java.util.List<android.service.autofill.FillContext> getFillContexts();
method public int getFlags();
method public int getId();
method public void writeToParcel(android.os.Parcel, int);
@@ -37483,7 +37350,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";
}
@@ -37713,12 +37579,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();
@@ -38005,7 +37869,6 @@
method public void onRangeStart(java.lang.String, int, int, int);
method public abstract void onStart(java.lang.String);
method public void onStop(java.lang.String, boolean);
- method public deprecated void onUtteranceRangeStart(java.lang.String, int, int);
}
public class Voice implements android.os.Parcelable {
@@ -40086,8 +39949,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
}
@@ -45592,7 +45458,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);
@@ -45812,6 +45677,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";
@@ -46523,7 +46389,7 @@
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();
}
@@ -47235,8 +47101,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";
@@ -47418,10 +47284,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();
@@ -47763,7 +47629,7 @@
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();
@@ -47779,7 +47645,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 java.lang.String EXTRA_CLIENT_STATE = "android.view.autofill.extra.CLIENT_STATE";
}
public static abstract class AutofillManager.AutofillCallback {
@@ -48213,12 +48079,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();
@@ -48229,19 +48090,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";
@@ -48920,7 +48786,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();
@@ -48967,7 +48832,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);
@@ -51427,7 +51291,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);
@@ -52112,15 +51976,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 c132385..e7b573b 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -1,9 +1,64 @@
package android.app {
+ public class Activity extends android.view.ContextThemeWrapper implements android.content.ComponentCallbacks2 android.view.KeyEvent.Callback android.view.LayoutInflater.Factory2 android.view.View.OnCreateContextMenuListener android.view.Window.Callback {
+ method public deprecated boolean enterPictureInPictureMode(android.app.PictureInPictureArgs);
+ method public deprecated void setPictureInPictureArgs(android.app.PictureInPictureArgs);
+ }
+
+ public class ActivityManager {
+ method public static deprecated int getMaxNumPictureInPictureActions();
+ }
+
+ public class KeyguardManager {
+ method public deprecated void dismissKeyguard(android.app.Activity, android.app.KeyguardManager.KeyguardDismissCallback, android.os.Handler);
+ }
+
public class Notification implements android.os.Parcelable {
+ method public deprecated java.lang.String getChannel();
+ method public deprecated long getTimeout();
method public deprecated void setLatestEventInfo(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
}
+ public static class Notification.Builder {
+ method public deprecated android.app.Notification.Builder setChannel(java.lang.String);
+ method public deprecated android.app.Notification.Builder setTimeout(long);
+ }
+
+ public static final class Notification.TvExtender implements android.app.Notification.Extender {
+ method public deprecated java.lang.String getChannel();
+ }
+
+ public final deprecated class PictureInPictureArgs implements android.os.Parcelable {
+ ctor public deprecated PictureInPictureArgs();
+ ctor public deprecated PictureInPictureArgs(float, java.util.List<android.app.RemoteAction>);
+ method public static android.app.PictureInPictureArgs convert(android.app.PictureInPictureParams);
+ method public static android.app.PictureInPictureParams convert(android.app.PictureInPictureArgs);
+ method public void copyOnlySet(android.app.PictureInPictureArgs);
+ method public java.util.List<android.app.RemoteAction> getActions();
+ method public float getAspectRatio();
+ method public android.util.Rational getAspectRatioRational();
+ method public android.graphics.Rect getSourceRectHint();
+ method public android.graphics.Rect getSourceRectHintInsets();
+ method public boolean hasSetActions();
+ method public boolean hasSetAspectRatio();
+ method public boolean hasSourceBoundsHint();
+ method public boolean hasSourceBoundsHintInsets();
+ 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);
+ method public deprecated void setSourceRectHintInsets(android.graphics.Rect);
+ method public void truncateActions(int);
+ field public static final android.os.Parcelable.Creator<android.app.PictureInPictureArgs> CREATOR;
+ }
+
+ public static class PictureInPictureArgs.Builder {
+ ctor public PictureInPictureArgs.Builder();
+ method public android.app.PictureInPictureArgs build();
+ method public android.app.PictureInPictureArgs.Builder setActions(java.util.List<android.app.RemoteAction>);
+ method public android.app.PictureInPictureArgs.Builder setAspectRatio(android.util.Rational);
+ method public android.app.PictureInPictureArgs.Builder setSourceRectHint(android.graphics.Rect);
+ }
+
public final class RecoverableSecurityException extends java.lang.SecurityException implements android.os.Parcelable {
method public deprecated void showAsNotification(android.content.Context);
}
@@ -17,12 +72,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;
@@ -37,6 +98,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);
@@ -66,6 +131,10 @@
method public abstract boolean setInstantAppCookie(byte[]);
}
+ public class ResolveInfo implements android.os.Parcelable {
+ field public deprecated boolean instantAppAvailable;
+ }
+
public final class SharedLibraryInfo implements android.os.Parcelable {
method public boolean isBuiltin();
method public boolean isDynamic();
@@ -178,6 +247,26 @@
method public deprecated int stopUsingNetworkFeature(int, java.lang.String);
}
+ public deprecated class NetworkBadging {
+ method public static android.graphics.drawable.Drawable getWifiIcon(int, int, android.content.res.Resources.Theme);
+ field public static final int BADGING_4K = 30; // 0x1e
+ field public static final int BADGING_HD = 20; // 0x14
+ field public static final int BADGING_NONE = 0; // 0x0
+ field public static final int BADGING_SD = 10; // 0xa
+ }
+
+ public abstract class NetworkRecommendationProvider {
+ ctor public deprecated NetworkRecommendationProvider(android.os.Handler);
+ method public deprecated void onRequestRecommendation(android.net.RecommendationRequest, android.net.NetworkRecommendationProvider.ResultCallback);
+ 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 deprecated class NetworkRecommendationProvider.ResultCallback {
+ ctor public NetworkRecommendationProvider.ResultCallback(android.os.IRemoteCallback, int);
+ method public void onResult(android.net.RecommendationResult);
+ }
+
public abstract class PskKeyManager {
ctor public PskKeyManager();
field public static final int MAX_IDENTITY_HINT_LENGTH_BYTES = 128; // 0x80
@@ -185,6 +274,37 @@
field public static final int MAX_KEY_LENGTH_BYTES = 256; // 0x100
}
+ public final deprecated class RecommendationRequest implements android.os.Parcelable {
+ ctor protected RecommendationRequest(android.os.Parcel);
+ method public android.net.wifi.WifiConfiguration[] getConnectableConfigs();
+ method public android.net.wifi.WifiConfiguration getConnectedConfig();
+ method public android.net.wifi.WifiConfiguration getDefaultWifiConfig();
+ method public int getLastSelectedNetworkId();
+ method public long getLastSelectedNetworkTimestamp();
+ method public android.net.wifi.ScanResult[] getScanResults();
+ method public void setConnectableConfigs(android.net.wifi.WifiConfiguration[]);
+ method public void setConnectedConfig(android.net.wifi.WifiConfiguration);
+ field public static final android.os.Parcelable.Creator<android.net.RecommendationRequest> CREATOR;
+ }
+
+ 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[]);
+ method public android.net.RecommendationRequest.Builder setConnectedWifiConfig(android.net.wifi.WifiConfiguration);
+ method public android.net.RecommendationRequest.Builder setDefaultWifiConfig(android.net.wifi.WifiConfiguration);
+ method public android.net.RecommendationRequest.Builder setLastSelectedNetwork(int, long);
+ method public android.net.RecommendationRequest.Builder setScanResults(android.net.wifi.ScanResult[]);
+ }
+
+ 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 android.net.wifi.WifiConfiguration getWifiConfiguration();
+ method public boolean hasRecommendation();
+ field public static final android.os.Parcelable.Creator<android.net.RecommendationResult> CREATOR;
+ }
+
public class SSLCertificateSocketFactory extends javax.net.ssl.SSLSocketFactory {
method public static deprecated org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache);
}
@@ -211,6 +331,10 @@
ctor public RecoverySystem();
}
+ public class TestLooperManager {
+ method public deprecated android.os.MessageQueue getQueue();
+ }
+
public class UserManager {
method public android.graphics.drawable.Drawable getBadgedDrawableForUser(android.graphics.drawable.Drawable, android.os.UserHandle, android.graphics.Rect, int);
method public android.graphics.drawable.Drawable getBadgedIconForUser(android.graphics.drawable.Drawable, android.os.UserHandle);
@@ -372,6 +496,14 @@
}
+package android.speech.tts {
+
+ public abstract class UtteranceProgressListener {
+ method public deprecated void onUtteranceRangeStart(java.lang.String, int, int);
+ }
+
+}
+
package android.test.mock {
public deprecated class MockPackageManager extends android.content.pm.PackageManager {
@@ -442,6 +574,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 f49ab1d..8aa6c36 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 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
@@ -1182,6 +1182,7 @@
field public static final int ratingBarStyleSmall = 16842877; // 0x101007d
field public static final int readPermission = 16842759; // 0x1010007
field public static final int recognitionService = 16843932; // 0x101049c
+ field public static final int recreateOnConfigChanges = 16844105; // 0x1010549
field public static final int recycleEnabled = 16844124; // 0x101055c
field public static final int relinquishTaskIdentity = 16843894; // 0x1010476
field public static final int reparent = 16843964; // 0x10104bc
@@ -1208,7 +1209,6 @@
field public static final int resizeable = 16843405; // 0x101028d
field public static final int resizeableActivity = 16844022; // 0x10104f6
field public static final int resource = 16842789; // 0x1010025
- field public static final int restartOnConfigChanges = 16844105; // 0x1010549
field public static final int restoreAnyVersion = 16843450; // 0x10102ba
field public static final deprecated int restoreNeedsApplication = 16843421; // 0x101029d
field public static final int restrictedAccountType = 16843733; // 0x10103d5
@@ -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 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 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,8 @@
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 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 +3736,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();
@@ -3814,7 +3811,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();
@@ -3893,7 +3889,7 @@
method public void setImmersive(boolean);
method public void setIntent(android.content.Intent);
method public final void setMediaController(android.media.session.MediaController);
- 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);
@@ -3979,7 +3975,6 @@
method public int getLauncherLargeIconDensity();
method public int getLauncherLargeIconSize();
method public int getLockTaskModeState();
- method public static int getMaxNumPictureInPictureActions();
method public int getMemoryClass();
method public void getMemoryInfo(android.app.ActivityManager.MemoryInfo);
method public static void getMyMemoryState(android.app.ActivityManager.RunningAppProcessInfo);
@@ -4091,7 +4086,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
@@ -4178,6 +4173,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();
@@ -4869,7 +4865,6 @@
public abstract class FragmentContainer {
ctor public FragmentContainer();
- method public android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
method public abstract <T extends android.view.View> T onFindViewById(int);
method public abstract boolean onHasView();
}
@@ -4984,6 +4979,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);
@@ -5016,11 +5012,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);
@@ -5028,6 +5023,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);
@@ -5133,7 +5129,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);
}
@@ -5153,7 +5149,6 @@
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 exitKeyguardSecurely(android.app.KeyguardManager.OnKeyguardExitResult);
method public boolean inKeyguardRestrictedInputMode();
method public boolean isDeviceLocked();
@@ -5161,6 +5156,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 {
@@ -5301,7 +5297,7 @@
method public android.app.Notification clone();
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();
@@ -5310,7 +5306,7 @@
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
@@ -5515,7 +5511,7 @@
method public android.app.Notification.Builder setAutoCancel(boolean);
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);
@@ -5559,7 +5555,7 @@
method public android.app.Notification.Builder setSubText(java.lang.CharSequence);
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);
@@ -5663,11 +5659,12 @@
ctor public Notification.TvExtender();
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);
}
@@ -5734,7 +5731,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();
@@ -5774,7 +5770,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();
@@ -5898,16 +5893,18 @@
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 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;
+ }
+
+ 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 {
@@ -6303,17 +6300,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();
@@ -6336,8 +6322,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();
@@ -6354,7 +6338,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();
@@ -6363,7 +6346,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;
@@ -6391,16 +6373,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;
@@ -6502,7 +6480,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);
@@ -6550,6 +6528,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;
@@ -6606,7 +6585,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);
@@ -6646,6 +6625,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);
@@ -6734,7 +6714,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
@@ -6777,8 +6757,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;
}
@@ -6949,7 +6929,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();
@@ -6986,6 +6965,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;
}
@@ -7162,6 +7143,7 @@
}
public class FullBackupDataOutput {
+ method public long getQuota();
}
public class RestoreDescription implements android.os.Parcelable {
@@ -7457,8 +7439,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;
@@ -8500,7 +8482,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);
}
@@ -8688,8 +8670,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 {
@@ -8769,21 +8753,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 {
@@ -8919,7 +8903,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);
@@ -9217,17 +9201,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";
@@ -9849,15 +9833,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";
@@ -9874,6 +9855,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";
@@ -10040,6 +10022,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";
@@ -10108,7 +10091,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";
@@ -10974,7 +10956,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 {
@@ -11672,8 +11654,8 @@
field public android.content.pm.ActivityInfo activityInfo;
field public android.content.IntentFilter filter;
field public int icon;
- field public boolean instantAppAvailable;
field public boolean isDefault;
+ field public boolean isInstantAppAvailable;
field public int labelRes;
field public int match;
field public java.lang.CharSequence nonLocalizedLabel;
@@ -11710,7 +11692,7 @@
method public java.util.List<android.content.pm.VersionedPackage> getDependentPackages();
method public java.lang.String getName();
method public int getType();
- method public long getVersion();
+ method public int getVersion();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.SharedLibraryInfo> CREATOR;
field public static final int TYPE_BUILTIN = 0; // 0x0
@@ -11798,7 +11780,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;
}
@@ -14058,7 +14040,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);
@@ -14534,6 +14516,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);
@@ -14584,7 +14567,7 @@
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);
@@ -14610,6 +14593,7 @@
package android.graphics.drawable {
public class AdaptiveIconDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+ ctor public AdaptiveIconDrawable(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
method public void draw(android.graphics.Canvas);
method public android.graphics.drawable.Drawable getBackground();
method public static float getExtraInsetFraction();
@@ -15168,17 +15152,13 @@
package android.graphics.fonts {
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 {
@@ -15266,7 +15246,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
@@ -15527,18 +15507,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 {
@@ -20765,9 +20743,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);
@@ -22811,6 +22789,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);
}
@@ -27267,6 +27246,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);
@@ -27573,8 +27553,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);
@@ -27776,17 +27756,6 @@
field public static final android.os.Parcelable.Creator<android.net.Network> CREATOR;
}
- public class NetworkBadging {
- method public static android.graphics.drawable.Drawable getWifiIcon(int, int, android.content.res.Resources.Theme);
- field public static final int BADGING_4K = 30; // 0x1e
- field public static final int BADGING_HD = 20; // 0x14
- field public static final int BADGING_NONE = 0; // 0x0
- field public static final int BADGING_SD = 10; // 0xa
- }
-
- public static abstract class NetworkBadging.Badging implements java.lang.annotation.Annotation {
- }
-
public final class NetworkCapabilities implements android.os.Parcelable {
ctor public NetworkCapabilities(android.net.NetworkCapabilities);
method public int describeContents();
@@ -27881,17 +27850,9 @@
}
public abstract class NetworkRecommendationProvider {
- 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 deprecated void onRequestRecommendation(android.net.RecommendationRequest, android.net.NetworkRecommendationProvider.ResultCallback);
method public abstract void onRequestScores(android.net.NetworkKey[]);
- 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 deprecated class NetworkRecommendationProvider.ResultCallback {
- method public void onResult(android.net.RecommendationResult);
}
public class NetworkRequest implements android.os.Parcelable {
@@ -27957,41 +27918,6 @@
field public static final android.os.Parcelable.Creator<android.net.ProxyInfo> CREATOR;
}
- 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();
- method public android.net.wifi.WifiConfiguration getConnectedConfig();
- method public android.net.wifi.WifiConfiguration getDefaultWifiConfig();
- method public int getLastSelectedNetworkId();
- method public long getLastSelectedNetworkTimestamp();
- method public android.net.wifi.ScanResult[] getScanResults();
- method public void setConnectableConfigs(android.net.wifi.WifiConfiguration[]);
- method public void setConnectedConfig(android.net.wifi.WifiConfiguration);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.RecommendationRequest> CREATOR;
- }
-
- 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[]);
- method public android.net.RecommendationRequest.Builder setConnectedWifiConfig(android.net.wifi.WifiConfiguration);
- method public android.net.RecommendationRequest.Builder setDefaultWifiConfig(android.net.wifi.WifiConfiguration);
- method public android.net.RecommendationRequest.Builder setLastSelectedNetwork(int, long);
- method public android.net.RecommendationRequest.Builder setScanResults(android.net.wifi.ScanResult[]);
- }
-
- 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();
- method public android.net.wifi.WifiConfiguration getWifiConfiguration();
- method public boolean hasRecommendation();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.RecommendationResult> CREATOR;
- }
-
public final class RouteInfo implements android.os.Parcelable {
method public int describeContents();
method public android.net.IpPrefix getDestination();
@@ -29126,6 +29052,7 @@
method public boolean setWifiApConfiguration(android.net.wifi.WifiConfiguration);
method public boolean setWifiApEnabled(android.net.wifi.WifiConfiguration, boolean);
method public boolean setWifiEnabled(boolean);
+ method public void startLocalOnlyHotspot(android.net.wifi.WifiManager.LocalOnlyHotspotCallback, android.os.Handler);
method public deprecated boolean startLocationRestrictedScan(android.os.WorkSource);
method public boolean startScan();
method public boolean startScan(android.os.WorkSource);
@@ -29203,6 +29130,22 @@
method public abstract void onSuccess();
}
+ public static class WifiManager.LocalOnlyHotspotCallback {
+ ctor public WifiManager.LocalOnlyHotspotCallback();
+ method public void onFailed(int);
+ method public void onStarted(android.net.wifi.WifiManager.LocalOnlyHotspotReservation);
+ method public void onStopped();
+ field public static final int ERROR_GENERIC = 2; // 0x2
+ field public static final int ERROR_INCOMPATIBLE_MODE = 3; // 0x3
+ field public static final int ERROR_NO_CHANNEL = 1; // 0x1
+ field public static final int ERROR_TETHERING_DISALLOWED = 4; // 0x4
+ }
+
+ public class WifiManager.LocalOnlyHotspotReservation implements java.lang.AutoCloseable {
+ method public void close();
+ method public android.net.wifi.WifiConfiguration getWifiConfiguration();
+ }
+
public class WifiManager.MulticastLock {
method public void acquire();
method public boolean isHeld();
@@ -29507,33 +29450,9 @@
ctor public PasspointConfiguration(android.net.wifi.hotspot2.PasspointConfiguration);
method public int describeContents();
method public android.net.wifi.hotspot2.pps.Credential getCredential();
- method public int getCredentialPriority();
method public android.net.wifi.hotspot2.pps.HomeSp getHomeSp();
- method public android.net.wifi.hotspot2.pps.Policy getPolicy();
- method public long getSubscriptionCreationTimeInMs();
- method public long getSubscriptionExpirationTimeInMs();
- method public java.lang.String getSubscriptionType();
- method public android.net.wifi.hotspot2.pps.UpdateParameter getSubscriptionUpdate();
- method public java.util.Map<java.lang.String, byte[]> getTrustRootCertList();
- method public int getUpdateIdentifier();
- method public long getUsageLimitDataLimit();
- method public long getUsageLimitStartTimeInMs();
- method public long getUsageLimitTimeLimitInMinutes();
- method public long getUsageLimitUsageTimePeriodInMinutes();
method public void setCredential(android.net.wifi.hotspot2.pps.Credential);
- method public void setCredentialPriority(int);
method public void setHomeSp(android.net.wifi.hotspot2.pps.HomeSp);
- method public void setPolicy(android.net.wifi.hotspot2.pps.Policy);
- method public void setSubscriptionCreationTimeInMs(long);
- method public void setSubscriptionExpirationTimeInMs(long);
- method public void setSubscriptionType(java.lang.String);
- method public void setSubscriptionUpdate(android.net.wifi.hotspot2.pps.UpdateParameter);
- method public void setTrustRootCertList(java.util.Map<java.lang.String, byte[]>);
- method public void setUpdateIdentifier(int);
- method public void setUsageLimitDataLimit(long);
- method public void setUsageLimitStartTimeInMs(long);
- method public void setUsageLimitTimeLimitInMinutes(long);
- method public void setUsageLimitUsageTimePeriodInMinutes(long);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.PasspointConfiguration> CREATOR;
}
@@ -29556,21 +29475,15 @@
method public int describeContents();
method public java.security.cert.X509Certificate getCaCertificate();
method public android.net.wifi.hotspot2.pps.Credential.CertificateCredential getCertCredential();
- method public boolean getCheckAaaServerCertStatus();
method public java.security.cert.X509Certificate[] getClientCertificateChain();
method public java.security.PrivateKey getClientPrivateKey();
- method public long getCreationTimeInMs();
- method public long getExpirationTimeInMs();
method public java.lang.String getRealm();
method public android.net.wifi.hotspot2.pps.Credential.SimCredential getSimCredential();
method public android.net.wifi.hotspot2.pps.Credential.UserCredential getUserCredential();
method public void setCaCertificate(java.security.cert.X509Certificate);
method public void setCertCredential(android.net.wifi.hotspot2.pps.Credential.CertificateCredential);
- method public void setCheckAaaServerCertStatus(boolean);
method public void setClientCertificateChain(java.security.cert.X509Certificate[]);
method public void setClientPrivateKey(java.security.PrivateKey);
- method public void setCreationTimeInMs(long);
- method public void setExpirationTimeInMs(long);
method public void setRealm(java.lang.String);
method public void setSimCredential(android.net.wifi.hotspot2.pps.Credential.SimCredential);
method public void setUserCredential(android.net.wifi.hotspot2.pps.Credential.UserCredential);
@@ -29606,19 +29519,13 @@
ctor public Credential.UserCredential();
ctor public Credential.UserCredential(android.net.wifi.hotspot2.pps.Credential.UserCredential);
method public int describeContents();
- method public boolean getAbleToShare();
method public int getEapType();
- method public boolean getMachineManaged();
method public java.lang.String getNonEapInnerMethod();
method public java.lang.String getPassword();
- method public java.lang.String getSoftTokenApp();
method public java.lang.String getUsername();
- method public void setAbleToShare(boolean);
method public void setEapType(int);
- method public void setMachineManaged(boolean);
method public void setNonEapInnerMethod(java.lang.String);
method public void setPassword(java.lang.String);
- method public void setSoftTokenApp(java.lang.String);
method public void setUsername(java.lang.String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.UserCredential> CREATOR;
@@ -29630,96 +29537,14 @@
method public int describeContents();
method public java.lang.String getFqdn();
method public java.lang.String getFriendlyName();
- method public java.util.Map<java.lang.String, java.lang.Long> getHomeNetworkIds();
- method public java.lang.String getIconUrl();
- method public long[] getMatchAllOis();
- method public long[] getMatchAnyOis();
- method public java.lang.String[] getOtherHomePartners();
method public long[] getRoamingConsortiumOis();
method public void setFqdn(java.lang.String);
method public void setFriendlyName(java.lang.String);
- method public void setHomeNetworkIds(java.util.Map<java.lang.String, java.lang.Long>);
- method public void setIconUrl(java.lang.String);
- method public void setMatchAllOis(long[]);
- method public void setMatchAnyOis(long[]);
- method public void setOtherHomePartners(java.lang.String[]);
method public void setRoamingConsortiumOis(long[]);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.HomeSp> CREATOR;
}
- public final class Policy implements android.os.Parcelable {
- ctor public Policy();
- ctor public Policy(android.net.wifi.hotspot2.pps.Policy);
- method public int describeContents();
- method public java.lang.String[] getExcludedSsidList();
- method public int getMaximumBssLoadValue();
- method public long getMinHomeDownlinkBandwidth();
- method public long getMinHomeUplinkBandwidth();
- method public long getMinRoamingDownlinkBandwidth();
- method public long getMinRoamingUplinkBandwidth();
- method public android.net.wifi.hotspot2.pps.UpdateParameter getPolicyUpdate();
- method public java.util.List<android.net.wifi.hotspot2.pps.Policy.RoamingPartner> getPreferredRoamingPartnerList();
- method public java.util.Map<java.lang.Integer, java.lang.String> getRequiredProtoPortMap();
- method public void setExcludedSsidList(java.lang.String[]);
- method public void setMaximumBssLoadValue(int);
- method public void setMinHomeDownlinkBandwidth(long);
- method public void setMinHomeUplinkBandwidth(long);
- method public void setMinRoamingDownlinkBandwidth(long);
- method public void setMinRoamingUplinkBandwidth(long);
- method public void setPolicyUpdate(android.net.wifi.hotspot2.pps.UpdateParameter);
- method public void setPreferredRoamingPartnerList(java.util.List<android.net.wifi.hotspot2.pps.Policy.RoamingPartner>);
- method public void setRequiredProtoPortMap(java.util.Map<java.lang.Integer, java.lang.String>);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Policy> CREATOR;
- }
-
- public static final class Policy.RoamingPartner implements android.os.Parcelable {
- ctor public Policy.RoamingPartner();
- ctor public Policy.RoamingPartner(android.net.wifi.hotspot2.pps.Policy.RoamingPartner);
- method public int describeContents();
- method public java.lang.String getCountries();
- method public java.lang.String getFqdn();
- method public boolean getFqdnExactMatch();
- method public int getPriority();
- method public void setCountries(java.lang.String);
- method public void setFqdn(java.lang.String);
- method public void setFqdnExactMatch(boolean);
- method public void setPriority(int);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Policy.RoamingPartner> CREATOR;
- }
-
- public final class UpdateParameter implements android.os.Parcelable {
- ctor public UpdateParameter();
- ctor public UpdateParameter(android.net.wifi.hotspot2.pps.UpdateParameter);
- method public int describeContents();
- method public java.lang.String getBase64EncodedPassword();
- method public java.lang.String getRestriction();
- method public java.lang.String getServerUri();
- method public byte[] getTrustRootCertSha256Fingerprint();
- method public java.lang.String getTrustRootCertUrl();
- method public long getUpdateIntervalInMinutes();
- method public java.lang.String getUpdateMethod();
- method public java.lang.String getUsername();
- method public void setBase64EncodedPassword(java.lang.String);
- method public void setRestriction(java.lang.String);
- method public void setServerUri(java.lang.String);
- method public void setTrustRootCertSha256Fingerprint(byte[]);
- method public void setTrustRootCertUrl(java.lang.String);
- method public void setUpdateIntervalInMinutes(long);
- method public void setUpdateMethod(java.lang.String);
- method public void setUsername(java.lang.String);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.UpdateParameter> CREATOR;
- field public static final long UPDATE_CHECK_INTERVAL_NEVER = 4294967295L; // 0xffffffffL
- field public static final java.lang.String UPDATE_METHOD_OMADM = "OMA-DM-ClientInitiated";
- field public static final java.lang.String UPDATE_METHOD_SSP = "SSP-ClientInitiated";
- field public static final java.lang.String UPDATE_RESTRICTION_HOMESP = "HomeSP";
- field public static final java.lang.String UPDATE_RESTRICTION_ROAMING_PARTNER = "RoamingPartner";
- field public static final java.lang.String UPDATE_RESTRICTION_UNRESTRICTED = "Unrestricted";
- }
-
}
package android.net.wifi.p2p {
@@ -33433,7 +33258,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);
@@ -33458,7 +33282,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);
@@ -34020,7 +33843,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);
@@ -34066,7 +33888,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;
}
@@ -34426,7 +34247,7 @@
public class TestLooperManager {
method public void execute(android.os.Message);
- method public android.os.MessageQueue getQueue();
+ method public android.os.MessageQueue getMessageQueue();
method public boolean hasMessages(android.os.Handler, java.lang.Object, int);
method public boolean hasMessages(android.os.Handler, java.lang.Object, java.lang.Runnable);
method public android.os.Message next();
@@ -34559,6 +34380,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";
@@ -34803,8 +34625,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;
@@ -34818,7 +34643,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;
@@ -37409,7 +37233,6 @@
}
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.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);
@@ -40133,7 +39956,7 @@
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 java.util.List<android.service.autofill.FillContext> getFillContexts();
method public int getFlags();
method public int getId();
method public void writeToParcel(android.os.Parcel, int);
@@ -40676,7 +40499,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";
}
@@ -40969,12 +40791,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();
@@ -41261,7 +41081,6 @@
method public void onRangeStart(java.lang.String, int, int, int);
method public abstract void onStart(java.lang.String);
method public void onStop(java.lang.String, boolean);
- method public deprecated void onUtteranceRangeStart(java.lang.String, int, int);
}
public class Voice implements android.os.Parcelable {
@@ -43562,8 +43381,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
}
@@ -46741,6 +46563,7 @@
method public int getTag();
method public int getThreadId();
method public long getTimeNanos();
+ method public int getUid();
}
public deprecated class EventLogTags {
@@ -49174,7 +48997,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);
@@ -49394,6 +49216,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";
@@ -50105,7 +49928,7 @@
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();
}
@@ -50673,6 +50496,7 @@
method public java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int);
method public java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList();
method public void interrupt();
+ method public static boolean isAccessibilityButtonSupported();
method public boolean isEnabled();
method public boolean isTouchExplorationEnabled();
method public boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener);
@@ -50820,8 +50644,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";
@@ -51003,10 +50827,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();
@@ -51348,7 +51172,7 @@
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();
@@ -51364,7 +51188,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 java.lang.String EXTRA_CLIENT_STATE = "android.view.autofill.extra.CLIENT_STATE";
}
public static abstract class AutofillManager.AutofillCallback {
@@ -51798,12 +51622,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();
@@ -51814,19 +51633,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";
@@ -52598,7 +52422,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();
@@ -52646,7 +52469,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);
@@ -55377,7 +55199,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);
@@ -56062,15 +55884,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 039cd74..15de5c4 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -1,9 +1,64 @@
package android.app {
+ public class Activity extends android.view.ContextThemeWrapper implements android.content.ComponentCallbacks2 android.view.KeyEvent.Callback android.view.LayoutInflater.Factory2 android.view.View.OnCreateContextMenuListener android.view.Window.Callback {
+ method public deprecated boolean enterPictureInPictureMode(android.app.PictureInPictureArgs);
+ method public deprecated void setPictureInPictureArgs(android.app.PictureInPictureArgs);
+ }
+
+ public class ActivityManager {
+ method public static deprecated int getMaxNumPictureInPictureActions();
+ }
+
+ public class KeyguardManager {
+ method public deprecated void dismissKeyguard(android.app.Activity, android.app.KeyguardManager.KeyguardDismissCallback, android.os.Handler);
+ }
+
public class Notification implements android.os.Parcelable {
+ method public deprecated java.lang.String getChannel();
+ method public deprecated long getTimeout();
method public deprecated void setLatestEventInfo(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
}
+ public static class Notification.Builder {
+ method public deprecated android.app.Notification.Builder setChannel(java.lang.String);
+ method public deprecated android.app.Notification.Builder setTimeout(long);
+ }
+
+ public static final class Notification.TvExtender implements android.app.Notification.Extender {
+ method public deprecated java.lang.String getChannel();
+ }
+
+ public final deprecated class PictureInPictureArgs implements android.os.Parcelable {
+ ctor public deprecated PictureInPictureArgs();
+ ctor public deprecated PictureInPictureArgs(float, java.util.List<android.app.RemoteAction>);
+ method public static android.app.PictureInPictureArgs convert(android.app.PictureInPictureParams);
+ method public static android.app.PictureInPictureParams convert(android.app.PictureInPictureArgs);
+ method public void copyOnlySet(android.app.PictureInPictureArgs);
+ method public java.util.List<android.app.RemoteAction> getActions();
+ method public float getAspectRatio();
+ method public android.util.Rational getAspectRatioRational();
+ method public android.graphics.Rect getSourceRectHint();
+ method public android.graphics.Rect getSourceRectHintInsets();
+ method public boolean hasSetActions();
+ method public boolean hasSetAspectRatio();
+ method public boolean hasSourceBoundsHint();
+ method public boolean hasSourceBoundsHintInsets();
+ 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);
+ method public deprecated void setSourceRectHintInsets(android.graphics.Rect);
+ method public void truncateActions(int);
+ field public static final android.os.Parcelable.Creator<android.app.PictureInPictureArgs> CREATOR;
+ }
+
+ public static class PictureInPictureArgs.Builder {
+ ctor public PictureInPictureArgs.Builder();
+ method public android.app.PictureInPictureArgs build();
+ method public android.app.PictureInPictureArgs.Builder setActions(java.util.List<android.app.RemoteAction>);
+ method public android.app.PictureInPictureArgs.Builder setAspectRatio(android.util.Rational);
+ method public android.app.PictureInPictureArgs.Builder setSourceRectHint(android.graphics.Rect);
+ }
+
public final class RecoverableSecurityException extends java.lang.SecurityException implements android.os.Parcelable {
method public deprecated void showAsNotification(android.content.Context);
}
@@ -15,12 +70,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;
@@ -35,6 +96,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);
@@ -64,6 +129,10 @@
method public abstract boolean setInstantAppCookie(byte[]);
}
+ public class ResolveInfo implements android.os.Parcelable {
+ field public deprecated boolean instantAppAvailable;
+ }
+
public final class SharedLibraryInfo implements android.os.Parcelable {
method public boolean isBuiltin();
method public boolean isDynamic();
@@ -176,6 +245,26 @@
method public deprecated int stopUsingNetworkFeature(int, java.lang.String);
}
+ public deprecated class NetworkBadging {
+ method public static android.graphics.drawable.Drawable getWifiIcon(int, int, android.content.res.Resources.Theme);
+ field public static final int BADGING_4K = 30; // 0x1e
+ field public static final int BADGING_HD = 20; // 0x14
+ field public static final int BADGING_NONE = 0; // 0x0
+ field public static final int BADGING_SD = 10; // 0xa
+ }
+
+ public abstract class NetworkRecommendationProvider {
+ ctor public deprecated NetworkRecommendationProvider(android.os.Handler);
+ method public deprecated void onRequestRecommendation(android.net.RecommendationRequest, android.net.NetworkRecommendationProvider.ResultCallback);
+ 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 deprecated class NetworkRecommendationProvider.ResultCallback {
+ ctor public NetworkRecommendationProvider.ResultCallback(android.os.IRemoteCallback, int);
+ method public void onResult(android.net.RecommendationResult);
+ }
+
public abstract class PskKeyManager {
ctor public PskKeyManager();
field public static final int MAX_IDENTITY_HINT_LENGTH_BYTES = 128; // 0x80
@@ -183,6 +272,37 @@
field public static final int MAX_KEY_LENGTH_BYTES = 256; // 0x100
}
+ public final deprecated class RecommendationRequest implements android.os.Parcelable {
+ ctor protected RecommendationRequest(android.os.Parcel);
+ method public android.net.wifi.WifiConfiguration[] getConnectableConfigs();
+ method public android.net.wifi.WifiConfiguration getConnectedConfig();
+ method public android.net.wifi.WifiConfiguration getDefaultWifiConfig();
+ method public int getLastSelectedNetworkId();
+ method public long getLastSelectedNetworkTimestamp();
+ method public android.net.wifi.ScanResult[] getScanResults();
+ method public void setConnectableConfigs(android.net.wifi.WifiConfiguration[]);
+ method public void setConnectedConfig(android.net.wifi.WifiConfiguration);
+ field public static final android.os.Parcelable.Creator<android.net.RecommendationRequest> CREATOR;
+ }
+
+ 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[]);
+ method public android.net.RecommendationRequest.Builder setConnectedWifiConfig(android.net.wifi.WifiConfiguration);
+ method public android.net.RecommendationRequest.Builder setDefaultWifiConfig(android.net.wifi.WifiConfiguration);
+ method public android.net.RecommendationRequest.Builder setLastSelectedNetwork(int, long);
+ method public android.net.RecommendationRequest.Builder setScanResults(android.net.wifi.ScanResult[]);
+ }
+
+ 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 android.net.wifi.WifiConfiguration getWifiConfiguration();
+ method public boolean hasRecommendation();
+ field public static final android.os.Parcelable.Creator<android.net.RecommendationResult> CREATOR;
+ }
+
public class SSLCertificateSocketFactory extends javax.net.ssl.SSLSocketFactory {
method public static deprecated org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache);
}
@@ -205,6 +325,10 @@
ctor public RecoverySystem();
}
+ public class TestLooperManager {
+ method public deprecated android.os.MessageQueue getQueue();
+ }
+
public class UserManager {
method public android.graphics.drawable.Drawable getBadgedDrawableForUser(android.graphics.drawable.Drawable, android.os.UserHandle, android.graphics.Rect, int);
method public android.graphics.drawable.Drawable getBadgedIconForUser(android.graphics.drawable.Drawable, android.os.UserHandle);
@@ -366,6 +490,14 @@
}
+package android.speech.tts {
+
+ public abstract class UtteranceProgressListener {
+ method public deprecated void onUtteranceRangeStart(java.lang.String, int, int);
+ }
+
+}
+
package android.test.mock {
public deprecated class MockPackageManager extends android.content.pm.PackageManager {
@@ -436,6 +568,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 74d74e3..944a350 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 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
@@ -1063,6 +1061,7 @@
field public static final int ratingBarStyleSmall = 16842877; // 0x101007d
field public static final int readPermission = 16842759; // 0x1010007
field public static final int recognitionService = 16843932; // 0x101049c
+ field public static final int recreateOnConfigChanges = 16844105; // 0x1010549
field public static final int recycleEnabled = 16844124; // 0x101055c
field public static final int relinquishTaskIdentity = 16843894; // 0x1010476
field public static final int reparent = 16843964; // 0x10104bc
@@ -1087,7 +1086,6 @@
field public static final int resizeable = 16843405; // 0x101028d
field public static final int resizeableActivity = 16844022; // 0x10104f6
field public static final int resource = 16842789; // 0x1010025
- field public static final int restartOnConfigChanges = 16844105; // 0x1010549
field public static final int restoreAnyVersion = 16843450; // 0x10102ba
field public static final deprecated int restoreNeedsApplication = 16843421; // 0x101029d
field public static final int restrictedAccountType = 16843733; // 0x10103d5
@@ -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 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 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,8 @@
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 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 +3605,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();
@@ -3683,7 +3678,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();
@@ -3761,7 +3755,7 @@
method public void setImmersive(boolean);
method public void setIntent(android.content.Intent);
method public final void setMediaController(android.media.session.MediaController);
- 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);
@@ -3841,7 +3835,6 @@
method public int getLauncherLargeIconDensity();
method public int getLauncherLargeIconSize();
method public int getLockTaskModeState();
- method public static int getMaxNumPictureInPictureActions();
method public int getMemoryClass();
method public void getMemoryInfo(android.app.ActivityManager.MemoryInfo);
method public static void getMyMemoryState(android.app.ActivityManager.RunningAppProcessInfo);
@@ -3952,7 +3945,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
@@ -4039,6 +4032,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);
@@ -4714,7 +4708,6 @@
public abstract class FragmentContainer {
ctor public FragmentContainer();
- method public android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
method public abstract <T extends android.view.View> T onFindViewById(int);
method public abstract boolean onHasView();
}
@@ -4829,6 +4822,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);
@@ -4861,11 +4855,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);
@@ -4873,6 +4866,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);
@@ -4966,7 +4960,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);
}
@@ -4986,7 +4980,6 @@
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 exitKeyguardSecurely(android.app.KeyguardManager.OnKeyguardExitResult);
method public boolean inKeyguardRestrictedInputMode();
method public boolean isDeviceLocked();
@@ -4994,6 +4987,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 {
@@ -5134,7 +5128,7 @@
method public android.app.Notification clone();
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();
@@ -5142,7 +5136,7 @@
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
@@ -5344,7 +5338,7 @@
method public android.app.Notification.Builder setAutoCancel(boolean);
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);
@@ -5388,7 +5382,7 @@
method public android.app.Notification.Builder setSubText(java.lang.CharSequence);
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);
@@ -5550,7 +5544,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();
@@ -5585,7 +5578,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();
@@ -5709,16 +5701,18 @@
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 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;
+ }
+
+ 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 {
@@ -6116,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();
@@ -6149,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);
@@ -6165,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();
@@ -6174,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;
@@ -6199,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;
@@ -6310,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);
@@ -6356,6 +6331,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);
@@ -6403,7 +6379,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);
@@ -6442,6 +6418,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);
@@ -6523,7 +6500,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
@@ -6561,8 +6538,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;
}
@@ -6733,7 +6710,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();
@@ -6768,6 +6744,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;
}
@@ -6796,6 +6773,7 @@
}
public class FullBackupDataOutput {
+ method public long getQuota();
}
public abstract class RestoreObserver {
@@ -7021,8 +6999,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;
@@ -8056,7 +8034,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);
}
@@ -8231,8 +8209,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 {
@@ -8303,21 +8283,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 {
@@ -8453,7 +8433,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);
@@ -8752,17 +8732,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";
@@ -9362,15 +9342,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";
@@ -9528,6 +9505,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";
@@ -9573,7 +9551,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";
@@ -10353,7 +10330,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 {
@@ -10952,8 +10929,8 @@
field public android.content.pm.ActivityInfo activityInfo;
field public android.content.IntentFilter filter;
field public int icon;
- field public boolean instantAppAvailable;
field public boolean isDefault;
+ field public boolean isInstantAppAvailable;
field public int labelRes;
field public int match;
field public java.lang.CharSequence nonLocalizedLabel;
@@ -10990,7 +10967,7 @@
method public java.util.List<android.content.pm.VersionedPackage> getDependentPackages();
method public java.lang.String getName();
method public int getType();
- method public long getVersion();
+ method public int getVersion();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.SharedLibraryInfo> CREATOR;
field public static final int TYPE_BUILTIN = 0; // 0x0
@@ -11079,7 +11056,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;
}
@@ -13325,7 +13302,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);
@@ -13801,6 +13778,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);
@@ -13851,7 +13829,7 @@
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);
@@ -13877,6 +13855,7 @@
package android.graphics.drawable {
public class AdaptiveIconDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+ ctor public AdaptiveIconDrawable(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
method public void draw(android.graphics.Canvas);
method public android.graphics.drawable.Drawable getBackground();
method public static float getExtraInsetFraction();
@@ -13890,6 +13869,7 @@
method public void setColorFilter(android.graphics.ColorFilter);
method public void setOpacity(int);
method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+ field public static final float MASK_SIZE = 100.0f;
}
public abstract interface Animatable {
@@ -14439,17 +14419,13 @@
package android.graphics.fonts {
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 {
@@ -14537,7 +14513,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
@@ -14798,18 +14774,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 {
@@ -19312,9 +19286,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);
@@ -21114,6 +21088,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);
}
@@ -25503,8 +25478,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);
@@ -26659,6 +26634,7 @@
method public void setTdlsEnabled(java.net.InetAddress, boolean);
method public void setTdlsEnabledWithMacAddress(java.lang.String, boolean);
method public boolean setWifiEnabled(boolean);
+ method public void startLocalOnlyHotspot(android.net.wifi.WifiManager.LocalOnlyHotspotCallback, android.os.Handler);
method public boolean startScan();
method public void startWps(android.net.wifi.WpsInfo, android.net.wifi.WifiManager.WpsCallback);
method public int updateNetwork(android.net.wifi.WifiConfiguration);
@@ -26709,6 +26685,22 @@
field public static final int WPS_WEP_PROHIBITED = 4; // 0x4
}
+ public static class WifiManager.LocalOnlyHotspotCallback {
+ ctor public WifiManager.LocalOnlyHotspotCallback();
+ method public void onFailed(int);
+ method public void onStarted(android.net.wifi.WifiManager.LocalOnlyHotspotReservation);
+ method public void onStopped();
+ field public static final int ERROR_GENERIC = 2; // 0x2
+ field public static final int ERROR_INCOMPATIBLE_MODE = 3; // 0x3
+ field public static final int ERROR_NO_CHANNEL = 1; // 0x1
+ field public static final int ERROR_TETHERING_DISALLOWED = 4; // 0x4
+ }
+
+ public class WifiManager.LocalOnlyHotspotReservation implements java.lang.AutoCloseable {
+ method public void close();
+ method public android.net.wifi.WifiConfiguration getWifiConfiguration();
+ }
+
public class WifiManager.MulticastLock {
method public void acquire();
method public boolean isHeld();
@@ -26871,33 +26863,9 @@
ctor public PasspointConfiguration(android.net.wifi.hotspot2.PasspointConfiguration);
method public int describeContents();
method public android.net.wifi.hotspot2.pps.Credential getCredential();
- method public int getCredentialPriority();
method public android.net.wifi.hotspot2.pps.HomeSp getHomeSp();
- method public android.net.wifi.hotspot2.pps.Policy getPolicy();
- method public long getSubscriptionCreationTimeInMs();
- method public long getSubscriptionExpirationTimeInMs();
- method public java.lang.String getSubscriptionType();
- method public android.net.wifi.hotspot2.pps.UpdateParameter getSubscriptionUpdate();
- method public java.util.Map<java.lang.String, byte[]> getTrustRootCertList();
- method public int getUpdateIdentifier();
- method public long getUsageLimitDataLimit();
- method public long getUsageLimitStartTimeInMs();
- method public long getUsageLimitTimeLimitInMinutes();
- method public long getUsageLimitUsageTimePeriodInMinutes();
method public void setCredential(android.net.wifi.hotspot2.pps.Credential);
- method public void setCredentialPriority(int);
method public void setHomeSp(android.net.wifi.hotspot2.pps.HomeSp);
- method public void setPolicy(android.net.wifi.hotspot2.pps.Policy);
- method public void setSubscriptionCreationTimeInMs(long);
- method public void setSubscriptionExpirationTimeInMs(long);
- method public void setSubscriptionType(java.lang.String);
- method public void setSubscriptionUpdate(android.net.wifi.hotspot2.pps.UpdateParameter);
- method public void setTrustRootCertList(java.util.Map<java.lang.String, byte[]>);
- method public void setUpdateIdentifier(int);
- method public void setUsageLimitDataLimit(long);
- method public void setUsageLimitStartTimeInMs(long);
- method public void setUsageLimitTimeLimitInMinutes(long);
- method public void setUsageLimitUsageTimePeriodInMinutes(long);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.PasspointConfiguration> CREATOR;
}
@@ -26920,21 +26888,15 @@
method public int describeContents();
method public java.security.cert.X509Certificate getCaCertificate();
method public android.net.wifi.hotspot2.pps.Credential.CertificateCredential getCertCredential();
- method public boolean getCheckAaaServerCertStatus();
method public java.security.cert.X509Certificate[] getClientCertificateChain();
method public java.security.PrivateKey getClientPrivateKey();
- method public long getCreationTimeInMs();
- method public long getExpirationTimeInMs();
method public java.lang.String getRealm();
method public android.net.wifi.hotspot2.pps.Credential.SimCredential getSimCredential();
method public android.net.wifi.hotspot2.pps.Credential.UserCredential getUserCredential();
method public void setCaCertificate(java.security.cert.X509Certificate);
method public void setCertCredential(android.net.wifi.hotspot2.pps.Credential.CertificateCredential);
- method public void setCheckAaaServerCertStatus(boolean);
method public void setClientCertificateChain(java.security.cert.X509Certificate[]);
method public void setClientPrivateKey(java.security.PrivateKey);
- method public void setCreationTimeInMs(long);
- method public void setExpirationTimeInMs(long);
method public void setRealm(java.lang.String);
method public void setSimCredential(android.net.wifi.hotspot2.pps.Credential.SimCredential);
method public void setUserCredential(android.net.wifi.hotspot2.pps.Credential.UserCredential);
@@ -26970,19 +26932,13 @@
ctor public Credential.UserCredential();
ctor public Credential.UserCredential(android.net.wifi.hotspot2.pps.Credential.UserCredential);
method public int describeContents();
- method public boolean getAbleToShare();
method public int getEapType();
- method public boolean getMachineManaged();
method public java.lang.String getNonEapInnerMethod();
method public java.lang.String getPassword();
- method public java.lang.String getSoftTokenApp();
method public java.lang.String getUsername();
- method public void setAbleToShare(boolean);
method public void setEapType(int);
- method public void setMachineManaged(boolean);
method public void setNonEapInnerMethod(java.lang.String);
method public void setPassword(java.lang.String);
- method public void setSoftTokenApp(java.lang.String);
method public void setUsername(java.lang.String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.UserCredential> CREATOR;
@@ -26994,96 +26950,14 @@
method public int describeContents();
method public java.lang.String getFqdn();
method public java.lang.String getFriendlyName();
- method public java.util.Map<java.lang.String, java.lang.Long> getHomeNetworkIds();
- method public java.lang.String getIconUrl();
- method public long[] getMatchAllOis();
- method public long[] getMatchAnyOis();
- method public java.lang.String[] getOtherHomePartners();
method public long[] getRoamingConsortiumOis();
method public void setFqdn(java.lang.String);
method public void setFriendlyName(java.lang.String);
- method public void setHomeNetworkIds(java.util.Map<java.lang.String, java.lang.Long>);
- method public void setIconUrl(java.lang.String);
- method public void setMatchAllOis(long[]);
- method public void setMatchAnyOis(long[]);
- method public void setOtherHomePartners(java.lang.String[]);
method public void setRoamingConsortiumOis(long[]);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.HomeSp> CREATOR;
}
- public final class Policy implements android.os.Parcelable {
- ctor public Policy();
- ctor public Policy(android.net.wifi.hotspot2.pps.Policy);
- method public int describeContents();
- method public java.lang.String[] getExcludedSsidList();
- method public int getMaximumBssLoadValue();
- method public long getMinHomeDownlinkBandwidth();
- method public long getMinHomeUplinkBandwidth();
- method public long getMinRoamingDownlinkBandwidth();
- method public long getMinRoamingUplinkBandwidth();
- method public android.net.wifi.hotspot2.pps.UpdateParameter getPolicyUpdate();
- method public java.util.List<android.net.wifi.hotspot2.pps.Policy.RoamingPartner> getPreferredRoamingPartnerList();
- method public java.util.Map<java.lang.Integer, java.lang.String> getRequiredProtoPortMap();
- method public void setExcludedSsidList(java.lang.String[]);
- method public void setMaximumBssLoadValue(int);
- method public void setMinHomeDownlinkBandwidth(long);
- method public void setMinHomeUplinkBandwidth(long);
- method public void setMinRoamingDownlinkBandwidth(long);
- method public void setMinRoamingUplinkBandwidth(long);
- method public void setPolicyUpdate(android.net.wifi.hotspot2.pps.UpdateParameter);
- method public void setPreferredRoamingPartnerList(java.util.List<android.net.wifi.hotspot2.pps.Policy.RoamingPartner>);
- method public void setRequiredProtoPortMap(java.util.Map<java.lang.Integer, java.lang.String>);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Policy> CREATOR;
- }
-
- public static final class Policy.RoamingPartner implements android.os.Parcelable {
- ctor public Policy.RoamingPartner();
- ctor public Policy.RoamingPartner(android.net.wifi.hotspot2.pps.Policy.RoamingPartner);
- method public int describeContents();
- method public java.lang.String getCountries();
- method public java.lang.String getFqdn();
- method public boolean getFqdnExactMatch();
- method public int getPriority();
- method public void setCountries(java.lang.String);
- method public void setFqdn(java.lang.String);
- method public void setFqdnExactMatch(boolean);
- method public void setPriority(int);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Policy.RoamingPartner> CREATOR;
- }
-
- public final class UpdateParameter implements android.os.Parcelable {
- ctor public UpdateParameter();
- ctor public UpdateParameter(android.net.wifi.hotspot2.pps.UpdateParameter);
- method public int describeContents();
- method public java.lang.String getBase64EncodedPassword();
- method public java.lang.String getRestriction();
- method public java.lang.String getServerUri();
- method public byte[] getTrustRootCertSha256Fingerprint();
- method public java.lang.String getTrustRootCertUrl();
- method public long getUpdateIntervalInMinutes();
- method public java.lang.String getUpdateMethod();
- method public java.lang.String getUsername();
- method public void setBase64EncodedPassword(java.lang.String);
- method public void setRestriction(java.lang.String);
- method public void setServerUri(java.lang.String);
- method public void setTrustRootCertSha256Fingerprint(byte[]);
- method public void setTrustRootCertUrl(java.lang.String);
- method public void setUpdateIntervalInMinutes(long);
- method public void setUpdateMethod(java.lang.String);
- method public void setUsername(java.lang.String);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.UpdateParameter> CREATOR;
- field public static final long UPDATE_CHECK_INTERVAL_NEVER = 4294967295L; // 0xffffffffL
- field public static final java.lang.String UPDATE_METHOD_OMADM = "OMA-DM-ClientInitiated";
- field public static final java.lang.String UPDATE_METHOD_SSP = "SSP-ClientInitiated";
- field public static final java.lang.String UPDATE_RESTRICTION_HOMESP = "HomeSP";
- field public static final java.lang.String UPDATE_RESTRICTION_ROAMING_PARTNER = "RoamingPartner";
- field public static final java.lang.String UPDATE_RESTRICTION_UNRESTRICTED = "Unrestricted";
- }
-
}
package android.net.wifi.p2p {
@@ -30783,7 +30657,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);
@@ -30808,7 +30681,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);
@@ -31359,7 +31231,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);
@@ -31405,7 +31276,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;
}
@@ -31737,7 +31607,7 @@
public class TestLooperManager {
method public void execute(android.os.Message);
- method public android.os.MessageQueue getQueue();
+ method public android.os.MessageQueue getMessageQueue();
method public boolean hasMessages(android.os.Handler, java.lang.Object, int);
method public boolean hasMessages(android.os.Handler, java.lang.Object, java.lang.Runnable);
method public android.os.Message next();
@@ -31812,6 +31682,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";
@@ -32040,9 +31911,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);
@@ -32055,7 +31926,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;
@@ -32063,7 +31933,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;
}
@@ -34557,7 +34426,6 @@
}
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.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);
@@ -37174,7 +37042,7 @@
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 java.util.List<android.service.autofill.FillContext> getFillContexts();
method public int getFlags();
method public int getId();
method public void writeToParcel(android.os.Parcel, int);
@@ -37678,7 +37546,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";
}
@@ -37908,12 +37775,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();
@@ -38200,7 +38065,6 @@
method public void onRangeStart(java.lang.String, int, int, int);
method public abstract void onStart(java.lang.String);
method public void onStop(java.lang.String, boolean);
- method public deprecated void onUtteranceRangeStart(java.lang.String, int, int);
}
public class Voice implements android.os.Parcelable {
@@ -40281,8 +40145,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
}
@@ -45960,7 +45827,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);
@@ -46183,6 +46049,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";
@@ -46898,7 +46765,7 @@
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();
}
@@ -47613,8 +47480,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";
@@ -47796,10 +47663,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();
@@ -48142,7 +48009,7 @@
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();
@@ -48158,7 +48025,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 java.lang.String EXTRA_CLIENT_STATE = "android.view.autofill.extra.CLIENT_STATE";
}
public static abstract class AutofillManager.AutofillCallback {
@@ -48592,12 +48459,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();
@@ -48608,19 +48470,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";
@@ -49299,7 +49166,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();
@@ -49346,7 +49212,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);
@@ -51813,7 +51678,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);
@@ -52506,15 +52371,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 c132385..e7b573b 100644
--- a/api/test-removed.txt
+++ b/api/test-removed.txt
@@ -1,9 +1,64 @@
package android.app {
+ public class Activity extends android.view.ContextThemeWrapper implements android.content.ComponentCallbacks2 android.view.KeyEvent.Callback android.view.LayoutInflater.Factory2 android.view.View.OnCreateContextMenuListener android.view.Window.Callback {
+ method public deprecated boolean enterPictureInPictureMode(android.app.PictureInPictureArgs);
+ method public deprecated void setPictureInPictureArgs(android.app.PictureInPictureArgs);
+ }
+
+ public class ActivityManager {
+ method public static deprecated int getMaxNumPictureInPictureActions();
+ }
+
+ public class KeyguardManager {
+ method public deprecated void dismissKeyguard(android.app.Activity, android.app.KeyguardManager.KeyguardDismissCallback, android.os.Handler);
+ }
+
public class Notification implements android.os.Parcelable {
+ method public deprecated java.lang.String getChannel();
+ method public deprecated long getTimeout();
method public deprecated void setLatestEventInfo(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
}
+ public static class Notification.Builder {
+ method public deprecated android.app.Notification.Builder setChannel(java.lang.String);
+ method public deprecated android.app.Notification.Builder setTimeout(long);
+ }
+
+ public static final class Notification.TvExtender implements android.app.Notification.Extender {
+ method public deprecated java.lang.String getChannel();
+ }
+
+ public final deprecated class PictureInPictureArgs implements android.os.Parcelable {
+ ctor public deprecated PictureInPictureArgs();
+ ctor public deprecated PictureInPictureArgs(float, java.util.List<android.app.RemoteAction>);
+ method public static android.app.PictureInPictureArgs convert(android.app.PictureInPictureParams);
+ method public static android.app.PictureInPictureParams convert(android.app.PictureInPictureArgs);
+ method public void copyOnlySet(android.app.PictureInPictureArgs);
+ method public java.util.List<android.app.RemoteAction> getActions();
+ method public float getAspectRatio();
+ method public android.util.Rational getAspectRatioRational();
+ method public android.graphics.Rect getSourceRectHint();
+ method public android.graphics.Rect getSourceRectHintInsets();
+ method public boolean hasSetActions();
+ method public boolean hasSetAspectRatio();
+ method public boolean hasSourceBoundsHint();
+ method public boolean hasSourceBoundsHintInsets();
+ 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);
+ method public deprecated void setSourceRectHintInsets(android.graphics.Rect);
+ method public void truncateActions(int);
+ field public static final android.os.Parcelable.Creator<android.app.PictureInPictureArgs> CREATOR;
+ }
+
+ public static class PictureInPictureArgs.Builder {
+ ctor public PictureInPictureArgs.Builder();
+ method public android.app.PictureInPictureArgs build();
+ method public android.app.PictureInPictureArgs.Builder setActions(java.util.List<android.app.RemoteAction>);
+ method public android.app.PictureInPictureArgs.Builder setAspectRatio(android.util.Rational);
+ method public android.app.PictureInPictureArgs.Builder setSourceRectHint(android.graphics.Rect);
+ }
+
public final class RecoverableSecurityException extends java.lang.SecurityException implements android.os.Parcelable {
method public deprecated void showAsNotification(android.content.Context);
}
@@ -17,12 +72,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;
@@ -37,6 +98,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);
@@ -66,6 +131,10 @@
method public abstract boolean setInstantAppCookie(byte[]);
}
+ public class ResolveInfo implements android.os.Parcelable {
+ field public deprecated boolean instantAppAvailable;
+ }
+
public final class SharedLibraryInfo implements android.os.Parcelable {
method public boolean isBuiltin();
method public boolean isDynamic();
@@ -178,6 +247,26 @@
method public deprecated int stopUsingNetworkFeature(int, java.lang.String);
}
+ public deprecated class NetworkBadging {
+ method public static android.graphics.drawable.Drawable getWifiIcon(int, int, android.content.res.Resources.Theme);
+ field public static final int BADGING_4K = 30; // 0x1e
+ field public static final int BADGING_HD = 20; // 0x14
+ field public static final int BADGING_NONE = 0; // 0x0
+ field public static final int BADGING_SD = 10; // 0xa
+ }
+
+ public abstract class NetworkRecommendationProvider {
+ ctor public deprecated NetworkRecommendationProvider(android.os.Handler);
+ method public deprecated void onRequestRecommendation(android.net.RecommendationRequest, android.net.NetworkRecommendationProvider.ResultCallback);
+ 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 deprecated class NetworkRecommendationProvider.ResultCallback {
+ ctor public NetworkRecommendationProvider.ResultCallback(android.os.IRemoteCallback, int);
+ method public void onResult(android.net.RecommendationResult);
+ }
+
public abstract class PskKeyManager {
ctor public PskKeyManager();
field public static final int MAX_IDENTITY_HINT_LENGTH_BYTES = 128; // 0x80
@@ -185,6 +274,37 @@
field public static final int MAX_KEY_LENGTH_BYTES = 256; // 0x100
}
+ public final deprecated class RecommendationRequest implements android.os.Parcelable {
+ ctor protected RecommendationRequest(android.os.Parcel);
+ method public android.net.wifi.WifiConfiguration[] getConnectableConfigs();
+ method public android.net.wifi.WifiConfiguration getConnectedConfig();
+ method public android.net.wifi.WifiConfiguration getDefaultWifiConfig();
+ method public int getLastSelectedNetworkId();
+ method public long getLastSelectedNetworkTimestamp();
+ method public android.net.wifi.ScanResult[] getScanResults();
+ method public void setConnectableConfigs(android.net.wifi.WifiConfiguration[]);
+ method public void setConnectedConfig(android.net.wifi.WifiConfiguration);
+ field public static final android.os.Parcelable.Creator<android.net.RecommendationRequest> CREATOR;
+ }
+
+ 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[]);
+ method public android.net.RecommendationRequest.Builder setConnectedWifiConfig(android.net.wifi.WifiConfiguration);
+ method public android.net.RecommendationRequest.Builder setDefaultWifiConfig(android.net.wifi.WifiConfiguration);
+ method public android.net.RecommendationRequest.Builder setLastSelectedNetwork(int, long);
+ method public android.net.RecommendationRequest.Builder setScanResults(android.net.wifi.ScanResult[]);
+ }
+
+ 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 android.net.wifi.WifiConfiguration getWifiConfiguration();
+ method public boolean hasRecommendation();
+ field public static final android.os.Parcelable.Creator<android.net.RecommendationResult> CREATOR;
+ }
+
public class SSLCertificateSocketFactory extends javax.net.ssl.SSLSocketFactory {
method public static deprecated org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache);
}
@@ -211,6 +331,10 @@
ctor public RecoverySystem();
}
+ public class TestLooperManager {
+ method public deprecated android.os.MessageQueue getQueue();
+ }
+
public class UserManager {
method public android.graphics.drawable.Drawable getBadgedDrawableForUser(android.graphics.drawable.Drawable, android.os.UserHandle, android.graphics.Rect, int);
method public android.graphics.drawable.Drawable getBadgedIconForUser(android.graphics.drawable.Drawable, android.os.UserHandle);
@@ -372,6 +496,14 @@
}
+package android.speech.tts {
+
+ public abstract class UtteranceProgressListener {
+ method public deprecated void onUtteranceRangeStart(java.lang.String, int, int);
+ }
+
+}
+
package android.test.mock {
public deprecated class MockPackageManager extends android.content.pm.PackageManager {
@@ -442,6 +574,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..a70085c 100644
--- a/core/java/android/accessibilityservice/AccessibilityButtonController.java
+++ b/core/java/android/accessibilityservice/AccessibilityButtonController.java
@@ -19,10 +19,13 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Handler;
+import android.os.Looper;
import android.os.RemoteException;
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 +92,7 @@
* @param callback the callback to add, must be non-null
*/
public void registerAccessibilityButtonCallback(@NonNull AccessibilityButtonCallback callback) {
- registerAccessibilityButtonCallback(callback, null);
+ registerAccessibilityButtonCallback(callback, new Handler(Looper.getMainLooper()));
}
/**
@@ -99,11 +102,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 +125,7 @@
*/
public void unregisterAccessibilityButtonCallback(
@NonNull AccessibilityButtonCallback callback) {
+ Preconditions.checkNotNull(callback);
synchronized (mLock) {
if (mCallbacks == null) {
return;
@@ -154,12 +159,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 +184,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 3cda489..06a9b06 100644
--- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
+++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
@@ -119,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;
@@ -301,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;
@@ -521,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);
@@ -670,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;
}
@@ -971,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;
}
@@ -1000,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";
}
@@ -1064,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 06b09c0..a5b37f3 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -376,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:
@@ -395,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 cdfb52b1..4f6c0c9 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -2039,70 +2039,101 @@
/**
* 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());
+ }
+
+ /** @removed */
+ @Deprecated
+ public boolean enterPictureInPictureMode(@NonNull PictureInPictureArgs args) {
+ return enterPictureInPictureMode(PictureInPictureArgs.convert(args));
}
/**
- * 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)}.
+ * 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.
+ * 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 args the explicit non-null arguments to use when entering picture-in-picture.
- * @return whether the system successfully entered picture-in-picture.
+ * @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 PictureInPictureArgs args) {
+ public boolean enterPictureInPictureMode(@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);
- return ActivityManagerNative.getDefault().enterPictureInPictureMode(mToken, args);
+ updatePictureInPictureParamsForContentInsets(params);
+ return ActivityManagerNative.getDefault().enterPictureInPictureMode(mToken, params);
} catch (RemoteException e) {
return false;
}
}
+ /** @removed */
+ @Deprecated
+ public void setPictureInPictureArgs(@NonNull PictureInPictureArgs args) {
+ setPictureInPictureParams(PictureInPictureArgs.convert(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);
}
}
@@ -2130,6 +2161,7 @@
*
* @see #onConfigurationChanged(Configuration)
* @see View#onMovedToDisplay(int, Configuration)
+ * @hide
*/
public void onMovedToDisplay(int displayId, Configuration config) {
}
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 1ab45b5..9af74ba 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. */
@@ -1126,12 +1127,10 @@
com.android.internal.R.bool.config_supportsSplitScreenMultiWindow);
}
- /**
- * 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.
- */
+ /** @removed */
+ @Deprecated
public static int getMaxNumPictureInPictureActions() {
- return NUM_ALLOWED_PIP_ACTIONS;
+ return 3;
}
/**
@@ -3141,10 +3140,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 +3162,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 +3230,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 +3252,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 +3287,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 195ba24..dd9db8a 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -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);
}
@@ -3030,7 +3032,7 @@
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();
boolean notSecure = r.window == null ||
(r.window.getAttributes().flags
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/AuthenticationRequiredException.java b/core/java/android/app/AuthenticationRequiredException.java
index 8960979..04e5e0a 100644
--- a/core/java/android/app/AuthenticationRequiredException.java
+++ b/core/java/android/app/AuthenticationRequiredException.java
@@ -56,10 +56,7 @@
* {@link Activity#setResult(int)} before finishing to
* communicate the final status of the recovery. For example,
* apps that observe {@link Activity#RESULT_OK} may choose to
- * immediately retry their operation. If this exception was
- * thrown from a {@link ContentProvider}, you should also send
- * any relevant {@link ContentResolver#notifyChange} events to
- * trigger reloading of data.
+ * immediately retry their operation.
*/
public AuthenticationRequiredException(Throwable cause, PendingIntent userAction) {
super(cause.getMessage());
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/FragmentContainer.java b/core/java/android/app/FragmentContainer.java
index 77c9c31..f8836bc8 100644
--- a/core/java/android/app/FragmentContainer.java
+++ b/core/java/android/app/FragmentContainer.java
@@ -42,6 +42,8 @@
* Creates an instance of the specified fragment, can be overridden to construct fragments
* with dependencies, or change the fragment being constructed. By default just calls
* {@link Fragment#instantiate(Context, String, Bundle)}.
+ *
+ * @hide
*/
public Fragment instantiate(Context context, String className, Bundle arguments) {
return Fragment.instantiate(context, className, arguments);
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..fcf0aab 100644
--- a/core/java/android/app/KeyguardManager.java
+++ b/core/java/android/app/KeyguardManager.java
@@ -362,6 +362,13 @@
}
}
+ /** @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.
@@ -378,30 +385,33 @@
* 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.
- * @param handler The handler to invoke the callback on, or {@code null} to use the main
- * handler.
+ * 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 dismissKeyguard(@NonNull Activity activity,
- @Nullable KeyguardDismissCallback callback, @Nullable Handler handler) {
+ 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/LoadedApk.java b/core/java/android/app/LoadedApk.java
index bbcf7ba..b84161c 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -1218,6 +1218,7 @@
private Intent mCurIntent;
private final boolean mOrdered;
private boolean mDispatched;
+ private Throwable mPreviousRunStacktrace; // To investigate b/37809561. STOPSHIP remove.
public Args(Intent intent, int resultCode, String resultData, Bundle resultExtras,
boolean ordered, boolean sticky, int sendingUser) {
@@ -1243,11 +1244,14 @@
final IActivityManager mgr = ActivityManager.getService();
final Intent intent = mCurIntent;
if (intent == null) {
- Log.wtf(TAG, "Null intent being dispatched, mDispatched=" + mDispatched);
+ Log.wtf(TAG, "Null intent being dispatched, mDispatched=" + mDispatched
+ + ": run() previously called at "
+ + Log.getStackTraceString(mPreviousRunStacktrace));
}
mCurIntent = null;
mDispatched = true;
+ mPreviousRunStacktrace = new Throwable("Previous stacktrace");
if (receiver == null || intent == null || mForgotten) {
if (mRegistered && ordered) {
if (ActivityThread.DEBUG_BROADCAST) Slog.i(ActivityThread.TAG,
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index e53e3da..2e56bcf 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
@@ -1290,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.
@@ -2393,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=");
@@ -2499,22 +2494,34 @@
}
}
- /**
- * Returns the id of the channel this notification posts to.
- */
+ /** @removed */
+ @Deprecated
public String getChannel() {
return mChannelId;
}
/**
- * Returns the time at which this notification should be canceled by the system, if it's not
- * canceled already.
+ * Returns the id of the channel this notification posts to.
*/
+ public String getChannelId() {
+ return mChannelId;
+ }
+
+ /** @removed */
+ @Deprecated
public long getTimeout() {
return mTimeout;
}
/**
+ * Returns the duration from posting after which this notification should be canceled by the
+ * system, if it's not canceled already.
+ */
+ public long getTimeoutAfter() {
+ return mTimeout;
+ }
+
+ /**
* 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}.
@@ -2525,6 +2532,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;
@@ -2663,21 +2673,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
@@ -2770,8 +2771,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
@@ -2807,19 +2808,33 @@
return this;
}
+ /** @removed */
+ @Deprecated
+ public Builder setChannel(String channelId) {
+ mN.mChannelId = channelId;
+ return this;
+ }
+
/**
* Specifies the channel the notification should be delivered on.
*/
- public Builder setChannel(String channelId) {
+ public Builder setChannelId(String channelId) {
mN.mChannelId = channelId;
return this;
}
+ /** @removed */
+ @Deprecated
+ public Builder setTimeout(long durationMs) {
+ mN.mTimeout = durationMs;
+ return this;
+ }
+
/**
* Specifies a duration in milliseconds after which this notification should be canceled,
* if it is not already canceled.
*/
- public Builder setTimeout(long durationMs) {
+ public Builder setTimeoutAfter(long durationMs) {
mN.mTimeout = durationMs;
return this;
}
@@ -3819,10 +3834,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);
}
@@ -4291,6 +4358,8 @@
mN.mLargeIcon = null;
Bitmap largeIconLegacy = mN.largeIcon;
mN.largeIcon = null;
+ ArrayList<Action> actions = mActions;
+ mActions = new ArrayList<>();
Bundle publicExtras = new Bundle();
publicExtras.putBoolean(EXTRA_SHOW_WHEN,
savedBundle.getBoolean(EXTRA_SHOW_WHEN));
@@ -4306,6 +4375,7 @@
mN.extras = savedBundle;
mN.mLargeIcon = largeIcon;
mN.largeIcon = largeIconLegacy;
+ mActions = actions;
mStyle = style;
return view;
}
@@ -4810,7 +4880,7 @@
private int getBackgroundColor() {
if (isColorized()) {
- return mN.color;
+ return mBackgroundColor != COLOR_INVALID ? mBackgroundColor : mN.color;
} else {
return COLOR_DEFAULT;
}
@@ -4828,6 +4898,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();
+ }
}
/**
@@ -4864,6 +4949,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);
@@ -4875,7 +4972,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() {
@@ -7915,9 +8028,25 @@
}
/**
+ * 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;
+ }
+
+ /** @removed */
+ @Deprecated
+ public String getChannel() {
+ return mChannelId;
+ }
+
+ /**
* Returns the id of the channel this notification posts to on TV.
*/
- public String getChannel() {
+ public String getChannelId() {
return mChannelId;
}
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..d7317f4 100644
--- a/core/java/android/app/PictureInPictureArgs.java
+++ b/core/java/android/app/PictureInPictureArgs.java
@@ -20,20 +20,97 @@
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.
- */
+/** @removed */
+@Deprecated
public final class PictureInPictureArgs implements Parcelable {
/**
+ * Builder class for {@link PictureInPictureArgs} 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 Activity#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;
+ }
+
+ public PictureInPictureArgs build() {
+ PictureInPictureArgs args = new PictureInPictureArgs(mAspectRatio, mUserActions,
+ mSourceRectHint);
+ return args;
+ }
+ }
+
+ /**
* The expected aspect ratio of the picture-in-picture.
*/
@Nullable
- private Float mAspectRatio;
+ private Rational mAspectRatio;
/**
* The set of actions that are associated with this activity when in picture-in-picture.
@@ -56,9 +133,25 @@
@Nullable
private Rect mSourceRectHintInsets;
- PictureInPictureArgs(Parcel in) {
+ /**
+ * @hide
+ */
+ @Deprecated
+ public PictureInPictureArgs() {
+ }
+
+ /**
+ * @hide
+ */
+ @Deprecated
+ public PictureInPictureArgs(float aspectRatio, List<RemoteAction> actions) {
+ setAspectRatio(aspectRatio);
+ setActions(actions);
+ }
+
+ private PictureInPictureArgs(Parcel in) {
if (in.readInt() != 0) {
- mAspectRatio = in.readFloat();
+ mAspectRatio = new Rational(in.readInt(), in.readInt());
}
if (in.readInt() != 0) {
mUserActions = new ArrayList<>();
@@ -72,25 +165,48 @@
}
}
- /**
- * Creates a new set of picture-in-picture arguments.
- */
- public PictureInPictureArgs() {
- // Empty constructor
+ private PictureInPictureArgs(Rational aspectRatio, List<RemoteAction> actions,
+ Rect sourceRectHint) {
+ mAspectRatio = aspectRatio;
+ mUserActions = actions;
+ mSourceRectHint = sourceRectHint;
}
/**
- * Creates a new set of picture-in-picture arguments from the given {@param aspectRatio} and
- * {@param actions}.
+ * @hide
*/
- public PictureInPictureArgs(float aspectRatio, List<RemoteAction> actions) {
- mAspectRatio = aspectRatio;
+ @Deprecated
+ public void setAspectRatio(float aspectRatio) {
+ // Temporary workaround
+ mAspectRatio = new Rational((int) (aspectRatio * 1000000000), 1000000000);
+ }
+
+ /**
+ * @hide
+ */
+ @Deprecated
+ public void setActions(List<RemoteAction> actions) {
+ if (mUserActions != null) {
+ mUserActions = null;
+ }
if (actions != null) {
mUserActions = new ArrayList<>(actions);
}
}
/**
+ * @hide
+ */
+ @Deprecated
+ public void setSourceRectHint(Rect launchBounds) {
+ if (launchBounds == null) {
+ mSourceRectHint = null;
+ } else {
+ mSourceRectHint = new Rect(launchBounds);
+ }
+ }
+
+ /**
* Copies the set parameters from the other picture-in-picture args.
* @hide
*/
@@ -110,24 +226,21 @@
}
/**
- * Sets the aspect ratio.
- * @param aspectRatio the new aspect ratio for picture-in-picture.
- */
- public void setAspectRatio(float aspectRatio) {
- mAspectRatio = aspectRatio;
- }
-
- /**
* @return the aspect ratio. If none is set, return 0.
* @hide
*/
public float getAspectRatio() {
if (mAspectRatio != null) {
- return mAspectRatio;
+ return mAspectRatio.floatValue();
}
return 0f;
}
+ /** {@hide} */
+ public Rational getAspectRatioRational() {
+ return mAspectRatio;
+ }
+
/**
* @return whether the aspect ratio is set.
* @hide
@@ -137,19 +250,6 @@
}
/**
- * Sets the user actions.
- * @param actions the new actions to show in the picture-in-picture menu.
- */
- public void setActions(List<RemoteAction> actions) {
- if (mUserActions != null) {
- mUserActions = null;
- }
- if (actions != null) {
- mUserActions = new ArrayList<>(actions);
- }
- }
-
- /**
* @return the set of user actions.
* @hide
*/
@@ -166,16 +266,12 @@
}
/**
- * 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.
+ * Truncates the set of actions to the given {@param size}.
+ * @hide
*/
- public void setSourceRectHint(Rect launchBounds) {
- if (launchBounds == null) {
- mSourceRectHint = null;
- } else {
- mSourceRectHint = new Rect(launchBounds);
+ public void truncateActions(int size) {
+ if (hasSetActions()) {
+ mUserActions = mUserActions.subList(0, Math.min(mUserActions.size(), size));
}
}
@@ -183,6 +279,7 @@
* Sets the insets to be used with the source rect hint bounds.
* @hide
*/
+ @Deprecated
public void setSourceRectHintInsets(Rect insets) {
if (insets == null) {
mSourceRectHintInsets = null;
@@ -224,18 +321,6 @@
}
@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;
}
@@ -244,7 +329,8 @@
public void writeToParcel(Parcel out, int flags) {
if (mAspectRatio != null) {
out.writeInt(1);
- out.writeFloat(mAspectRatio);
+ out.writeInt(mAspectRatio.getNumerator());
+ out.writeInt(mAspectRatio.getDenominator());
} else {
out.writeInt(0);
}
@@ -277,4 +363,14 @@
return new PictureInPictureArgs[size];
}
};
-}
\ No newline at end of file
+
+ public static PictureInPictureArgs convert(PictureInPictureParams params) {
+ return new PictureInPictureArgs(params.getAspectRatioRational(), params.getActions(),
+ params.getSourceRectHint());
+ }
+
+ public static PictureInPictureParams convert(PictureInPictureArgs args) {
+ return new PictureInPictureParams(args.getAspectRatioRational(), args.getActions(),
+ args.getSourceRectHint());
+ }
+}
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..323a0fb
--- /dev/null
+++ b/core/java/android/app/PictureInPictureParams.java
@@ -0,0 +1,331 @@
+/*
+ * 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.
+ */
+public final 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 Activity#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.
+ */
+ @Nullable
+ private Rational 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;
+
+ /** {@hide} */
+ PictureInPictureParams() {
+ }
+
+ /** {@hide} */
+ 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);
+ }
+ }
+
+ /** {@hide} */
+ 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;
+ }
+
+ /** @hide */
+ public Rational getAspectRatioRational() {
+ return mAspectRatio;
+ }
+
+ /**
+ * @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/RecoverableSecurityException.java b/core/java/android/app/RecoverableSecurityException.java
index a503a46..6747004 100644
--- a/core/java/android/app/RecoverableSecurityException.java
+++ b/core/java/android/app/RecoverableSecurityException.java
@@ -76,10 +76,7 @@
* {@link Activity#setResult(int)} before finishing to
* communicate the final status of the recovery. For example,
* apps that observe {@link Activity#RESULT_OK} may choose to
- * immediately retry their operation. If this exception was
- * thrown from a {@link ContentProvider}, you should also send
- * any relevant {@link ContentResolver#notifyChange} events to
- * trigger reloading of data.
+ * immediately retry their operation.
*/
public RecoverableSecurityException(Throwable cause, CharSequence userMessage,
RemoteAction userAction) {
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 6d87de8..db2f937 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -17,8 +17,6 @@
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;
@@ -746,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
@@ -1774,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/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 7855b92..109b5bb 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
@@ -2754,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
@@ -2833,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
@@ -3028,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 {}
/**
@@ -3070,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) {
@@ -5551,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.
@@ -5661,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 {
@@ -5743,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}.
@@ -7508,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) {
@@ -7523,13 +7632,13 @@
}
/**
- * 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) {
+ public @NonNull Set<String> getAffiliationIds(@NonNull ComponentName admin) {
throwIfParentInstance("getAffiliationIds");
try {
- return mService.getAffiliationIds(admin);
+ return new ArraySet<>(mService.getAffiliationIds(admin));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -7826,7 +7935,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/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java
index d6b89a1..7261dfa 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);
}
@@ -1552,14 +1559,14 @@
@Override
public void setText(CharSequence text) {
ViewNodeText t = getNodeText();
- t.mText = text;
+ t.mText = TextUtils.trimNoCopySpans(text);
t.mTextSelectionStart = t.mTextSelectionEnd = -1;
}
@Override
public void setText(CharSequence text, int selectionStart, int selectionEnd) {
ViewNodeText t = getNodeText();
- t.mText = text;
+ t.mText = TextUtils.trimNoCopySpans(text);
t.mTextSelectionStart = selectionStart;
t.mTextSelectionEnd = selectionEnd;
}
@@ -1730,13 +1737,6 @@
}
@Override
- public void setUrl(String url) {
- if (url == null) return;
-
- setWebDomain(url);
- }
-
- @Override
public void setWebDomain(@Nullable String domain) {
if (domain == null) {
mNode.mWebDomain = null;
@@ -1788,7 +1788,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++) {
@@ -1869,20 +1869,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 */
@@ -1909,6 +1911,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);
@@ -2021,10 +2024,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/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 c427268..e8ad69d 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -1703,7 +1703,7 @@
* 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.
+ * on an un-specified background thread.
* @throws NullPointerException if callback is null
*/
public BluetoothGatt connectGatt(Context context, boolean autoConnect,
@@ -1712,9 +1712,6 @@
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();
diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java
index 713dbf4..5fabbb6 100644
--- a/core/java/android/bluetooth/BluetoothGatt.java
+++ b/core/java/android/bluetooth/BluetoothGatt.java
@@ -156,11 +156,13 @@
}
mClientIf = clientIf;
if (status != GATT_SUCCESS) {
- mHandler.post(new Runnable() {
+ runOrQueueCallback(new Runnable() {
@Override
public void run() {
- mCallback.onConnectionStateChange(BluetoothGatt.this, GATT_FAILURE,
- BluetoothProfile.STATE_DISCONNECTED);
+ if (mCallback != null) {
+ mCallback.onConnectionStateChange(BluetoothGatt.this, GATT_FAILURE,
+ BluetoothProfile.STATE_DISCONNECTED);
+ }
}
});
@@ -189,10 +191,12 @@
return;
}
- mHandler.post(new Runnable() {
+ runOrQueueCallback(new Runnable() {
@Override
public void run() {
- mCallback.onPhyUpdate(BluetoothGatt.this, txPhy, rxPhy, status);
+ if (mCallback != null) {
+ mCallback.onPhyUpdate(BluetoothGatt.this, txPhy, rxPhy, status);
+ }
}
});
}
@@ -209,10 +213,12 @@
return;
}
- mHandler.post(new Runnable() {
+ runOrQueueCallback(new Runnable() {
@Override
public void run() {
- mCallback.onPhyRead(BluetoothGatt.this, txPhy, rxPhy, status);
+ if (mCallback != null) {
+ mCallback.onPhyRead(BluetoothGatt.this, txPhy, rxPhy, status);
+ }
}
});
}
@@ -232,10 +238,13 @@
int profileState = connected ? BluetoothProfile.STATE_CONNECTED :
BluetoothProfile.STATE_DISCONNECTED;
- mHandler.post(new Runnable() {
+ runOrQueueCallback(new Runnable() {
@Override
public void run() {
- mCallback.onConnectionStateChange(BluetoothGatt.this, status, profileState);
+ if (mCallback != null) {
+ mCallback.onConnectionStateChange(BluetoothGatt.this, status,
+ profileState);
+ }
}
});
@@ -291,10 +300,12 @@
}
}
- mHandler.post(new Runnable() {
+ runOrQueueCallback(new Runnable() {
@Override
public void run() {
- mCallback.onServicesDiscovered(BluetoothGatt.this, status);
+ if (mCallback != null) {
+ mCallback.onServicesDiscovered(BluetoothGatt.this, status);
+ }
}
});
}
@@ -341,10 +352,13 @@
if (status == 0) characteristic.setValue(value);
- mHandler.post(new Runnable() {
+ runOrQueueCallback(new Runnable() {
@Override
public void run() {
- mCallback.onCharacteristicRead(BluetoothGatt.this, characteristic, status);
+ if (mCallback != null) {
+ mCallback.onCharacteristicRead(BluetoothGatt.this, characteristic,
+ status);
+ }
}
});
}
@@ -387,10 +401,13 @@
mAuthRetryState = AUTH_RETRY_STATE_IDLE;
- mHandler.post(new Runnable() {
+ runOrQueueCallback(new Runnable() {
@Override
public void run() {
- mCallback.onCharacteristicWrite(BluetoothGatt.this, characteristic, status);
+ if (mCallback != null) {
+ mCallback.onCharacteristicWrite(BluetoothGatt.this, characteristic,
+ status);
+ }
}
});
}
@@ -413,10 +430,12 @@
characteristic.setValue(value);
- mHandler.post(new Runnable() {
+ runOrQueueCallback(new Runnable() {
@Override
public void run() {
- mCallback.onCharacteristicChanged(BluetoothGatt.this, characteristic);
+ if (mCallback != null) {
+ mCallback.onCharacteristicChanged(BluetoothGatt.this, characteristic);
+ }
}
});
}
@@ -458,10 +477,12 @@
mAuthRetryState = AUTH_RETRY_STATE_IDLE;
- mHandler.post(new Runnable() {
+ runOrQueueCallback(new Runnable() {
@Override
public void run() {
- mCallback.onDescriptorRead(BluetoothGatt.this, descriptor, status);
+ if (mCallback != null) {
+ mCallback.onDescriptorRead(BluetoothGatt.this, descriptor, status);
+ }
}
});
}
@@ -502,10 +523,12 @@
mAuthRetryState = AUTH_RETRY_STATE_IDLE;
- mHandler.post(new Runnable() {
+ runOrQueueCallback(new Runnable() {
@Override
public void run() {
- mCallback.onDescriptorWrite(BluetoothGatt.this, descriptor, status);
+ if (mCallback != null) {
+ mCallback.onDescriptorWrite(BluetoothGatt.this, descriptor, status);
+ }
}
});
}
@@ -526,10 +549,12 @@
mDeviceBusy = false;
}
- mHandler.post(new Runnable() {
+ runOrQueueCallback(new Runnable() {
@Override
public void run() {
- mCallback.onReliableWriteCompleted(BluetoothGatt.this, status);
+ if (mCallback != null) {
+ mCallback.onReliableWriteCompleted(BluetoothGatt.this, status);
+ }
}
});
}
@@ -545,10 +570,12 @@
if (!address.equals(mDevice.getAddress())) {
return;
}
- mHandler.post(new Runnable() {
+ runOrQueueCallback(new Runnable() {
@Override
public void run() {
- mCallback.onReadRemoteRssi(BluetoothGatt.this, rssi, status);
+ if (mCallback != null) {
+ mCallback.onReadRemoteRssi(BluetoothGatt.this, rssi, status);
+ }
}
});
}
@@ -565,10 +592,12 @@
return;
}
- mHandler.post(new Runnable() {
+ runOrQueueCallback(new Runnable() {
@Override
public void run() {
- mCallback.onMtuChanged(BluetoothGatt.this, mtu, status);
+ if (mCallback != null) {
+ mCallback.onMtuChanged(BluetoothGatt.this, mtu, status);
+ }
}
});
}
@@ -587,11 +616,13 @@
return;
}
- mHandler.post(new Runnable() {
+ runOrQueueCallback(new Runnable() {
@Override
public void run() {
- mCallback.onConnectionUpdated(BluetoothGatt.this, interval, latency,
- timeout, status);
+ if (mCallback != null) {
+ mCallback.onConnectionUpdated(BluetoothGatt.this, interval, latency,
+ timeout, status);
+ }
}
});
}
@@ -672,6 +703,22 @@
}
/**
+ * Queue the runnable on a {@link Handler} provided by the user, or execute the runnable
+ * immediately if no Handler was provided.
+ */
+ private void runOrQueueCallback(final Runnable cb) {
+ if (mHandler == null) {
+ try {
+ cb.run();
+ } catch (Exception ex) {
+ Log.w(TAG, "Unhandled exception in callback", ex);
+ }
+ } else {
+ mHandler.post(cb);
+ }
+ }
+
+ /**
* Register an application callback to start using GATT.
*
* <p>This is an asynchronous call. The callback {@link BluetoothGattCallback#onAppRegistered}
@@ -973,6 +1020,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/IBluetoothGatt.aidl b/core/java/android/bluetooth/IBluetoothGatt.aidl
index 12e9baa..e2d4f5b 100644
--- a/core/java/android/bluetooth/IBluetoothGatt.aidl
+++ b/core/java/android/bluetooth/IBluetoothGatt.aidl
@@ -59,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);
@@ -80,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 0c7958d..67d56d5 100644
--- a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
+++ b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
@@ -544,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/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/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 2e2d444..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.
*/
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index da43fec..1d879e9 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -1710,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.
*/
@@ -1840,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
@@ -3228,6 +3223,7 @@
* caused the broadcast.
* @hide
*/
+ @SystemApi
public static final String ACTION_GLOBAL_BUTTON = "android.intent.action.GLOBAL_BUTTON";
/**
@@ -3389,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
*/
@@ -4311,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>
@@ -4421,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/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index 0be0885..587ab3b 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -883,9 +883,12 @@
/**
* Screen rotation animation desired by the activity, with values as defined
* for {@link android.view.WindowManager.LayoutParams#rotationAnimation}.
+ *
+ * -1 means to use the system default.
+ *
* @hide
*/
- public int rotationAnimation = ROTATION_ANIMATION_ROTATE;
+ public int rotationAnimation = -1;
/** @hide */
public static final int LOCK_TASK_LAUNCH_MODE_DEFAULT = 0;
@@ -985,10 +988,18 @@
* @hide
*/
boolean isFixedOrientationLandscape() {
- return screenOrientation == SCREEN_ORIENTATION_LANDSCAPE
- || screenOrientation == SCREEN_ORIENTATION_SENSOR_LANDSCAPE
- || screenOrientation == SCREEN_ORIENTATION_REVERSE_LANDSCAPE
- || screenOrientation == SCREEN_ORIENTATION_USER_LANDSCAPE;
+ return isFixedOrientationLandscape(screenOrientation);
+ }
+
+ /**
+ * Returns true if the activity's orientation is fixed to landscape.
+ * @hide
+ */
+ public static boolean isFixedOrientationLandscape(@ScreenOrientation int orientation) {
+ return orientation == SCREEN_ORIENTATION_LANDSCAPE
+ || orientation == SCREEN_ORIENTATION_SENSOR_LANDSCAPE
+ || orientation == SCREEN_ORIENTATION_REVERSE_LANDSCAPE
+ || orientation == SCREEN_ORIENTATION_USER_LANDSCAPE;
}
/**
@@ -996,10 +1007,18 @@
* @hide
*/
boolean isFixedOrientationPortrait() {
- return screenOrientation == SCREEN_ORIENTATION_PORTRAIT
- || screenOrientation == SCREEN_ORIENTATION_SENSOR_PORTRAIT
- || screenOrientation == SCREEN_ORIENTATION_REVERSE_PORTRAIT
- || screenOrientation == SCREEN_ORIENTATION_USER_PORTRAIT;
+ return isFixedOrientationPortrait(screenOrientation);
+ }
+
+ /**
+ * Returns true if the activity's orientation is fixed to portrait.
+ * @hide
+ */
+ public static boolean isFixedOrientationPortrait(@ScreenOrientation int orientation) {
+ return orientation == SCREEN_ORIENTATION_PORTRAIT
+ || orientation == SCREEN_ORIENTATION_SENSOR_PORTRAIT
+ || orientation == SCREEN_ORIENTATION_REVERSE_PORTRAIT
+ || orientation == SCREEN_ORIENTATION_USER_PORTRAIT;
}
/**
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/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index c7dd1fa..9096e44 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -462,7 +462,7 @@
*
* See PackageManager.NOTIFY_PACKAGE_USE_* for reasons.
*/
- void notifyPackageUse(String packageName, int reason);
+ oneway void notifyPackageUse(String packageName, int reason);
/**
* Notify the package manager that a list of dex files have been loaded.
@@ -471,7 +471,8 @@
* @param dexPats the list of the dex files paths that have been loaded
* @param loaderIsa the ISA of the loader process
*/
- void notifyDexLoad(String loadingPackageName, in List<String> dexPaths, String loaderIsa);
+ oneway void notifyDexLoad(String loadingPackageName, in List<String> dexPaths,
+ String loaderIsa);
/**
* Ask the package manager to perform a dex-opt for the given reason. The package
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/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index aaaff0c..4e11233 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -26,6 +26,7 @@
import android.app.ActivityManager;
import android.content.Intent;
import android.content.IntentSender;
+import android.content.pm.PackageManager.InstallReason;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.FileBridge;
@@ -948,7 +949,7 @@
/** {@hide} */
public int installLocation = PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY;
/** {@hide} */
- public int installReason = PackageManager.INSTALL_REASON_UNKNOWN;
+ public @InstallReason int installReason = PackageManager.INSTALL_REASON_UNKNOWN;
/** {@hide} */
public long sizeBytes = -1;
/** {@hide} */
@@ -1146,7 +1147,10 @@
}
}
- public void setInstallReason(int installReason) {
+ /**
+ * Set the reason for installing this package.
+ */
+ public void setInstallReason(@InstallReason int installReason) {
this.installReason = installReason;
}
@@ -1236,7 +1240,7 @@
/** {@hide} */
public int mode;
/** {@hide} */
- public int installReason;
+ public @InstallReason int installReason;
/** {@hide} */
public long sizeBytes;
/** {@hide} */
@@ -1324,9 +1328,9 @@
/**
* Return the reason for installing this package.
*
- * @see PackageManager#INSTALL_REASON_UNKNOWN
+ * @return The install reason.
*/
- public int getInstallReason() {
+ public @InstallReason int getInstallReason() {
return installReason;
}
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 e4db0f0..9b0bab4 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -148,7 +148,7 @@
private static final String PROPERTY_CHILD_PACKAGES_ENABLED =
"persist.sys.child_packages_enabled";
- private static final boolean MULTI_PACKAGE_APK_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;
@@ -201,10 +201,10 @@
private static final String META_DATA_INSTANT_APPS = "instantapps.clients.allowed";
/**
- * Bit mask of all the valid bits that can be set in restartOnConfigChanges.
+ * Bit mask of all the valid bits that can be set in recreateOnConfigChanges.
* @hide
*/
- private static final int RESTART_ON_CONFIG_CHANGES_MASK =
+ private static final int RECREATE_ON_CONFIG_CHANGES_MASK =
ActivityInfo.CONFIG_MCC | ActivityInfo.CONFIG_MNC;
// These are the tags supported by child packages
@@ -547,6 +547,8 @@
*/
public interface Callback {
boolean hasFeature(String feature);
+ String[] getOverlayPaths(String targetPackageName, String targetPath);
+ String[] getOverlayApks(String targetPackageName);
}
/**
@@ -563,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;
+ }
}
/**
@@ -1054,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);
@@ -1238,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]);
@@ -1938,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
@@ -1947,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;
@@ -1967,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,
@@ -3268,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,
@@ -3405,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;
}
@@ -4186,7 +4219,7 @@
ActivityManager.getDefaultAppRecentsLimitStatic());
a.info.configChanges = getActivityConfigChanges(
sa.getInt(R.styleable.AndroidManifestActivity_configChanges, 0),
- sa.getInt(R.styleable.AndroidManifestActivity_restartOnConfigChanges, 0));
+ sa.getInt(R.styleable.AndroidManifestActivity_recreateOnConfigChanges, 0));
a.info.softInputMode = sa.getInt(
R.styleable.AndroidManifestActivity_windowSoftInputMode, 0);
@@ -4490,13 +4523,13 @@
/**
* @param configChanges The bit mask of configChanges fetched from AndroidManifest.xml.
- * @param restartOnConfigChanges The bit mask restartOnConfigChanges fetched from
- * AndroidManifest.xml.
+ * @param recreateOnConfigChanges The bit mask recreateOnConfigChanges fetched from
+ * AndroidManifest.xml.
* @hide Exposed for unit testing only.
*/
@TestApi
- public static int getActivityConfigChanges(int configChanges, int restartOnConfigChanges) {
- return configChanges | ((~restartOnConfigChanges) & RESTART_ON_CONFIG_CHANGES_MASK);
+ public static int getActivityConfigChanges(int configChanges, int recreateOnConfigChanges) {
+ return configChanges | ((~recreateOnConfigChanges) & RECREATE_ON_CONFIG_CHANGES_MASK);
}
private void parseLayout(Resources res, AttributeSet attrs, Activity a) {
@@ -7205,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/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java
index 650b4c0..f312204 100644
--- a/core/java/android/content/pm/ResolveInfo.java
+++ b/core/java/android/content/pm/ResolveInfo.java
@@ -71,6 +71,10 @@
/**
* Whether or not an instant app is available for the resolved intent.
*/
+ public boolean isInstantAppAvailable;
+
+ /** @removed */
+ @Deprecated
public boolean instantAppAvailable;
/**
@@ -330,7 +334,8 @@
system = orig.system;
targetUserId = orig.targetUserId;
handleAllWebDataURI = orig.handleAllWebDataURI;
- instantAppAvailable = orig.instantAppAvailable;
+ isInstantAppAvailable = orig.isInstantAppAvailable;
+ instantAppAvailable = isInstantAppAvailable;
}
public String toString() {
@@ -394,7 +399,7 @@
dest.writeInt(noResourceId ? 1 : 0);
dest.writeInt(iconResourceId);
dest.writeInt(handleAllWebDataURI ? 1 : 0);
- dest.writeInt(instantAppAvailable ? 1 : 0);
+ dest.writeInt(isInstantAppAvailable ? 1 : 0);
}
public static final Creator<ResolveInfo> CREATOR
@@ -442,7 +447,7 @@
noResourceId = source.readInt() != 0;
iconResourceId = source.readInt();
handleAllWebDataURI = source.readInt() != 0;
- instantAppAvailable = source.readInt() != 0;
+ instantAppAvailable = isInstantAppAvailable = source.readInt() != 0;
}
public static class DisplayNameComparator
diff --git a/core/java/android/content/pm/SharedLibraryInfo.java b/core/java/android/content/pm/SharedLibraryInfo.java
index 0ad4874..5032e6a 100644
--- a/core/java/android/content/pm/SharedLibraryInfo.java
+++ b/core/java/android/content/pm/SharedLibraryInfo.java
@@ -131,7 +131,7 @@
*
* @return The version.
*/
- public @IntRange(from = -1) long getVersion() {
+ public @IntRange(from = -1) int getVersion() {
return mVersion;
}
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/content/res/FontResourcesParser.java b/core/java/android/content/res/FontResourcesParser.java
index 0edbc70..b21ccf1 100644
--- a/core/java/android/content/res/FontResourcesParser.java
+++ b/core/java/android/content/res/FontResourcesParser.java
@@ -19,6 +19,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.util.AttributeSet;
+import android.util.Log;
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
@@ -34,6 +35,7 @@
* @hide
*/
public class FontResourcesParser {
+ private static final String TAG = "FontResourcesParser";
private static final int NORMAL_WEIGHT = 400;
private static final int ITALIC = 1;
@@ -79,12 +81,10 @@
private boolean mItalic;
private int mResourceId;
- public FontFileResourceEntry(@NonNull String fileName, int weight, boolean italic,
- int resourceId) {
+ public FontFileResourceEntry(@NonNull String fileName, int weight, boolean italic) {
mFileName = fileName;
mWeight = weight;
mItalic = italic;
- mResourceId = resourceId;
}
public @NonNull String getFileName() {
@@ -98,10 +98,6 @@
public boolean isItalic() {
return mItalic;
}
-
- public int getResourceId() {
- return mResourceId;
- }
}
// A class represents file based font-family element in xml file.
@@ -140,6 +136,7 @@
return readFamily(parser, resources);
} else {
skip(parser);
+ Log.e(TAG, "Failed to find font-family tag");
return null;
}
}
@@ -184,7 +181,10 @@
if (parser.getEventType() != XmlPullParser.START_TAG) continue;
String tag = parser.getName();
if (tag.equals("font")) {
- fonts.add(readFont(parser, resources));
+ final FontFileResourceEntry entry = readFont(parser, resources);
+ if (entry != null) {
+ fonts.add(entry);
+ }
} else {
skip(parser);
}
@@ -203,12 +203,14 @@
int weight = array.getInt(R.styleable.FontFamilyFont_fontWeight, NORMAL_WEIGHT);
boolean isItalic = ITALIC == array.getInt(R.styleable.FontFamilyFont_fontStyle, 0);
String filename = array.getString(R.styleable.FontFamilyFont_font);
- int resourceId = array.getResourceId(R.styleable.FontFamilyFont_font, 0);
array.recycle();
while (parser.next() != XmlPullParser.END_TAG) {
skip(parser);
}
- return new FontFileResourceEntry(filename, weight, isItalic, resourceId);
+ if (filename == null) {
+ return null;
+ }
+ return new FontFileResourceEntry(filename, weight, isItalic);
}
private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index 02ddc89..bdfef83 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -789,7 +789,6 @@
final FontResourcesParser.FamilyResourceEntry familyEntry =
FontResourcesParser.parse(rp, wrapper);
if (familyEntry == null) {
- Log.e(TAG, "Failed to find font-family tag");
return null;
}
return Typeface.createFromResources(familyEntry, mAssets, file);
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 51506b0..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) {
@@ -579,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/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..b0cc38c 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");
}
@@ -3400,10 +3356,26 @@
}
/**
+ * Requests that the system open the captive portal app on the specified network.
+ *
+ * @param network The network to log into.
+ *
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL)
+ public void startCaptivePortalApp(Network network) {
+ try {
+ mService.startCaptivePortalApp(network);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* 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/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index 425e494..6b2da61 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -160,6 +160,7 @@
void setAcceptUnvalidated(in Network network, boolean accept, boolean always);
void setAvoidUnvalidated(in Network network);
+ void startCaptivePortalApp(in Network network);
int getMultipathPreference(in Network Network);
diff --git a/core/java/android/net/INetworkScoreService.aidl b/core/java/android/net/INetworkScoreService.aidl
index 73e52c8..d163a44 100644
--- a/core/java/android/net/INetworkScoreService.aidl
+++ b/core/java/android/net/INetworkScoreService.aidl
@@ -45,7 +45,7 @@
* Set the active scorer and clear existing scores.
* @param packageName the package name of the new scorer to use.
* @return true if the operation succeeded, or false if the new package is not a valid scorer.
- * @throws SecurityException if the caller is not the system.
+ * @throws SecurityException if the caller is not the system or a network scorer.
*/
boolean setActiveScorer(in String packageName);
diff --git a/core/java/android/net/NetworkBadging.java b/core/java/android/net/NetworkBadging.java
index b4ef695..6de28b7 100644
--- a/core/java/android/net/NetworkBadging.java
+++ b/core/java/android/net/NetworkBadging.java
@@ -35,9 +35,10 @@
/**
* Utility methods for working with network badging.
*
- * @hide
+ * @removed
+ *
*/
-@SystemApi
+@Deprecated
public class NetworkBadging {
@IntDef({BADGING_NONE, BADGING_SD, BADGING_HD, BADGING_4K})
diff --git a/core/java/android/net/NetworkRecommendationProvider.java b/core/java/android/net/NetworkRecommendationProvider.java
index 1eaa1f9..d7b58f7 100644
--- a/core/java/android/net/NetworkRecommendationProvider.java
+++ b/core/java/android/net/NetworkRecommendationProvider.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
import android.Manifest.permission;
@@ -41,11 +57,13 @@
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.
* @deprecated to be removed.
+ * @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.
* @deprecated to be removed.
+ * @removed
*/
public static final String EXTRA_SEQUENCE = "android.net.extra.SEQUENCE";
private final IBinder mService;
@@ -54,6 +72,7 @@
* Constructs a new instance.
* @param handler indicates which thread to use when handling requests. Cannot be {@code null}.
* @deprecated use {@link #NetworkRecommendationProvider(Context, Executor)}
+ * @removed
*/
public NetworkRecommendationProvider(Handler handler) {
if (handler == null) {
@@ -82,6 +101,7 @@
* available it must be passed into
* {@link ResultCallback#onResult(RecommendationResult)}.
* @deprecated to be removed.
+ * @removed
*/
public void onRequestRecommendation(RecommendationRequest request, ResultCallback callback) {}
@@ -107,6 +127,7 @@
* is available.
*
* @deprecated to be removed.
+ * @removed
*/
public static class ResultCallback {
private final IRemoteCallback mCallback;
diff --git a/core/java/android/net/NetworkScoreManager.java b/core/java/android/net/NetworkScoreManager.java
index eeb426a..9f6e45c 100644
--- a/core/java/android/net/NetworkScoreManager.java
+++ b/core/java/android/net/NetworkScoreManager.java
@@ -16,27 +16,20 @@
package android.net;
-import static android.net.NetworkRecommendationProvider.EXTRA_RECOMMENDATION_RESULT;
-
+import android.Manifest.permission;
import android.annotation.IntDef;
-import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi;
import android.content.Context;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.RemoteCallback;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
-import com.android.internal.util.Preconditions;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
-import java.util.concurrent.CompletableFuture;
/**
* Class that manages communication between network subsystems and a network scorer.
@@ -49,9 +42,9 @@
*
* <p>A network scorer is any application which:
* <ul>
- * <li>Declares the {@link android.Manifest.permission#SCORE_NETWORKS} permission.
+ * <li>Declares the {@link permission#SCORE_NETWORKS} permission.
* <li>Include a Service for the {@link #ACTION_RECOMMEND_NETWORKS} action
- * protected by the {@link android.Manifest.permission#BIND_NETWORK_RECOMMENDATION_SERVICE}
+ * protected by the {@link permission#BIND_NETWORK_RECOMMENDATION_SERVICE}
* permission.
* </ul>
*
@@ -319,7 +312,7 @@
*
* @return true if the operation succeeded, or false if the new package is not a valid scorer.
* @throws SecurityException if the caller is not a system process or does not hold the
- * {@link android.Manifest.permission#REQUEST_NETWORK_SCORES} permission
+ * {@link permission#SCORE_NETWORKS} permission
* @hide
*/
@SystemApi
@@ -351,7 +344,7 @@
*
* @return true if the broadcast was sent, or false if there is no active scorer.
* @throws SecurityException if the caller does not hold the
- * {@link android.Manifest.permission#REQUEST_NETWORK_SCORES} permission.
+ * {@link permission#REQUEST_NETWORK_SCORES} permission.
* @hide
*/
public boolean requestScores(NetworkKey[] networks) throws SecurityException {
@@ -368,7 +361,7 @@
* @param networkType the type of network this cache can handle. See {@link NetworkKey#type}.
* @param scoreCache implementation of {@link INetworkScoreCache} to store the scores.
* @throws SecurityException if the caller does not hold the
- * {@link android.Manifest.permission#REQUEST_NETWORK_SCORES} permission.
+ * {@link permission#REQUEST_NETWORK_SCORES} permission.
* @throws IllegalArgumentException if a score cache is already registered for this type.
* @deprecated equivalent to registering for cache updates with CACHE_FILTER_NONE.
* @hide
@@ -385,7 +378,7 @@
* @param scoreCache implementation of {@link INetworkScoreCache} to store the scores
* @param filterType the {@link CacheUpdateFilter} to apply
* @throws SecurityException if the caller does not hold the
- * {@link android.Manifest.permission#REQUEST_NETWORK_SCORES} permission.
+ * {@link permission#REQUEST_NETWORK_SCORES} permission.
* @throws IllegalArgumentException if a score cache is already registered for this type.
* @hide
*/
@@ -404,7 +397,7 @@
* @param networkType the type of network this cache can handle. See {@link NetworkKey#type}.
* @param scoreCache implementation of {@link INetworkScoreCache} to store the scores.
* @throws SecurityException if the caller does not hold the
- * {@link android.Manifest.permission#REQUEST_NETWORK_SCORES} permission.
+ * {@link permission#REQUEST_NETWORK_SCORES} permission.
* @throws IllegalArgumentException if a score cache is already registered for this type.
* @hide
*/
@@ -417,25 +410,6 @@
}
/**
- * Request a recommendation for which network to connect to.
- *
- * <p>It is not safe to call this method from the main thread.
- *
- * @param request a {@link RecommendationRequest} instance containing additional
- * request details
- * @return a {@link RecommendationResult} instance containing the recommended network
- * to connect to
- * @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 {
- return null;
- }
-
- /**
* Determine whether the application with the given UID is the enabled scorer.
*
* @param callingUid the UID to check
diff --git a/core/java/android/net/RecommendationRequest.java b/core/java/android/net/RecommendationRequest.java
index 45ee3a5..21641d9 100644
--- a/core/java/android/net/RecommendationRequest.java
+++ b/core/java/android/net/RecommendationRequest.java
@@ -17,7 +17,6 @@
package android.net;
-import android.annotation.SystemApi;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.os.Parcel;
@@ -31,8 +30,8 @@
* @see {@link NetworkScoreManager#requestRecommendation(RecommendationRequest)}.
* @hide
* @deprecated to be removed.
+ * @removed
*/
-@SystemApi
public final class RecommendationRequest implements Parcelable {
private final ScanResult[] mScanResults;
private final WifiConfiguration mDefaultConfig;
@@ -45,8 +44,8 @@
* Builder class for constructing {@link RecommendationRequest} instances.
* @hide
* @deprecated to be removed.
+ * @removed
*/
- @SystemApi
public static final class Builder {
private ScanResult[] mScanResults;
private WifiConfiguration mDefaultConfig;
diff --git a/core/java/android/net/RecommendationResult.java b/core/java/android/net/RecommendationResult.java
index ce4d83a..d66dd22 100644
--- a/core/java/android/net/RecommendationResult.java
+++ b/core/java/android/net/RecommendationResult.java
@@ -18,12 +18,10 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.annotation.SystemApi;
import android.net.wifi.WifiConfiguration;
import android.os.Parcel;
import android.os.Parcelable;
-import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
/**
@@ -32,8 +30,8 @@
* @see {@link NetworkScoreManager#requestRecommendation(RecommendationRequest)}.
* @hide
* @deprecated to be removed.
+ * @removed
*/
-@SystemApi
public final class RecommendationResult implements Parcelable {
private final WifiConfiguration mWifiConfiguration;
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/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/PowerManagerInternal.java b/core/java/android/os/PowerManagerInternal.java
index 44addfc..a01b8ed 100644
--- a/core/java/android/os/PowerManagerInternal.java
+++ b/core/java/android/os/PowerManagerInternal.java
@@ -87,16 +87,6 @@
public abstract void setScreenBrightnessOverrideFromWindowManager(int brightness);
/**
- * Used by the window manager to override the button brightness based on the
- * current foreground activity.
- *
- * This method must only be called by the window manager.
- *
- * @param brightness The overridden brightness, or -1 to disable the override.
- */
- public abstract void setButtonBrightnessOverrideFromWindowManager(int brightness);
-
- /**
* Used by the window manager to override the user activity timeout based on the
* current foreground activity. It can only be used to make the timeout shorter
* than usual, not longer.
diff --git a/core/java/android/os/TestLooperManager.java b/core/java/android/os/TestLooperManager.java
index 745642e..5e7549f 100644
--- a/core/java/android/os/TestLooperManager.java
+++ b/core/java/android/os/TestLooperManager.java
@@ -58,11 +58,17 @@
/**
* Returns the {@link MessageQueue} this object is wrapping.
*/
- public MessageQueue getQueue() {
+ public MessageQueue getMessageQueue() {
checkReleased();
return mQueue;
}
+ /** @removed */
+ @Deprecated
+ public MessageQueue getQueue() {
+ return getMessageQueue();
+ }
+
/**
* Returns the next message that should be executed by this queue, may block
* if no messages are ready.
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/VintfObject.java b/core/java/android/os/VintfObject.java
index 1ef3916..8302ece 100644
--- a/core/java/android/os/VintfObject.java
+++ b/core/java/android/os/VintfObject.java
@@ -26,17 +26,12 @@
private static final String LOG_TAG = "VintfObject";
/**
- * Slurps all device information (both manifests)
- * and report it.
+ * Slurps all device information (both manifests and both matrices)
+ * and report them.
* If any error in getting one of the manifests, it is not included in
* the list.
*/
- public static String[] report() {
- ArrayList<String> ret = new ArrayList<>();
- put(ret, getDeviceManifest(), "device manifest");
- put(ret, getFrameworkManifest(), "framework manifest");
- return ret.toArray(new String[0]);
- }
+ public static native String[] report();
/**
* Verify that the given metadata for an OTA package is compatible with
@@ -50,15 +45,4 @@
*/
public static native int verify(String[] packageInfo);
- // return null if any error, otherwise XML string.
- private static native String getDeviceManifest();
- private static native String getFrameworkManifest();
-
- private static void put(ArrayList<String> list, String content, String message) {
- if (content == null || content.length() == 0) {
- Log.e(LOG_TAG, "Cannot get;" + message + "; check native logs for details.");
- return;
- }
- list.add(content);
- }
}
diff --git a/core/java/android/os/VintfRuntimeInfo.java b/core/java/android/os/VintfRuntimeInfo.java
new file mode 100644
index 0000000..29698b9
--- /dev/null
+++ b/core/java/android/os/VintfRuntimeInfo.java
@@ -0,0 +1,70 @@
+/*
+ * 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.os;
+
+/**
+ * Java API for ::android::vintf::RuntimeInfo. Methods return null / 0 on any error.
+ *
+ * @hide
+ */
+public class VintfRuntimeInfo {
+
+ private VintfRuntimeInfo() {}
+
+ /**
+ * @return /sys/fs/selinux/policyvers, via security_policyvers() native call
+ */
+ public static native long getKernelSepolicyVersion();
+ /**
+ * @return content of /proc/cpuinfo
+ */
+ public static native String getCpuInfo();
+ /**
+ * @return os name extracted from uname() native call
+ */
+ public static native String getOsName();
+ /**
+ * @return node name extracted from uname() native call
+ */
+ public static native String getNodeName();
+ /**
+ * @return os release extracted from uname() native call
+ */
+ public static native String getOsRelease();
+ /**
+ * @return os version extracted from uname() native call
+ */
+ public static native String getOsVersion();
+ /**
+ * @return hardware id extracted from uname() native call
+ */
+ public static native String getHardwareId();
+ /**
+ * @return kernel version extracted from uname() native call. Format is
+ * {@code x.y.z}.
+ */
+ public static native String getKernelVersion();
+ /**
+ * @return libavb version in OS. Format is {@code x.y}.
+ */
+ public static native String getBootAvbVersion();
+ /**
+ * @return libavb version in bootloader. Format is {@code x.y}.
+ */
+ public static native String getBootVbmetaAvbVersion();
+
+}
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/provider/CallLog.java b/core/java/android/provider/CallLog.java
index 8630f16..5c4fe96 100644
--- a/core/java/android/provider/CallLog.java
+++ b/core/java/android/provider/CallLog.java
@@ -333,6 +333,13 @@
public static final String TRANSCRIPTION = "transcription";
/**
+ * State of voicemail transcription entry. This will only be populated for call log
+ * entries of type {@link #VOICEMAIL_TYPE}.
+ * @hide
+ */
+ public static final String TRANSCRIPTION_STATE = "transcription_state";
+
+ /**
* Whether this item has been read or otherwise consumed by the user.
* <p>
* Unlike the {@link #NEW} field, which requires the user to have acknowledged the
diff --git a/core/java/android/provider/FontsContract.java b/core/java/android/provider/FontsContract.java
index 6c038c78..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;
@@ -601,49 +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);
- if (uriBuffer.isEmpty()) {
- return null;
- }
- 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.
@@ -792,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)
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 3343ffe..7ead659 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.
@@ -6622,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>
@@ -6769,7 +6789,8 @@
* Represented as milliseconds from midnight (e.g. 79200000 == 10pm).
* @hide
*/
- public static final String NIGHT_DISPLAY_CUSTOM_START_TIME = "night_display_custom_start_time";
+ public static final String NIGHT_DISPLAY_CUSTOM_START_TIME =
+ "night_display_custom_start_time";
/**
* Custom time when Night display is scheduled to deactivate.
@@ -6779,6 +6800,14 @@
public static final String NIGHT_DISPLAY_CUSTOM_END_TIME = "night_display_custom_end_time";
/**
+ * Time in milliseconds (since epoch) when Night display was last activated. Use to decide
+ * whether to apply the current activated state after a reboot or user change.
+ * @hide
+ */
+ public static final String NIGHT_DISPLAY_LAST_ACTIVATED_TIME =
+ "night_display_last_activated_time";
+
+ /**
* Names of the service components that the current user has explicitly allowed to
* be a VR mode listener, separated by ':'.
*
@@ -7004,6 +7033,7 @@
NIGHT_DISPLAY_CUSTOM_END_TIME,
NIGHT_DISPLAY_COLOR_TEMPERATURE,
NIGHT_DISPLAY_AUTO_MODE,
+ NIGHT_DISPLAY_LAST_ACTIVATED_TIME,
NIGHT_DISPLAY_ACTIVATED,
SYNC_PARENT_SOUNDS,
CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED,
@@ -7065,6 +7095,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);
@@ -7711,13 +7747,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
@@ -8950,13 +9009,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>
diff --git a/core/java/android/provider/VoicemailContract.java b/core/java/android/provider/VoicemailContract.java
index 4c61c2f..864a0fd 100644
--- a/core/java/android/provider/VoicemailContract.java
+++ b/core/java/android/provider/VoicemailContract.java
@@ -232,6 +232,39 @@
*/
public static final String TRANSCRIPTION = "transcription";
/**
+ * The state of the voicemail transcription.
+ * <P> Possible values: {@link #TRANSCRIPTION_NOT_STARTED},
+ * {@link #TRANSCRIPTION_IN_PROGRESS}, {@link #TRANSCRIPTION_FAILED},
+ * {@link #TRANSCRIPTION_AVAILABLE}.
+ * <P>Type: INTEGER</P>
+ * @hide
+ */
+ public static final String TRANSCRIPTION_STATE = "transcription_state";
+ /**
+ * Value of {@link #TRANSCRIPTION_STATE} when the voicemail transcription has not yet
+ * been attempted.
+ * @hide
+ */
+ public static final int TRANSCRIPTION_NOT_STARTED = 0;
+ /**
+ * Value of {@link #TRANSCRIPTION_STATE} when the voicemail transcription has begun
+ * but is not yet complete.
+ * @hide
+ */
+ public static final int TRANSCRIPTION_IN_PROGRESS = 1;
+ /**
+ * Value of {@link #TRANSCRIPTION_STATE} when the voicemail transcription has
+ * been attempted and failed.
+ * @hide
+ */
+ public static final int TRANSCRIPTION_FAILED = 2;
+ /**
+ * Value of {@link #TRANSCRIPTION_STATE} when the voicemail transcription has
+ * completed and the result has been stored in the {@link #TRANSCRIPTION} column.
+ * @hide
+ */
+ public static final int TRANSCRIPTION_AVAILABLE = 3;
+ /**
* Path to the media content file. Internal only field.
* @hide
*/
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 32b078f..88d17ef 100644
--- a/core/java/android/service/autofill/AutofillService.java
+++ b/core/java/android/service/autofill/AutofillService.java
@@ -48,7 +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_AUTOFILL} permission so
+ * {@link android.Manifest.permission#BIND_AUTOFILL_SERVICE} permission so
* that other applications can not abuse it.
*/
@SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION)
@@ -119,7 +119,7 @@
try {
onFillRequest(request, cancellation, fillCallback);
} catch (AbstractMethodError e) {
- final ArrayList<FillContext> contexts = request.getFillContexts();
+ final List<FillContext> contexts = request.getFillContexts();
onFillRequest(contexts.get(contexts.size() - 1).getStructure(),
request.getClientState(), request.getFlags(), cancellation,
fillCallback);
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/FillContext.java b/core/java/android/service/autofill/FillContext.java
index 8a28c45..d6616bf 100644
--- a/core/java/android/service/autofill/FillContext.java
+++ b/core/java/android/service/autofill/FillContext.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.app.assist.AssistStructure;
@@ -74,11 +74,9 @@
@Override
public String toString() {
- if (!DEBUG) {
- return super.toString();
- } else {
- return "FillContext [mRequestId=" + mRequestId + "]";
- }
+ if (!sDebug) return super.toString();
+
+ return "FillContext [reqId=" + mRequestId + "]";
}
@Override
diff --git a/core/java/android/service/autofill/FillRequest.java b/core/java/android/service/autofill/FillRequest.java
index 8ac399c..b1145ee 100644
--- a/core/java/android/service/autofill/FillRequest.java
+++ b/core/java/android/service/autofill/FillRequest.java
@@ -29,6 +29,7 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
+import java.util.List;
/**
* This class represents a request to an {@link AutofillService autofill provider}
@@ -96,7 +97,7 @@
/**
* @return The contexts associated with each previous fill request.
*/
- public @NonNull ArrayList<FillContext> getFillContexts() {
+ public @NonNull List<FillContext> getFillContexts() {
return mContexts;
}
diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java
index 5c8f3ce..1914db9 100644
--- a/core/java/android/service/autofill/FillResponse.java
+++ b/core/java/android/service/autofill/FillResponse.java
@@ -17,7 +17,7 @@
package android.service.autofill;
import static android.service.autofill.FillRequest.INVALID_REQUEST_ID;
-import static android.view.autofill.Helper.DEBUG;
+import static android.view.autofill.Helper.sDebug;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -30,6 +30,7 @@
import android.widget.RemoteViews;
import java.util.ArrayList;
+import java.util.Arrays;
/**
* Response for a {@link
@@ -258,12 +259,17 @@
* @param ids id of Views that when focused will display the authentication UI affordance.
*
* @return This builder.
+ * @throw {@link IllegalArgumentException} if {@code ids} is {@code null} or empty, or if
+ * neither {@code authentication} nor {@code presentation} is non-{@code null}.
+ *
* @see android.app.PendingIntent#getIntentSender()
*/
public @NonNull Builder setAuthentication(@NonNull AutofillId[] ids,
@Nullable IntentSender authentication, @Nullable RemoteViews presentation) {
throwIfDestroyed();
- // TODO(b/37424539): assert ids is not null nor empty once old version is removed
+ if (ids == null || ids.length == 0) {
+ throw new IllegalArgumentException("ids cannot be null or empry");
+ }
if (authentication == null ^ presentation == null) {
throw new IllegalArgumentException("authentication and presentation"
+ " must be both non-null or null");
@@ -275,17 +281,6 @@
}
/**
- * TODO(b/37424539): will be removed once clients use the version that takes ids
- * @hide
- * @deprecated
- */
- @Deprecated
- public @NonNull Builder setAuthentication(@Nullable IntentSender authentication,
- @Nullable RemoteViews presentation) {
- return setAuthentication(null, authentication, presentation);
- }
-
- /**
* Specifies views that should not trigger new
* {@link AutofillService#onFillRequest(FillRequest, android.os.CancellationSignal,
* FillCallback)} requests.
@@ -394,8 +389,9 @@
/////////////////////////////////////
@Override
public String toString() {
- if (!DEBUG) return super.toString();
+ if (!sDebug) return super.toString();
+ // TODO: create a dump() method instead
return new StringBuilder(
"FillResponse : [mRequestId=" + mRequestId)
.append(", datasets=").append(mDatasets)
@@ -403,10 +399,8 @@
.append(", clientState=").append(mClientState != null)
.append(", hasPresentation=").append(mPresentation != null)
.append(", hasAuthentication=").append(mAuthentication != null)
- .append(", authenticationSize=").append(mAuthenticationIds != null
- ? mAuthenticationIds.length : "N/A")
- .append(", ignoredIdsSize=").append(mIgnoredIds != null
- ? mIgnoredIds.length : "N/A")
+ .append(", authenticationIds=").append(Arrays.toString(mAuthenticationIds))
+ .append(", ignoredIds=").append(Arrays.toString(mIgnoredIds))
.append("]")
.toString();
}
@@ -447,8 +441,16 @@
}
builder.setSaveInfo(parcel.readParcelable(null));
builder.setClientState(parcel.readParcelable(null));
- builder.setAuthentication(parcel.readParcelableArray(null, AutofillId.class),
- parcel.readParcelable(null), parcel.readParcelable(null));
+
+ // Sets authentication state.
+ final AutofillId[] authenticationIds = parcel.readParcelableArray(null,
+ AutofillId.class);
+ final IntentSender authentication = parcel.readParcelable(null);
+ final RemoteViews presentation = parcel.readParcelable(null);
+ if (authenticationIds != null) {
+ builder.setAuthentication(authenticationIds, authentication, presentation);
+ }
+
builder.setIgnoredIds(parcel.readParcelableArray(null, AutofillId.class));
final FillResponse response = builder.build();
diff --git a/core/java/android/service/autofill/SaveInfo.java b/core/java/android/service/autofill/SaveInfo.java
index 94e5e3e..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;
@@ -387,7 +387,7 @@
/////////////////////////////////////
@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))
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/speech/tts/UtteranceProgressListener.java b/core/java/android/speech/tts/UtteranceProgressListener.java
index ef81f12..7381a12 100644
--- a/core/java/android/speech/tts/UtteranceProgressListener.java
+++ b/core/java/android/speech/tts/UtteranceProgressListener.java
@@ -144,9 +144,8 @@
onUtteranceRangeStart(utteranceId, start, end);
}
- /**
- * @deprecated Due to internal API changes. Remove when apps catch up.
- */
+ /** @removed */
+ @Deprecated
public void onUtteranceRangeStart(String utteranceId, int start, int end) {
}
diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java
index ee2b38e..91f43d6 100644
--- a/core/java/android/text/TextUtils.java
+++ b/core/java/android/text/TextUtils.java
@@ -40,6 +40,7 @@
import android.text.style.LeadingMarginSpan;
import android.text.style.LocaleSpan;
import android.text.style.MetricAffectingSpan;
+import android.text.style.ParagraphStyle;
import android.text.style.QuoteSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.ReplacementSpan;
@@ -56,6 +57,7 @@
import android.text.style.TypefaceSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
+import android.text.style.UpdateAppearance;
import android.util.Log;
import android.util.Printer;
import android.view.View;
@@ -1903,6 +1905,38 @@
return Resources.getSystem().getQuantityString(R.plurals.selected_count, count, count);
}
+ /**
+ * Returns whether or not the specified spanned text has a style span.
+ * @hide
+ */
+ public static boolean hasStyleSpan(@NonNull Spanned spanned) {
+ Preconditions.checkArgument(spanned != null);
+ final Class<?>[] styleClasses = {
+ CharacterStyle.class, ParagraphStyle.class, UpdateAppearance.class};
+ for (Class<?> clazz : styleClasses) {
+ if (spanned.nextSpanTransition(-1, spanned.length(), clazz) < spanned.length()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * If the {@code charSequence} is instance of {@link Spanned}, creates a new copy and
+ * {@link NoCopySpan}'s are removed from the copy. Otherwise the given {@code charSequence} is
+ * returned as it is.
+ *
+ * @hide
+ */
+ @Nullable
+ public static CharSequence trimNoCopySpans(@Nullable CharSequence charSequence) {
+ if (charSequence != null && charSequence instanceof Spanned) {
+ // SpannableStringBuilder copy constructor trims NoCopySpans.
+ return new SpannableStringBuilder(charSequence);
+ }
+ return charSequence;
+ }
+
private static Object sLock = new Object();
private static char[] sTemp = null;
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/view/FocusFinder.java b/core/java/android/view/FocusFinder.java
index 1ccf16a..48e5ca9 100644
--- a/core/java/android/view/FocusFinder.java
+++ b/core/java/android/view/FocusFinder.java
@@ -193,10 +193,14 @@
private View findNextUserSpecifiedFocus(ViewGroup root, View focused, int direction) {
// check for user specified next focus
View userSetNextFocus = focused.findUserSetNextFocus(root, direction);
- if (userSetNextFocus != null && userSetNextFocus.isFocusable()
- && (!userSetNextFocus.isInTouchMode()
- || userSetNextFocus.isFocusableInTouchMode())) {
- return userSetNextFocus;
+ while (userSetNextFocus != null) {
+ if (userSetNextFocus.isFocusable()
+ && userSetNextFocus.getVisibility() == View.VISIBLE
+ && (!userSetNextFocus.isInTouchMode()
+ || userSetNextFocus.isFocusableInTouchMode())) {
+ return userSetNextFocus;
+ }
+ userSetNextFocus = userSetNextFocus.findUserSetNextFocus(root, direction);
}
return null;
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 34aecdc..39f1170 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -805,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.
*/
@@ -1173,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.
@@ -2745,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
@@ -2978,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;
/**
@@ -7292,7 +7313,9 @@
*
* @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);
@@ -7456,10 +7479,12 @@
* <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) {
}
@@ -7546,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},
@@ -7599,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();
@@ -7643,7 +7695,7 @@
}
private boolean isAutofillable() {
- return getAutofillType() != AUTOFILL_TYPE_NONE && !isAutofillBlocked();
+ return getAutofillType() != AUTOFILL_TYPE_NONE && isImportantForAutofill();
}
private void populateVirtualStructure(ViewStructure structure,
@@ -7727,26 +7779,33 @@
* 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(@NonNull 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) {
- structure.setAutofillId(getAutofillId());
- // 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);
@@ -9584,22 +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}.
- */
- public boolean isAutofillBlocked() {
- // TODO(b/36171235): properly implement it using isImportantForAutofill()
- return false;
- }
-
- /**
- * @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,
@@ -16576,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) {
}
@@ -20372,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;
@@ -20395,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);
+ }
}
}
@@ -21083,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 b783482..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()) {
diff --git a/core/java/android/view/ViewStructure.java b/core/java/android/view/ViewStructure.java
index fb910b8..6bdc9ff 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
@@ -374,13 +374,6 @@
public abstract Rect getTempRect();
/**
- * @deprecated - use {@link #setWebDomain(String)} instead.
- * @hide
- */
- @Deprecated
- public abstract void setUrl(String url);
-
- /**
* Sets the Web domain represented by this node.
*
* <p>Typically used when the view is a container for an HTML document.
@@ -429,7 +422,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 dfb0095..7eb7bd9 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -23,10 +23,12 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SdkConstant;
+import android.annotation.SystemApi;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
+import android.content.res.Resources;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
@@ -1059,6 +1061,19 @@
}
}
+ /**
+ * Determines if the accessibility button within the system navigation area is supported.
+ *
+ * @return {@code true} if the accessibility button is supported on this device,
+ * {@code false} otherwise
+ * @hide
+ */
+ @SystemApi
+ public static boolean isAccessibilityButtonSupported() {
+ final Resources res = Resources.getSystem();
+ return res.getBoolean(com.android.internal.R.bool.config_showNavigationBar);
+ }
+
private final class MyCallback implements Handler.Callback {
public static final int MSG_SET_STATE = 1;
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 268f7f3..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;
@@ -92,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 6e02a84..d0133ed 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;
@@ -94,7 +94,8 @@
* <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.CLIENT_STATE";
static final String SESSION_ID_TAG = "android:sessionId";
static final String LAST_AUTOFILLED_DATA_TAG = "android:lastAutoFilledData";
@@ -107,11 +108,15 @@
@Deprecated
public static final int FLAG_MANUAL_REQUEST = 0x1;
- // TODO(b/37563972): start from 0x1 once FLAG_MANUAL_REQUEST is gone
- /** @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();
@@ -239,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");
}
@@ -356,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);
}
/**
@@ -385,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;
}
@@ -424,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);
}
}
}
@@ -453,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);
}
}
}
@@ -482,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;
}
@@ -498,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);
}
}
}
@@ -529,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);
}
}
}
@@ -581,7 +567,7 @@
value = view.getAutofillValue();
}
- updateSessionLocked(id, null, value, FLAG_VALUE_CHANGED);
+ updateSessionLocked(id, null, value, ACTION_VALUE_CHANGED, 0);
}
}
@@ -602,7 +588,7 @@
}
final AutofillId id = getAutofillId(view, childId);
- updateSessionLocked(id, null, value, FLAG_VALUE_CHANGED);
+ updateSessionLocked(id, null, value, ACTION_VALUE_CHANGED, 0);
}
}
@@ -644,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;
}
@@ -709,7 +700,7 @@
// 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) {
@@ -736,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);
}
@@ -745,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();
}
@@ -755,9 +746,7 @@
}
private void finishSessionLocked() {
- if (DEBUG) {
- Log.d(TAG, "finishSessionLocked()");
- }
+ if (sVerbose) Log.v(TAG, "finishSessionLocked()");
try {
mService.finishSession(mSessionId, mContext.getUserId());
@@ -770,9 +759,7 @@
}
private void cancelSessionLocked() {
- if (DEBUG) {
- Log.d(TAG, "cancelSessionLocked()");
- }
+ if (sVerbose) Log.v(TAG, "cancelSessionLocked()");
try {
mService.cancelSession(mSessionId, mContext.getUserId());
@@ -780,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();
}
@@ -807,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();
}
@@ -903,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;
+ }
}
}
@@ -1025,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;
}
}
}
@@ -1180,8 +1183,8 @@
}
}
- if (DEBUG) {
- Log.d(TAG, "TrackedViews(trackedIds=" + trackedIds + "): "
+ if (sVerbose) {
+ Log.v(TAG, "TrackedViews(trackedIds=" + trackedIds + "): "
+ " mVisibleTrackedIds=" + mVisibleTrackedIds
+ " mInvisibleTrackedIds=" + mInvisibleTrackedIds);
}
@@ -1201,7 +1204,7 @@
AutofillId id = getAutofillId(view);
AutofillClient client = getClientLocked();
- if (DEBUG) {
+ if (sDebug) {
Log.d(TAG, "notifyViewVisibilityChange(): id=" + id + " isVisible="
+ isVisible);
}
@@ -1242,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);
@@ -1258,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");
}
}
}
@@ -1343,10 +1346,11 @@
}
@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));
}
}
diff --git a/core/java/android/view/autofill/AutofillValue.java b/core/java/android/view/autofill/AutofillValue.java
index b1a9d90..3beae11 100644
--- a/core/java/android/view/autofill/AutofillValue.java
+++ b/core/java/android/view/autofill/AutofillValue.java
@@ -20,13 +20,13 @@
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;
import android.os.Parcel;
import android.os.Parcelable;
+import android.text.TextUtils;
import android.view.View;
import com.android.internal.util.Preconditions;
@@ -171,12 +171,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();
}
/////////////////////////////////////
@@ -253,7 +258,8 @@
* <p>See {@link View#AUTOFILL_TYPE_TEXT} for more info.
*/
public static AutofillValue forText(@Nullable CharSequence value) {
- return value == null ? null : new AutofillValue(AUTOFILL_TYPE_TEXT, value);
+ return value == null ? null : new AutofillValue(AUTOFILL_TYPE_TEXT,
+ TextUtils.trimNoCopySpans(value));
}
/**
diff --git a/core/java/android/view/autofill/Helper.java b/core/java/android/view/autofill/Helper.java
index 2b25ae7..829e7f3 100644
--- a/core/java/android/view/autofill/Helper.java
+++ b/core/java/android/view/autofill/Helper.java
@@ -25,15 +25,16 @@
/** @hide */
public final class Helper {
- // TODO(b/36141126): set to false and remove guard from places that should always be on
- public static final boolean DEBUG = true;
- 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 9417bd0..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,7 +39,7 @@
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);
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..209ff09 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,14 @@
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());
+ final ParcelFileDescriptor fd = getFdLocked(locale);
+ mSmartSelection = new SmartSelection(fd.getFd());
+ closeAndLogError(fd);
mLocale = locale;
}
return mSmartSelection;
@@ -191,6 +193,67 @@
}
@GuardedBy("mSmartSelectionLock") // Do not call outside this lock.
+ private ParcelFileDescriptor 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;
+ } 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 updateFd;
+ } else {
+ closeAndLogError(updateFd);
+ throw new FileNotFoundException(
+ String.format("No model file found for %s", locale));
+ }
+ }
+
+ if (!localeMatches) {
+ closeAndLogError(updateFd);
+ return factoryFd;
+ }
+
+ final int updateVersion = SmartSelection.getVersion(updateFdInt);
+ final int factoryVersion = SmartSelection.getVersion(factoryFd.getFd());
+ if (updateVersion > factoryVersion) {
+ closeAndLogError(factoryFd);
+ return updateFd;
+ } else {
+ closeAndLogError(updateFd);
+ return factoryFd;
+ }
+ }
+
+ @GuardedBy("mSmartSelectionLock") // Do not call outside this lock.
private void destroySmartSelectionIfExistsLocked() {
if (mSmartSelection != null) {
mSmartSelection.close();
@@ -206,11 +269,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 +303,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 +342,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 +403,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
*/
@@ -512,6 +607,7 @@
@Nullable
public static Intent create(Context context, String type, String text) {
type = type.trim().toLowerCase(Locale.ENGLISH);
+ text = text.trim();
switch (type) {
case TextClassifier.TYPE_EMAIL:
return new Intent(Intent.ACTION_SENDTO)
@@ -523,6 +619,9 @@
return new Intent(Intent.ACTION_VIEW)
.setData(Uri.parse(String.format("geo:0,0?q=%s", text)));
case TextClassifier.TYPE_URL:
+ if (!text.startsWith("https://") && !text.startsWith("http://")) {
+ text = "http://" + text;
+ }
return new Intent(Intent.ACTION_VIEW, Uri.parse(text))
.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
default:
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/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 1c87726..5476ab2 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -7088,7 +7088,8 @@
final int size = scrapViews.size();
if (size > 0) {
// See if we still have a view for this position or ID.
- for (int i = 0; i < size; i++) {
+ // Traverse backwards to find the most recently used scrap view
+ for (int i = size - 1; i >= 0; i--) {
final View view = scrapViews.get(i);
final AbsListView.LayoutParams params =
(AbsListView.LayoutParams) view.getLayoutParams();
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/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..ad3a99d 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;
@@ -154,10 +154,10 @@
private static final int MENU_ITEM_ORDER_COPY = 5;
private static final int MENU_ITEM_ORDER_PASTE = 6;
private static final int MENU_ITEM_ORDER_SHARE = 7;
- private static final int MENU_ITEM_ORDER_PASTE_AS_PLAIN_TEXT = 8;
- private static final int MENU_ITEM_ORDER_SELECT_ALL = 9;
- private static final int MENU_ITEM_ORDER_REPLACE = 10;
- private static final int MENU_ITEM_ORDER_AUTOFILL = 11;
+ private static final int MENU_ITEM_ORDER_SELECT_ALL = 8;
+ private static final int MENU_ITEM_ORDER_REPLACE = 9;
+ private static final int MENU_ITEM_ORDER_AUTOFILL = 10;
+ private static final int MENU_ITEM_ORDER_PASTE_AS_PLAIN_TEXT = 11;
private static final int MENU_ITEM_ORDER_PROCESS_TEXT_INTENT_ACTIONS_START = 100;
// Each Editor manages its own undo stack.
@@ -841,7 +841,7 @@
* Adjusts selection to the word under last touch offset. Return true if the operation was
* successfully performed.
*/
- private boolean selectCurrentWord() {
+ boolean selectCurrentWord() {
if (!mTextView.canSelectText()) {
return false;
}
@@ -2186,7 +2186,7 @@
}
void onTouchUpEvent(MotionEvent event) {
- if (getSelectionActionModeHelper().resetOriginalSelection(
+ if (getSelectionActionModeHelper().resetSelection(
getTextView().getOffsetForPosition(event.getX(), event.getY()))) {
return;
}
@@ -2634,9 +2634,9 @@
.setAlphabeticShortcut('v')
.setEnabled(mTextView.canPaste())
.setOnMenuItemClickListener(mOnContextMenuItemClickListener);
- menu.add(Menu.NONE, TextView.ID_PASTE, MENU_ITEM_ORDER_PASTE_AS_PLAIN_TEXT,
+ menu.add(Menu.NONE, TextView.ID_PASTE_AS_PLAIN_TEXT, MENU_ITEM_ORDER_PASTE_AS_PLAIN_TEXT,
com.android.internal.R.string.paste_as_plain_text)
- .setEnabled(mTextView.canPaste())
+ .setEnabled(mTextView.canPasteAsPlainText())
.setOnMenuItemClickListener(mOnContextMenuItemClickListener);
menu.add(Menu.NONE, TextView.ID_SHARE, MENU_ITEM_ORDER_SHARE,
com.android.internal.R.string.share)
@@ -3775,7 +3775,6 @@
mode.setSubtitle(null);
mode.setTitleOptionalHint(true);
populateMenuWithItems(menu);
- updateAssistMenuItem(menu);
Callback customCallback = getCustomCallback();
if (customCallback != null) {
@@ -3836,13 +3835,25 @@
}
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(mode);
+ }
+
+ if (mTextView.canPasteAsPlainText()) {
+ menu.add(
+ Menu.NONE,
+ TextView.ID_PASTE_AS_PLAIN_TEXT,
+ MENU_ITEM_ORDER_PASTE_AS_PLAIN_TEXT,
+ com.android.internal.R.string.paste_as_plain_text)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
updateSelectAllItem(menu);
updateReplaceItem(menu);
+ updateAssistMenuItem(menu);
}
@Override
@@ -3884,14 +3895,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 +3911,7 @@
mMetricsLogger.write(
new LogMaker(MetricsEvent.TEXT_SELECTION_MENU_ITEM_ASSIST)
.setType(MetricsEvent.TYPE_OPEN)
- .setSubtype(textClassificationResult.getLogType()));
+ .setSubtype(textClassification.getLogType()));
}
}
}
@@ -3914,24 +3925,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/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/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/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..c9d172f 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -26,13 +26,14 @@
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;
import com.android.internal.util.Preconditions;
+import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Supplier;
@@ -52,7 +53,7 @@
private final Editor mEditor;
private final TextClassificationHelper mTextClassificationHelper;
- private TextClassificationResult mTextClassificationResult;
+ private TextClassification mTextClassification;
private AsyncTask mTextClassificationAsyncTask;
private final SelectionInfo mSelectionInfo = new SelectionInfo();
@@ -98,8 +99,8 @@
}
}
- public boolean resetOriginalSelection(int textIndex) {
- if (mSelectionInfo.resetOriginalSelection(textIndex, mEditor.getTextView().getText())) {
+ public boolean resetSelection(int textIndex) {
+ if (mSelectionInfo.resetSelection(textIndex, mEditor)) {
invalidateActionModeAsync();
return true;
}
@@ -107,8 +108,8 @@
}
@Nullable
- public TextClassificationResult getTextClassificationResult() {
- return mTextClassificationResult;
+ public TextClassification getTextClassification() {
+ return mTextClassification;
}
public void onDestroyActionMode() {
@@ -121,7 +122,7 @@
mTextClassificationAsyncTask.cancel(true);
mTextClassificationAsyncTask = null;
}
- mTextClassificationResult = null;
+ mTextClassification = null;
}
private boolean isNoOpTextClassifier() {
@@ -140,9 +141,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 +159,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();
@@ -177,9 +178,9 @@
/**
* Holds information about the selection and uses it to decide on whether or not to update
- * the selection when resetOriginalSelection is called.
- * The expected UX here is to allow the user to re-snap the selection back to the original word
- * that was selected with one tap on that word.
+ * the selection when resetSelection is called.
+ * The expected UX here is to allow the user to select a word inside of the "smart selection" on
+ * a single tap.
*/
private static final class SelectionInfo {
@@ -212,14 +213,14 @@
mResetOriginal = false;
}
- public boolean resetOriginalSelection(int textIndex, CharSequence text) {
+ public boolean resetSelection(int textIndex, Editor editor) {
+ final CharSequence text = editor.getTextView().getText();
if (mResetOriginal
- && textIndex >= mOriginalStart && textIndex <= mOriginalEnd
+ && textIndex >= mSelectionStart && textIndex <= mSelectionEnd
&& text instanceof Spannable) {
- Selection.setSelection((Spannable) text, mOriginalStart, mOriginalEnd);
// Only allow a reset once.
mResetOriginal = false;
- return true;
+ return editor.selectCurrentWord();
}
return false;
}
@@ -310,6 +311,13 @@
/** End index relative to mTrimmedText */
private int mRelativeEnd;
+ /** Information about the last classified text to avoid re-running a query. */
+ private CharSequence mLastClassificationText;
+ private int mLastClassificationSelectionStart;
+ private int mLastClassificationSelectionEnd;
+ private LocaleList mLastClassificationLocales;
+ private SelectionResult mLastClassificationResult;
+
TextClassificationHelper(TextClassifier textClassifier,
CharSequence text, int selectionStart, int selectionEnd, LocaleList locales) {
reset(textClassifier, text, selectionStart, selectionEnd, locales);
@@ -328,12 +336,25 @@
@WorkerThread
public SelectionResult classifyText() {
- trimText();
- return new SelectionResult(
- mSelectionStart,
- mSelectionEnd,
- mTextClassifier.getTextClassificationResult(
- mTrimmedText, mRelativeStart, mRelativeEnd, mLocales));
+ if (!Objects.equals(mText, mLastClassificationText)
+ || mSelectionStart != mLastClassificationSelectionStart
+ || mSelectionEnd != mLastClassificationSelectionEnd
+ || !Objects.equals(mLocales, mLastClassificationLocales)) {
+
+ mLastClassificationText = mText;
+ mLastClassificationSelectionStart = mSelectionStart;
+ mLastClassificationSelectionEnd = mSelectionEnd;
+ mLastClassificationLocales = mLocales;
+
+ trimText();
+ mLastClassificationResult = new SelectionResult(
+ mSelectionStart,
+ mSelectionEnd,
+ mTextClassifier.classifyText(
+ mTrimmedText, mRelativeStart, mRelativeEnd, mLocales));
+
+ }
+ return mLastClassificationResult;
}
@WorkerThread
@@ -361,12 +382,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/TextView.java b/core/java/android/widget/TextView.java
index 399cfac..242dcf5 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -35,6 +35,7 @@
import android.app.Activity;
import android.app.assist.AssistStructure;
import android.content.ClipData;
+import android.content.ClipDescription;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
@@ -125,6 +126,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 +396,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 +913,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 +1233,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 +3386,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 +3903,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 +5370,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 +7170,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 +7310,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 +7359,10 @@
return super.onKeyUp(keyCode, event);
}
+ if (!KeyEvent.isModifierKey(keyCode)) {
+ mPreventDefaultMovement = false;
+ }
+
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
if (event.hasNoModifiers()) {
@@ -9280,12 +9333,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 +9353,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();
@@ -10171,6 +10235,9 @@
}
boolean canRequestAutofill() {
+ if (!isAutofillable()) {
+ return false;
+ }
final AutofillManager afm = mContext.getSystemService(AutofillManager.class);
if (afm != null) {
return afm.isEnabled();
@@ -10976,6 +11043,26 @@
.hasPrimaryClip());
}
+ boolean canPasteAsPlainText() {
+ if (!canPaste()) {
+ return false;
+ }
+
+ final ClipData clipData =
+ ((ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE))
+ .getPrimaryClip();
+ final ClipDescription description = clipData.getDescription();
+ final boolean isPlainType = description.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN);
+ final CharSequence text = clipData.getItemAt(0).getText();
+ if (isPlainType && (text instanceof Spanned)) {
+ Spanned spanned = (Spanned) text;
+ if (TextUtils.hasStyleSpan(spanned)) {
+ return true;
+ }
+ }
+ return description.hasMimeType(ClipDescription.MIMETYPE_TEXT_HTML);
+ }
+
boolean canProcessText() {
if (getId() == View.NO_ID) {
return false;
diff --git a/core/java/android/widget/VideoView.java b/core/java/android/widget/VideoView.java
index 7b2efea..58a2b0f 100644
--- a/core/java/android/widget/VideoView.java
+++ b/core/java/android/widget/VideoView.java
@@ -708,18 +708,20 @@
@Override
public boolean onTouchEvent(MotionEvent ev) {
- if (isInPlaybackState() && mMediaController != null) {
+ if (ev.getAction() == MotionEvent.ACTION_DOWN
+ && isInPlaybackState() && mMediaController != null) {
toggleMediaControlsVisiblity();
}
- return false;
+ return super.onTouchEvent(ev);
}
@Override
public boolean onTrackballEvent(MotionEvent ev) {
- if (isInPlaybackState() && mMediaController != null) {
+ if (ev.getAction() == MotionEvent.ACTION_DOWN
+ && isInPlaybackState() && mMediaController != null) {
toggleMediaControlsVisiblity();
}
- return false;
+ return super.onTrackballEvent(ev);
}
@Override
diff --git a/core/java/com/android/internal/app/ResolverListController.java b/core/java/com/android/internal/app/ResolverListController.java
index e8bebb7..ee5f6fd 100644
--- a/core/java/com/android/internal/app/ResolverListController.java
+++ b/core/java/com/android/internal/app/ResolverListController.java
@@ -97,7 +97,8 @@
final List<ResolveInfo> infos = mpm.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY
| (shouldGetResolvedFilter ? PackageManager.GET_RESOLVED_FILTER : 0)
- | (shouldGetActivityMetadata ? PackageManager.GET_META_DATA : 0));
+ | (shouldGetActivityMetadata ? PackageManager.GET_META_DATA : 0)
+ | PackageManager.MATCH_INSTANT);
if (infos != null) {
if (resolvedComponents == null) {
resolvedComponents = new ArrayList<>();
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/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/view/menu/MenuPopupHelper.java b/core/java/com/android/internal/view/menu/MenuPopupHelper.java
index 324f923..6af41a5 100644
--- a/core/java/com/android/internal/view/menu/MenuPopupHelper.java
+++ b/core/java/com/android/internal/view/menu/MenuPopupHelper.java
@@ -256,7 +256,7 @@
final int hgrav = Gravity.getAbsoluteGravity(mDropDownGravity,
mAnchorView.getLayoutDirection()) & Gravity.HORIZONTAL_GRAVITY_MASK;
if (hgrav == Gravity.RIGHT) {
- xOffset -= mAnchorView.getWidth();
+ xOffset += mAnchorView.getWidth();
}
popup.setHorizontalOffset(xOffset);
diff --git a/core/java/com/android/internal/view/menu/StandardMenuPopup.java b/core/java/com/android/internal/view/menu/StandardMenuPopup.java
index 169caa5..d9ca5be 100644
--- a/core/java/com/android/internal/view/menu/StandardMenuPopup.java
+++ b/core/java/com/android/internal/view/menu/StandardMenuPopup.java
@@ -263,6 +263,7 @@
mShownAnchorView, mOverflowOnly, mPopupStyleAttr, mPopupStyleRes);
subPopup.setPresenterCallback(mPresenterCallback);
subPopup.setForceShowIcon(MenuPopup.shouldPreserveIconSpacing(subMenu));
+ subPopup.setGravity(mDropDownGravity);
// Pass responsibility for handling onDismiss to the submenu.
subPopup.setOnDismissListener(mOnDismissListener);
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 ceb3cc8..77c72eb 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -97,6 +97,7 @@
android_os_Trace.cpp \
android_os_UEventObserver.cpp \
android_os_VintfObject.cpp \
+ android_os_VintfRuntimeInfo.cpp \
android_net_LocalSocketImpl.cpp \
android_net_NetUtils.cpp \
android_net_TrafficStats.cpp \
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 8ca4794..369bb7f 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -160,6 +160,7 @@
extern int register_android_os_Parcel(JNIEnv* env);
extern int register_android_os_SELinux(JNIEnv* env);
extern int register_android_os_VintfObject(JNIEnv *env);
+extern int register_android_os_VintfRuntimeInfo(JNIEnv *env);
extern int register_android_os_seccomp(JNIEnv* env);
extern int register_android_os_SystemProperties(JNIEnv *env);
extern int register_android_os_SystemClock(JNIEnv* env);
@@ -525,7 +526,7 @@
/*
* Reads a "property" into "buffer". If the property is non-empty, it
* is treated as a dex2oat compiler option that should be
- * passed as a quoted option, e.g. "-Ximage-compiler-option --compiler-filter=verify-none".
+ * passed as a quoted option, e.g. "-Ximage-compiler-option --compiler-filter=assume-verified".
*
* The "compilerArg" is a prefix for the option such as "--compiler-filter=".
*
@@ -773,7 +774,7 @@
"-Xmx", "-Ximage-compiler-option");
if (skip_compilation) {
addOption("-Ximage-compiler-option");
- addOption("--compiler-filter=verify-none");
+ addOption("--compiler-filter=assume-verified");
} else {
parseCompilerOption("dalvik.vm.image-dex2oat-filter", dex2oatImageCompilerFilterBuf,
"--compiler-filter=", "-Ximage-compiler-option");
@@ -804,7 +805,7 @@
"-Xmx", "-Xcompiler-option");
if (skip_compilation) {
addOption("-Xcompiler-option");
- addOption("--compiler-filter=verify-none");
+ addOption("--compiler-filter=assume-verified");
// We skip compilation when a minimal runtime is brought up for decryption. In that case
// /data is temporarily backed by a tmpfs, which is usually small.
@@ -1304,6 +1305,7 @@
REG_JNI(register_android_os_HwParcel),
REG_JNI(register_android_os_HwRemoteBinder),
REG_JNI(register_android_os_VintfObject),
+ REG_JNI(register_android_os_VintfRuntimeInfo),
REG_JNI(register_android_nio_utils),
REG_JNI(register_android_graphics_Canvas),
REG_JNI(register_android_graphics_Graphics),
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/graphics/SurfaceTexture.cpp b/core/jni/android/graphics/SurfaceTexture.cpp
index 14bad0f..9242b70 100644
--- a/core/jni/android/graphics/SurfaceTexture.cpp
+++ b/core/jni/android/graphics/SurfaceTexture.cpp
@@ -286,9 +286,7 @@
createProcessUniqueId()));
// If the current context is protected, inform the producer.
- if (isProtectedContext()) {
- consumer->setConsumerUsageBits(GRALLOC_USAGE_PROTECTED);
- }
+ consumer->setConsumerIsProtected(isProtectedContext());
SurfaceTexture_setSurfaceTexture(env, thiz, surfaceTexture);
SurfaceTexture_setProducer(env, thiz, producer);
diff --git a/core/jni/android_hardware_HardwareBuffer.cpp b/core/jni/android_hardware_HardwareBuffer.cpp
index 4b31c91..ba23450 100644
--- a/core/jni/android_hardware_HardwareBuffer.cpp
+++ b/core/jni/android_hardware_HardwareBuffer.cpp
@@ -80,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,
- android_convertGralloc1To0Usage(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) {
@@ -145,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());
}
// ----------------------------------------------------------------------------
@@ -221,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_os_VintfObject.cpp b/core/jni/android_os_VintfObject.cpp
index 9491a1e..033f2df 100644
--- a/core/jni/android_os_VintfObject.cpp
+++ b/core/jni/android_os_VintfObject.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 The Android Open Source Project
+ * 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.
@@ -16,6 +16,10 @@
#define LOG_TAG "VintfObject"
//#define LOG_NDEBUG 0
+#include <android-base/logging.h>
+
+#include <vector>
+#include <string>
#include <JNIHelp.h>
#include <vintf/VintfObject.h>
@@ -23,31 +27,48 @@
#include "core_jni_helpers.h"
+static jclass gString;
+
namespace android {
-using vintf::HalManifest;
-using vintf::RuntimeInfo;
using vintf::VintfObject;
using vintf::gHalManifestConverter;
+using vintf::gCompatibilityMatrixConverter;
+using vintf::XmlConverter;
-static jstring android_os_VintfObject_getDeviceManifest(JNIEnv* env, jclass clazz)
-{
- const HalManifest *manifest = VintfObject::GetDeviceHalManifest();
- if (manifest == nullptr) {
- return nullptr;
+static inline jobjectArray toJavaStringArray(JNIEnv* env, const std::vector<std::string>& v) {
+ jobjectArray ret = env->NewObjectArray(v.size(), gString, NULL /* init element */);
+ for (size_t i = 0; i < v.size(); ++i) {
+ env->SetObjectArrayElement(ret, i, env->NewStringUTF(v[i].c_str()));
}
- std::string xml = gHalManifestConverter(*manifest);
- return env->NewStringUTF(xml.c_str());
+ return ret;
}
-static jstring android_os_VintfObject_getFrameworkManifest(JNIEnv* env, jclass clazz)
-{
- const HalManifest *manifest = VintfObject::GetFrameworkHalManifest();
- if (manifest == nullptr) {
- return nullptr;
+template<typename T>
+static void tryAddSchema(const T* object, const XmlConverter<T>& converter,
+ const std::string& description,
+ std::vector<std::string>* cStrings) {
+ if (object == nullptr) {
+ LOG(WARNING) << __FUNCTION__ << "Cannot get " << description;
+ } else {
+ cStrings->push_back(converter(*object));
}
- std::string xml = gHalManifestConverter(*manifest);
- return env->NewStringUTF(xml.c_str());
+}
+
+static jobjectArray android_os_VintfObject_report(JNIEnv* env, jclass clazz)
+{
+ std::vector<std::string> cStrings;
+
+ tryAddSchema(VintfObject::GetDeviceHalManifest(), gHalManifestConverter,
+ "device manifest", &cStrings);
+ tryAddSchema(VintfObject::GetFrameworkHalManifest(), gHalManifestConverter,
+ "framework manifest", &cStrings);
+ tryAddSchema(VintfObject::GetDeviceCompatibilityMatrix(), gCompatibilityMatrixConverter,
+ "device compatibility matrix", &cStrings);
+ tryAddSchema(VintfObject::GetFrameworkCompatibilityMatrix(), gCompatibilityMatrixConverter,
+ "framework compatibility matrix", &cStrings);
+
+ return toJavaStringArray(env, cStrings);
}
static jint android_os_VintfObject_verify(JNIEnv *env, jclass clazz, jobjectArray packageInfo) {
@@ -66,15 +87,18 @@
// ----------------------------------------------------------------------------
static const JNINativeMethod gVintfObjectMethods[] = {
- {"getDeviceManifest", "()Ljava/lang/String;", (void*)android_os_VintfObject_getDeviceManifest},
- {"getFrameworkManifest", "()Ljava/lang/String;", (void*)android_os_VintfObject_getFrameworkManifest},
- {"verify", "([Ljava/lang/String;)I", (void*)android_os_VintfObject_verify},
+ {"report", "()[Ljava/lang/String;", (void*)android_os_VintfObject_report},
+ {"verify", "([Ljava/lang/String;)I", (void*)android_os_VintfObject_verify},
};
+
const char* const kVintfObjectPathName = "android/os/VintfObject";
int register_android_os_VintfObject(JNIEnv* env)
{
+
+ gString = MakeGlobalRefOrDie(env, FindClassOrDie(env, "java/lang/String"));
+
return RegisterMethodsOrDie(env, kVintfObjectPathName, gVintfObjectMethods,
NELEM(gVintfObjectMethods));
}
diff --git a/core/jni/android_os_VintfRuntimeInfo.cpp b/core/jni/android_os_VintfRuntimeInfo.cpp
new file mode 100644
index 0000000..ecb6854
--- /dev/null
+++ b/core/jni/android_os_VintfRuntimeInfo.cpp
@@ -0,0 +1,80 @@
+/*
+ * 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.
+ */
+
+#define LOG_TAG "VintfRuntimeInfo"
+//#define LOG_NDEBUG 0
+
+#include <JNIHelp.h>
+#include <vintf/VintfObject.h>
+#include <vintf/parse_string.h>
+#include <vintf/parse_xml.h>
+
+#include "core_jni_helpers.h"
+
+namespace android {
+
+using vintf::RuntimeInfo;
+using vintf::VintfObject;
+
+#define MAP_STRING_METHOD(javaMethod, cppString) \
+ static jstring android_os_VintfRuntimeInfo_##javaMethod(JNIEnv* env, jclass clazz) \
+ { \
+ const RuntimeInfo *info = VintfObject::GetRuntimeInfo(); \
+ if (info == nullptr) return nullptr; \
+ return env->NewStringUTF((cppString).c_str()); \
+ } \
+
+MAP_STRING_METHOD(getCpuInfo, info->cpuInfo());
+MAP_STRING_METHOD(getOsName, info->osName());
+MAP_STRING_METHOD(getNodeName, info->nodeName());
+MAP_STRING_METHOD(getOsRelease, info->osRelease());
+MAP_STRING_METHOD(getOsVersion, info->osVersion());
+MAP_STRING_METHOD(getHardwareId, info->hardwareId());
+MAP_STRING_METHOD(getKernelVersion, vintf::to_string(info->kernelVersion()));
+MAP_STRING_METHOD(getBootAvbVersion, vintf::to_string(info->bootAvbVersion()));
+MAP_STRING_METHOD(getBootVbmetaAvbVersion, vintf::to_string(info->bootVbmetaAvbVersion()));
+
+
+static jlong android_os_VintfRuntimeInfo_getKernelSepolicyVersion(JNIEnv *env, jclass clazz)
+{
+ const RuntimeInfo *info = VintfObject::GetRuntimeInfo();
+ if (info == nullptr) return 0;
+ return static_cast<jlong>(info->kernelSepolicyVersion());
+}
+
+// ----------------------------------------------------------------------------
+
+static const JNINativeMethod gVintfRuntimeInfoMethods[] = {
+ {"getKernelSepolicyVersion", "()J", (void*)android_os_VintfRuntimeInfo_getKernelSepolicyVersion},
+ {"getCpuInfo", "()Ljava/lang/String;", (void*)android_os_VintfRuntimeInfo_getCpuInfo},
+ {"getOsName", "()Ljava/lang/String;", (void*)android_os_VintfRuntimeInfo_getOsName},
+ {"getNodeName", "()Ljava/lang/String;", (void*)android_os_VintfRuntimeInfo_getNodeName},
+ {"getOsRelease", "()Ljava/lang/String;", (void*)android_os_VintfRuntimeInfo_getOsRelease},
+ {"getOsVersion", "()Ljava/lang/String;", (void*)android_os_VintfRuntimeInfo_getOsVersion},
+ {"getHardwareId", "()Ljava/lang/String;", (void*)android_os_VintfRuntimeInfo_getHardwareId},
+ {"getKernelVersion", "()Ljava/lang/String;", (void*)android_os_VintfRuntimeInfo_getKernelVersion},
+ {"getBootAvbVersion", "()Ljava/lang/String;", (void*)android_os_VintfRuntimeInfo_getBootAvbVersion},
+ {"getBootVbmetaAvbVersion", "()Ljava/lang/String;", (void*)android_os_VintfRuntimeInfo_getBootVbmetaAvbVersion},
+};
+
+const char* const kVintfRuntimeInfoPathName = "android/os/VintfRuntimeInfo";
+
+int register_android_os_VintfRuntimeInfo(JNIEnv* env)
+{
+ return RegisterMethodsOrDie(env, kVintfRuntimeInfoPathName, gVintfRuntimeInfoMethods, NELEM(gVintfRuntimeInfoMethods));
+}
+
+};
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..f418435 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: normal
+ -->
+ <permission android:name="android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND"
+ android:label="@string/permlab_runInBackground"
+ android:description="@string/permdesc_runInBackground"
+ android:protectionLevel="normal" />
+
+ <!-- Allows a companion app to use data in the background.
+ <p>Protection level: normal
+ -->
+ <permission android:name="android.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND"
+ android:label="@string/permlab_useDataInBackground"
+ android:description="@string/permdesc_useDataInBackground"
+ android:protectionLevel="normal" />
+
+
<!-- ================================== -->
<!-- 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_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..4524b6e 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Opletberigte"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Kleinhandeldemonstrasie"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB-verbinding"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Veiligmodus"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-stelsel"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Skakel oor na persoonlik"</string>
@@ -280,15 +297,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 +1747,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..a3ebecb 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"ማንቂያዎች"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"የችርቻሮ ማሳያ"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"የዩኤስቢ ግንኙነት"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"የሚያስተማምን ሁነታ"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android ስርዓት"</string>
<string name="user_owner_label" msgid="1119010402169916617">"ወደ የግል ቀይር"</string>
@@ -284,8 +301,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 +1747,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..d1b9dcb 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>
@@ -270,6 +277,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"التنبيهات"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"عرض توضيحي لبائع التجزئة"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"اتصال USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"الوضع الآمن"</string>
<string name="android_system_label" msgid="6577375335728551336">"نظام Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"التبديل إلى الشخصي"</string>
@@ -296,8 +313,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 +606,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 +649,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 +1871,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..552c4e3 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Siqnallar"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Pərakəndə demo"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB əlaqə"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Təhlükəsiz rejim"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android sistemi"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Şəxsi profilə keçirin"</string>
@@ -284,8 +301,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 +1036,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 +1747,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..9fc3a28c 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>
@@ -261,6 +268,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Obaveštenja"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Režim demonstracije za maloprodajne objekte"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB veza"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Bezbedni režim"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android sistem"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Pređi na Lični profil"</string>
@@ -287,8 +304,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>
@@ -1625,7 +1640,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalirao je administrator"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ažurirao je administrator"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Izbrisao je administrator"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"Da bi produžila vreme trajanja baterije, ušteda baterije smanjuje performanse uređaja i ograničava vibraciju, usluge lokacije i većinu pozadinskih podataka. Imejl, razmena poruka i druge aplikacije koje se oslanjaju na sinhronizaciju možda neće da se ažuriraju ako ih ne otvorite.\n\nUšteda baterije se automatski isključuje kada se uređaj puni."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Da bi produžila vreme trajanja baterije, ušteda baterije smanjuje performanse uređaja i ograničava vibraciju, usluge lokacije i većinu pozadinskih podataka. Imejl, razmena poruka i druge aplikacije koje se oslanjaju na sinhronizaciju neće se ažurirati dok ih ne otvorite.\n\nUšteda baterije se automatski isključuje kada se uređaj puni."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Da bi se smanjila potrošnja podataka, Ušteda podataka sprečava neke aplikacije da šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može da pristupa podacima, ali će to činiti ređe. Na primer, slike se 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 +1778,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..fdd15d3 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>
@@ -264,6 +271,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Абвесткi"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Дэманстрацыйны рэжым для пунктаў продажу"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Падключэнне USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Бяспечны рэжым"</string>
<string name="android_system_label" msgid="6577375335728551336">"Сістэма Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Пераключыцца на асабісты"</string>
@@ -286,14 +303,12 @@
<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">"Атрымайце змесцiва акна"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Вывучыце змесцiва акна, з якiм вы працуеце."</string>
- <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Уключыце Explore by Touch"</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">"Сцэнары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_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>
@@ -1786,7 +1801,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 +1809,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..b03e09e 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>
@@ -258,8 +265,18 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Сигнали"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Демонстрационен режим за магазини"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB връзка"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<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 +301,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 +1486,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 +1747,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..b574890 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"সতর্কতাগুলি"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"খুচরা বিক্রয়ের ডেমো"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB সংযোগ"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"নিরাপদ মোড"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android সিস্টেম"</string>
<string name="user_owner_label" msgid="1119010402169916617">"ব্যক্তিগততে পাল্টান"</string>
@@ -284,8 +301,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 +1116,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 +1619,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 +1748,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..37fa55f 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>
@@ -261,6 +268,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Upozorenja"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Promotivna demonstracija u maloprodaji"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB veza"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Siguran način rada"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android sistem"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Prebacite se na lični"</string>
@@ -283,15 +300,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 +656,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 +689,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 +864,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 +893,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>
@@ -993,7 +1008,7 @@
<string name="inputMethod" msgid="1653630062304567879">"Način unosa"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Akcije za tekst"</string>
<string name="email" msgid="4560673117055050403">"E-pošta"</string>
- <string name="dial" msgid="4204975095406423102">"Telefon"</string>
+ <string name="dial" msgid="4204975095406423102">"Pozovi"</string>
<string name="map" msgid="5441053548030107189">"Mapa"</string>
<string name="browse" msgid="6079864138582486027">"Pretraži"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Ponestaje prostora za pohranu"</string>
@@ -1091,7 +1106,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 +1117,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 +1127,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 +1158,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>
@@ -1179,7 +1194,7 @@
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Postavljanje vremena"</string>
<string name="date_picker_dialog_title" msgid="5879450659453782278">"Postavljanje datuma"</string>
<string name="date_time_set" msgid="5777075614321087758">"Postaviti"</string>
- <string name="date_time_done" msgid="2507683751759308828">"Završeno"</string>
+ <string name="date_time_done" msgid="2507683751759308828">"Gotovo"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"NOVO: "</font></string>
<string name="perms_description_app" msgid="5139836143293299417">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> omogućava."</string>
<string name="no_permissions" msgid="7283357728219338112">"Nisu potrebne dozvole"</string>
@@ -1204,7 +1219,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 +1280,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 +1317,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 +1352,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>
@@ -1431,7 +1446,7 @@
<string name="wireless_display_route_description" msgid="9070346425023979651">"Bežični prikaz"</string>
<string name="media_route_button_content_description" msgid="591703006349356016">"Prebacuj"</string>
<string name="media_route_chooser_title" msgid="1751618554539087622">"Poveži na uređaj"</string>
- <string name="media_route_chooser_title_for_remote_display" msgid="3395541745872017583">"Prebaci ekran na uređaj"</string>
+ <string name="media_route_chooser_title_for_remote_display" msgid="3395541745872017583">"Emitiranje ekrana na uređaj"</string>
<string name="media_route_chooser_searching" msgid="4776236202610828706">"Traženje uređajā…"</string>
<string name="media_route_chooser_extended_settings" msgid="87015534236701604">"Postavke"</string>
<string name="media_route_controller_disconnect" msgid="8966120286374158649">"Prekini vezu"</string>
@@ -1609,8 +1624,8 @@
<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="done_label" msgid="2093726099505892398">"Završeno"</string>
+ <string name="immersive_cling_positive" msgid="5016839404568297683">"Razumijem"</string>
+ <string name="done_label" msgid="2093726099505892398">"Gotovo"</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>
<string name="select_hours" msgid="6043079511766008245">"Odaberite sat"</string>
@@ -1631,7 +1646,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 +1778,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..0b77c82 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertes"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demostració comercial"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Connexió USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Mode segur"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Canvia al perfil personal"</string>
@@ -284,14 +301,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 +1618,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 +1706,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 +1747,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..31f0826 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>
@@ -264,6 +271,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Upozornění"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Prodejní ukázka"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Připojení USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Nouzový režim"</string>
<string name="android_system_label" msgid="6577375335728551336">"Systém Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Přepnout na osobní profil"</string>
@@ -290,8 +307,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 +1662,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 +1809,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..a258f08 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Underretninger"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo til udstilling i butik"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB-forbindelse"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Sikker tilstand"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-system"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Skift til Tilpasset"</string>
@@ -284,11 +301,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>
@@ -312,8 +327,8 @@
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Tillader, at appen kan modtage og behandle sms-beskeder. Det betyder, at appen kan overvåge eller slette de beskeder, der sendes til din enhed, uden at vise dem til dig."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"modtage tekstbeskeder (mms)"</string>
<string name="permdesc_receiveMms" msgid="533019437263212260">"Tillader, at appen kan modtage og behandle mms-beskeder. Det betyder, at appen kan overvåge eller slette de beskeder, der sendes til din enhed, uden at vise dem til dig."</string>
- <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"læse Cell Broadcast-beskeder"</string>
- <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Tillader, at appen læser Cell Broadcast-beskeder, der modtages af din enhed. I nogle områder sendes der Cell Broadcast-beskeder for at advare om nødsituationer. Ondsindede apps kan forstyrre ydelsen eller driften af din enhed, når der modtages en Cell Broadcast-besked om en nødsituation."</string>
+ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"læse Cell Broadcast-meddelelser"</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Tillader, at appen læser Cell Broadcast-meddelelser, der modtages af din enhed. I nogle områder sendes der Cell Broadcast-meddelelser for at advare om nødsituationer. Ondsindede apps kan forstyrre ydelsen eller driften af din enhed, når der modtages en Cell Broadcast-meddelelse om en nødsituation."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"læse feeds, jeg abonnerer på"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Tillader, at appen kan hente oplysninger om de feeds, der synkroniseres."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"Send og se sms-beskeder"</string>
@@ -1069,19 +1084,19 @@
<string name="dump_heap_text" msgid="4809417337240334941">"Processen <xliff:g id="PROC">%1$s</xliff:g> har overskredet sin proceshukommelsesgrænse på <xliff:g id="SIZE">%2$s</xliff:g>. En heap dump er tilgængelig og kan deles med udvikleren. Vær forsigtig: Denne heap dump kan indeholde dine personlige oplysninger, som appen har adgang til."</string>
<string name="sendText" msgid="5209874571959469142">"Vælg en handling for teksten"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Lydstyrke for opkald"</string>
- <string name="volume_music" msgid="5421651157138628171">"Medielydstyrke"</string>
+ <string name="volume_music" msgid="5421651157138628171">"Lydstyrke for medier"</string>
<string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Afspilning via Bluetooth"</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Lydløs ringetone er angivet"</string>
<string name="volume_call" msgid="3941680041282788711">"Lydstyrke for opkald"</string>
<string name="volume_bluetooth_call" msgid="2002891926351151534">"Lydstyrke for Bluetooth under opkald"</string>
<string name="volume_alarm" msgid="1985191616042689100">"Lydstyrke for alarm"</string>
- <string name="volume_notification" msgid="2422265656744276715">"Lydstyrke for meddelelser"</string>
+ <string name="volume_notification" msgid="2422265656744276715">"Lydstyrke for underretninger"</string>
<string name="volume_unknown" msgid="1400219669770445902">"Lydstyrke"</string>
<string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Lydstyrke for bluetooth"</string>
<string name="volume_icon_description_ringer" msgid="3326003847006162496">"Lydstyrke for ringetone"</string>
<string name="volume_icon_description_incall" msgid="8890073218154543397">"Lydstyrke for opkald"</string>
- <string name="volume_icon_description_media" msgid="4217311719665194215">"Medielydstyrke"</string>
- <string name="volume_icon_description_notification" msgid="7044986546477282274">"Lydstyrke for meddelelser"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"Lydstyrke for medier"</string>
+ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Lydstyrke for underretninger"</string>
<string name="ringtone_default" msgid="3789758980357696936">"Standardringetone"</string>
<string name="ringtone_default_with_actual" msgid="1767304850491060581">"Standard (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
<string name="ringtone_silent" msgid="7937634392408977062">"Ingen"</string>
@@ -1562,7 +1577,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>
@@ -1604,7 +1619,7 @@
<string name="package_updated_device_owner" msgid="1847154566357862089">"Opdateret af din administrator"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Slettet af din administrator"</string>
<string name="battery_saver_description" msgid="1960431123816253034">"Batterisparefunktionen hjælper med at forlænge batteriets levetid ved at reducere enhedens ydeevne og begrænse vibration, placeringstjenester og det meste baggrundsdata. E-mail, beskedfunktioner og andre apps, der benytter synkronisering, opdateres muligvis ikke, medmindre du åbner dem.\n\nBatterisparefunktionen slukker automatisk, når enheden oplader."</string>
- <string name="data_saver_description" msgid="6015391409098303235">"Datasparefunktion forhindrer nogle apps i at sende eller modtage data i baggrunden for at reducere dataforbruget. En app, der er i brug, kan få adgang til data, men gør det måske ikke så ofte. Dette kan f.eks. betyde, at billeder ikke vises, før du trykker på dem."</string>
+ <string name="data_saver_description" msgid="6015391409098303235">"Datasparefunktionen forhindrer nogle apps i at sende eller modtage data i baggrunden for at reducere dataforbruget. En app, der er i brug, kan få adgang til data, men gør det måske ikke så ofte. Dette kan f.eks. betyde, at billeder ikke vises, før du trykker på dem."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Vil du slå Datasparefunktion til?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Slå til"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
@@ -1726,17 +1741,18 @@
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"USB-fejlretning"</string>
<string name="time_picker_hour_label" msgid="2979075098868106450">"time"</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"minut"</string>
- <string name="time_picker_header_text" msgid="143536825321922567">"Indstil klokkeslæt"</string>
+ <string name="time_picker_header_text" msgid="143536825321922567">"Angiv klokkeslæt"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"Angiv et gyldigt klokkeslæt"</string>
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Angiv klokkeslæt"</string>
<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 i 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..5a70d9b 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Warnmeldungen"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo für Einzelhandel"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB-Verbindung"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Abgesicherter Modus"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-System"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Zu \"Privat\" wechseln"</string>
@@ -265,7 +282,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 +301,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 +456,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 +1417,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 +1618,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 +1656,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 +1747,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..0cc6dc6 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Ειδοποιήσεις"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Επίδειξη λιανικής"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Σύνδεση USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Ασφαλής λειτουργία"</string>
<string name="android_system_label" msgid="6577375335728551336">"Σύστημα Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Μετάβαση σε προσωπικό προφίλ"</string>
@@ -284,8 +301,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 +1618,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 +1656,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 +1747,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..4976b03 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>
@@ -258,8 +265,18 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alerts"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Retail demo"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB connection"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<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 +295,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 +595,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 +639,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 +1618,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 +1656,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 +1747,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..4976b03 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>
@@ -258,8 +265,18 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alerts"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Retail demo"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB connection"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<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 +295,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 +595,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 +639,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 +1618,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 +1656,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 +1747,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..4976b03 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>
@@ -258,8 +265,18 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alerts"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Retail demo"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB connection"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<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 +295,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 +595,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 +639,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 +1618,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 +1656,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 +1747,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..5515ae1 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo para punto de venta"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Conexión USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Cambiar al perfil personal"</string>
@@ -284,8 +301,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 +1114,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 +1441,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 +1656,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 +1716,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 +1747,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..33c0e5c 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo para tiendas"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Conexión USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Cambiar a perfil personal"</string>
@@ -284,8 +301,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 +1002,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 +1084,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 +1095,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 +1482,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 +1618,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 +1747,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..1c76b3f 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Teatised"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Poedemo"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB-ühendus"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Turvarežiim"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-süsteem"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Lülita isiklikule profiilile"</string>
@@ -281,15 +298,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 +1618,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 +1747,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..78aed23 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Abisuak"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Saltzaileentzako demoa"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB konexioa"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Modu segurua"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android sistema"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Aldatu profil pertsonalera"</string>
@@ -282,10 +299,8 @@
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"atzitu bizi-konstanteei buruzko sentsore-datuak"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Eskuratu leihoko edukia"</string>
<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_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktibatu \"Arakatu ukituta\""</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 +720,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>
@@ -1472,7 +1487,7 @@
<string name="user_switched" msgid="3768006783166984410">"Uneko erabiltzailea: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzailera aldatzen…"</string>
<string name="user_logging_out_message" msgid="8939524935808875155">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzailearen saioa amaitzen…"</string>
- <string name="owner_name" msgid="2716755460376028154">"jabea"</string>
+ <string name="owner_name" msgid="2716755460376028154">"Jabea"</string>
<string name="error_message_title" msgid="4510373083082500195">"Errorea"</string>
<string name="error_message_change_not_allowed" msgid="1238035947357923497">"Administratzaileak ez du eman aldaketa egiteko baimena"</string>
<string name="app_not_found" msgid="3429141853498927379">"Ez da ekintza gauza dezakeen aplikaziorik aurkitu"</string>
@@ -1604,7 +1619,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 +1748,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..cd8e750 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"هشدارها"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"نمونه برای خردهفروشان"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"اتصال USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"حالت ایمن"</string>
<string name="android_system_label" msgid="6577375335728551336">"سیستم Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"رفتن به نمایه شخصی"</string>
@@ -284,8 +301,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 +1486,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 +1747,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..5690669 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Ilmoitukset"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Esittelytila"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB-yhteys"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Suojattu tila"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-järjestelmä"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Siirry henkilökohtaiseen profiiliin"</string>
@@ -284,8 +301,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 +1747,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..7797274 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertes"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Démo en magasin"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Connexion USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Mode sécurisé"</string>
<string name="android_system_label" msgid="6577375335728551336">"Système Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Passer au profil personnel"</string>
@@ -284,8 +301,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 +1618,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 +1656,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 +1747,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..761947e 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertes"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Démonstration en magasin"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Connexion USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Mode sécurisé"</string>
<string name="android_system_label" msgid="6577375335728551336">"Système Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Passer au profil personnel"</string>
@@ -265,7 +282,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 +301,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 +1747,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..2c58acb 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -29,10 +29,10 @@
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> días"</string>
<string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> hr"</string>
+ <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
<string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> hrs"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
+ <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
+ <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <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="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> minuto"</string>
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string>
@@ -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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demostración comercial"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"conexión USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Cambiar ao perfil persoal"</string>
@@ -284,12 +301,10 @@
<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>
- <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Controlar o nivel do zoom e o posicionamento da pantalla"</string>
+ <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Controlar a ampliación da pantalla"</string>
+ <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Controla o nivel do zoom e o posicionamento da pantalla."</string>
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Realizar xestos"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Podes tocar, pasar o dedo, beliscar e realizar outros xestos."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Xestos de impresión dixital"</string>
@@ -436,8 +451,8 @@
<string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Permite á aplicación crear sockets de rede e utilizar protocolos de rede personalizados. O navegador e outras aplicacións ofrecen medios para enviar datos a Internet, polo que non se require este permiso para enviar datos a Internet."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"cambiar a conectividade de rede"</string>
<string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Permite á aplicación cambiar o estado da conectividade de rede."</string>
- <string name="permlab_changeTetherState" msgid="5952584964373017960">"cambiar conectividade de ancoraxe á rede"</string>
- <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Permite á aplicación cambiar o estado da conectividade de rede ancorada."</string>
+ <string name="permlab_changeTetherState" msgid="5952584964373017960">"cambiar conectividade de conexión compartida"</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Permite á aplicación cambiar o estado da conectividade da conexión compartida."</string>
<string name="permlab_accessWifiState" msgid="5202012949247040011">"ver conexións wifi"</string>
<string name="permdesc_accessWifiState" msgid="5002798077387803726">"Permite á aplicación ver información acerca das redes wifi, como se a wifi está activada e o nome dos dispositivos wifi conectados."</string>
<string name="permlab_changeWifiState" msgid="6550641188749128035">"conectar e desconectar da wifi"</string>
@@ -539,8 +554,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 +608,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 +660,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 +867,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>
@@ -1112,7 +1127,7 @@
<string name="wifi_connect_alert_message" msgid="6451273376815958922">"A aplicación %1$s quere conectarse á rede wifi %2$s"</string>
<string name="wifi_connect_default_application" msgid="7143109390475484319">"Unha aplicación"</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
- <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Inicia Wi-Fi Direct. Esta acción desactivará o cliente e a zona interactiva da wifi."</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Inicia Wi-Fi Direct. Esta acción desactivará a zona ou o cliente wifi."</string>
<string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Non se puido iniciar Wi-Fi Direct."</string>
<string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Direct está activado"</string>
<string name="wifi_p2p_enabled_notification_message" msgid="8064677407830620023">"Toca para acceder á configuración"</string>
@@ -1282,7 +1297,7 @@
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modo de coche activado"</string>
<string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Toca para saír do modo de coche."</string>
- <string name="tethered_notification_title" msgid="3146694234398202601">"Ancoraxe á rede ou zona Wi-Fi activada"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Conexión compartida ou zona wifi activada"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Tocar para configurar."</string>
<string name="back_button_label" msgid="2300470004503343439">"Volver"</string>
<string name="next_button_label" msgid="1080555104677992408">"Seguinte"</string>
@@ -1604,7 +1619,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado polo teu administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Actualizado polo teu administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Eliminado polo teu administrador"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"Para axudar a mellorar a duración da batería, a función aforro de batería reduce o rendemento do teu dispositivo e limita a vibración, os servizos de localización e a maioría dos datos en segundo plano. É posible que o correo electrónico, as mensaxes e outras aplicacións que dependen da sincronización non se actualicen a menos que os abras. \n\nA función aforro de batería desactívase automaticamente cando pos a cargar o teu dispositivo."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Para axudar a mellorar a duración da batería, a función de aforro da batería reduce o rendemento do teu dispositivo e limita a vibración, os servizos de localización e a maioría dos datos en segundo plano. É posible que o correo electrónico, as mensaxes e outras aplicacións que dependen da sincronización non se actualicen a menos que os abras. \n\nA función de aforro da batería desactívase automaticamente cando pos a cargar o teu dispositivo."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Para contribuír a reducir o uso de datos, o Economizador de datos impide que algunhas aplicacións envíen ou reciban datos en segundo plano. Cando esteas utilizando unha aplicación, esta poderá acceder aos datos, pero é posible que o faga con menos frecuencia. Por exemplo, é posible que as imaxes non se mostren ata que as toques."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Queres activar o economizador de datos?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activar"</string>
@@ -1702,7 +1717,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 +1748,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..77f7212 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"ચેતવણીઓ"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"રિટેલ ડેમો"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB કનેક્શન"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"સુરક્ષિત મોડ"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android સિસ્ટમ"</string>
<string name="user_owner_label" msgid="1119010402169916617">"વ્યક્તિગત પર સ્વિચ કરો"</string>
@@ -284,8 +301,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 +1715,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 +1748,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..0a672ca 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"सूचनाएं"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"खुदरा डेमो"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB कनेक्शन"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android सिस्टम"</string>
<string name="user_owner_label" msgid="1119010402169916617">"व्यक्तिगत प्रोफ़ाइल में स्विच करें"</string>
@@ -284,8 +301,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 +1618,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 +1747,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..48f4cf7 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>
@@ -261,6 +268,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Upozorenja"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Prodajni demo-način"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB veza"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Siguran način rada"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sustav Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Prijeđite na osobni"</string>
@@ -268,7 +285,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 +301,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 +1503,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 +1640,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 +1778,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..8af3ff5 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Értesítések"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Kiskereskedelmi bemutató"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB-kapcsolat"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Biztonsági üzemmód"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android rendszer"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Átváltás személyes profilra"</string>
@@ -284,8 +301,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 +1747,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..2ca708d 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>
@@ -258,38 +265,46 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Ծանուցումներ"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Խանութի ցուցադրական ռեժիմ"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB կապակցում"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Անվտանգ ռեժիմ"</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">"Անցնել աշխատանքային պրոֆիլին"</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 +352,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 +473,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 +788,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 +991,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 +1193,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 +1372,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 +1577,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 +1618,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 +1741,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..aa325ac 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Notifikasi"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo promo"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Sambungan USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Mode aman"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Beralih ke Pribadi"</string>
@@ -284,8 +301,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 +1747,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..e37862b 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Tilkynningar"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Kynningarútgáfa fyrir verslanir"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB-tenging"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Örugg stilling"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android kerfið"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Skipta yfir í persónulegt snið"</string>
@@ -284,8 +301,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 +1740,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 +1748,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..8057a06 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Avvisi"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo retail"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Connessione USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Modalità provvisoria"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Passa al profilo personale"</string>
@@ -284,11 +301,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 +1747,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..504d3ad 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>
@@ -264,6 +271,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"התראות"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"הדגמה לקמעונאים"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"חיבור USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"מצב בטוח"</string>
<string name="android_system_label" msgid="6577375335728551336">"מערכת Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"עבור ל\'אישי\'"</string>
@@ -290,8 +307,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 +567,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 +590,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 +711,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 +756,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 +803,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>
@@ -1004,7 +1019,7 @@
<string name="delete" msgid="6098684844021697789">"מחק"</string>
<string name="copyUrl" msgid="2538211579596067402">"העתק כתובת אתר"</string>
<string name="selectTextMode" msgid="1018691815143165326">"בחר טקסט"</string>
- <string name="undo" msgid="7905788502491742328">"בטל"</string>
+ <string name="undo" msgid="7905788502491742328">"ביטול"</string>
<string name="redo" msgid="7759464876566803888">"בצע מחדש"</string>
<string name="autofill" msgid="3035779615680565188">"מילוי אוטומטי"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"בחירת טקסט"</string>
@@ -1061,7 +1076,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>
@@ -1162,21 +1177,21 @@
<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>
<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_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>
@@ -1193,7 +1208,7 @@
<string name="carrier_app_notification_title" msgid="8921767385872554621">"ה-SIM החדש הוכנס"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"הקש כדי להגדיר"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"הגדרת שעה"</string>
- <string name="date_picker_dialog_title" msgid="5879450659453782278">"הגדר תאריך"</string>
+ <string name="date_picker_dialog_title" msgid="5879450659453782278">"הגדרת תאריך"</string>
<string name="date_time_set" msgid="5777075614321087758">"הגדר"</string>
<string name="date_time_done" msgid="2507683751759308828">"בוצע"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"חדש: "</font></string>
@@ -1216,9 +1231,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>
@@ -1291,8 +1306,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>
@@ -1353,13 +1368,13 @@
<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>
<string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"הסט למעלה כדי להוסיף ולמטה כדי להפחית."</string>
- <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"הוסף דקה"</string>
+ <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"הוספת דקה"</string>
<string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"הפחת דקה"</string>
<string name="time_picker_increment_hour_button" msgid="3652056055810223139">"הוסף שעה"</string>
<string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"הפחת שעה"</string>
@@ -1398,7 +1413,7 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"כונן USB של <xliff:g id="MANUFACTURER">%s</xliff:g>"</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>
@@ -1463,30 +1478,30 @@
<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>
<string name="kg_login_password_hint" msgid="9057289103827298549">"סיסמה"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"היכנס"</string>
+ <string name="kg_login_submit_button" msgid="5355904582674054702">"כניסה"</string>
<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 +1623,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 +1656,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>
@@ -1771,7 +1786,7 @@
<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_left_button" msgid="5314271347014802475">"בטל"</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>
<string name="conference_call" msgid="3751093130790472426">"שיחת ועידה"</string>
@@ -1788,17 +1803,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_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-ja/strings.xml b/core/res/res/values-ja/strings.xml
index f627b22..4f18bcb 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"通知"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"販売店デモ"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB 接続"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"セーフモード"</string>
<string name="android_system_label" msgid="6577375335728551336">"Androidシステム"</string>
<string name="user_owner_label" msgid="1119010402169916617">"個人用に切り替える"</string>
@@ -284,8 +301,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 +1747,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..31cd59b 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"გაფრთხილებები"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"დემო-რეჟიმი საცალო მოვაჭრეებისთვის"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB კავშირი"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"უსაფრთხო რეჟიმი"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-ის სისტემა"</string>
<string name="user_owner_label" msgid="1119010402169916617">"პირად პროფილზე გადართვა"</string>
@@ -281,11 +298,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 +1618,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 +1747,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..c512e43 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Дабылдар"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Бөлшек саудаға арналған демо нұсқасы"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB байланысы"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Қауіпсіз режим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android жүйесі"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Жекеге ауысу"</string>
@@ -284,8 +301,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 +1748,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..64306fd 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"ការជូនដំណឹង"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"របៀបដាក់បង្ហាញក្នុងហាង"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"ការតភ្ជាប់ USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"របៀបសុវត្ថិភាព"</string>
<string name="android_system_label" msgid="6577375335728551336">"ប្រព័ន្ធ Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"ប្តូរទៅផ្ទាល់ខ្លួន"</string>
@@ -274,20 +291,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 +1091,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 +1412,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 +1620,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 +1700,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 +1749,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..aaabd91 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"ಎಚ್ಚರಿಕೆಗಳು"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"ರಿಟೇಲ್ ಡೆಮೋ"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB ಸಂಪರ್ಕ"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"ಸುರಕ್ಷಿತ ಮೋಡ್"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android ಸಿಸ್ಟಂ"</string>
<string name="user_owner_label" msgid="1119010402169916617">"ವೈಯಕ್ತಿಕಗೆ ಬದಲಿಸಿ"</string>
@@ -280,16 +297,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 +395,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 +514,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 +727,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 +739,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 +767,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 +860,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 +976,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 +984,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 +1002,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 +1132,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 +1145,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 +1154,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 +1192,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 +1267,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 +1316,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 +1326,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 +1349,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 +1476,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 +1619,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 +1705,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 +1730,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 +1748,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..ab61857 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"알림"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"소매 데모"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB 연결"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"안전 모드"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android 시스템"</string>
<string name="user_owner_label" msgid="1119010402169916617">"개인으로 전환"</string>
@@ -284,8 +301,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 +1136,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 +1747,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..a24bd7f 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Эскертүүлөр"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Чекене соода дүкөнү үчүн демо режим"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB аркылуу туташуу"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Коопсуз режим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android тутуму"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Жеке профилге которулуу"</string>
@@ -265,7 +282,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 +297,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 +714,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 +727,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 +1183,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 +1327,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 +1372,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,11 +1418,11 @@
<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>
- <string name="media_route_chooser_extended_settings" msgid="87015534236701604">"Тууралоолор"</string>
+ <string name="media_route_chooser_extended_settings" msgid="87015534236701604">"Жөндөөлөр"</string>
<string name="media_route_controller_disconnect" msgid="8966120286374158649">"Ажыратуу"</string>
<string name="media_route_status_scanning" msgid="7279908761758293783">"Скандоодо..."</string>
<string name="media_route_status_connecting" msgid="6422571716007825440">"Туташууда..."</string>
@@ -1461,7 +1476,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">"Атайын мүмкүнчүлүктөр функциясын пайдалануу үчүн, анын кыска жолу күйгүзүлгөндө, үндү катуулатуу/акырындатуу баскычын үч секунддай кое бербей басып туруңуз.\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,7 +1619,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 +1748,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..d162fe0 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"ການເຕືອນ"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"ເດໂມສຳລັບຮ້ານຂາຍ"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"ການເຊື່ອມຕໍ່ USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Safe mode"</string>
<string name="android_system_label" msgid="6577375335728551336">"ລະບົບ Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"ສະລັບໄປໂປຣໄຟລ໌ສ່ວນຕົວ"</string>
@@ -284,8 +301,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 +1618,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 +1747,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..0a62d62 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>
@@ -264,6 +271,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Įspėjimai"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demonstracinė versija mažmenininkams"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB jungtis"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Saugos režimas"</string>
<string name="android_system_label" msgid="6577375335728551336">"„Android“ sistema"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Perjungti į asmeninį režimą"</string>
@@ -290,11 +307,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 +1662,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 +1809,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..3bcce6f 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>
@@ -261,6 +268,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Brīdinājumi"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demonstrācijas versija veikaliem"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB savienojums"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Drošais režīms"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android sistēma"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Pārslēgt personīgo profilu"</string>
@@ -287,11 +304,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 +1778,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..b5e8c90 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Предупредувања"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Демонстрација за малопродажба"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB-врска"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Безбеден режим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Систем Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Префрлете на личен профил"</string>
@@ -280,16 +297,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 +660,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 +1010,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 +1084,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 +1095,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 +1373,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 +1750,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..5dbb334 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"അലേർട്ടുകൾ"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"റീട്ടെയിൽ ഡെമോ"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB കണക്ഷൻ"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"സുരക്ഷിത മോഡ്"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android സിസ്റ്റം"</string>
<string name="user_owner_label" msgid="1119010402169916617">"വ്യക്തിഗത പ്രൊഫൈലിലേക്ക് മാറുക"</string>
@@ -284,8 +301,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 +1136,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 +1740,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 +1748,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..765aa5d 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Сануулга"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Жижиглэнгийн жишээ"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB холболт"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Аюулгүй горим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Андройд систем"</string>
<string name="user_owner_label" msgid="1119010402169916617">"\"Хувийн\" руу шилжих"</string>
@@ -284,8 +301,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 +1745,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..4191828 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"सूचना"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"किरकोळ डेमो"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB कनेक्शन"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android सिस्टम"</string>
<string name="user_owner_label" msgid="1119010402169916617">"वैयक्तिकवर स्विच करा"</string>
@@ -284,8 +301,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 +458,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 +1619,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 +1748,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..d4cc2d3 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Makluman"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Tunjuk cara runcit"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Sambungan USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Mod selamat"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Beralih kepada Peribadi"</string>
@@ -284,8 +301,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 +1747,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..1d89730 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"သတိပေးချက်များ"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"လက်လီအရောင်းဆိုင် သရုပ်ပြမှု"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB ချိတ်ဆက်မှု"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"အန္တရာယ်ကင်းမှု စနစ်(Safe mode)"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android စနစ်"</string>
<string name="user_owner_label" msgid="1119010402169916617">"ကိုယ်ပိုင်သီးသန့်အဖြစ် ပြောင်းပါ"</string>
@@ -265,7 +282,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 +297,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 +594,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 +603,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 +637,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 +660,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 +682,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 +702,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 +766,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 +853,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 +1619,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 +1744,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..ab32ff8 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Varsler"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Butikkdemo"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB-tilkobling"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Sikkermodus"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-system"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Bytt til den personlige profilen"</string>
@@ -281,15 +298,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 +727,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 +1618,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 +1741,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..33466bc 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"अलर्टहरू"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"खुद्रा बिक्री सम्बन्धी डेमो"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB जडान"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string>
<string name="android_system_label" msgid="6577375335728551336">"एन्ड्रोइड प्रणाली"</string>
<string name="user_owner_label" msgid="1119010402169916617">"व्यक्तिगत प्रोफाइलमा स्विच गर्नुहोस्"</string>
@@ -265,7 +282,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 +301,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>
@@ -1283,7 +1298,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>
@@ -1738,11 +1753,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..c82219c 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Meldingen"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo voor de detailhandel"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB-verbinding"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Veilige modus"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-systeem"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Overschakelen naar persoonlijk profiel"</string>
@@ -283,10 +300,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 +728,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 +744,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 +1618,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 +1747,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..5c606ae 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"ਸੁਚੇਤਨਾਵਾਂ"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"ਪ੍ਰਚੂਨ ਸਟੋਰਾਂ ਲਈ ਡੈਮੋ"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB ਕਨੈਕਸ਼ਨ"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"ਸੁਰੱਖਿਅਤ ਮੋਡ"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android System"</string>
<string name="user_owner_label" msgid="1119010402169916617">"ਨਿੱਜੀ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
@@ -284,8 +301,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 +1748,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..7386f2d 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>
@@ -264,6 +271,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alerty"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Tryb demo dla sklepów"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Połączenie USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Tryb awaryjny"</string>
<string name="android_system_label" msgid="6577375335728551336">"System Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Włącz profil osobisty"</string>
@@ -290,8 +307,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 +1809,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..d5dc395 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demonstração na loja"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Conexão USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Modo de segurança"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Alternar para \"Pessoal\""</string>
@@ -284,8 +301,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 +1618,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 +1747,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..1f297c2 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demonstração para retalho"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Ligação USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Mudar para pessoal"</string>
@@ -284,8 +301,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 +1747,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..d5dc395 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demonstração na loja"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Conexão USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Modo de segurança"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Alternar para \"Pessoal\""</string>
@@ -284,8 +301,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 +1618,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 +1747,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..3a2c38d 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>
@@ -261,6 +268,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alerte"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demonstrație comercială"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Conexiune USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Mod sigur"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistemul Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Comutați la Personal"</string>
@@ -287,8 +304,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 +1177,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 +1778,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..0bc71eb 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>
@@ -264,6 +271,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Уведомления"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Деморежим для магазина"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB-подключение"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Безопасный режим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Система Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Перейти в личный профиль"</string>
@@ -290,8 +307,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 +1201,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 +1809,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..b7e695a 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"ඇඟවීම්"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"සිල්ලර ආදර්ශනය"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB සම්බන්ධතාවය"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"ආරක්ෂිත ආකාරය"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android පද්ධතිය"</string>
<string name="user_owner_label" msgid="1119010402169916617">"පුද්ගලික වෙත මාරු වන්න"</string>
@@ -284,8 +301,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>
@@ -1605,7 +1620,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>
@@ -1734,11 +1749,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..018ea4e 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>
@@ -264,6 +271,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Upozornenia"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Predajná ukážka"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Pripojenie USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Núdzový režim"</string>
<string name="android_system_label" msgid="6577375335728551336">"Systém Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Prepnúť na osobný"</string>
@@ -290,12 +307,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 +333,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 +720,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 +733,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 +894,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 +1524,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 +1662,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 +1682,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 +1694,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 +1706,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 +1716,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 +1803,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..729612f 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>
@@ -264,6 +271,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Opozorila"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Predstavitev za maloprodajo"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Povezava USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Varni način"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Preklop na osebni profil"</string>
@@ -290,11 +307,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 +1809,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..563f4bd 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Sinjalizimet"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demonstrimi i shitjes me pakicë"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Lidhja USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Modaliteti i sigurisë"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistemi \"android\""</string>
<string name="user_owner_label" msgid="1119010402169916617">"Ndryshoje te \"Personale\""</string>
@@ -284,8 +301,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 +1084,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 +1095,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 +1619,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 +1748,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..2d2cc70 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>
@@ -261,6 +268,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Обавештења"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Режим демонстрације за малопродајне објекте"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB веза"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Безбедни режим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android систем"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Пређи на Лични профил"</string>
@@ -287,8 +304,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>
@@ -1625,7 +1640,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>
@@ -1763,11 +1778,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..c480df4 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Varningar"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo för återförsäljare"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB-anslutning"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Säkert läge"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-system"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Byt till din personliga profil"</string>
@@ -284,8 +301,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 +1193,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 +1747,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..cec75bc 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>
@@ -256,6 +263,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Arifa"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Onyesho la duka la rejareja"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Muunganisho wa USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Mtindo salama"</string>
<string name="android_system_label" msgid="6577375335728551336">"Mfumo wa Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Badili uweke wasifu wa Binafsi"</string>
@@ -278,16 +295,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 +1082,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 +1191,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 +1616,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 +1696,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 +1745,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..7062e98 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"விழிப்பூட்டல்கள்"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"விற்பனையாளர் டெமோ"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB இணைப்பு"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"பாதுகாப்பு பயன்முறை"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android அமைப்பு"</string>
<string name="user_owner_label" msgid="1119010402169916617">"தனிப்பட்ட சுயவிவரத்திற்கு மாறு"</string>
@@ -284,8 +301,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 +1748,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..31e2721 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"హెచ్చరికలు"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"రిటైల్ డెమో"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB కనెక్షన్"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"సురక్షిత మోడ్"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android సిస్టమ్"</string>
<string name="user_owner_label" msgid="1119010402169916617">"వ్యక్తిగతానికి మార్చు"</string>
@@ -281,11 +298,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 +686,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 +1619,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 +1748,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..fd7158f 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"การแจ้งเตือน"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"การสาธิตสำหรับผู้ค้าปลีก"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"การเชื่อมต่อ USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"โหมดปลอดภัย"</string>
<string name="android_system_label" msgid="6577375335728551336">"ระบบ Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"เปลี่ยนไปใช้โปรไฟล์ส่วนตัว"</string>
@@ -284,8 +301,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 +1747,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..e58f62f 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Mga Alerto"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Retail demo"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Koneksyon ng USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Safe mode"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android System"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Lumipat sa Personal"</string>
@@ -270,7 +287,7 @@
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"i-access ang iyong kalendaryo"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"magpadala at tumingin ng mga mensaheng SMS"</string>
- <string name="permgrouplab_storage" msgid="1971118770546336966">"Imbakan"</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"Storage"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"i-access ang mga larawan, media at file sa iyong device"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikropono"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"mag-record ng audio"</string>
@@ -284,8 +301,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>
@@ -570,7 +585,7 @@
<string name="policydesc_setGlobalProxy" msgid="8459859731153370499">"Itakda ang pandaigdigang proxy ng device na gagamitin habang naka-enable ang patakaran. Ang may-ari ng device lang ang makakapagtakda sa pandaigdigang proxy."</string>
<string name="policylab_expirePassword" msgid="5610055012328825874">"Itakda screen lock password expiration"</string>
<string name="policydesc_expirePassword" msgid="5367525762204416046">"Baguhin kung gaano kadalas dapat palitan ang password, PIN o pattern sa screen lock."</string>
- <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Itakda pag-encrypt ng imbakan"</string>
+ <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Itakda pag-encrypt ng storage"</string>
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Hilinging naka-encrypt ang nakaimbak na data ng app."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Huwag paganahin mga camera"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Pigilan ang paggamit sa lahat ng camera ng device."</string>
@@ -1732,11 +1747,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..e395435 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Uyarılar"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Mağaza demo"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB bağlantısı"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Güvenli mod"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android Sistemi"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Kişisel Profile Geç"</string>
@@ -284,14 +301,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 +1196,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 +1283,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 +1747,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..09cec2a 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>
@@ -264,6 +271,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Сповіщення"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Демо-режим для роздрібної торгівлі"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"З’єднання USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Безп. режим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Система Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Перейти в особистий профіль"</string>
@@ -290,8 +307,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 +656,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 +666,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 +1332,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 +1809,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..225faa6 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"الرٹس"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"ریٹیل ڈیمو"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB کنکشن"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"حفاظتی وضع"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android سسٹم"</string>
<string name="user_owner_label" msgid="1119010402169916617">"ذاتی پر سوئچ کریں"</string>
@@ -284,8 +301,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 +1297,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 +1748,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..0e7d4ff 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Ogohlantirishlar"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo rejim"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB orqali ulanish"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Xavfsiz usul"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android tizimi"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Shaxsiy profilga o‘tish"</string>
@@ -284,8 +301,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>
@@ -717,7 +732,7 @@
<string name="lockscreen_missing_sim_message" product="tv" msgid="1943633865476989599">"Televizorda SIM karta yo‘q."</string>
<string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"Telefoningizda SIM karta yo‘q."</string>
<string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"SIM kartani soling."</string>
- <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SIM karta solinmagan yoki uni o‘qib bo‘lmaydi. SIM kartani soling."</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SIM karta solinmagan yoki u yaroqsiz. SIM kartani soling."</string>
<string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"Foydalanib bo‘lmaydigan SIM karta."</string>
<string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"SIM kartangiz butunlay bloklab qo‘yilgan.\n Yangi SIM karta olish uchun aloqa operatoringiz bilan bog‘laning."</string>
<string name="lockscreen_transport_prev_description" msgid="6300840251218161534">"Avvalgi musiqa"</string>
@@ -1169,7 +1184,7 @@
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB jihozga ulangan"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Boshqa parametrlarini ko‘rish uchun bosing."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB orqali nosozliklarni tuzatish"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"O‘chirib qo‘yish uchun bu yerga bosing."</string>
+ <string name="adb_active_notification_message" msgid="4948470599328424059">"Faolsizlantirish uchun bu yerga bosing."</string>
<!-- no translation found for adb_active_notification_message (8470296818270110396) -->
<skip />
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Xatoliklar hisoboti olinmoqda…"</string>
@@ -1733,11 +1748,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..f2ba671 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Cảnh báo"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Giới thiệu bán lẻ"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Kết nối USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Chế độ an toàn"</string>
<string name="android_system_label" msgid="6577375335728551336">"Hệ thống Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Chuyển sang Cá nhân"</string>
@@ -284,8 +301,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 +1747,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..6e35e3f 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"提醒"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"零售演示模式"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB 连接"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"安全模式"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android 系统"</string>
<string name="user_owner_label" msgid="1119010402169916617">"切换到“个人”"</string>
@@ -281,11 +298,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 +1138,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 +1193,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 +1747,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..74f4987 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -72,8 +72,8 @@
<string name="ClirMmi" msgid="7784673673446833091">"本機號碼"</string>
<string name="ColpMmi" msgid="3065121483740183974">"連接線識別功能"</string>
<string name="ColrMmi" msgid="4996540314421889589">"連接線識別限制"</string>
- <string name="CfMmi" msgid="5123218989141573515">"來電轉接"</string>
- <string name="CwMmi" msgid="9129678056795016867">"來電待接"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"來電轉駁"</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,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">"短訊"</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>
<string name="peerTtyModeOff" msgid="3280819717850602205">"對方曾要求 TTY 模式 (OFF)"</string>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"通知"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"零售示範"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB 連線"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"安全模式"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android 系統"</string>
<string name="user_owner_label" msgid="1119010402169916617">"切換至個人設定檔"</string>
@@ -284,8 +301,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 +1036,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 +1618,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 +1747,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..87e98dd 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>
@@ -258,16 +265,26 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"快訊"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"零售商示範模式"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB 連線"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"安全模式"</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">"切換至公司設定檔"</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 +296,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 +324,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 +371,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 +414,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 +442,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 +458,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 +734,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 +748,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 +817,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 +838,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 +847,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 +869,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 +993,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 +1049,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 +1073,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 +1081,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 +1144,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 +1193,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 +1263,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 +1321,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 +1442,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 +1459,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 +1618,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 +1657,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 +1666,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 +1691,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 +1705,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 +1723,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 +1747,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..a656e6c 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>
@@ -258,6 +265,16 @@
<string name="notification_channel_alerts" msgid="4496839309318519037">"Izexwayiso"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Idemo yokuthenga"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Ukuxhumeka kwe-USB"</string>
+ <!-- no translation found for notification_channel_foreground_service (6665375982962336520) -->
+ <skip />
+ <!-- no translation found for foreground_service_app_in_background (6826789589341671842) -->
+ <skip />
+ <!-- no translation found for foreground_service_apps_in_background (7150914856893450380) -->
+ <skip />
+ <!-- no translation found for foreground_service_tap_for_details (372046743534354644) -->
+ <skip />
+ <!-- no translation found for foreground_service_multiple_separator (4021901567939866542) -->
+ <skip />
<string name="safeMode" msgid="2788228061547930246">"Imodi ephephile"</string>
<string name="android_system_label" msgid="6577375335728551336">"Uhlelo lwe-Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Shintshela komuntu siqu"</string>
@@ -284,8 +301,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 +1747,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 3898cae..cfe25b3 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -60,6 +60,15 @@
mode. -->
<attr name="colorMultiSelectHighlight" format="color" />
+ <!-- Drawable to be drawn over the view to mark it as autofilled-->
+ <attr name="autofilledHighlight" format="reference" />
+
+ <!-- Max width of the autofill data set picker as a fraction of the screen width -->
+ <attr name="autofillDatasetPickerMaxWidth" format="reference" />
+
+ <!-- Max height of the autofill data set picker as a fraction of the screen height -->
+ <attr name="autofillDatasetPickerMaxHeight" 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. -->
@@ -3448,8 +3457,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. -->
@@ -3489,10 +3498,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..ced22cc 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. -->
@@ -784,13 +784,13 @@
<enum name="locked" value="14" />
</attr>
- <!-- Specify the configuration changes that trigger the system to restart the
+ <!-- Specify the configuration changes that trigger the system to recreate the
current activity if any of these configuration changes happen in the system.
The valid configuration changes include mcc and mnc which are the same with
- those in configChanges. By default from Android O, we don't restart the activity
+ those in configChanges. By default from Android O, we don't recreate the activity
even the app doesn't specify mcc or mnc in configChanges. If the app wants to
- restart, specify them in restartOnConfigChanges. -->
- <attr name="restartOnConfigChanges">
+ be recreated, specify them in recreateOnConfigChanges. -->
+ <attr name="recreateOnConfigChanges">
<!-- The IMSI MCC has changed, that is a SIM has been detected and
updated the Mobile Country Code. -->
<flag name="mcc" value="0x0001" />
@@ -817,15 +817,15 @@
<attr name="configChanges">
<!-- The IMSI MCC has changed, that is a SIM has been detected and
updated the Mobile Country Code. By default from Android O, we
- don't restart the activity even the app doesn't specify mcc in
- configChanges. If the app wants to restart, specify mcc in
- restartOnConfigChanges. -->
+ don't recreate the activity even the app doesn't specify mcc in
+ configChanges. If the app wants to recreate the activity, specify
+ mcc in recreateOnConfigChanges. -->
<flag name="mcc" value="0x0001" />
<!-- The IMSI MNC has changed, that is a SIM has been detected and
updated the Mobile Network Code. By default from Android O, we
- don't restart the activity even the app doesn't specify mnc in
- configChanges. If the app wants to restart, specify mnc in
- restartOnConfigChanges. -->
+ don't recreate the activity even the app doesn't specify mnc in
+ configChanges. If the app wants to recreate the acvitity, specify
+ mnc in recreateOnConfigChanges. -->
<flag name="mnc" value="0x0002" />
<!-- The locale has changed, that is the user has selected a new
language that text should be displayed in. -->
@@ -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).
@@ -2048,7 +2048,7 @@
<attr name="launchMode" />
<attr name="screenOrientation" />
<attr name="configChanges" />
- <attr name="restartOnConfigChanges" />
+ <attr name="recreateOnConfigChanges" />
<attr name="permission" />
<attr name="multiprocess" />
<attr name="process" />
@@ -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/config.xml b/core/res/res/values/config.xml
index 0fa1fdb..a921fd7 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2863,4 +2863,13 @@
<!-- The apps that need to be hidden when they are disabled -->
<string-array name="config_hideWhenDisabled_packageNames"></string-array>
+
+ <!-- Additional non-platform defined global settings exposed to Instant Apps -->
+ <string-array name="config_allowedGlobalInstantAppSettings"></string-array>
+
+ <!-- Additional non-platform defined system settings exposed to Instant Apps -->
+ <string-array name="config_allowedSystemInstantAppSettings"></string-array>
+
+ <!-- Additional non-platform defined secure settings exposed to Instant Apps -->
+ <string-array name="config_allowedSecureInstantAppSettings"></string-array>
</resources>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index c5316c6..ece0e82 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>
@@ -536,4 +536,8 @@
<dimen name="item_touch_helper_max_drag_scroll_per_frame">20dp</dimen>
<dimen name="item_touch_helper_swipe_escape_velocity">120dp</dimen>
<dimen name="item_touch_helper_swipe_escape_max_velocity">800dp</dimen>
+
+ <!-- Max width/height of the autofill data set picker as a fraction of the screen width/height -->
+ <dimen name="autofill_dataset_picker_max_size">90%</dimen>
+
</resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index e13026b..42d3f27 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" />
@@ -2786,13 +2786,13 @@
<public name="appCategory" />
<public name="autoSizeMaxTextSize" />
<public name="__removed2" />
- <public name="restartOnConfigChanges" />
+ <public name="recreateOnConfigChanges" />
<public name="certDigest" />
<public name="splitName" />
<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 35b12ff..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>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 63a5cfd7..1966f6a 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -238,7 +238,9 @@
<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="attr" name="autofillDatasetPickerMaxWidth"/>
+ <java-symbol type="attr" name="autofillDatasetPickerMaxHeight"/>
<java-symbol type="bool" name="action_bar_embed_tabs" />
<java-symbol type="bool" name="action_bar_expanded_action_views_exclusive" />
<java-symbol type="bool" name="config_avoidGfxAccel" />
@@ -598,11 +600,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 +2616,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" />
@@ -2907,6 +2907,7 @@
<java-symbol type="string" name="autofill_save_type_email_address" />
<java-symbol type="drawable" name="autofill_dataset_picker_background" />
<java-symbol type="style" name="AutofillDatasetPicker" />
+ <java-symbol type="dimen" name="autofill_dataset_picker_max_size"/>
<!-- Accessibility fingerprint gestures -->
<java-symbol type="string" name="capability_title_canCaptureFingerprintGestures" />
@@ -2970,6 +2971,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" />
@@ -2998,4 +3005,9 @@
<java-symbol type="string" name="config_feedbackIntentNameKey" />
<java-symbol type="array" name="config_hideWhenDisabled_packageNames" />
+
+ <java-symbol type="array" name="config_allowedGlobalInstantAppSettings" />
+ <java-symbol type="array" name="config_allowedSystemInstantAppSettings" />
+ <java-symbol type="array" name="config_allowedSecureInstantAppSettings" />
+
</resources>
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index a661b07..383ae5d 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>
@@ -446,6 +449,10 @@
<item name="tooltipFrameBackground">@drawable/tooltip_frame</item>
<item name="tooltipForegroundColor">@color/bright_foreground_light</item>
<item name="tooltipBackgroundColor">@color/tooltip_background_light</item>
+
+ <!-- Autofill: max width/height of the dataset picker as a fraction of screen size -->
+ <item name="autofillDatasetPickerMaxWidth">@dimen/autofill_dataset_picker_max_size</item>
+ <item name="autofillDatasetPickerMaxHeight">@dimen/autofill_dataset_picker_max_size</item>
</style>
<!-- Variant of {@link #Theme} with no title bar -->
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/content/pm/PackageParserTest.java b/core/tests/coretests/src/android/content/pm/PackageParserTest.java
index ca4141a..b9bd193 100644
--- a/core/tests/coretests/src/android/content/pm/PackageParserTest.java
+++ b/core/tests/coretests/src/android/content/pm/PackageParserTest.java
@@ -220,41 +220,41 @@
* Unit test for PackageParser.getActivityConfigChanges().
* If the bit is 1 in the original configChanges, it is still 1 in the final configChanges.
* If the bit is 0 in the original configChanges and the bit is not set to 1 in
- * restartOnConfigChanges, the bit is changed to 1 in the final configChanges by default.
+ * recreateOnConfigChanges, the bit is changed to 1 in the final configChanges by default.
*/
@Test
public void testGetActivityConfigChanges() {
- // Not set in either configChanges or restartOnConfigChanges.
+ // Not set in either configChanges or recreateOnConfigChanges.
int configChanges = 0x0000; // 00000000.
- int restartOnConfigChanges = 0x0000; // 00000000.
+ int recreateOnConfigChanges = 0x0000; // 00000000.
int finalConfigChanges =
- PackageParser.getActivityConfigChanges(configChanges, restartOnConfigChanges);
+ PackageParser.getActivityConfigChanges(configChanges, recreateOnConfigChanges);
assertEquals(0x0003, finalConfigChanges); // Should be 00000011.
- // Not set in configChanges, but set in restartOnConfigChanges.
+ // Not set in configChanges, but set in recreateOnConfigChanges.
configChanges = 0x0000; // 00000000.
- restartOnConfigChanges = 0x0003; // 00000011.
+ recreateOnConfigChanges = 0x0003; // 00000011.
finalConfigChanges =
- PackageParser.getActivityConfigChanges(configChanges, restartOnConfigChanges);
+ PackageParser.getActivityConfigChanges(configChanges, recreateOnConfigChanges);
assertEquals(0x0000, finalConfigChanges); // Should be 00000000.
// Set in configChanges.
configChanges = 0x0003; // 00000011.
- restartOnConfigChanges = 0X0000; // 00000000.
+ recreateOnConfigChanges = 0X0000; // 00000000.
finalConfigChanges =
- PackageParser.getActivityConfigChanges(configChanges, restartOnConfigChanges);
+ PackageParser.getActivityConfigChanges(configChanges, recreateOnConfigChanges);
assertEquals(0x0003, finalConfigChanges); // Should be 00000011.
- restartOnConfigChanges = 0x0003; // 00000011.
+ recreateOnConfigChanges = 0x0003; // 00000011.
finalConfigChanges =
- PackageParser.getActivityConfigChanges(configChanges, restartOnConfigChanges);
+ PackageParser.getActivityConfigChanges(configChanges, recreateOnConfigChanges);
assertEquals(0x0003, finalConfigChanges); // Should still be 00000011.
// Other bit set in configChanges.
configChanges = 0x0080; // 10000000, orientation.
- restartOnConfigChanges = 0x0000; // 00000000.
+ recreateOnConfigChanges = 0x0000; // 00000000.
finalConfigChanges =
- PackageParser.getActivityConfigChanges(configChanges, restartOnConfigChanges);
+ PackageParser.getActivityConfigChanges(configChanges, recreateOnConfigChanges);
assertEquals(0x0083, finalConfigChanges); // Should be 10000011.
}
}
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/os/VintfObjectTest.java b/core/tests/coretests/src/android/os/VintfObjectTest.java
index aaaf55c..821ee80 100644
--- a/core/tests/coretests/src/android/os/VintfObjectTest.java
+++ b/core/tests/coretests/src/android/os/VintfObjectTest.java
@@ -26,5 +26,8 @@
// From /system/manifest.xml
assertTrue(String.join("", xmls).contains(
"<manifest version=\"1.0\" type=\"framework\">"));
+ // From /system/compatibility-matrix.xml
+ assertTrue(String.join("", xmls).contains(
+ "<compatibility-matrix version=\"1.0\" type=\"framework\">"));
}
}
diff --git a/core/tests/coretests/src/android/provider/FontsContractTest.java b/core/tests/coretests/src/android/provider/FontsContractTest.java
index 56bfbb0..d42d79e 100644
--- a/core/tests/coretests/src/android/provider/FontsContractTest.java
+++ b/core/tests/coretests/src/android/provider/FontsContractTest.java
@@ -32,7 +32,6 @@
import android.content.pm.ProviderInfo;
import android.content.pm.Signature;
import android.database.MatrixCursor;
-import android.graphics.fonts.FontVariationAxis.InvalidFormatException;
import android.graphics.fonts.FontVariationAxis;
import android.provider.FontsContract.FontInfo;
import android.support.test.filters.SmallTest;
@@ -73,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);
@@ -90,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(
@@ -107,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(
@@ -120,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(
@@ -140,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(
@@ -160,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,
@@ -193,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/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 7d04954..aeed20e 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -216,6 +216,7 @@
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,
diff --git a/core/tests/coretests/src/android/text/DynamicLayoutBlocksTest.java b/core/tests/coretests/src/android/text/DynamicLayoutBlocksTest.java
index 5ed6ce5..bc9f44d 100644
--- a/core/tests/coretests/src/android/text/DynamicLayoutBlocksTest.java
+++ b/core/tests/coretests/src/android/text/DynamicLayoutBlocksTest.java
@@ -16,17 +16,26 @@
package android.text;
-import junit.framework.TestCase;
-
import static android.text.Layout.Alignment.ALIGN_NORMAL;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
/**
- * Tests DynamciLayout updateBlocks method.
+ * Tests DynamicLayout updateBlocks method.
*
* Requires disabling access checks in the vm since this calls package-private APIs.
*
*/
-public class DynamicLayoutBlocksTest extends TestCase {
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class DynamicLayoutBlocksTest {
private DynamicLayout dl = new DynamicLayout("", new TextPaint(), 0, ALIGN_NORMAL, 0, 0, false);
private static final int ___ = DynamicLayout.INVALID_BLOCK_INDEX;
@@ -88,6 +97,7 @@
assertState(sizes, ids);
}
+ @Test
public void testFrom0() {
defineInitialState( new int[] { 0 }, new int[] { 123 });
@@ -101,6 +111,7 @@
assertState( new int[] { 10 } );
}
+ @Test
public void testFrom1ReplaceByEmpty() {
defineInitialState( new int[] { 100 }, new int[] { 123 });
@@ -126,6 +137,7 @@
assertState( new int[] { 100 } );
}
+ @Test
public void testFrom1ReplaceFromFirstLine() {
defineInitialState( new int[] { 100 }, new int[] { 123 });
@@ -142,6 +154,7 @@
assertState( new int[] { 20 } );
}
+ @Test
public void testFrom1ReplaceFromCenter() {
defineInitialState( new int[] { 100 }, new int[] { 123 });
@@ -158,6 +171,7 @@
assertState( new int[] { 20, 50 } );
}
+ @Test
public void testFrom1ReplaceFromEnd() {
defineInitialState( new int[] { 100 }, new int[] { 123 });
@@ -171,6 +185,7 @@
assertState( new int[] { 100, 10 } );
}
+ @Test
public void testFrom2ReplaceFromFirstLine() {
defineInitialState( new int[] { 10, 20 }, new int[] { 123, 456 });
@@ -187,6 +202,7 @@
assertState( new int[] { 50 }, new int[] { ___ } );
}
+ @Test
public void testFrom2ReplaceFromFirstBlock() {
defineInitialState( new int[] { 10, 20 }, new int[] { 123, 456 });
@@ -203,6 +219,7 @@
assertState( new int[] { 3, 50 }, new int[] { ___, ___ } );
}
+ @Test
public void testFrom2ReplaceFromBottomBoundary() {
defineInitialState( new int[] { 10, 20 }, new int[] { 123, 456 });
@@ -216,6 +233,7 @@
assertState( new int[] { 10, 50 }, new int[] { ___, ___ } );
}
+ @Test
public void testFrom2ReplaceFromTopBoundary() {
defineInitialState( new int[] { 10, 20 }, new int[] { 123, 456 });
@@ -229,6 +247,7 @@
assertState( new int[] { 11, 50 }, new int[] { 123, ___ } );
}
+ @Test
public void testFrom2ReplaceFromSecondBlock() {
defineInitialState( new int[] { 10, 20 }, new int[] { 123, 456 });
@@ -242,6 +261,7 @@
assertState( new int[] { 11, 14-11, 50 }, new int[] { 123, ___, ___ } );
}
+ @Test
public void testFrom2RemoveFromFirst() {
defineInitialState( new int[] { 10, 20 }, new int[] { 123, 456 });
@@ -258,6 +278,7 @@
assertState( new int[] { 0 }, new int[] { ___ } );
}
+ @Test
public void testFrom2RemoveFromFirstBlock() {
defineInitialState( new int[] { 10, 20 }, new int[] { 123, 456 });
@@ -274,6 +295,7 @@
assertState( new int[] { 4 }, new int[] { ___ } );
}
+ @Test
public void testFrom2RemoveFromSecondBlock() {
defineInitialState( new int[] { 10, 20 }, new int[] { 123, 456 });
@@ -284,6 +306,7 @@
assertState( new int[] { 11, 14-11 }, new int[] { 123, ___ } );
}
+ @Test
public void testFrom3ReplaceFromFirstBlock() {
defineInitialState( new int[] { 10, 30, 60 }, new int[] { 123, 456, 789 });
@@ -306,6 +329,7 @@
assertState( new int[] { 3, 50 }, new int[] { ___, ___ } );
}
+ @Test
public void testFrom3ReplaceFromSecondBlock() {
defineInitialState( new int[] { 10, 30, 60 }, new int[] { 123, 456, 789 });
diff --git a/core/tests/coretests/src/android/text/DynamicLayoutTest.java b/core/tests/coretests/src/android/text/DynamicLayoutTest.java
index 9362ed9..da6dc7e 100644
--- a/core/tests/coretests/src/android/text/DynamicLayoutTest.java
+++ b/core/tests/coretests/src/android/text/DynamicLayoutTest.java
@@ -17,16 +17,28 @@
package android.text;
import static android.text.Layout.Alignment.ALIGN_NORMAL;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Paint.FontMetricsInt;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
import android.text.style.ReplacementSpan;
-import junit.framework.TestCase;
-public class DynamicLayoutTest extends TestCase {
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class DynamicLayoutTest {
private static final int WIDTH = 10000;
+ @Test
public void testGetBlocksAlwaysNeedToBeRedrawn_en() {
final SpannableStringBuilder builder = new SpannableStringBuilder();
final DynamicLayout layout = new DynamicLayout(builder, new TextPaint(), WIDTH,
@@ -42,19 +54,7 @@
assertNull(layout.getBlocksAlwaysNeedToBeRedrawn());
}
-
- private static class MockReplacementSpan extends ReplacementSpan {
- @Override
- public int getSize(Paint paint, CharSequence text, int start, int end, FontMetricsInt fm) {
- return 10;
- }
-
- @Override
- public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top,
- int y, int bottom, Paint paint) {
- }
- }
-
+ @Test
public void testGetBlocksAlwaysNeedToBeRedrawn_replacementSpan() {
final SpannableStringBuilder builder = new SpannableStringBuilder();
final DynamicLayout layout = new DynamicLayout(builder, new TextPaint(), WIDTH,
@@ -66,11 +66,17 @@
builder.append("hijk lmn\n");
assertNull(layout.getBlocksAlwaysNeedToBeRedrawn());
- builder.setSpan(new MockReplacementSpan(), 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ ReplacementSpan mockReplacementSpan = mock(ReplacementSpan.class);
+ when(mockReplacementSpan.getSize(any(), any(), any(), any(), any()))
+ .thenReturn(10);
+ doNothing().when(mockReplacementSpan)
+ .draw(any(), any(), any(), any(), any(), any(), any(), any(), any());
+
+ builder.setSpan(mockReplacementSpan, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
assertNotNull(layout.getBlocksAlwaysNeedToBeRedrawn());
assertTrue(layout.getBlocksAlwaysNeedToBeRedrawn().contains(0));
- builder.setSpan(new MockReplacementSpan(), 9, 13, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ builder.setSpan(mockReplacementSpan, 9, 13, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
assertTrue(layout.getBlocksAlwaysNeedToBeRedrawn().contains(0));
assertTrue(layout.getBlocksAlwaysNeedToBeRedrawn().contains(1));
@@ -83,6 +89,7 @@
assertTrue(layout.getBlocksAlwaysNeedToBeRedrawn().isEmpty());
}
+ @Test
public void testGetBlocksAlwaysNeedToBeRedrawn_thai() {
final SpannableStringBuilder builder = new SpannableStringBuilder();
final DynamicLayout layout = new DynamicLayout(builder, new TextPaint(), WIDTH,
diff --git a/core/tests/coretests/src/android/text/PackedIntVectorTest.java b/core/tests/coretests/src/android/text/PackedIntVectorTest.java
index 1aab8af..9df0f89 100644
--- a/core/tests/coretests/src/android/text/PackedIntVectorTest.java
+++ b/core/tests/coretests/src/android/text/PackedIntVectorTest.java
@@ -16,17 +16,23 @@
package android.text;
-import android.support.test.filters.SmallTest;
+import static org.junit.Assert.assertEquals;
-import junit.framework.TestCase;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* PackedIntVectorTest tests the features of android.util.PackedIntVector.
*/
-public class PackedIntVectorTest extends TestCase {
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class PackedIntVectorTest {
- @SmallTest
- public void testBasic() throws Exception {
+ @Test
+ public void testBasic() {
for (int width = 0; width < 10; width++) {
PackedIntVector p = new PackedIntVector(width);
int[] ins = new int[width];
diff --git a/core/tests/coretests/src/android/text/SpannableTest.java b/core/tests/coretests/src/android/text/SpannableTest.java
index d6f0244..5ed6250 100644
--- a/core/tests/coretests/src/android/text/SpannableTest.java
+++ b/core/tests/coretests/src/android/text/SpannableTest.java
@@ -16,15 +16,20 @@
package android.text;
-import android.test.InstrumentationTestCase;
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
import android.test.MoreAsserts;
-import android.test.suitebuilder.annotation.MediumTest;
-public abstract class SpannableTest extends InstrumentationTestCase {
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public abstract class SpannableTest {
protected abstract Spannable newSpannableWithText(String text);
- @MediumTest
+ @Test
public void testGetSpans() {
Spannable spannable = newSpannableWithText("abcdef");
Object emptySpan = new Object();
diff --git a/core/tests/coretests/src/android/text/SpannedTest.java b/core/tests/coretests/src/android/text/SpannedTest.java
index 911da4b..60cddb08 100644
--- a/core/tests/coretests/src/android/text/SpannedTest.java
+++ b/core/tests/coretests/src/android/text/SpannedTest.java
@@ -16,34 +16,40 @@
package android.text;
+import static org.junit.Assert.assertEquals;
+
import android.graphics.Typeface;
import android.os.Parcel;
import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
import android.text.style.CharacterStyle;
import android.text.style.StyleSpan;
import android.text.style.TextAppearanceSpan;
import android.text.style.TypefaceSpan;
-import junit.framework.TestCase;
+import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* SpannedTest tests some features of Spanned
*/
-public class SpannedTest extends TestCase {
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class SpannedTest {
private int mExpect;
- @SmallTest
- public void testSpannableString() throws Exception {
+ @Test
+ public void testSpannableString() {
checkPriority(new SpannableString("the quick brown fox"));
}
- @SmallTest
- public void testSpannableStringBuilder() throws Exception {
+ @Test
+ public void testSpannableStringBuilder() {
checkPriority2(new SpannableStringBuilder("the quick brown fox"));
}
- @SmallTest
- public void testAppend() throws Exception {
+ @Test
+ public void testAppend() {
Object o = new Object();
SpannableString ss = new SpannableString("Test");
ss.setSpan(o, 0, ss.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
@@ -61,7 +67,7 @@
assertEquals(1, ssb.getSpans(4, 8, Object.class).length);
}
- @SmallTest
+ @Test
public void testWrapParcel() {
SpannableString s = new SpannableString("Hello there world");
CharacterStyle mark = new StyleSpan(Typeface.BOLD);
@@ -129,16 +135,16 @@
mExpect = 0;
- s.setSpan(new Watcher(2), 0, s.length(),
+ s.setSpan(new Watcher(2), 0, s.length(),
Spannable.SPAN_INCLUSIVE_INCLUSIVE |
(2 << Spannable.SPAN_PRIORITY_SHIFT));
- s.setSpan(new Watcher(4), 0, s.length(),
+ s.setSpan(new Watcher(4), 0, s.length(),
Spannable.SPAN_INCLUSIVE_INCLUSIVE |
(4 << Spannable.SPAN_PRIORITY_SHIFT));
- s.setSpan(new Watcher(1), 0, s.length(),
+ s.setSpan(new Watcher(1), 0, s.length(),
Spannable.SPAN_INCLUSIVE_INCLUSIVE |
(1 << Spannable.SPAN_PRIORITY_SHIFT));
- s.setSpan(new Watcher(3), 0, s.length(),
+ s.setSpan(new Watcher(3), 0, s.length(),
Spannable.SPAN_INCLUSIVE_INCLUSIVE |
(3 << Spannable.SPAN_PRIORITY_SHIFT));
@@ -162,10 +168,13 @@
mSequence = sequence;
}
- public void onSpanChanged(Spannable b, Object o, int s, int e,
- int st, int en) { }
+ @Override
+ public void onSpanChanged(Spannable b, Object o, int s, int e, int st, int en) { }
+
+ @Override
public void onSpanRemoved(Spannable b, Object o, int s, int e) { }
+ @Override
public void onSpanAdded(Spannable b, Object o, int s, int e) {
if (mExpect != 0) {
assertEquals(mSequence, mExpect);
@@ -173,16 +182,18 @@
}
}
- public void beforeTextChanged(CharSequence s, int start, int count,
- int after) { }
- public void onTextChanged(CharSequence s, int start, int before,
- int count) {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
if (mExpect != 0) {
assertEquals(mSequence, mExpect);
mExpect = mSequence - 1;
}
}
+ @Override
public void afterTextChanged(Editable s) { }
}
}
diff --git a/core/tests/coretests/src/android/text/StaticLayoutBidiTest.java b/core/tests/coretests/src/android/text/StaticLayoutBidiTest.java
index a9865f8..d16cce8 100644
--- a/core/tests/coretests/src/android/text/StaticLayoutBidiTest.java
+++ b/core/tests/coretests/src/android/text/StaticLayoutBidiTest.java
@@ -16,15 +16,21 @@
package android.text;
+import static org.junit.Assert.assertEquals;
+
import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
-import junit.framework.TestCase;
+import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* Quick check of native bidi implementation.
*/
-public class StaticLayoutBidiTest extends TestCase {
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class StaticLayoutBidiTest {
public static final int REQ_DL = 2; // Layout.DIR_REQUEST_DEFAULT_LTR;
public static final int REQ_DR = -2; // Layout.DIR_REQUEST_DEFAULT_RTL;
@@ -39,47 +45,47 @@
public static final String GIMEL = "\u05d2";
public static final String DALET = "\u05d3";
- @SmallTest
+ @Test
public void testAllLtr() {
expectNativeBidi(REQ_DL, "a test", "000000", L);
}
- @SmallTest
+ @Test
public void testLtrRtl() {
expectNativeBidi(REQ_DL, "abc " + ALEF + BET + GIMEL, "0000111", L);
}
- @SmallTest
+ @Test
public void testAllRtl() {
expectNativeBidi(REQ_DL, ALEF + SP + ALEF + BET + GIMEL + DALET, "111111", R);
}
- @SmallTest
+ @Test
public void testRtlLtr() {
expectNativeBidi(REQ_DL, ALEF + BET + GIMEL + " abc", "1111222", R);
}
- @SmallTest
+ @Test
public void testRAllLtr() {
expectNativeBidi(REQ_R, "a test", "222222", R);
}
- @SmallTest
+ @Test
public void testRLtrRtl() {
expectNativeBidi(REQ_R, "abc " + ALEF + BET + GIMEL, "2221111", R);
}
- @SmallTest
+ @Test
public void testLAllRtl() {
expectNativeBidi(REQ_L, ALEF + SP + ALEF + BET + GIMEL + DALET, "111111", L);
}
- @SmallTest
+ @Test
public void testLRtlLtr() {
expectNativeBidi(REQ_DL, ALEF + BET + GIMEL + " abc", "1111222", R);
}
- @SmallTest
+ @Test
public void testNativeBidi() {
expectNativeBidi(REQ_L, ALEF + BET + GIMEL + " abc", "1110000", L);
}
diff --git a/core/tests/coretests/src/android/text/StaticLayoutDirectionsTest.java b/core/tests/coretests/src/android/text/StaticLayoutDirectionsTest.java
index 2300c63..e0b4776 100644
--- a/core/tests/coretests/src/android/text/StaticLayoutDirectionsTest.java
+++ b/core/tests/coretests/src/android/text/StaticLayoutDirectionsTest.java
@@ -16,16 +16,21 @@
package android.text;
+import static org.junit.Assert.fail;
+
import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
import android.text.Layout.Directions;
import android.text.StaticLayoutTest.LayoutBuilder;
-import junit.framework.TestCase;
-
import java.util.Arrays;
import java.util.Formatter;
+import org.junit.Test;
+import org.junit.runner.RunWith;
-public class StaticLayoutDirectionsTest extends TestCase {
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class StaticLayoutDirectionsTest {
private static final char ALEF = '\u05d0';
private static Directions dirs(int ... dirs) {
@@ -107,7 +112,7 @@
return new String(chars, 0, chars.length);
}
- @SmallTest
+ @Test
public void testDirections() {
StringBuilder buf = new StringBuilder("\n");
Formatter f = new Formatter(buf);
@@ -122,7 +127,7 @@
}
}
- @SmallTest
+ @Test
public void testTrailingWhitespace() {
LayoutBuilder b = StaticLayoutTest.builder();
b.setText(pseudoBidiToReal("Ab c"));
@@ -137,7 +142,7 @@
expectDirections("split line", expected, result);
}
- @SmallTest
+ @Test
public void testNextToRightOf() {
LayoutBuilder b = StaticLayoutTest.builder();
b.setText(pseudoBidiToReal("aA1B2"));
@@ -161,7 +166,7 @@
}
}
- @SmallTest
+ @Test
public void testNextToLeftOf() {
LayoutBuilder b = StaticLayoutTest.builder();
b.setText(pseudoBidiToReal("aA1B2"));
@@ -178,40 +183,6 @@
}
}
- // utility, not really a test
- /*
- public void testMeasureText1() {
- LayoutBuilder b = StaticLayoutTest.builder();
- String text = "ABC"; // "abAB"
- b.setText(pseudoBidiToReal(text));
- Layout l = b.build();
- Directions directions = l.getLineDirections(0);
-
- TextPaint workPaint = new TextPaint();
-
- int dir = -1; // LEFT_TO_RIGHT
- boolean trailing = true;
- boolean alt = true;
- do {
- dir = -dir;
- do {
- trailing = !trailing;
- for (int offset = 0, end = b.text.length(); offset <= end; ++offset) {
- float width = Layout.measureText(b.paint,
- workPaint,
- b.text,
- 0, offset, end,
- dir, directions,
- trailing, false,
- null);
- Log.i("BIDI", "dir: " + dir + " trail: " + trailing +
- " offset: " + offset + " width: " + width);
- }
- } while (!trailing);
- } while (dir > 0);
- }
- */
-
// utility for displaying arrays in hex
private static String hexArray(int[] array) {
StringBuilder sb = new StringBuilder();
diff --git a/core/tests/coretests/src/android/text/StaticLayoutTest.java b/core/tests/coretests/src/android/text/StaticLayoutTest.java
index 436840c..b7ca219 100644
--- a/core/tests/coretests/src/android/text/StaticLayoutTest.java
+++ b/core/tests/coretests/src/android/text/StaticLayoutTest.java
@@ -16,25 +16,30 @@
package android.text;
+import static android.text.Layout.Alignment.ALIGN_NORMAL;
+import static org.junit.Assert.assertEquals;
+
import android.graphics.Paint.FontMetricsInt;
import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
import android.text.Layout.Alignment;
import android.text.method.EditorState;
import android.util.Log;
-import junit.framework.TestCase;
-
-import static android.text.Layout.Alignment.ALIGN_NORMAL;
+import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* Tests StaticLayout vertical metrics behavior.
*/
-public class StaticLayoutTest extends TestCase {
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class StaticLayoutTest {
/**
* Basic test showing expected behavior and relationship between font
* metrics and line metrics.
*/
- @SmallTest
+ @Test
public void testGetters1() {
LayoutBuilder b = builder();
FontMetricsInt fmi = b.paint.getFontMetricsInt();
@@ -60,7 +65,7 @@
* Basic test showing effect of includePad = true with 1 line.
* Top and bottom padding are affected, as is the line descent and height.
*/
- @SmallTest
+ @Test
public void testGetters2() {
LayoutBuilder b = builder()
.setIncludePad(true);
@@ -75,7 +80,7 @@
* Basic test showing effect of includePad = true wrapping to 2 lines.
* Ascent of top line and descent of bottom line are affected.
*/
- @SmallTest
+ @Test
public void testGetters3() {
LayoutBuilder b = builder()
.setIncludePad(true)
@@ -92,7 +97,7 @@
* Basic test showing effect of includePad = true wrapping to 3 lines.
* First line ascent is top, bottom line descent is bottom.
*/
- @SmallTest
+ @Test
public void testGetters4() {
LayoutBuilder b = builder()
.setText("This is a longer test")
@@ -112,7 +117,7 @@
* large text. See effect of leading. Currently, we don't expect there to
* even be non-zero leading.
*/
- @SmallTest
+ @Test
public void testGetters5() {
LayoutBuilder b = builder()
.setText("This is a longer test")
@@ -139,7 +144,7 @@
* Basic test showing effect of includePad = true, spacingAdd = 2, wrapping
* to 3 lines.
*/
- @SmallTest
+ @Test
public void testGetters6() {
int spacingAdd = 2; // int so expressions return int
LayoutBuilder b = builder()
@@ -160,7 +165,7 @@
* Basic test showing effect of includePad = true, spacingAdd = 2,
* spacingMult = 1.5, wrapping to 3 lines.
*/
- @SmallTest
+ @Test
public void testGetters7() {
LayoutBuilder b = builder()
.setText("This is a longer test")
@@ -182,7 +187,7 @@
* Basic test showing effect of includePad = true, spacingAdd = 0,
* spacingMult = 0.8 when wrapping to 3 lines.
*/
- @SmallTest
+ @Test
public void testGetters8() {
LayoutBuilder b = builder()
.setText("This is a longer test")
@@ -336,6 +341,7 @@
* Tests for keycap, variation selectors, flags are in CTS.
* See {@link android.text.cts.StaticLayoutTest}.
*/
+ @Test
public void testEmojiOffset() {
EditorState state = new EditorState();
TextPaint paint = new TextPaint();
diff --git a/core/tests/coretests/src/android/text/StaticLayoutTextMeasuringTest.java b/core/tests/coretests/src/android/text/StaticLayoutTextMeasuringTest.java
index 7e07acb..f6888e3 100644
--- a/core/tests/coretests/src/android/text/StaticLayoutTextMeasuringTest.java
+++ b/core/tests/coretests/src/android/text/StaticLayoutTextMeasuringTest.java
@@ -16,15 +16,23 @@
package android.text;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
import android.text.Layout.Alignment;
-import junit.framework.TestCase;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* Tests for text measuring methods of StaticLayout.
*/
-public class StaticLayoutTextMeasuringTest extends TestCase {
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class StaticLayoutTextMeasuringTest {
private static final float SPACE_MULTI = 1.0f;
private static final float SPACE_ADD = 0.0f;
private static final int DEFAULT_OUTER_WIDTH = 150;
@@ -32,37 +40,36 @@
private TextPaint mDefaultPaint;
- @Override
- protected void setUp() throws Exception {
- super.setUp();
+ @Before
+ public void setup() {
if (mDefaultPaint == null) {
mDefaultPaint = new TextPaint();
}
}
- @SmallTest
+ @Test
public void testGetPrimaryHorizontal_zwnbsp() {
// a, ZERO WIDTH NO-BREAK SPACE
String testString = "a\uFEFF";
StaticLayout layout = new StaticLayout(testString, mDefaultPaint,
DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
- assertEquals(0.0f, layout.getPrimaryHorizontal(0));
- assertEquals(layout.getPrimaryHorizontal(2), layout.getPrimaryHorizontal(1));
+ assertEquals(0.0f, layout.getPrimaryHorizontal(0), 0f);
+ assertEquals(layout.getPrimaryHorizontal(2), layout.getPrimaryHorizontal(1), 0f);
}
- @SmallTest
+ @Test
public void testGetPrimaryHorizontal_devanagari() {
// DEVANAGARI LETTER KA, DEVANAGARI VOWEL SIGN AA
String testString = "\u0915\u093E";
StaticLayout layout = new StaticLayout(testString, mDefaultPaint,
DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
- assertEquals(0.0f, layout.getPrimaryHorizontal(0));
- assertEquals(layout.getPrimaryHorizontal(2), layout.getPrimaryHorizontal(1));
+ assertEquals(0.0f, layout.getPrimaryHorizontal(0), 0f);
+ assertEquals(layout.getPrimaryHorizontal(2), layout.getPrimaryHorizontal(1), 0f);
}
- @SmallTest
+ @Test
public void testGetPrimaryHorizontal_flagEmoji() {
// REGIONAL INDICATOR SYMBOL LETTER U, REGIONAL INDICATOR SYMBOL LETTER S, REGIONAL
// INDICATOR SYMBOL LETTER Z
@@ -71,12 +78,12 @@
StaticLayout layout = new StaticLayout(testString, mDefaultPaint,
DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
- assertEquals(0.0f, layout.getPrimaryHorizontal(0));
- assertEquals(layout.getPrimaryHorizontal(4), layout.getPrimaryHorizontal(1));
- assertEquals(layout.getPrimaryHorizontal(4), layout.getPrimaryHorizontal(2));
- assertEquals(layout.getPrimaryHorizontal(4), layout.getPrimaryHorizontal(3));
+ assertEquals(0.0f, layout.getPrimaryHorizontal(0), 0f);
+ assertEquals(layout.getPrimaryHorizontal(4), layout.getPrimaryHorizontal(1), 0f);
+ assertEquals(layout.getPrimaryHorizontal(4), layout.getPrimaryHorizontal(2), 0f);
+ assertEquals(layout.getPrimaryHorizontal(4), layout.getPrimaryHorizontal(3), 0f);
assertTrue(layout.getPrimaryHorizontal(6) > layout.getPrimaryHorizontal(4));
- assertEquals(layout.getPrimaryHorizontal(6), layout.getPrimaryHorizontal(5));
+ assertEquals(layout.getPrimaryHorizontal(6), layout.getPrimaryHorizontal(5), 0f);
}
}
diff --git a/core/tests/coretests/src/android/text/TextLayoutTest.java b/core/tests/coretests/src/android/text/TextLayoutTest.java
index f3a28b4..8963189 100644
--- a/core/tests/coretests/src/android/text/TextLayoutTest.java
+++ b/core/tests/coretests/src/android/text/TextLayoutTest.java
@@ -17,31 +17,34 @@
package android.text;
import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
-import junit.framework.TestCase;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class TextLayoutTest {
+ private String mString;
+ private TextPaint mPaint;
-public class TextLayoutTest extends TestCase {
-
- protected String mString;
- protected TextPaint mPaint;
-
- protected void setUp() throws Exception {
- super.setUp();
+ @Before
+ public void setup() {
mString = "The quick brown fox";
mPaint = new TextPaint();
}
- @SmallTest
- public void testStaticLayout() throws Exception {
- Layout l = new StaticLayout(mString, mPaint, 200,
+ @Test
+ public void testStaticLayout() {
+ new StaticLayout(mString, mPaint, 200,
Layout.Alignment.ALIGN_NORMAL, 1, 0,
true);
}
- @SmallTest
- public void testDynamicLayoutTest() throws Exception {
- Layout l = new DynamicLayout(mString, mPaint, 200,
+ @Test
+ public void testDynamicLayoutTest() {
+ new DynamicLayout(mString, mPaint, 200,
Layout.Alignment.ALIGN_NORMAL, 1, 0,
true);
}
diff --git a/core/tests/coretests/src/android/text/TextUtilsTest.java b/core/tests/coretests/src/android/text/TextUtilsTest.java
index 26aabdb..312c4fb 100644
--- a/core/tests/coretests/src/android/text/TextUtilsTest.java
+++ b/core/tests/coretests/src/android/text/TextUtilsTest.java
@@ -16,6 +16,14 @@
package android.text;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.support.test.runner.AndroidJUnit4;
import com.google.android.collect.Lists;
import android.os.Parcel;
@@ -27,19 +35,21 @@
import android.text.util.Rfc822Tokenizer;
import android.view.View;
-import junit.framework.TestCase;
-
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
+import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* TextUtilsTest tests {@link TextUtils}.
*/
-public class TextUtilsTest extends TestCase {
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class TextUtilsTest {
- @SmallTest
- public void testBasic() throws Exception {
+ @Test
+ public void testBasic() {
assertEquals("", TextUtils.concat());
assertEquals("foo", TextUtils.concat("foo"));
assertEquals("foobar", TextUtils.concat("foo", "bar"));
@@ -71,8 +81,8 @@
assertTrue(TextUtils.concat(foo, bar) instanceof SpannedString);
}
- @SmallTest
- public void testTemplateString() throws Exception {
+ @Test
+ public void testTemplateString() {
CharSequence result;
result = TextUtils.expandTemplate("This is a ^1 of the ^2 broadcast ^3.",
@@ -136,7 +146,7 @@
/** Fail unless text+spans contains a span 'spanName' with the given start and end. */
private void checkContains(Spanned text, String[] spans, String spanName,
- int start, int end) throws Exception {
+ int start, int end) {
for (String i: spans) {
if (i.equals(spanName)) {
assertEquals(start, text.getSpanStart(i));
@@ -147,8 +157,8 @@
fail();
}
- @SmallTest
- public void testTemplateSpan() throws Exception {
+ @Test
+ public void testTemplateSpan() {
SpannableString template;
Spanned result;
String[] spans;
@@ -186,27 +196,27 @@
checkContains(result, spans, "during+after", 1, 2);
}
- @SmallTest
+ @Test
public void testStringSplitterSimple() {
stringSplitterTestHelper("a,b,cde", new String[] {"a", "b", "cde"});
}
- @SmallTest
+ @Test
public void testStringSplitterEmpty() {
stringSplitterTestHelper("", new String[] {});
}
- @SmallTest
+ @Test
public void testStringSplitterWithLeadingEmptyString() {
stringSplitterTestHelper(",a,b,cde", new String[] {"", "a", "b", "cde"});
}
- @SmallTest
+ @Test
public void testStringSplitterWithInternalEmptyString() {
stringSplitterTestHelper("a,b,,cde", new String[] {"a", "b", "", "cde"});
}
- @SmallTest
+ @Test
public void testStringSplitterWithTrailingEmptyString() {
// A single trailing emtpy string should be ignored.
stringSplitterTestHelper("a,b,cde,", new String[] {"a", "b", "cde"});
@@ -222,7 +232,7 @@
MoreAsserts.assertEquals(expectedStrings, strings.toArray(new String[]{}));
}
- @SmallTest
+ @Test
public void testTrim() {
String[] strings = { "abc", " abc", " abc", "abc ", "abc ",
" abc ", " abc ", "\nabc\n", "\nabc", "abc\n" };
@@ -232,7 +242,7 @@
}
}
- @SmallTest
+ @Test
public void testRfc822TokenizerFullAddress() {
Rfc822Token[] tokens = Rfc822Tokenizer.tokenize("Foo Bar (something) <foo@google.com>");
assertNotNull(tokens);
@@ -242,7 +252,7 @@
assertEquals("something",tokens[0].getComment());
}
- @SmallTest
+ @Test
public void testRfc822TokenizeItemWithError() {
Rfc822Token[] tokens = Rfc822Tokenizer.tokenize("\"Foo Bar\\");
assertNotNull(tokens);
@@ -250,7 +260,7 @@
assertEquals("Foo Bar", tokens[0].getAddress());
}
- @SmallTest
+ @Test
public void testRfc822FindToken() {
Rfc822Tokenizer tokenizer = new Rfc822Tokenizer();
// 0 1 2 3 4
@@ -262,12 +272,13 @@
assertEquals(46, tokenizer.findTokenEnd(address, 25));
}
- @SmallTest
+ @Test
public void testRfc822FindTokenWithError() {
assertEquals(9, new Rfc822Tokenizer().findTokenEnd("\"Foo Bar\\", 0));
}
@LargeTest
+ @Test
public void testEllipsize() {
CharSequence s1 = "The quick brown fox jumps over \u00FEhe lazy dog.";
CharSequence s2 = new Wrapper(s1);
@@ -327,7 +338,7 @@
}
}
- @SmallTest
+ @Test
public void testDelimitedStringContains() {
assertFalse(TextUtils.delimitedStringContains("", ',', null));
assertFalse(TextUtils.delimitedStringContains(null, ',', ""));
@@ -347,7 +358,7 @@
assertFalse(TextUtils.delimitedStringContains("network,mock,gpsx", ',', "gps"));
}
- @SmallTest
+ @Test
public void testCharSequenceCreator() {
Parcel p = Parcel.obtain();
TextUtils.writeToParcel(null, p, 0);
@@ -360,7 +371,7 @@
assertEquals("conversion to/from parcel failed", "test", text);
}
- @SmallTest
+ @Test
public void testCharSequenceCreatorNull() {
Parcel p;
CharSequence text;
@@ -371,7 +382,7 @@
assertNull("null CharSequence should generate null from parcel", text);
}
- @SmallTest
+ @Test
public void testCharSequenceCreatorSpannable() {
Parcel p;
CharSequence text;
@@ -382,7 +393,7 @@
assertEquals("conversion to/from parcel failed", "test", text.toString());
}
- @SmallTest
+ @Test
public void testCharSequenceCreatorString() {
Parcel p;
CharSequence text;
@@ -404,10 +415,12 @@
mString = s;
}
+ @Override
public int length() {
return mString.length();
}
+ @Override
public char charAt(int off) {
return mString.charAt(off);
}
@@ -417,12 +430,13 @@
return mString.toString();
}
+ @Override
public CharSequence subSequence(int start, int end) {
return new Wrapper(mString.subSequence(start, end));
}
}
- @LargeTest
+ @Test
public void testRemoveEmptySpans() {
MockSpanned spanned = new MockSpanned();
@@ -484,14 +498,17 @@
}
}
+ @Override
public char charAt(int arg0) {
return 0;
}
+ @Override
public int length() {
return 0;
}
+ @Override
public CharSequence subSequence(int arg0, int arg1) {
return null;
}
@@ -522,7 +539,7 @@
}
}
- @SmallTest
+ @Test
public void testGetLayoutDirectionFromLocale() {
assertEquals(View.LAYOUT_DIRECTION_LTR, TextUtils.getLayoutDirectionFromLocale(null));
assertEquals(View.LAYOUT_DIRECTION_LTR,
diff --git a/core/tests/coretests/src/android/text/VariationParserTest.java b/core/tests/coretests/src/android/text/VariationParserTest.java
index bcc47e1..ec2c96c 100644
--- a/core/tests/coretests/src/android/text/VariationParserTest.java
+++ b/core/tests/coretests/src/android/text/VariationParserTest.java
@@ -16,41 +16,52 @@
package android.text;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
import android.graphics.fonts.FontVariationAxis;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
-import junit.framework.TestCase;
+import org.junit.Test;
+import org.junit.runner.RunWith;
-public class VariationParserTest extends TestCase {
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class VariationParserTest {
private static final String[] INVALID_STYLE_VALUES = {
"", "x", "\t", "\n"
};
- @SmallTest
+ @Test
public void testFromFontVariationSetting_InvalidStyleValue() {
// Test with invalid styleValue
for (String invalidStyle : INVALID_STYLE_VALUES) {
try {
FontVariationAxis.fromFontVariationSettings("'wdth' " + invalidStyle);
fail();
- } catch (FontVariationAxis.InvalidFormatException e) {
+ } catch (IllegalArgumentException e) {
// pass
}
}
for (String invalidStyle : INVALID_STYLE_VALUES) {
try {
- FontVariationAxis.fromFontVariationSettings("'wght' 1, 'wdth' " + invalidStyle);
+ FontVariationAxis.fromFontVariationSettings("'wght' 1, 'wdth' "
+ + invalidStyle);
fail();
- } catch (FontVariationAxis.InvalidFormatException e) {
+ } catch (IllegalArgumentException e) {
// pass
}
}
}
- @SmallTest
- public void testOpenTypeTagValue() throws FontVariationAxis.InvalidFormatException {
- assertEquals(0x77647468, (new FontVariationAxis("wdth", 0).getOpenTypeTagValue()));
- assertEquals(0x41582020, (new FontVariationAxis("AX ", 0).getOpenTypeTagValue()));
- assertEquals(0x20202020, (new FontVariationAxis(" ", 0).getOpenTypeTagValue()));
+ @Test
+ 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/text/format/DateFormatTest.java b/core/tests/coretests/src/android/text/format/DateFormatTest.java
index 93bc911..15c86f0 100644
--- a/core/tests/coretests/src/android/text/format/DateFormatTest.java
+++ b/core/tests/coretests/src/android/text/format/DateFormatTest.java
@@ -16,14 +16,21 @@
package android.text.format;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
-import junit.framework.TestCase;
+import org.junit.Test;
+import org.junit.runner.RunWith;
-public class DateFormatTest extends TestCase {
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class DateFormatTest {
- @SmallTest
- public void testHasDesignator() throws Exception {
+ @Test
+ public void testHasDesignator() {
assertTrue(DateFormat.hasDesignator("hh:mm:ss", DateFormat.MINUTE));
assertTrue(DateFormat.hasDesignator("myyyy", DateFormat.MINUTE));
assertTrue(DateFormat.hasDesignator("mmm", DateFormat.MINUTE));
@@ -31,8 +38,8 @@
assertFalse(DateFormat.hasDesignator("hh:MM:ss", DateFormat.MINUTE));
}
- @SmallTest
- public void testHasDesignatorEscaped() throws Exception {
+ @Test
+ public void testHasDesignatorEscaped() {
assertTrue(DateFormat.hasDesignator("hh:mm 'LOL'", DateFormat.MINUTE));
assertFalse(DateFormat.hasDesignator("hh:mm 'yyyy'", DateFormat.YEAR));
diff --git a/core/tests/coretests/src/android/text/format/DateUtilsTest.java b/core/tests/coretests/src/android/text/format/DateUtilsTest.java
index de43fc6..9271cb4 100644
--- a/core/tests/coretests/src/android/text/format/DateUtilsTest.java
+++ b/core/tests/coretests/src/android/text/format/DateUtilsTest.java
@@ -16,45 +16,40 @@
package android.text.format;
+import static org.junit.Assert.assertEquals;
+
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.LocaleList;
import android.support.test.filters.SmallTest;
-
-import junit.framework.TestCase;
+import android.support.test.runner.AndroidJUnit4;
import java.util.Locale;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
-public class DateUtilsTest extends TestCase {
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class DateUtilsTest {
private static final LocaleList LOCALE_LIST_US = new LocaleList(Locale.US);
private LocaleList mOriginalLocales;
- @Override
- protected void setUp() throws Exception {
- super.setUp();
+ @Before
+ public void setup() {
mOriginalLocales = Resources.getSystem().getConfiguration().getLocales();
setLocales(LOCALE_LIST_US);
}
- @Override
- protected void tearDown() throws Exception {
+ @After
+ public void teardown() {
setLocales(mOriginalLocales);
- super.tearDown();
}
- private void setLocales(LocaleList locales) {
- final Resources systemResources = Resources.getSystem();
- final Configuration config = new Configuration(systemResources.getConfiguration());
- config.setLocales(locales);
- // This is not very safe to call, but since DateUtils.formatDuration() is a static method
- // (it gets its format strings from the system resources), we can't pass a modified Context
- // to it.
- systemResources.updateConfiguration(config, null);
- }
-
- @SmallTest
- public void test_formatDuration_seconds() throws Exception {
+ @Test
+ public void test_formatDuration_seconds() {
assertEquals("0 seconds", DateUtils.formatDuration(0));
assertEquals("0 seconds", DateUtils.formatDuration(1));
assertEquals("0 seconds", DateUtils.formatDuration(499));
@@ -75,8 +70,8 @@
assertEquals("2s", DateUtils.formatDuration(1500, DateUtils.LENGTH_SHORTEST));
}
- @SmallTest
- public void test_formatDuration_Minutes() throws Exception {
+ @Test
+ public void test_formatDuration_Minutes() {
assertEquals("59 seconds", DateUtils.formatDuration(59000));
assertEquals("60 seconds", DateUtils.formatDuration(59500));
assertEquals("1 minute", DateUtils.formatDuration(60000));
@@ -92,8 +87,8 @@
assertEquals("2m", DateUtils.formatDuration(120000, DateUtils.LENGTH_SHORTEST));
}
- @SmallTest
- public void test_formatDuration_Hours() throws Exception {
+ @Test
+ public void test_formatDuration_Hours() {
assertEquals("59 minutes", DateUtils.formatDuration(3540000));
assertEquals("1 hour", DateUtils.formatDuration(3600000));
assertEquals("48 hours", DateUtils.formatDuration(172800000));
@@ -107,4 +102,15 @@
assertEquals("1h", DateUtils.formatDuration(3600000, DateUtils.LENGTH_SHORTEST));
assertEquals("48h", DateUtils.formatDuration(172800000, DateUtils.LENGTH_SHORTEST));
}
+
+ private void setLocales(LocaleList locales) {
+ final Resources systemResources = Resources.getSystem();
+ final Configuration config = new Configuration(systemResources.getConfiguration());
+ config.setLocales(locales);
+ // This is not very safe to call, but since DateUtils.formatDuration() is a static method
+ // (it gets its format strings from the system resources), we can't pass a modified Context
+ // to it.
+ systemResources.updateConfiguration(config, null);
+ }
+
}
diff --git a/core/tests/coretests/src/android/text/format/FormatterTest.java b/core/tests/coretests/src/android/text/format/FormatterTest.java
index 2293094..a4ce911 100644
--- a/core/tests/coretests/src/android/text/format/FormatterTest.java
+++ b/core/tests/coretests/src/android/text/format/FormatterTest.java
@@ -16,43 +16,43 @@
package android.text.format;
+import static org.junit.Assert.assertEquals;
+
+import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
-import android.test.AndroidTestCase;
+import android.support.test.runner.AndroidJUnit4;
import android.text.format.Formatter.BytesResult;
import java.util.Locale;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
-public class FormatterTest extends AndroidTestCase {
-
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class FormatterTest {
private Locale mOriginalLocale;
+ private Context mContext;
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
- mOriginalLocale = mContext.getResources().getConfiguration().locale;
+ @Before
+ public void setup() {
+ mContext = InstrumentationRegistry.getContext();
+ mOriginalLocale = mContext.getResources()
+ .getConfiguration().locale;
}
- @Override
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() {
if (mOriginalLocale != null) {
setLocale(mOriginalLocale);
}
- super.tearDown();
}
- private void setLocale(Locale locale) {
- Resources res = getContext().getResources();
- Configuration config = res.getConfiguration();
- config.locale = locale;
- res.updateConfiguration(config, res.getDisplayMetrics());
-
- Locale.setDefault(locale);
- }
-
- @SmallTest
+ @Test
public void testFormatBytes() {
setLocale(Locale.ENGLISH);
@@ -90,7 +90,7 @@
checkFormatBytes(-914, false, "-0.91", -910);
// Missing FLAG_CALCULATE_ROUNDED case.
- BytesResult r = Formatter.formatBytes(getContext().getResources(), 1, 0);
+ BytesResult r = Formatter.formatBytes(mContext.getResources(), 1, 0);
assertEquals("1", r.value);
assertEquals(0, r.roundedBytes); // Didn't pass FLAG_CALCULATE_ROUNDED
@@ -101,9 +101,18 @@
private void checkFormatBytes(long bytes, boolean useShort,
String expectedString, long expectedRounded) {
- BytesResult r = Formatter.formatBytes(getContext().getResources(), bytes,
+ BytesResult r = Formatter.formatBytes(mContext.getResources(), bytes,
Formatter.FLAG_CALCULATE_ROUNDED | (useShort ? Formatter.FLAG_SHORTER : 0));
assertEquals(expectedString, r.value);
assertEquals(expectedRounded, r.roundedBytes);
}
+
+ private void setLocale(Locale locale) {
+ Resources res = mContext.getResources();
+ Configuration config = res.getConfiguration();
+ config.locale = locale;
+ res.updateConfiguration(config, res.getDisplayMetrics());
+
+ Locale.setDefault(locale);
+ }
}
diff --git a/core/tests/coretests/src/android/text/format/TimeTest.java b/core/tests/coretests/src/android/text/format/TimeTest.java
index f6dd0d4..8983d15 100644
--- a/core/tests/coretests/src/android/text/format/TimeTest.java
+++ b/core/tests/coretests/src/android/text/format/TimeTest.java
@@ -16,17 +16,25 @@
package android.text.format;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import android.support.test.filters.SmallTest;
import android.support.test.filters.Suppress;
+import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
import android.util.TimeFormatException;
-import junit.framework.TestCase;
+import org.junit.Test;
+import org.junit.runner.RunWith;
-public class TimeTest extends TestCase {
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class TimeTest {
- @SmallTest
- public void testNormalize0() throws Exception {
+ @Test
+ public void testNormalize0() {
Time t = new Time(Time.TIMEZONE_UTC);
t.parse("20060432T010203");
t.normalize(false /* use isDst */);
@@ -174,8 +182,8 @@
new DateTest(2007, 10, 5, 2, 0, 60, 2007, 10, 5, 3, 0),
};
- @SmallTest
- public void testNormalize1() throws Exception {
+ @Test
+ public void testNormalize1() {
Time local = new Time("America/Los_Angeles");
int len = dayTests.length;
@@ -265,70 +273,70 @@
}
}
- @SmallTest
- public void testSwitchTimezone0() throws Exception {
+ @Test
+ public void testSwitchTimezone0() {
Time t = new Time(Time.TIMEZONE_UTC);
t.parse("20061005T120000");
t.switchTimezone("America/Los_Angeles");
// System.out.println("got: " + t);
}
- @SmallTest
- public void testCtor0() throws Exception {
+ @Test
+ public void testCtor0() {
Time t = new Time(Time.TIMEZONE_UTC);
assertEquals(Time.TIMEZONE_UTC, t.timezone);
}
- @SmallTest
- public void testGetActualMaximum0() throws Exception {
+ @Test
+ public void testGetActualMaximum0() {
Time t = new Time(Time.TIMEZONE_UTC);
- int r = t.getActualMaximum(Time.SECOND);
+ t.getActualMaximum(Time.SECOND);
// System.out.println("r=" + r);
}
- @SmallTest
- public void testClear0() throws Exception {
+ @Test
+ public void testClear0() {
Time t = new Time(Time.TIMEZONE_UTC);
t.clear(Time.TIMEZONE_UTC);
}
- @SmallTest
- public void testCompare0() throws Exception {
+ @Test
+ public void testCompare0() {
Time a = new Time(Time.TIMEZONE_UTC);
Time b = new Time("America/Los_Angeles");
int r = Time.compare(a, b);
// System.out.println("r=" + r);
}
- @SmallTest
- public void testFormat0() throws Exception {
+ @Test
+ public void testFormat0() {
Time t = new Time(Time.TIMEZONE_UTC);
String r = t.format("%Y%m%dT%H%M%S");
// System.out.println("r='" + r + "'");
}
- @SmallTest
- public void testToString0() throws Exception {
+ @Test
+ public void testToString0() {
Time t = new Time(Time.TIMEZONE_UTC);
String r = t.toString();
// System.out.println("r='" + r + "'");
}
- @SmallTest
- public void testGetCurrentTimezone0() throws Exception {
+ @Test
+ public void testGetCurrentTimezone0() {
String r = Time.getCurrentTimezone();
// System.out.println("r='" + r + "'");
}
- @SmallTest
- public void testSetToNow0() throws Exception {
+ @Test
+ public void testSetToNow0() {
Time t = new Time(Time.TIMEZONE_UTC);
t.setToNow();
// System.out.println("t=" + t);
}
- @SmallTest
- public void testMillis0() throws Exception {
+ @Test
+ public void testMillis0() {
Time t = new Time(Time.TIMEZONE_UTC);
t.set(0, 0, 0, 1, 1, 2006);
long r = t.toMillis(true /* ignore isDst */);
@@ -338,23 +346,23 @@
// System.out.println("r=" + r);
}
- @SmallTest
- public void testMillis1() throws Exception {
+ @Test
+ public void testMillis1() {
Time t = new Time(Time.TIMEZONE_UTC);
t.set(1, 0, 0, 1, 0, 1970);
long r = t.toMillis(true /* ignore isDst */);
// System.out.println("r=" + r);
}
- @SmallTest
- public void testParse0() throws Exception {
+ @Test
+ public void testParse0() {
Time t = new Time(Time.TIMEZONE_UTC);
t.parse("12345678T901234");
// System.out.println("t=" + t);
}
- @SmallTest
- public void testParse33390() throws Exception {
+ @Test
+ public void testParse33390() {
Time t = new Time(Time.TIMEZONE_UTC);
t.parse3339("1980-05-23");
@@ -435,8 +443,8 @@
}
}
- @SmallTest
- public void testSet0() throws Exception {
+ @Test
+ public void testSet0() {
Time t = new Time(Time.TIMEZONE_UTC);
t.set(1000L);
// System.out.println("t.year=" + t.year);
@@ -449,13 +457,13 @@
// System.out.println("t=" + t);
}
- @SmallTest
- public void testSet1() throws Exception {
+ @Test
+ public void testSet1() {
Time t = new Time(Time.TIMEZONE_UTC);
t.set(1, 2, 3, 4, 5, 6);
// System.out.println("t=" + t);
}
-
+
// Timezones that cover the world. Some GMT offsets occur more than
// once in case some cities decide to change their GMT offset.
private static final String[] mTimeZones = {
@@ -518,9 +526,9 @@
"Pacific/Honolulu",
"Pacific/Midway",
};
-
+
@Suppress
- public void disableTestGetJulianDay() throws Exception {
+ public void disableTestGetJulianDay() {
Time time = new Time();
// For each day of the year, and for each timezone, get the Julian
@@ -560,11 +568,11 @@
}
}
}
-
+
@Suppress
- public void disableTestSetJulianDay() throws Exception {
+ public void disableTestSetJulianDay() {
Time time = new Time();
-
+
// For each day of the year in 2008, and for each timezone,
// test that we can set the Julian day correctly.
for (int monthDay = 1; monthDay <= 366; monthDay++) {
diff --git a/core/tests/coretests/src/android/text/method/BackspaceTest.java b/core/tests/coretests/src/android/text/method/BackspaceTest.java
index 864b48a..6e41831 100644
--- a/core/tests/coretests/src/android/text/method/BackspaceTest.java
+++ b/core/tests/coretests/src/android/text/method/BackspaceTest.java
@@ -17,9 +17,13 @@
package android.text.method;
import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
import android.text.InputType;
import android.view.KeyEvent;
import android.widget.TextView.BufferType;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* Test backspace key handling of {@link android.text.method.BaseKeyListener}.
@@ -27,6 +31,8 @@
* Only contains edge cases. For normal cases, see {@see android.text.method.cts.BackspaceTest}.
* TODO: introduce test cases for surrogate pairs and replacement span.
*/
+@SmallTest
+@RunWith(AndroidJUnit4.class)
public class BackspaceTest extends KeyListenerTestCase {
private static final BaseKeyListener mKeyListener = new BaseKeyListener() {
public int getInputType() {
@@ -49,7 +55,7 @@
state.mSelectionEnd = mTextView.getSelectionEnd();
}
- @SmallTest
+ @Test
public void testCombiningEnclosingKeycaps() {
EditorState state = new EditorState();
@@ -77,7 +83,7 @@
state.assertEquals("|");
}
- @SmallTest
+ @Test
public void testVariationSelector() {
EditorState state = new EditorState();
@@ -141,7 +147,7 @@
state.assertEquals("|");
}
- @SmallTest
+ @Test
public void testEmojiZWJSequence() {
EditorState state = new EditorState();
@@ -221,7 +227,7 @@
state.assertEquals("|");
}
- @SmallTest
+ @Test
public void testFlags() {
EditorState state = new EditorState();
@@ -283,7 +289,7 @@
state.assertEquals("'a' |");
}
- @SmallTest
+ @Test
public void testEmojiModifier() {
EditorState state = new EditorState();
@@ -312,7 +318,7 @@
state.assertEquals("|");
}
- @SmallTest
+ @Test
public void testMixedEdgeCases() {
EditorState state = new EditorState();
diff --git a/core/tests/coretests/src/android/text/method/EditorState.java b/core/tests/coretests/src/android/text/method/EditorState.java
index bbbbd6d..12bb8c8 100644
--- a/core/tests/coretests/src/android/text/method/EditorState.java
+++ b/core/tests/coretests/src/android/text/method/EditorState.java
@@ -16,6 +16,11 @@
package android.text.method;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.Editable;
@@ -59,19 +64,6 @@
public EditorState() {
}
- /**
- * A mocked {@link android.text.style.ReplacementSpan} for testing purpose.
- */
- private static class MockReplacementSpan extends ReplacementSpan {
- public int getSize(Paint paint, CharSequence text, int start, int end,
- Paint.FontMetricsInt fm) {
- return 0;
- }
- public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top,
- int y, int bottom, Paint paint) {
- }
- }
-
// Returns true if the code point is ASCII and graph.
private boolean isGraphicAscii(int codePoint) {
return 0x20 < codePoint && codePoint < 0x7F;
@@ -169,7 +161,14 @@
throw new IllegalArgumentException(
"ReplacementSpan start position appears after end position.");
}
- spannable.setSpan(new MockReplacementSpan(), replacementSpanStart, replacementSpanEnd,
+
+ ReplacementSpan mockReplacementSpan = mock(ReplacementSpan.class);
+ when(mockReplacementSpan.getSize(any(), any(), any(), any(), any()))
+ .thenReturn(0);
+ doNothing().when(mockReplacementSpan)
+ .draw(any(), any(), any(), any(), any(), any(), any(), any(), any());
+
+ spannable.setSpan(mockReplacementSpan, replacementSpanStart, replacementSpanEnd,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
mText = Editable.Factory.getInstance().newEditable(spannable);
diff --git a/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java b/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java
index 839d380..6914e21 100644
--- a/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java
+++ b/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java
@@ -17,16 +17,23 @@
package android.text.method;
import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
import android.text.InputType;
import android.view.KeyEvent;
import android.widget.TextView.BufferType;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
/**
* Test forward delete key handling of {@link android.text.method.BaseKeyListener}.
*
* Only contains edge cases. For normal cases, see {@see android.text.method.cts.ForwardDeleteTest}.
* TODO: introduce test cases for surrogate pairs and replacement span.
*/
+@SmallTest
+@RunWith(AndroidJUnit4.class)
public class ForwardDeleteTest extends KeyListenerTestCase {
private static final BaseKeyListener mKeyListener = new BaseKeyListener() {
public int getInputType() {
@@ -49,7 +56,7 @@
state.mSelectionEnd = mTextView.getSelectionEnd();
}
- @SmallTest
+ @Test
public void testCombiningEnclosingKeycaps() {
EditorState state = new EditorState();
@@ -69,7 +76,7 @@
state.assertEquals("|");
}
- @SmallTest
+ @Test
public void testVariationSelector() {
EditorState state = new EditorState();
@@ -117,7 +124,7 @@
state.assertEquals("|");
}
- @SmallTest
+ @Test
public void testEmojiZeroWidthJoinerSequence() {
EditorState state = new EditorState();
@@ -160,7 +167,7 @@
state.assertEquals("|");
}
- @SmallTest
+ @Test
public void testFlags() {
EditorState state = new EditorState();
@@ -217,7 +224,7 @@
state.assertEquals("| 'b'");
}
- @SmallTest
+ @Test
public void testEmojiModifier() {
EditorState state = new EditorState();
@@ -246,7 +253,7 @@
state.assertEquals("|");
}
- @SmallTest
+ @Test
public void testMixedEdgeCases() {
EditorState state = new EditorState();
@@ -354,6 +361,8 @@
// ZERO WIDTH JOINER + regional indicator symbol
state.setByString("| U+1F469 U+200D U+1F1FA");
forwardDelete(state, 0);
+ state.assertEquals("| U+1F1FA");
+ forwardDelete(state, 0);
state.assertEquals("|");
// Regional indicator symbol + end with ZERO WIDTH JOINER
@@ -364,6 +373,8 @@
// Regional indicator symbol + ZERO WIDTH JOINER
state.setByString("| U+1F1FA U+200D U+1F469");
forwardDelete(state, 0);
+ state.assertEquals("| U+1F469");
+ forwardDelete(state, 0);
state.assertEquals("|");
// Start with ZERO WIDTH JOINER + emoji modifier
@@ -384,6 +395,8 @@
// Emoji modifier + ZERO WIDTH JOINER
state.setByString("| U+1F466 U+1F3FB U+200D U+1F469");
forwardDelete(state, 0);
+ state.assertEquals("| U+1F469");
+ forwardDelete(state, 0);
state.assertEquals("|");
// Regional indicator symbol + emoji modifier
diff --git a/core/tests/coretests/src/android/text/method/KeyListenerTestCase.java b/core/tests/coretests/src/android/text/method/KeyListenerTestCase.java
index f005d7b..99a0091 100644
--- a/core/tests/coretests/src/android/text/method/KeyListenerTestCase.java
+++ b/core/tests/coretests/src/android/text/method/KeyListenerTestCase.java
@@ -17,25 +17,19 @@
package android.text.method;
import android.app.Instrumentation;
-import android.test.InstrumentationTestCase;
+import android.support.test.InstrumentationRegistry;
import android.view.KeyEvent;
import android.widget.EditText;
-import com.android.frameworks.coretests.R;
-
-public abstract class KeyListenerTestCase extends InstrumentationTestCase {
-
+public abstract class KeyListenerTestCase {
protected Instrumentation mInstrumentation;
protected EditText mTextView;
public KeyListenerTestCase() {
}
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
- mInstrumentation = getInstrumentation();
+ protected void setup() {
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
mTextView = new EditText(mInstrumentation.getContext());
}
diff --git a/core/tests/coretests/src/android/text/method/WordIteratorTest.java b/core/tests/coretests/src/android/text/method/WordIteratorTest.java
index 66cf65f..3499a74 100644
--- a/core/tests/coretests/src/android/text/method/WordIteratorTest.java
+++ b/core/tests/coretests/src/android/text/method/WordIteratorTest.java
@@ -16,16 +16,25 @@
package android.text.method;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+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 android.support.test.runner.AndroidJUnit4;
+import android.support.test.filters.SmallTest;
import java.text.BreakIterator;
import java.util.Locale;
+import org.junit.Test;
+import org.junit.runner.RunWith;
// TODO(Bug: 24062099): Add more tests for non-ascii text.
-public class WordIteratorTest extends AndroidTestCase {
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class WordIteratorTest {
- @SmallTest
+ @Test
public void testSetCharSequence() {
final String text = "text";
WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
@@ -48,7 +57,7 @@
wordIterator.setCharSequence(text, text.length(), text.length());
}
- @SmallTest
+ @Test
public void testWindowWidth() {
final String text = "aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk llll mmmm nnnn";
WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
@@ -65,7 +74,7 @@
assertEquals(BreakIterator.DONE, wordIterator.following(expectedWindowEnd));
}
- @SmallTest
+ @Test
public void testPreceding() {
final String text = "abc def-ghi. jkl";
WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
@@ -105,7 +114,7 @@
assertEquals(text.indexOf('j'), wordIterator.preceding(text.indexOf('l')));
}
- @SmallTest
+ @Test
public void testFollowing() {
final String text = "abc def-ghi. jkl";
WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
@@ -145,7 +154,7 @@
assertEquals(BreakIterator.DONE, wordIterator.following(text.length()));
}
- @SmallTest
+ @Test
public void testIsBoundary() {
final String text = "abc def-ghi. jkl";
WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
@@ -173,7 +182,7 @@
assertTrue(wordIterator.isBoundary(text.length()));
}
- @SmallTest
+ @Test
public void testNextBoundary() {
final String text = "abc def-ghi. jkl";
WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
@@ -220,7 +229,7 @@
assertEquals(BreakIterator.DONE, currentOffset);
}
- @SmallTest
+ @Test
public void testPrevBoundary() {
final String text = "abc def-ghi. jkl";
WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
@@ -266,7 +275,7 @@
assertEquals(BreakIterator.DONE, currentOffset);
}
- @SmallTest
+ @Test
public void testGetBeginning() {
{
final String text = "abc def-ghi. jkl";
@@ -340,7 +349,7 @@
}
}
- @SmallTest
+ @Test
public void testGetEnd() {
{
final String text = "abc def-ghi. jkl";
@@ -415,7 +424,7 @@
}
}
- @SmallTest
+ @Test
public void testGetPunctuationBeginning() {
final String text = "abc!? (^^;) def";
WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
@@ -450,7 +459,7 @@
assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.length()));
}
- @SmallTest
+ @Test
public void testGetPunctuationEnd() {
final String text = "abc!? (^^;) def";
WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
@@ -482,7 +491,7 @@
assertEquals(BreakIterator.DONE, wordIterator.getPunctuationEnd(text.length()));
}
- @SmallTest
+ @Test
public void testIsAfterPunctuation() {
final String text = "abc!? (^^;) def";
WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
@@ -498,7 +507,7 @@
assertFalse(wordIterator.isAfterPunctuation(text.length() + 1));
}
- @SmallTest
+ @Test
public void testIsOnPunctuation() {
final String text = "abc!? (^^;) def";
WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
@@ -517,7 +526,7 @@
assertFalse(wordIterator.isOnPunctuation(text.length() + 1));
}
- @SmallTest
+ @Test
public void testApostropheMiddleOfWord() {
// These tests confirm that the word "isn't" is treated like one word.
final String text = "isn't he";
diff --git a/core/tests/coretests/src/android/text/util/LinkifyTest.java b/core/tests/coretests/src/android/text/util/LinkifyTest.java
index 487f4e9..23c34085 100644
--- a/core/tests/coretests/src/android/text/util/LinkifyTest.java
+++ b/core/tests/coretests/src/android/text/util/LinkifyTest.java
@@ -16,45 +16,49 @@
package android.text.util;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
import android.content.Context;
import android.content.res.Configuration;
import android.os.LocaleList;
+import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
-import android.test.AndroidTestCase;
+import android.support.test.runner.AndroidJUnit4;
import android.text.method.LinkMovementMethod;
import android.widget.TextView;
import java.util.Locale;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* LinkifyTest tests {@link Linkify}.
*/
-public class LinkifyTest extends AndroidTestCase {
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class LinkifyTest {
private static final LocaleList LOCALE_LIST_US = new LocaleList(Locale.US);
private LocaleList mOriginalLocales;
+ private Context mContext;
- @Override
- protected void setUp() throws Exception {
- super.setUp();
+ @Before
+ public void setup() {
+ mContext = InstrumentationRegistry.getContext();
mOriginalLocales = LocaleList.getDefault();
LocaleList.setDefault(LOCALE_LIST_US);
}
- @Override
- protected void tearDown() throws Exception {
+ @After
+ public void teardown() {
LocaleList.setDefault(mOriginalLocales);
- super.tearDown();
}
- private Context createUsEnglishContext() {
- final Configuration overrideConfig = new Configuration();
- overrideConfig.setLocales(LOCALE_LIST_US);
- return getContext().createConfigurationContext(overrideConfig);
- }
-
- @SmallTest
- public void testNothing() throws Exception {
+ @Test
+ public void testNothing() {
TextView tv;
tv = new TextView(createUsEnglishContext());
@@ -64,8 +68,8 @@
assertTrue(tv.getUrls().length == 0);
}
- @SmallTest
- public void testNormal() throws Exception {
+ @Test
+ public void testNormal() {
TextView tv;
tv = new TextView(createUsEnglishContext());
@@ -76,8 +80,8 @@
assertTrue(tv.getUrls().length == 2);
}
- @SmallTest
- public void testUnclickable() throws Exception {
+ @Test
+ public void testUnclickable() {
TextView tv;
tv = new TextView(createUsEnglishContext());
@@ -88,4 +92,10 @@
assertFalse(tv.getMovementMethod() instanceof LinkMovementMethod);
assertTrue(tv.getUrls().length == 2);
}
+
+ private Context createUsEnglishContext() {
+ final Configuration overrideConfig = new Configuration();
+ overrideConfig.setLocales(LOCALE_LIST_US);
+ return mContext.createConfigurationContext(overrideConfig);
+ }
}
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..742fd60 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";
+ String classifiedText = "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,14 +186,26 @@
};
}
- 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;
- return text.equals(result.getText())
+ if (o instanceof TextClassification) {
+ TextClassification result = (TextClassification) o;
+ final boolean typeRequirementSatisfied;
+ switch (type) {
+ case TextClassifier.TYPE_URL:
+ String scheme = result.getIntent().getData().getScheme();
+ typeRequirementSatisfied = "http".equalsIgnoreCase(scheme)
+ || "https".equalsIgnoreCase(scheme);
+ break;
+ default:
+ typeRequirementSatisfied = true;
+ }
+
+ return typeRequirementSatisfied
+ && text.equals(result.getText())
&& result.getEntityCount() > 0
&& type.equals(result.getEntity(0));
// TODO: Include other properties.
diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
index 2203b6a..ebab129 100644
--- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
@@ -28,6 +28,7 @@
import static android.widget.espresso.TextViewActions.longPressOnTextAtIndex;
import static android.widget.espresso.TextViewAssertions.hasInsertionPointerAtIndex;
import static android.widget.espresso.TextViewAssertions.hasSelection;
+import static android.widget.espresso.TextViewAssertions.doesNotHaveStyledText;
import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarItemIndex;
import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarIsDisplayed;
import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarIsNotDisplayed;
@@ -47,9 +48,16 @@
import static org.hamcrest.Matchers.anyOf;
import static org.hamcrest.Matchers.is;
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.text.TextUtils;
+import android.text.Spanned;
+import android.support.test.espresso.NoMatchingViewException;
+import android.support.test.espresso.ViewAssertion;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
+import android.view.View;
import android.view.textclassifier.TextClassificationManager;
import android.view.textclassifier.TextClassifier;
import android.widget.espresso.CustomViewActions.RelativeCoordinatesProvider;
@@ -64,6 +72,8 @@
import com.android.frameworks.coretests.R;
+import junit.framework.AssertionFailedError;
+
/**
* Tests the TextView widget from an Activity
*/
@@ -708,7 +718,8 @@
}
@Override
- public void onDestroyActionMode(ActionMode actionMode) {}
+ public void onDestroyActionMode(ActionMode actionMode) {
+ }
}));
final String text = "droid@android.com";
@@ -717,4 +728,50 @@
sleepForFloatingToolbarPopup();
assertFloatingToolbarItemIndex(android.R.id.textAssist, 0);
}
+
+ public void testPastePlainText_menuAction() throws Exception {
+ initializeClipboardWithText(TextStyle.STYLED);
+
+ onView(withId(R.id.textview)).perform(replaceText(""));
+ onView(withId(R.id.textview)).perform(longClick());
+ sleepForFloatingToolbarPopup();
+ clickFloatingToolbarItem(
+ getActivity().getString(com.android.internal.R.string.paste_as_plain_text));
+ getInstrumentation().waitForIdleSync();
+
+ onView(withId(R.id.textview)).check(matches(withText("styledtext")));
+ onView(withId(R.id.textview)).check(doesNotHaveStyledText());
+ }
+
+ public void testPastePlainText_noMenuItemForPlainText() {
+ initializeClipboardWithText(TextStyle.PLAIN);
+
+ onView(withId(R.id.textview)).perform(replaceText(""));
+ onView(withId(R.id.textview)).perform(longClick());
+ sleepForFloatingToolbarPopup();
+
+ assertFloatingToolbarDoesNotContainItem(
+ getActivity().getString(com.android.internal.R.string.paste_as_plain_text));
+ }
+
+ private void initializeClipboardWithText(TextStyle textStyle) {
+ final ClipData clip;
+ switch (textStyle) {
+ case STYLED:
+ clip = ClipData.newHtmlText("html", "styledtext", "<b>styledtext</b>");
+ break;
+ case PLAIN:
+ clip = ClipData.newPlainText("plain", "plaintext");
+ break;
+ default:
+ throw new IllegalArgumentException("Invalid text style");
+ }
+ getActivity().getWindow().getDecorView().post(() ->
+ getActivity().getSystemService(ClipboardManager.class).setPrimaryClip( clip));
+ getInstrumentation().waitForIdleSync();
+ }
+
+ private enum TextStyle {
+ PLAIN, STYLED
+ }
}
diff --git a/core/tests/coretests/src/android/widget/espresso/TextViewAssertions.java b/core/tests/coretests/src/android/widget/espresso/TextViewAssertions.java
index 6e44cd8..2532731 100644
--- a/core/tests/coretests/src/android/widget/espresso/TextViewAssertions.java
+++ b/core/tests/coretests/src/android/widget/espresso/TextViewAssertions.java
@@ -26,6 +26,8 @@
import android.graphics.drawable.Drawable;
import android.support.test.espresso.NoMatchingViewException;
import android.support.test.espresso.ViewAssertion;
+import android.text.Spanned;
+import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
@@ -100,22 +102,19 @@
* @param index A matcher representing the expected index.
*/
public static ViewAssertion hasInsertionPointerAtIndex(final Matcher<Integer> index) {
- return new ViewAssertion() {
- @Override
- public void check(View view, NoMatchingViewException exception) {
- if (view instanceof TextView) {
- TextView textView = (TextView) view;
- int selectionStart = textView.getSelectionStart();
- int selectionEnd = textView.getSelectionEnd();
- try {
- assertThat(selectionStart, index);
- assertThat(selectionEnd, index);
- } catch (IndexOutOfBoundsException e) {
- throw new AssertionFailedError(e.getMessage());
- }
- } else {
- throw new AssertionFailedError("TextView not found");
+ return (view, exception) -> {
+ if (view instanceof TextView) {
+ TextView textView = (TextView) view;
+ int selectionStart = textView.getSelectionStart();
+ int selectionEnd = textView.getSelectionEnd();
+ try {
+ assertThat(selectionStart, index);
+ assertThat(selectionEnd, index);
+ } catch (IndexOutOfBoundsException e) {
+ throw new AssertionFailedError(e.getMessage());
}
+ } else {
+ throw new AssertionFailedError("TextView not found");
}
};
}
@@ -137,6 +136,19 @@
}
/**
+ * Returns a {@link ViewAssertion} that asserts that the TextView does not contain styled text.
+ */
+ public static ViewAssertion doesNotHaveStyledText() {
+ return (view, exception) -> {
+ final CharSequence text = ((TextView) view).getText();
+ if (text instanceof Spanned && !TextUtils.hasStyleSpan((Spanned) text)) {
+ return;
+ }
+ throw new AssertionFailedError("TextView has styled text");
+ };
+ }
+
+ /**
* A {@link ViewAssertion} to check the selected text in a {@link TextView}.
*/
private static final class TextSelectionAssertion implements ViewAssertion {
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 344f3c8..86ab3dc 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -181,6 +181,9 @@
<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 ba62a08..f38d8d2 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -30,7 +30,6 @@
import android.content.res.AssetManager;
import android.graphics.FontListParser;
import android.graphics.fonts.FontVariationAxis;
-import android.graphics.fonts.FontVariationAxis.InvalidFormatException;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
@@ -231,6 +230,7 @@
FontFamily fontFamily = new FontFamily();
for (final FontFileResourceEntry fontFile : filesEntry.getEntries()) {
+ // TODO: Add ttc and variation font support. (b/37853920)
if (!fontFamily.addFontFromAssetManager(mgr, fontFile.getFileName(),
0 /* resourceCookie */, false /* isAsset */, 0 /* ttcIndex */,
fontFile.getWeight(), fontFile.isItalic() ? STYLE_ITALIC : STYLE_NORMAL,
@@ -238,11 +238,9 @@
return null;
}
}
- // Due to backward compatibility, even if the font is not supported by our font stack,
- // we need to place the empty font at the first place. The typeface with empty font
- // behaves different from default typeface especially in fallback font selection.
- fontFamily.allowUnsupportedFont();
- fontFamily.freeze();
+ if (!fontFamily.freeze()) {
+ return null;
+ }
FontFamily[] familyChain = { fontFamily };
typeface = createFromFamiliesWithDefault(familyChain,
RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE);
@@ -432,11 +430,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/drawable/AdaptiveIconDrawable.java b/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
index ffadad9..ab10e97 100644
--- a/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
+++ b/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
@@ -78,6 +78,7 @@
* Mask path is defined inside device configuration in following dimension: [100 x 100]
* @hide
*/
+ @TestApi
public static final float MASK_SIZE = 100f;
/**
@@ -179,7 +180,6 @@
*
* @param backgroundDrawable drawable that should be rendered in the background
* @param foregroundDrawable drawable that should be rendered in the foreground
- * @hide
*/
public AdaptiveIconDrawable(Drawable backgroundDrawable,
Drawable foregroundDrawable) {
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/KeyStore.java b/keystore/java/android/security/KeyStore.java
index 244d6e5..bfd1422 100644
--- a/keystore/java/android/security/KeyStore.java
+++ b/keystore/java/android/security/KeyStore.java
@@ -636,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/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/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/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/libs/hwui/tests/unit/FrameBuilderTests.cpp b/libs/hwui/tests/unit/FrameBuilderTests.cpp
index bd798e8..fcdd814 100644
--- a/libs/hwui/tests/unit/FrameBuilderTests.cpp
+++ b/libs/hwui/tests/unit/FrameBuilderTests.cpp
@@ -819,7 +819,7 @@
EXPECT_EQ(1, renderer.getIndex()) << "ColorOp should not be rejected";
}
-OPENGL_PIPELINE_TEST(FrameBuilder, renderNode) {
+RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderNode) {
class RenderNodeTestRenderer : public TestRendererBase {
public:
void onRectOp(const RectOp& op, const BakedOpState& state) override {
@@ -2321,7 +2321,7 @@
EXPECT_EQ(1, renderer.getIndex());
}
-OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderProjectedInMiddle) {
+RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderProjectedInMiddle) {
/* R is backward projected on B
A
/ \
@@ -2351,7 +2351,7 @@
EXPECT_EQ(3, renderer.getIndex());
}
-OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderProjectLast) {
+RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderProjectLast) {
/* R is backward projected on E
A
/ | \
@@ -2383,7 +2383,7 @@
EXPECT_EQ(4, renderer.getIndex());
}
-OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderNoReceivable) {
+RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderNoReceivable) {
/* R is backward projected without receiver
A
/ \
@@ -2412,7 +2412,7 @@
EXPECT_EQ(2, renderer.getIndex());
}
-OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderParentReceivable) {
+RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderParentReceivable) {
/* R is backward projected on C
A
/ \
@@ -2441,7 +2441,7 @@
EXPECT_EQ(3, renderer.getIndex());
}
-OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderSameNodeReceivable) {
+RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderSameNodeReceivable) {
auto nodeA = TestUtils::createNode<RecordingCanvas>(0, 0, 100, 100,
[](RenderProperties& props, RecordingCanvas& canvas) {
drawOrderedNode(&canvas, 0, nullptr); //nodeB
@@ -2464,7 +2464,7 @@
EXPECT_EQ(2, renderer.getIndex());
}
-OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderProjectedSibling) {
+RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderProjectedSibling) {
//TODO: this test together with the next "projectionReorderProjectedSibling2" likely expose a
//bug in HWUI. First test draws R, while the second test does not draw R for a nearly identical
//tree setup. The correct behaviour is to not draw R, because the receiver cannot be a sibling
@@ -2497,7 +2497,7 @@
EXPECT_EQ(3, renderer.getIndex());
}
-OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderProjectedSibling2) {
+RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderProjectedSibling2) {
/* R is set to project on B, but R is not drawn because projecting on a sibling is not allowed.
A
|
@@ -2530,7 +2530,7 @@
EXPECT_EQ(3, renderer.getIndex());
}
-OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderGrandparentReceivable) {
+RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderGrandparentReceivable) {
/* R is backward projected on B
A
|
@@ -2562,7 +2562,7 @@
EXPECT_EQ(3, renderer.getIndex());
}
-OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderTwoReceivables) {
+RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderTwoReceivables) {
/* B and G are receivables, R is backward projected
A
/ \
@@ -2595,7 +2595,7 @@
EXPECT_EQ(4, renderer.getIndex());
}
-OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderTwoReceivablesLikelyScenario) {
+RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderTwoReceivablesLikelyScenario) {
/* B and G are receivables, G is backward projected
A
/ \
@@ -2628,7 +2628,7 @@
EXPECT_EQ(4, renderer.getIndex());
}
-OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderTwoReceivablesDeeper) {
+RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderTwoReceivablesDeeper) {
/* B and G are receivables, R is backward projected
A
/ \
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/location/java/com/android/internal/location/GpsNetInitiatedHandler.java b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
index 6bc5e91..9bd5994 100644
--- a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
+++ b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
@@ -36,6 +36,7 @@
import android.os.SystemProperties;
import android.util.Log;
+import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.R;
import com.android.internal.telephony.GsmAlphabet;
import com.android.internal.telephony.TelephonyProperties;
@@ -364,7 +365,8 @@
// Construct Notification
if (mNiNotificationBuilder == null) {
- mNiNotificationBuilder = new Notification.Builder(mContext)
+ mNiNotificationBuilder = new Notification.Builder(mContext,
+ SystemNotificationChannels.NETWORK_ALERTS)
.setSmallIcon(com.android.internal.R.drawable.stat_sys_gps_on)
.setWhen(0)
.setOngoing(true)
diff --git a/media/java/android/media/AudioFocusRequest.java b/media/java/android/media/AudioFocusRequest.java
index 2e4d199..b1dc3ad 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,52 @@
* {@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;
+ }
+
+ /**
+ * @hide
+ * Internal listener setter, no null checks on listener nor handler
+ * @param listener
+ * @param handler
+ * @return this {@code Builder} instance.
+ */
+ @NonNull Builder setOnAudioFocusChangeListenerInt(
+ OnAudioFocusChangeListener listener, Handler handler) {
+ mFocusListener = listener;
+ mListenerHandler = handler;
+ 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 +394,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 ce07c99..0b5dff2 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -2445,7 +2445,7 @@
}
final AudioFocusRequest afr = new AudioFocusRequest.Builder(durationHint)
- .setOnAudioFocusChangeListener(l, null /* no Handler for this legacy API */)
+ .setOnAudioFocusChangeListenerInt(l, null /* no Handler for this legacy API */)
.setAudioAttributes(requestAttributes)
.setAcceptsDelayedFocusGain((flags & AUDIOFOCUS_FLAG_DELAY_OK)
== AUDIOFOCUS_FLAG_DELAY_OK)
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/PlayerBase.java b/media/java/android/media/PlayerBase.java
index e634dc2..dd66649 100644
--- a/media/java/android/media/PlayerBase.java
+++ b/media/java/android/media/PlayerBase.java
@@ -536,9 +536,9 @@
throw new IllegalArgumentException("Use of STREAM_ACCESSIBILITY is reserved for "
+ "volume control");
}
- Log.e(className, "Use of stream types is deprecated for operations other than " +
- "volume control.");
- Log.e(className, "See the documentation of " + opName + " for what to use instead with " +
+ Log.w(className, "Use of stream types is deprecated for operations other than " +
+ "volume control");
+ Log.w(className, "See the documentation of " + opName + " for what to use instead with " +
"android.media.AudioAttributes to qualify your playback use case");
}
}
diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java
index 6f4118e..4496a82 100644
--- a/media/java/android/media/tv/TvContract.java
+++ b/media/java/android/media/tv/TvContract.java
@@ -437,7 +437,7 @@
public static final String PARAM_BROWSABLE_ONLY = "browsable_only";
/**
- * A optional query, update or delete URI parameter that allows the caller to specify canonical
+ * An optional query, update or delete URI parameter that allows the caller to specify canonical
* genre to filter programs.
* @hide
*/
@@ -452,6 +452,13 @@
public static final String PARAM_PREVIEW = "preview";
/**
+ * An optional query, update or delete URI parameter that allows the caller to specify package
+ * name to filter channels.
+ * @hide
+ */
+ public static final String PARAM_PACKAGE = "package";
+
+ /**
* Builds an ID that uniquely identifies a TV input service.
*
* @param name The {@link ComponentName} of the TV input service to build ID for.
diff --git a/media/java/android/media/tv/TvInputInfo.java b/media/java/android/media/tv/TvInputInfo.java
index a292b8e..74085d3 100644
--- a/media/java/android/media/tv/TvInputInfo.java
+++ b/media/java/android/media/tv/TvInputInfo.java
@@ -949,9 +949,6 @@
com.android.internal.R.styleable.TvInputService);
mSetupActivity = sa.getString(
com.android.internal.R.styleable.TvInputService_setupActivity);
- if (inputType == TYPE_TUNER && TextUtils.isEmpty(mSetupActivity)) {
- throw new IllegalStateException("Setup activity not found for " + si.name);
- }
if (mCanRecord == null) {
mCanRecord = sa.getBoolean(
com.android.internal.R.styleable.TvInputService_canRecord, false);
diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java
index e51025f..7b5f778 100644
--- a/media/java/android/media/tv/TvInputService.java
+++ b/media/java/android/media/tv/TvInputService.java
@@ -745,7 +745,7 @@
* Called when the application sets the surface.
*
* <p>The TV input service should render video onto the given surface. When called with
- * {@code null}, the input service should immediately release any references to the
+ * {@code null}, the input service should immediately free any references to the
* currently set surface and stop using it.
*
* @param surface The surface to be used for video rendering. Can be {@code null}.
diff --git a/obex/javax/obex/ServerSession.java b/obex/javax/obex/ServerSession.java
index 3831cf7..dbfeefd 100644
--- a/obex/javax/obex/ServerSession.java
+++ b/obex/javax/obex/ServerSession.java
@@ -104,7 +104,6 @@
case ObexHelper.OBEX_OPCODE_DISCONNECT:
handleDisconnectRequest();
- done = true;
break;
case ObexHelper.OBEX_OPCODE_GET:
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..c309133 100644
--- a/packages/CarrierDefaultApp/AndroidManifest.xml
+++ b/packages/CarrierDefaultApp/AndroidManifest.xml
@@ -33,6 +33,8 @@
<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" />
+ <action android:name="android.intent.action.LOCALE_CHANGED" />
</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/CarrierActionUtils.java b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CarrierActionUtils.java
index 7fd1601..0213306 100644
--- a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CarrierActionUtils.java
+++ b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CarrierActionUtils.java
@@ -112,8 +112,6 @@
private static void onShowCaptivePortalNotification(Intent intent, Context context) {
logd("onShowCaptivePortalNotification");
- final NotificationManager notificationMgr = context.getSystemService(
- NotificationManager.class);
Intent portalIntent = new Intent(context, CaptivePortalLoginActivity.class);
portalIntent.putExtras(intent);
portalIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT
@@ -123,7 +121,8 @@
Notification notification = getNotification(context, R.string.portal_notification_id,
R.string.portal_notification_detail, pendingIntent);
try {
- notificationMgr.notify(PORTAL_NOTIFICATION_TAG, PORTAL_NOTIFICATION_ID, notification);
+ context.getSystemService(NotificationManager.class)
+ .notify(PORTAL_NOTIFICATION_TAG, PORTAL_NOTIFICATION_ID, notification);
} catch (NullPointerException npe) {
loge("setNotificationVisible: " + npe);
}
@@ -131,12 +130,11 @@
private static void onShowNoDataServiceNotification(Context context) {
logd("onShowNoDataServiceNotification");
- final NotificationManager notificationMgr = context.getSystemService(
- NotificationManager.class);
Notification notification = getNotification(context, R.string.no_data_notification_id,
R.string.no_data_notification_detail, null);
try {
- notificationMgr.notify(NO_DATA_NOTIFICATION_TAG, NO_DATA_NOTIFICATION_ID, notification);
+ context.getSystemService(NotificationManager.class)
+ .notify(NO_DATA_NOTIFICATION_TAG, NO_DATA_NOTIFICATION_ID, notification);
} catch (NullPointerException npe) {
loge("setNotificationVisible: " + npe);
}
@@ -144,26 +142,16 @@
private static void onCancelAllNotifications(Context context) {
logd("onCancelAllNotifications");
- final NotificationManager notificationMgr = context.getSystemService(
- NotificationManager.class);
- notificationMgr.cancelAll();
+ context.getSystemService(NotificationManager.class).cancelAll();
}
private static Notification getNotification(Context context, int titleId, int textId,
PendingIntent pendingIntent) {
final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
- final NotificationManager notificationManager = context.getSystemService(
- NotificationManager.class);
final Resources resources = context.getResources();
final Bundle extras = Bundle.forPair(Notification.EXTRA_SUBSTITUTE_APP_NAME,
resources.getString(R.string.android_system_label));
- /* Creates the notification channel and registers it with NotificationManager. If a channel
- * with the same ID is already registered, NotificationManager will ignore this call.
- */
- notificationManager.createNotificationChannel(new NotificationChannel(
- NOTIFICATION_CHANNEL_ID_MOBILE_DATA_STATUS,
- resources.getString(R.string.mobile_data_status_notification_channel_name),
- NotificationManager.IMPORTANCE_DEFAULT));
+ createNotificationChannels(context);
Notification.Builder builder = new Notification.Builder(context)
.setContentTitle(resources.getString(titleId))
.setContentText(String.format(resources.getString(textId),
@@ -187,6 +175,19 @@
return builder.build();
}
+ /**
+ * Creates the notification channel and registers it with NotificationManager. Also used to
+ * update an existing channel's name.
+ */
+ static void createNotificationChannels(Context context) {
+ context.getSystemService(NotificationManager.class)
+ .createNotificationChannel(new NotificationChannel(
+ NOTIFICATION_CHANNEL_ID_MOBILE_DATA_STATUS,
+ context.getResources().getString(
+ R.string.mobile_data_status_notification_channel_name),
+ NotificationManager.IMPORTANCE_DEFAULT));
+ }
+
private static void logd(String s) {
Log.d(TAG, s);
}
diff --git a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CarrierDefaultBroadcastReceiver.java b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CarrierDefaultBroadcastReceiver.java
index 3fd89d9..3f55ff5 100644
--- a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CarrierDefaultBroadcastReceiver.java
+++ b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CarrierDefaultBroadcastReceiver.java
@@ -32,6 +32,10 @@
Log.d(TAG, "skip carrier actions during provisioning");
return;
}
+ if (Intent.ACTION_LOCALE_CHANGED.equals(intent.getAction())) {
+ CarrierActionUtils.createNotificationChannels(context);
+ return;
+ }
List<Integer> actionList = CustomConfigLoader.loadCarrierActionList(context, intent);
for (int actionIdx : actionList) {
Log.d(TAG, "apply carrier action idx: " + actionIdx);
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/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-iw/strings.xml b/packages/PrintSpooler/res/values-iw/strings.xml
index 7448079..6000500 100644
--- a/packages/PrintSpooler/res/values-iw/strings.xml
+++ b/packages/PrintSpooler/res/values-iw/strings.xml
@@ -87,7 +87,7 @@
<string name="cancelling_notification_title_template" msgid="1821759594704703197">"מבטל את <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
<string name="failed_notification_title_template" msgid="2256217208186530973">"שגיאת מדפסת ב-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
<string name="blocked_notification_title_template" msgid="1175435827331588646">"המדפסת חסמה את <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
- <string name="cancel" msgid="4373674107267141885">"בטל"</string>
+ <string name="cancel" msgid="4373674107267141885">"ביטול"</string>
<string name="restart" msgid="2472034227037808749">"הפעל מחדש"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"אין חיבור למדפסת"</string>
<string name="reason_unknown" msgid="5507940196503246139">"לא ידוע"</string>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index f45c2c1..e89b21a 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 c4e66aa..d8150d1 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 266b883..034653f 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -329,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 85e7875..603f6918 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 802d852..fcbb89d 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -318,7 +316,7 @@
<string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"Protanomalija (crveno-zeleno)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"Tritanomalija (plavo-žuto)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Korekcija boja"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ova funkcija je eksperimentalna i može da utiče na performanse."</string>
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ova funkcija je eksperimentalna i može da utiče na kvalitet rada."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Zamenjuje ga <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="845431008899029842">"Još oko <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> do potpunog punjenja"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 421f0b3..f8eec7f 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -97,7 +95,7 @@
<string name="tether_settings_title_wifi" msgid="3277144155960302049">"Партатыўная кропка доступу"</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="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>
@@ -308,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 Гэта функцыя ў альфа-версіі, яна можа працаваць няправільна.\n Каб працягнуць, націсніце «Сцерці і перайсці...»."</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>
@@ -318,7 +316,7 @@
<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>
@@ -349,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 1893393..53c50b9 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -218,7 +216,7 @@
<string name="enable_terminal_title" msgid="95572094356054120">"Локален терминал"</string>
<string name="enable_terminal_summary" msgid="67667852659359206">"Актив. на прил. за терминал с достъп до локалния команден ред"</string>
<string name="hdcp_checking_title" msgid="8605478913544273282">"Проверка с HDCP"</string>
- <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"Повед. за проверка с HDCP"</string>
+ <string name="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>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index b5fa686..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,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -106,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 3515347..6d755ea 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -97,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>
@@ -105,13 +103,13 @@
<string name="launch_defaults_some" msgid="313159469856372621">"Neke zadane vrijednosti su postavljene"</string>
<string name="launch_defaults_none" msgid="4241129108140034876">"Nema postavljenih zadanih vrijednosti"</string>
<string name="tts_settings" msgid="8186971894801348327">"Postavke za pretvaranje teksta u govor"</string>
- <string name="tts_settings_title" msgid="1237820681016639683">"Izlaz za pretvaranje teksta u govor"</string>
+ <string name="tts_settings_title" msgid="1237820681016639683">"Pretvaranje teksta u govor"</string>
<string name="tts_default_rate_title" msgid="6030550998379310088">"Brzina govora"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"Brzina kojom se izgovara tekst"</string>
<string name="tts_default_pitch_title" msgid="6135942113172488671">"Visina"</string>
<string name="tts_default_pitch_summary" msgid="1944885882882650009">"Utječe na ton sintetiziranog govora"</string>
<string name="tts_default_lang_title" msgid="8018087612299820556">"Jezik"</string>
- <string name="tts_lang_use_system" msgid="2679252467416513208">"Koristi sistemski jezik"</string>
+ <string name="tts_lang_use_system" msgid="2679252467416513208">"Korištenje sistemskog jezika"</string>
<string name="tts_lang_not_selected" msgid="7395787019276734765">"Jezik nije izabran"</string>
<string name="tts_default_lang_summary" msgid="5219362163902707785">"Postavlja glas za dati jezik za izgovoreni tekst"</string>
<string name="tts_play_example_title" msgid="7094780383253097230">"Poslušajte primjer"</string>
@@ -119,7 +117,7 @@
<string name="tts_install_data_title" msgid="4264378440508149986">"Instaliraj glasovne podatke"</string>
<string name="tts_install_data_summary" msgid="5742135732511822589">"Instalirajte glasovne podatke potrebne za sintetiziranje govora"</string>
<string name="tts_engine_security_warning" msgid="8786238102020223650">"Ovaj program za sintetiziranje govora u mogućnosti je da prikuplja sav tekst koji se izgovara, uključujući lične podatke kao što su lozinke i brojevi kreditnih kartica. Program omogućava aplikacija <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g>. Da li želite koristiti ovaj program za sintetiziranje govora?"</string>
- <string name="tts_engine_network_required" msgid="1190837151485314743">"Ovaj jezik zahtijeva mrežnu vezu radi za izlaz tekst-u-govor."</string>
+ <string name="tts_engine_network_required" msgid="1190837151485314743">"Ovaj jezik zahtijeva aktivnu mrežnu vezu za pretvaranje teksta u govor."</string>
<string name="tts_default_sample_string" msgid="4040835213373086322">"Ovo je primjer sinteze govora"</string>
<string name="tts_status_title" msgid="7268566550242584413">"Zadani status jezika"</string>
<string name="tts_status_ok" msgid="1309762510278029765">"<xliff:g id="LOCALE">%1$s</xliff:g> je u potpunosti podržan"</string>
@@ -128,8 +126,8 @@
<string name="tts_status_checking" msgid="5339150797940483592">"Provjerava se…"</string>
<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_engine_preference_section_title" msgid="448294500990971413">"Željeni alat"</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">
@@ -218,7 +216,7 @@
<string name="enable_terminal_title" msgid="95572094356054120">"Lokalni terminal"</string>
<string name="enable_terminal_summary" msgid="67667852659359206">"Omogući terminalnu aplik. koja nudi pristup lok. kom. okruženju"</string>
<string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP provjeravanje"</string>
- <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"Pos. ponaš. kod HDCP pr."</string>
+ <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"Postavke HDCP provjere"</string>
<string name="debug_debugging_category" msgid="6781250159513471316">"Otklanjanje grešaka"</string>
<string name="debug_app" msgid="8349591734751384446">"Odaberi aplikaciju za otklanjanje grešaka"</string>
<string name="debug_app_not_set" msgid="718752499586403499">"Nema postavljenih aplikac. za otklanjanje grešaka"</string>
@@ -280,12 +278,12 @@
<string name="force_resizable_activities_summary" msgid="6667493494706124459">"Neka sve aktivnosti budu takve da mogu mijenjati veličinu za prikaz sa više prozora, bez obzira na prikazane vrijednosti."</string>
<string name="enable_freeform_support" msgid="1461893351278940416">"Omogući prozore nepravilnih oblika"</string>
<string name="enable_freeform_support_summary" msgid="8247310463288834487">"Omogućiti podršku za eksperimentalne prozore nepravilnih oblika."</string>
- <string name="local_backup_password_title" msgid="3860471654439418822">"Lozinka za rezervnu kopiju radne površine"</string>
+ <string name="local_backup_password_title" msgid="3860471654439418822">"Lozinka za sigurnosnu kopiju radne površine"</string>
<string name="local_backup_password_summary_none" msgid="6951095485537767956">"Potpune sigurnosne kopije za računare trenutno nisu zaštićene"</string>
<string name="local_backup_password_summary_change" msgid="5376206246809190364">"Dodirnite da promijenite ili uklonite lozinku za potpune rezervne kopije sa radne površine"</string>
- <string name="local_backup_password_toast_success" msgid="582016086228434290">"Nova lozinka za rezervnu kopiju postavljena"</string>
+ <string name="local_backup_password_toast_success" msgid="582016086228434290">"Nova lozinka za sigurnosnu kopiju postavljena"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nova lozinka i potvrda se ne podudaraju"</string>
- <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Nije uspjelo postavljanje lozinke za rezervnu kopiju"</string>
+ <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Nije uspjelo postavljanje lozinke za sigurnosnu kopiju"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Živopisan (zadano)"</item>
<item msgid="8446070607501413455">"Prirodan"</item>
@@ -304,11 +302,11 @@
<string name="select_webview_provider_title" msgid="4628592979751918907">"Postavljanje WebViewa"</string>
<string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Podesi WebView"</string>
<string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Ovaj izbor više ne vrijedi. Pokušajte ponovo."</string>
- <string name="convert_to_file_encryption" msgid="3060156730651061223">"Pretvori u šifrirani fajl"</string>
+ <string name="convert_to_file_encryption" msgid="3060156730651061223">"Pretvaranje u šifrirani fajl"</string>
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"Pretvaranje…"</string>
<string name="convert_to_file_encryption_done" msgid="7859766358000523953">"Fajl je već šifriran"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"Pretvaranje u šifrirane fajlove"</string>
- <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Pretvori particiju sa podacima u particiju šifriranu sistemom fajlova.\n !! Upozorenje!! Ovo će izbrisati sve vaše podatke.\n Ova funkcija je u alfa fazi razvoja i možda neće ispravno raditi.\n Pritisnite \'Obriši i pretvori…\" da nastavite."</string>
+ <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Pretvorite particiju sa podacima u particiju šifriranu sistemom fajlova.\n !! Upozorenje!! Ovo će izbrisati sve vaše podatke.\n Ova funkcija je u alfa fazi razvoja i možda neće ispravno raditi.\n Pritisnite \"Obriši i pretvori…\" da nastavite."</string>
<string name="button_convert_fbe" msgid="5152671181309826405">"Obriši i pretvori…"</string>
<string name="picture_color_mode" msgid="4560755008730283695">"Režim boja Slika"</string>
<string name="picture_color_mode_desc" msgid="1141891467675548590">"Koristi sRGB"</string>
@@ -318,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>
@@ -348,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 6252dcb..2a4db1d 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -304,7 +302,7 @@
<string name="select_webview_provider_title" msgid="4628592979751918907">"Implementació de WebView"</string>
<string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Configura la implementació de WebView"</string>
<string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Aquesta opció ja no és vàlida. Torna-ho a provar."</string>
- <string name="convert_to_file_encryption" msgid="3060156730651061223">"Converteix en l\'encriptació de fitxers"</string>
+ <string name="convert_to_file_encryption" msgid="3060156730651061223">"Converteix en encriptació de fitxers"</string>
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"Converteix…"</string>
<string name="convert_to_file_encryption_done" msgid="7859766358000523953">"El fitxer ja està encriptat"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"S\'està convertint en l\'encriptació basada en fitxers"</string>
@@ -349,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 7d91dc1..673d51b 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 986bc3e..0447c52 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index d8993fc..0a2cf33 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -318,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 307ced6..24d3bf4 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -105,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 a35da4d..6b9daf7 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 a35da4d..6b9daf7 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 a35da4d..6b9daf7 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 fa092e2..1464d44 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 8dc6301..13dde32f 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -299,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>
@@ -308,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>
@@ -343,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 a8ebbda..cc52862 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 1cf26e5..aa6b3c2 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index c456b1c..65fe22c 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 f3e2d6b..d306e23 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 8c1df6b..5891473 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -113,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>
@@ -146,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>
@@ -218,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>
@@ -304,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>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 1c6e93b..831515a 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -282,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 8557fb5..8b57734 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -93,11 +91,11 @@
<string name="process_kernel_label" msgid="3916858646836739323">"SO Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Aplicacións eliminadas"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Aplicacións e usuarios eliminados"</string>
- <string name="tether_settings_title_usb" msgid="6688416425801386511">"Ancoraxe de USB"</string>
- <string name="tether_settings_title_wifi" msgid="3277144155960302049">"Zona interactiva portátil"</string>
- <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Ancoraxe de Bluetooth"</string>
- <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Ancoraxe á rede"</string>
- <string name="tether_settings_title_all" msgid="8356136101061143841">"Ancoraxe á rede e zona wifi"</string>
+ <string name="tether_settings_title_usb" msgid="6688416425801386511">"Conexión compart. por USB"</string>
+ <string name="tether_settings_title_wifi" msgid="3277144155960302049">"Zona wifi portátil"</string>
+ <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Conexión por Bluetooth"</string>
+ <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Conexión compartida"</string>
+ <string name="tether_settings_title_all" msgid="8356136101061143841">"Conexión comp./zona wifi"</string>
<string name="managed_user_title" msgid="8109605045406748842">"Aplicacións de traballo"</string>
<string name="user_guest" msgid="8475274842845401871">"Convidado"</string>
<string name="unknown" msgid="1592123443519355854">"Descoñecida"</string>
@@ -151,7 +149,7 @@
<string name="development_settings_summary" msgid="1815795401632854041">"Definir as opcións de desenvolvemento de aplicacións"</string>
<string name="development_settings_not_available" msgid="4308569041701535607">"As opcións de programador non están dispoñibles para este usuario"</string>
<string name="vpn_settings_not_available" msgid="956841430176985598">"A configuración da VPN non está dispoñible para este usuario"</string>
- <string name="tethering_settings_not_available" msgid="6765770438438291012">"A configuración da ancoraxe non está dispoñible para este usuario"</string>
+ <string name="tethering_settings_not_available" msgid="6765770438438291012">"A configuración da conexión compartida non está dispoñible para este usuario"</string>
<string name="apn_settings_not_available" msgid="7873729032165324000">"A configuración do nome do punto de acceso non está dispoñible para este usuario"</string>
<string name="enable_adb" msgid="7982306934419797485">"Depuración de USB"</string>
<string name="enable_adb_summary" msgid="4881186971746056635">"Modo de depuración de erros cando o USB está conectado"</string>
@@ -283,9 +281,9 @@
<string name="local_backup_password_title" msgid="3860471654439418822">"Contrasinal para copias"</string>
<string name="local_backup_password_summary_none" msgid="6951095485537767956">"As copias de seguridade de ordenador completas non están protexidas"</string>
<string name="local_backup_password_summary_change" msgid="5376206246809190364">"Toca para cambiar ou eliminar o contrasinal para as copias de seguranza completas do escritorio"</string>
- <string name="local_backup_password_toast_success" msgid="582016086228434290">"Novo contrasinal de copia de seguranza definido"</string>
+ <string name="local_backup_password_toast_success" msgid="582016086228434290">"Novo contrasinal da copia de seguranza definido"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"O contrasinal novo e a confirmación non coinciden"</string>
- <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Erro ao definir un contrasinal de copia de seguranza"</string>
+ <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Erro ao definir un contrasinal da copia de seguranza"</string>
<string-array name="color_mode_names">
<item msgid="2425514299220523812">"Brillante (predeterminado)"</item>
<item msgid="8446070607501413455">"Natural"</item>
@@ -299,17 +297,17 @@
<string name="inactive_apps_title" msgid="1317817863508274533">"Aplicacións inactivas"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Aplicación inactiva. Toca para alternar a configuración."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Aplicación activa. Toca para alternar a configuración."</string>
- <string name="runningservices_settings_title" msgid="8097287939865165213">"Servizos en execución"</string>
+ <string name="runningservices_settings_title" msgid="8097287939865165213">"En execución"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Ver e controlar servizos actualmente en execución"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Implementación de WebView"</string>
<string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Definir implementación de WebView"</string>
<string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Esta opción xa non é válida. Téntao de novo."</string>
- <string name="convert_to_file_encryption" msgid="3060156730651061223">"Converter no encriptado baseado en ficheiros"</string>
+ <string name="convert_to_file_encryption" msgid="3060156730651061223">"Cambiar a cifraxe de ficheiros"</string>
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"Converter..."</string>
<string name="convert_to_file_encryption_done" msgid="7859766358000523953">"Xa se encriptou o ficheiro"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"Convertendo no encriptado baseado en ficheiros"</string>
- <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Converte a partición de datos nun encriptado baseado en ficheiros.\n Advertencia: Esta acción borrará todos os datos.\n Esta función é alfa e quizais non funcione correctamente.\n Toca Borrar e converter... para continuar."</string>
- <string name="button_convert_fbe" msgid="5152671181309826405">"Borrar e converter..."</string>
+ <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Converte a partición de datos nunha encriptación baseada en ficheiros.\n Advertencia: Esta acción borrará todos os datos.\n Esta función é alfa e quizais non funcione correctamente.\n Para continuar, toca Limpar e converter..."</string>
+ <string name="button_convert_fbe" msgid="5152671181309826405">"Limpar e converter..."</string>
<string name="picture_color_mode" msgid="4560755008730283695">"Modo de cor da imaxe"</string>
<string name="picture_color_mode_desc" msgid="1141891467675548590">"Utiliza sRGB"</string>
<string name="daltonizer_mode_disabled" msgid="7482661936053801862">"Desactivado"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 6bde256..df9eda9 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 0341a4f..c729027 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 f9108c1..e94b6df 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -218,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 fdd34ad..d06417f 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 aeb7f46..14ba223 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,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -104,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>
@@ -301,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>
@@ -317,8 +315,8 @@
<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_title" msgid="5800761362678707872">"Գունաշտկում"</string>
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Սա փորձնական գործառույթ է և կարող է ազդել սարքի աշխատանքի վրա:"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Գերազանցված է <xliff:g id="TITLE">%1$s</xliff:g>-ից"</string>
<string name="power_remaining_duration_only" msgid="845431008899029842">"Մնացել է մոտ <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Մինչև լրիվ լիցքավորումը մնացել է <xliff:g id="TIME">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 4da60bed..733e2cb 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 a433b8d..d4fde8a 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 eef124d..14b8e37 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 9b3686d..e64e007 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -81,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>
@@ -269,12 +267,12 @@
<string name="animator_duration_scale_title" msgid="3406722410819934083">"קנה מידה למשך זמן אנימציה"</string>
<string name="overlay_display_devices_title" msgid="5364176287998398539">"צור הדמיית תצוגות משניות"</string>
<string name="debug_applications_category" msgid="4206913653849771549">"אפליקציות"</string>
- <string name="immediately_destroy_activities" msgid="1579659389568133959">"אל תשמור פעילויות"</string>
+ <string name="immediately_destroy_activities" msgid="1579659389568133959">"ללא שמירת פעילויות"</string>
<string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"השמד כל פעילות ברגע שהמשתמש עוזב אותה"</string>
<string name="app_process_limit_title" msgid="4280600650253107163">"מגבלה של תהליכים ברקע"</string>
<string name="show_all_anrs" msgid="28462979638729082">"הצג את כל פריטי ה-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>
@@ -304,12 +302,12 @@
<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>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 57f20bf..440b04d 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 bac03c7..08e6449 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -318,7 +316,7 @@
<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-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 7af0535..cc8b662 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 a8d1aa0..d299ec6 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -146,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>
@@ -301,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>
@@ -318,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 1d5c871..0120658 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -106,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>
@@ -202,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>
@@ -236,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>
@@ -301,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 3458f90..c5f842e 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 6263619..97830f0 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -78,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>
@@ -93,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>
@@ -113,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>
@@ -174,7 +172,7 @@
<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">"Канал аралык чалууну иштетүү"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP версиясы"</string>
@@ -218,7 +216,7 @@
<string name="enable_terminal_title" msgid="95572094356054120">"Жергиликтүү терминал"</string>
<string name="enable_terminal_summary" msgid="67667852659359206">"Жергиликтүү буйрук кабыгын сунуштаган терминалга уруксат берүү"</string>
<string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP текшерүү"</string>
- <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"HDCP текшерүү арактн коюу"</string>
+ <string name="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>
@@ -301,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>
@@ -351,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 2540053..5abd2a6 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 bcc884a..830abf0 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 80bbee5..5749954 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 17cff9a..f38ef5d 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 9de75e1..7194505 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 09ce7c0..c11fa9f 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 e020ca4..a45648e 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 3f264c3..6ca514b 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 6697eb1..21bc2dc 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -169,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>
@@ -218,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>
@@ -318,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-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 0be93b9..409ccab 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -308,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>
@@ -318,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 45c9d4e..8738e04 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 a9c522d..30cd8db 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 a954105..ac7d7de 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 b5edff1..7624042 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -304,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 1651384..fead9f0 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -56,10 +56,8 @@
<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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 smartphone"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Conectado ao servidor de transferência de arquivo"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index d69cc74..0059cdd 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 1651384..fead9f0 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -56,10 +56,8 @@
<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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 smartphone"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Conectado ao servidor de transferência de arquivo"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index d89858c..9504a73 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -281,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>
@@ -308,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 451cb0b..cc82236 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 03165fe..1623308 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 8df768c..a8f5566 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -105,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>
@@ -169,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>
@@ -236,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>
@@ -301,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 740a92e..085621a 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 e11c418..c9398a5 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 0f02f16..3992dbe 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -318,7 +316,7 @@
<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-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 1058a75..cfae5ae 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 fa7d028..8b24ef7 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -106,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>
@@ -308,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 1a8745f..e09db51 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 9e97748..dabf7ed 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 91ebc55..9a265f5 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 a73fb57..c46ac78 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 ae890e4..696b209 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -238,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>
@@ -282,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>
@@ -297,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 63faab2..d3f137f 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -105,10 +103,10 @@
<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>
+ <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>
@@ -304,7 +302,7 @@
<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>
@@ -329,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 67c3c13..3fceb98 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -93,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>
@@ -151,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 5d504ff..ad9dc3a 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -28,7 +28,7 @@
<string name="wifi_disabled_by_recommendation_provider" msgid="5168315140978066096">"Sifatsiz tarmoq sababli ulanib bo‘lmadi"</string>
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi ulanishini o‘rnatib bo‘lmadi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Tasdiqdan o‘tishda muammo"</string>
- <string name="wifi_not_in_range" msgid="1136191511238508967">"Aloqada emas"</string>
+ <string name="wifi_not_in_range" msgid="1136191511238508967">"Xizmat doirasidan tashqarida"</string>
<string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"Avtomatik ravishda ulanilmaydi"</string>
<string name="wifi_no_internet" msgid="3880396223819116454">"Internet aloqasi yo‘q"</string>
<string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g> tomonidan saqlangan"</string>
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 482d7ca..34dd863 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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 41c6210..43d75b3b 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -314,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 ecf7fa8..484f1d3 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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>
@@ -321,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 92b5231..050c556 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 415ddd9..d2a5743 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -56,10 +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>
- <!-- no translation found for bluetooth_profile_a2dp_high_quality (2221025895896419505) -->
- <skip />
- <!-- no translation found for bluetooth_profile_a2dp_high_quality_unknown_codec (5860996587596508755) -->
- <skip />
+ <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/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/accessibility/AccessibilityButtonHelper.java b/packages/SettingsLib/src/com/android/settingslib/accessibility/AccessibilityButtonHelper.java
index 972ea34..d5725e6 100644
--- a/packages/SettingsLib/src/com/android/settingslib/accessibility/AccessibilityButtonHelper.java
+++ b/packages/SettingsLib/src/com/android/settingslib/accessibility/AccessibilityButtonHelper.java
@@ -18,7 +18,6 @@
import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.Context;
-import android.content.res.Resources;
import android.provider.Settings;
import android.view.accessibility.AccessibilityManager;
@@ -55,8 +54,4 @@
public static boolean isRequested(Context ctx) {
return isRequestedByMagnification(ctx) || isRequestedByAccessibilityService(ctx);
}
-
- public static boolean isDeviceSupported(Resources res) {
- return res.getBoolean(com.android.internal.R.bool.config_showNavigationBar);
- }
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
index 66dfecd..443f1ee 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
@@ -1040,6 +1040,11 @@
final IPackageStatsObserver.Stub mStatsObserver = new IPackageStatsObserver.Stub() {
public void onGetStatsCompleted(PackageStats stats, boolean succeeded) {
+ if (!succeeded) {
+ // There is no meaningful information in stats if the call failed.
+ return;
+ }
+
boolean sizeChanged = false;
synchronized (mEntriesMap) {
if (DEBUG_LOCKING) Log.v(TAG, "onGetStatsCompleted acquired lock");
diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/PrivateStorageInfo.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/PrivateStorageInfo.java
index ccf7a0b..39dfe0e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/PrivateStorageInfo.java
+++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/PrivateStorageInfo.java
@@ -33,7 +33,7 @@
public final long freeBytes;
public final long totalBytes;
- private PrivateStorageInfo(long freeBytes, long totalBytes) {
+ public PrivateStorageInfo(long freeBytes, long totalBytes) {
this.freeBytes = freeBytes;
this.totalBytes = totalBytes;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index 9e9bc93..5a178a5 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();
@@ -994,9 +998,10 @@
if (mRssi != info.getRssi()) {
mRssi = info.getRssi();
updated = true;
+ } else if (mNetworkInfo.getDetailedState() != networkInfo.getDetailedState()) {
+ updated = true;
}
mInfo = info;
- // TODO(b/37289220): compare NetworkInfo states and set updated = true if necessary
mNetworkInfo = networkInfo;
} else if (mInfo != null) {
updated = true;
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index 646b6ba..be15e65 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -124,7 +124,8 @@
*/
private final Object mLock = new Object();
- //visible to both worker and main thread. Guarded by #mInternalAccessPoints
+ //visible to both worker and main thread.
+ @GuardedBy("mLock")
private final AccessPointListenerAdapter mAccessPointListenerAdapter
= new AccessPointListenerAdapter();
@@ -1005,12 +1006,13 @@
if (DBG) {
Log.d(TAG, "Starting to copy AP items on the MainHandler");
}
- if (notifyListeners) {
- notificationMap = mAccessPointListenerAdapter.mPendingNotifications.clone();
- }
-
- mAccessPointListenerAdapter.mPendingNotifications.clear();
synchronized (mLock) {
+ if (notifyListeners) {
+ notificationMap = mAccessPointListenerAdapter.mPendingNotifications.clone();
+ }
+
+ mAccessPointListenerAdapter.mPendingNotifications.clear();
+
for (AccessPoint internalAccessPoint : mInternalAccessPoints) {
AccessPoint accessPoint = oldAccessPoints.get(internalAccessPoint.mId);
if (accessPoint == null) {
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 154fde2..56cb0a3 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
@@ -404,4 +404,55 @@
assertThat(ap.getPasspointFqdn()).isEqualTo(fqdn);
assertThat(ap.getConfigName()).isEqualTo(providerFriendlyName);
}
+
+ @Test
+ public void testUpdateNetworkInfo_returnsTrue() {
+ int networkId = 123;
+ int rssi = -55;
+ WifiConfiguration config = new WifiConfiguration();
+ config.networkId = networkId;
+ WifiInfo wifiInfo = new WifiInfo();
+ wifiInfo.setNetworkId(networkId);
+ wifiInfo.setRssi(rssi);
+
+ NetworkInfo networkInfo =
+ new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0 /* subtype */, "WIFI", "");
+ networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTING, "", "");
+
+ AccessPoint ap = new TestAccessPointBuilder(mContext)
+ .setNetworkInfo(networkInfo)
+ .setNetworkId(networkId)
+ .setRssi(rssi)
+ .setWifiInfo(wifiInfo)
+ .build();
+
+ NetworkInfo newInfo = new NetworkInfo(networkInfo);
+ newInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, "", "");
+ assertThat(ap.update(config, wifiInfo, newInfo)).isTrue();
+ }
+
+ @Test
+ public void testUpdateNetworkInfoWithSameInfo_returnsFalse() {
+ int networkId = 123;
+ int rssi = -55;
+ WifiConfiguration config = new WifiConfiguration();
+ config.networkId = networkId;
+ WifiInfo wifiInfo = new WifiInfo();
+ wifiInfo.setNetworkId(networkId);
+ wifiInfo.setRssi(rssi);
+
+ NetworkInfo networkInfo =
+ new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0 /* subtype */, "WIFI", "");
+ networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTING, "", "");
+
+ AccessPoint ap = new TestAccessPointBuilder(mContext)
+ .setNetworkInfo(networkInfo)
+ .setNetworkId(networkId)
+ .setRssi(rssi)
+ .setWifiInfo(wifiInfo)
+ .build();
+
+ NetworkInfo newInfo = new NetworkInfo(networkInfo); // same values
+ assertThat(ap.update(config, wifiInfo, newInfo)).isFalse();
+ }
}
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/TestAccessPointBuilder.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
index a347203..2213ae6 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
@@ -20,6 +20,7 @@
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
import android.os.Bundle;
/**
@@ -36,11 +37,13 @@
// set some sensible defaults
private int mRssi = AccessPoint.UNREACHABLE_RSSI;
- private int networkId = WifiConfiguration.INVALID_NETWORK_ID;
+ private int mNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
private String ssid = "TestSsid";
private NetworkInfo mNetworkInfo = null;
private String mFqdn = null;
private String mProviderFriendlyName = null;
+ private WifiConfiguration mWifiConfig;
+ private WifiInfo mWifiInfo;
Context mContext;
@@ -51,12 +54,13 @@
public AccessPoint build() {
Bundle bundle = new Bundle();
- WifiConfiguration wifiConig = new WifiConfiguration();
- wifiConig.networkId = networkId;
+ WifiConfiguration wifiConfig = new WifiConfiguration();
+ wifiConfig.networkId = mNetworkId;
bundle.putString(AccessPoint.KEY_SSID, ssid);
- bundle.putParcelable(AccessPoint.KEY_CONFIG, wifiConig);
+ bundle.putParcelable(AccessPoint.KEY_CONFIG, wifiConfig);
bundle.putParcelable(AccessPoint.KEY_NETWORKINFO, mNetworkInfo);
+ bundle.putParcelable(AccessPoint.KEY_WIFIINFO, mWifiInfo);
if (mFqdn != null) {
bundle.putString(AccessPoint.KEY_FQDN, mFqdn);
}
@@ -81,17 +85,12 @@
return this;
}
- public TestAccessPointBuilder setRssi(int rssi) {
- mRssi = rssi;
- return this;
- }
-
/**
- * Set the rssi based upon the desired signal level.
+ * Set the rssi based upon the desired signal level.
*
- * <p>Side effect: if this AccessPoint was previously unreachable,
- * setting the level will also make it reachable.
- */
+ * <p>Side effect: if this AccessPoint was previously unreachable,
+ * setting the level will also make it reachable.
+ */
public TestAccessPointBuilder setLevel(int level) {
// Reversal of WifiManager.calculateSignalLevels
if (level == 0) {
@@ -106,6 +105,16 @@
return this;
}
+ public TestAccessPointBuilder setNetworkInfo(NetworkInfo info) {
+ mNetworkInfo = info;
+ return this;
+ }
+
+ public TestAccessPointBuilder setRssi(int rssi) {
+ mRssi = rssi;
+ return this;
+ }
+
/**
* Set whether the AccessPoint is reachable.
* Side effect: if the signal level was not previously set,
@@ -125,9 +134,9 @@
public TestAccessPointBuilder setSaved(boolean saved){
if (saved) {
- networkId = 1;
+ mNetworkId = 1;
} else {
- networkId = WifiConfiguration.INVALID_NETWORK_ID;
+ mNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
}
return this;
}
@@ -146,4 +155,20 @@
mProviderFriendlyName = friendlyName;
return this;
}
+
+ public TestAccessPointBuilder setWifiInfo(WifiInfo info) {
+ mWifiInfo = info;
+ return this;
+ }
+
+ /**
+ * Set the networkId in the WifiConfig.
+ *
+ * <p>Setting this to a value other than {@link WifiConfiguration#INVALID_NETWORK_ID} makes this
+ * AccessPoint a saved network.
+ */
+ public TestAccessPointBuilder setNetworkId(int networkId) {
+ mNetworkId = networkId;
+ return this;
+ }
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 48429e8..4b304b2 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -35,6 +35,7 @@
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
+import android.content.res.Resources;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.database.sqlite.SQLiteDatabase;
@@ -185,6 +186,26 @@
private static final Bundle NULL_SETTING_BUNDLE = Bundle.forPair(
Settings.NameValueTable.VALUE, null);
+ // Overlay specified settings whitelisted for Instant Apps
+ private static final Set<String> OVERLAY_ALLOWED_GLOBAL_INSTANT_APP_SETTINGS = new ArraySet<>();
+ private static final Set<String> OVERLAY_ALLOWED_SYSTEM_INSTANT_APP_SETTINGS = new ArraySet<>();
+ private static final Set<String> OVERLAY_ALLOWED_SECURE_INSTANT_APP_SETTINGS = new ArraySet<>();
+
+ static {
+ for (String name : Resources.getSystem().getStringArray(
+ com.android.internal.R.array.config_allowedGlobalInstantAppSettings)) {
+ OVERLAY_ALLOWED_GLOBAL_INSTANT_APP_SETTINGS.add(name);
+ }
+ for (String name : Resources.getSystem().getStringArray(
+ com.android.internal.R.array.config_allowedSystemInstantAppSettings)) {
+ OVERLAY_ALLOWED_SYSTEM_INSTANT_APP_SETTINGS.add(name);
+ }
+ for (String name : Resources.getSystem().getStringArray(
+ com.android.internal.R.array.config_allowedSecureInstantAppSettings)) {
+ OVERLAY_ALLOWED_SECURE_INSTANT_APP_SETTINGS.add(name);
+ }
+ }
+
// Changes to these global settings are synchronously persisted
private static final Set<String> CRITICAL_GLOBAL_SETTINGS = new ArraySet<>();
static {
@@ -1629,6 +1650,19 @@
}
}
+ private Set<String> getOverlayInstantAppAccessibleSettings(int settingsType) {
+ switch (settingsType) {
+ case SETTINGS_TYPE_GLOBAL:
+ return OVERLAY_ALLOWED_GLOBAL_INSTANT_APP_SETTINGS;
+ case SETTINGS_TYPE_SYSTEM:
+ return OVERLAY_ALLOWED_SYSTEM_INSTANT_APP_SETTINGS;
+ case SETTINGS_TYPE_SECURE:
+ return OVERLAY_ALLOWED_SECURE_INSTANT_APP_SETTINGS;
+ default:
+ throw new IllegalArgumentException("Invalid settings type: " + settingsType);
+ }
+ }
+
private List<String> getSettingsNamesLocked(int settingsType, int userId) {
boolean instantApp;
if (UserHandle.getAppId(Binder.getCallingUid()) < Process.FIRST_APPLICATION_UID) {
@@ -1652,7 +1686,8 @@
if (!ai.isInstantApp()) {
return;
}
- if (!getInstantAppAccessibleSettings(settingsType).contains(settingName)) {
+ if (!getInstantAppAccessibleSettings(settingsType).contains(settingName)
+ && !getOverlayInstantAppAccessibleSettings(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/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index bf39bc4..490bee4 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -539,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/plugin/src/com/android/systemui/plugins/doze/DozeProvider.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/doze/DozeProvider.java
deleted file mode 100644
index 0688481..0000000
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/doze/DozeProvider.java
+++ /dev/null
@@ -1,102 +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 com.android.systemui.plugins.doze;
-
-import android.app.PendingIntent;
-import android.content.Context;
-
-import com.android.systemui.plugins.Plugin;
-import com.android.systemui.plugins.annotations.ProvidesInterface;
-
-/**
- * Provides a {@link DozeUi}.
- */
-@ProvidesInterface(action = DozeProvider.ACTION, version = DozeProvider.VERSION)
-public interface DozeProvider extends Plugin {
-
- String ACTION = "com.android.systemui.action.PLUGIN_DOZE";
- int VERSION = 1;
-
- /**
- * Caution: Even if this is called, the DozeUi provided may still be in use until it transitions
- * to DozeState.FINISH
- */
- @Override
- default void onDestroy() {
- }
-
- /**
- * @return the plugin's implementation of DozeUi.
- */
- DozeUi provideDozeUi(Context context, DozeMachine machine, WakeLock wakeLock);
-
- /**
- * If true, the plugin allows the default pulse triggers to fire, otherwise they are disabled.
- */
- default boolean allowDefaultPulseTriggers() {
- return false;
- }
-
- /**
- * Ui for use in DozeMachine.
- */
- interface DozeUi {
- /** Called whenever the DozeMachine state transitions */
- void transitionTo(DozeState oldState, DozeState newState);
- }
-
- /** WakeLock wrapper for testability */
- interface WakeLock {
- /** @see android.os.PowerManager.WakeLock#acquire() */
- void acquire();
- /** @see android.os.PowerManager.WakeLock#release() */
- void release();
- /** @see android.os.PowerManager.WakeLock#wrap(Runnable) */
- Runnable wrap(Runnable r);
- }
-
- /** Plugin version of the DozeMachine's state */
- enum DozeState {
- /** Default state. Transition to INITIALIZED to get Doze going. */
- UNINITIALIZED,
- /** Doze components are set up. Followed by transition to DOZE or DOZE_AOD. */
- INITIALIZED,
- /** Regular doze. Device is asleep and listening for pulse triggers. */
- DOZE,
- /** Always-on doze. Device is asleep, showing UI and listening for pulse triggers. */
- DOZE_AOD,
- /** Pulse has been requested. Device is awake and preparing UI */
- DOZE_REQUEST_PULSE,
- /** Pulse is showing. Device is awake and showing UI. */
- DOZE_PULSING,
- /** Pulse is done showing. Followed by transition to DOZE or DOZE_AOD. */
- DOZE_PULSE_DONE,
- /** Doze is done. DozeService is finished. */
- FINISH,
- /** WakeUp. */
- WAKE_UP,
- }
-
- /** Plugin interface for the doze machine. */
- interface DozeMachine {
- /** Request that the DozeMachine transitions to {@code state} */
- void requestState(DozeState state);
-
- /** Request that the PendingIntent is sent. */
- void requestSendIntent(PendingIntent intent);
- }
-}
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
index 7d78c08..9ef05c5 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
@@ -16,6 +16,7 @@
import android.content.Context;
import android.graphics.drawable.Drawable;
+import android.metrics.LogMaker;
import android.service.quicksettings.Tile;
import com.android.systemui.plugins.annotations.DependsOn;
@@ -66,6 +67,10 @@
State getState();
+ default LogMaker populate(LogMaker logMaker) {
+ return logMaker;
+ }
+
@ProvidesInterface(version = Callback.VERSION)
public interface Callback {
public static final int VERSION = 1;
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-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml
index 8812830..486b46c 100644
--- a/packages/SystemUI/res-keyguard/values-da/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-da/strings.xml
@@ -36,7 +36,7 @@
<string name="keyguard_low_battery" msgid="9218432555787624490">"Tilslut din oplader."</string>
<string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"Tryk på menuen for at låse op."</string>
<string name="keyguard_network_locked_message" msgid="6743537524631420759">"Netværket er låst"</string>
- <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Der er ikke noget SIM-kort"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"Intet SIM-kort"</string>
<string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Der er ikke noget SIM-kort i denne tablet."</string>
<string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Der er ikke noget SIM-kort i telefonen."</string>
<string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Indsæt et SIM-kort."</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-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml
index 16362a8..e822382 100644
--- a/packages/SystemUI/res-keyguard/values-uz/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml
@@ -39,8 +39,8 @@
<string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"SIM karta yo‘q"</string>
<string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"Planshetingizda SIM karta yo‘q."</string>
<string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"Telefoningizda SIM karta yo‘q."</string>
- <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Telefonga SIM kartani joylashtiring."</string>
- <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM karta qo‘yilmagan yoki o‘qib bo‘lmayapti. SIM kartani joylashtiring."</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"Telefonga SIM karta soling."</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"SIM karta solinmagan yoki u yaroqsiz. SIM karta soling."</string>
<string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"Foydalanib bo‘lmaydigan SIM karta."</string>
<string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"SIM kartangiz butunlay bloklab qo‘yilgan.\n Yangi SIM karta olish uchun aloqa operatoringiz bilan bog‘laning."</string>
<string name="keyguard_sim_locked_message" msgid="953766009432168127">"SIM karta qulflangan."</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 6b4a2b2..f29e40f 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -403,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Tot <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Hou"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Vervang"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 0db214e..a660283 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"እስከ <xliff:g id="ID_1">%s</xliff:g> ድረስ"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"አቆይ"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"ተካ"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 3a18700..d4347a6 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -161,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -716,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -780,4 +777,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"حتى <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"الإبقاء على الإعدادات"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"استبدال"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 43c7f77..0f005a1 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> vaxtına qədər"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Saxlayın"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Əvəz edin"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 92a964d..dd26970 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -158,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -704,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -768,4 +765,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Do <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Zadrži"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Zameni"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 9c1c657..68adda6 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -159,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -710,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -774,4 +771,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Да <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Пакінуць"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Замяніць"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 96fec7b..85335c9 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -306,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"До <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Запазване"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Замяна"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index a6f49ae..abe5a43 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -191,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> পর্যন্ত"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"রাখুন"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"বদলে দিন"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index b5b7340..377cb1f 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -158,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -304,7 +303,7 @@
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Prebacivanje"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Prebacivanje"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Neimenovani uređaj"</string>
- <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Spreman za prebacivanje"</string>
+ <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Spreman za emitiranje"</string>
<string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"Nema dostupnih uređaja"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Osvjetljenje"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
@@ -352,10 +351,10 @@
<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>
+ <string name="zen_priority_introduction" msgid="3070506961866919502">"Neće vas ometati zvukovi i vibracije, osim alarma, podsjetnika, događaja i pozivalaca koje odredite."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Prilagodi"</string>
<string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Ovim se blokiraju SVI zvukovi i vibracije, uključujući alarme, muziku, videozapise i igre. I dalje ćete moći obavljati pozive."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Ovim se blokiraju SVI zvukovi i vibracije, uključujući alarme, muziku, video zapise i igre."</string>
@@ -660,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>
@@ -668,7 +667,7 @@
<string name="right_keycode" msgid="708447961000848163">"Kôd tipke desno"</string>
<string name="left_icon" msgid="3096287125959387541">"Ikona lijevo"</string>
<string name="right_icon" msgid="3952104823293824311">"Ikona desno"</string>
- <string name="drag_to_add_tiles" msgid="7058945779098711293">"Povucite da dodate polja"</string>
+ <string name="drag_to_add_tiles" msgid="7058945779098711293">"Prevucite da dodate pločice"</string>
<string name="drag_to_remove_tiles" msgid="3361212377437088062">"Prevucite ovdje za uklanjanje"</string>
<string name="qs_edit" msgid="2232596095725105230">"Uredi"</string>
<string name="tuner_time" msgid="6572217313285536011">"Vrijeme"</string>
@@ -706,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -754,7 +751,7 @@
<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>
@@ -770,4 +767,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Do <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Zadrži"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Zamijeni"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 05dd331..2262afc 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -199,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>
@@ -274,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>
@@ -353,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>
@@ -429,7 +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>
- <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Gestió de dispositius"</string>
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Fins a les <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Conserva"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Substitueix"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index c73655f..1b3eec1 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -159,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -710,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -774,4 +771,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Do <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Zachovat"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Nahradit"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index d8f7c22..295fc27 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -157,8 +157,7 @@
<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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -719,8 +716,8 @@
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimer"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Luk"</string>
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Træk nedad for at afvise"</string>
- <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_menu_title" msgid="3328510504196964712">"Menu for integreret billede"</string>
+ <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> vises som integreret 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>
<string name="pip_play" msgid="1417176722760265888">"Afspil"</string>
<string name="pip_pause" msgid="8881063404466476571">"Sæt på pause"</string>
@@ -753,7 +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>
- <string name="go_to_web" msgid="1106022723459948514">"Gå til internettet"</string>
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Indtil <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Behold"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Erstat"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 1e85c90..bf6abe3 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -446,8 +445,8 @@
<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>
- <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Du bist mit <xliff:g id="VPN_APP">%1$s</xliff:g> verbunden. Die VPN-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 VPN-Apps können deine Netzwerkaktivitäten (E-Mails, Apps und Websites) erfassen."</string>
+ <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>
@@ -702,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -766,4 +763,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Bis <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Beibehalten"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Ersetzen"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 6db0af0..0359519 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -467,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Έως τις <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Διατήρηση"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Αντικατάσταση"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index f4b75a3..03829e2 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -331,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>
@@ -526,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>
@@ -610,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Until <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Keep"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Replace"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index f4b75a3..03829e2 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -331,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>
@@ -526,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>
@@ -610,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Until <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Keep"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Replace"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index f4b75a3..03829e2 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -331,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>
@@ -526,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>
@@ -610,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Until <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Keep"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Replace"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index a51b090..298770e 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -624,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>
@@ -702,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -759,11 +756,15 @@
<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>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index cbeb40a..be4bfbb 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,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -546,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>
@@ -635,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>
@@ -702,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -766,4 +763,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Hasta <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Conservar"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Reemplazar"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 8424bba..a47bae8 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -197,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>
@@ -515,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>
@@ -702,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -766,4 +763,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Kuni ajani <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Säilita"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Asenda"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index bc13bcf..a060359 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -405,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>
@@ -440,8 +439,8 @@
<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>
- <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 kudeatu egin 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 kudeatu egin ditzake ezarpenak, enpresa-sarbidea, aplikazioak, gailuarekin erlazionatutako datuak eta gailuaren kokapen-informazioa.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan."</string>
+ <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>
@@ -702,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -766,4 +763,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> arte"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Utzi bere horretan"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Ordeztu"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 4c598d7..2d72800 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"تا <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"حفظ شود"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"جایگزین کردن"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 1710f40..7e93185 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> asti"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Säilytä"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Korvaa"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index a3560c3..524d5d1 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -355,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>
@@ -702,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -766,4 +763,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Jusqu\'à <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Garder"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Remplacer"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index e00c0e9..1840035 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -355,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>
@@ -702,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -766,4 +763,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Jusqu\'à <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Conserver"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Remplacer"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index df63037..58ff26f 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -34,7 +34,7 @@
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificacións"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Queda pouca batería"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> restante"</string>
- <string name="battery_low_percent_format_saver_started" msgid="6859235584035338833">"<xliff:g id="PERCENTAGE">%s</xliff:g> restante. A función aforro de batería está activada."</string>
+ <string name="battery_low_percent_format_saver_started" msgid="6859235584035338833">"<xliff:g id="PERCENTAGE">%s</xliff:g> restante. A función de aforro da batería está activada."</string>
<string name="invalid_charger" msgid="4549105996740522523">"Non compatible coa carga por USB.\nUtiliza só o cargador proporcionado."</string>
<string name="invalid_charger_title" msgid="3515740382572798460">"Non se admite a carga mediante USB."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Utiliza soamente o cargador fornecido."</string>
@@ -48,7 +48,7 @@
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"APAGAR"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
<string name="status_bar_settings_notifications" msgid="397146176280905137">"Notificacións"</string>
- <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth ancorado"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"Conexión compartida por Bluetooth"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Configurar métodos de entrada"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Teclado físico"</string>
<string name="usb_device_permission_prompt" msgid="834698001271562057">"Queres permitir que a aplicación <xliff:g id="APPLICATION">%1$s</xliff:g> acceda ao dispositivo USB?"</string>
@@ -155,10 +155,9 @@
<string name="accessibility_cell_data" msgid="5326139158682385073">"Datos móbiles"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"Os datos móbiles están activados"</string>
<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_bluetooth_tether" msgid="4102784498140271969">"Conexión compartida por Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Modo avión"</string>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -230,8 +229,8 @@
<string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Activouse a lanterna."</string>
<string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"Desactivouse a inversión da cor."</string>
<string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"Activouse a inversión da cor."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Desactivouse a zona interactiva móbil."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Activouse a zona interactiva móbil."</string>
+ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Desactivouse a zona wifi móbil."</string>
+ <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Activouse a zona wifi móbil."</string>
<string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Detívose a emisión en pantalla."</string>
<string name="accessibility_quick_settings_work_mode_off" msgid="7045417396436552890">"Modo de traballo desactivado."</string>
<string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Modo de traballo activado."</string>
@@ -314,7 +313,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Feito"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Conectado"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Conectando..."</string>
- <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Ancoraxe á rede"</string>
+ <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Conexión compartida"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona wifi"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notificacións"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lanterna"</string>
@@ -355,7 +354,7 @@
<string name="description_target_search" msgid="3091587249776033139">"Buscar"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Pasa o dedo cara arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Pasa o dedo cara a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="3070506961866919502">"Non te molestará ningún son nin vibración, agás os procedentes de alarmas, recordatorios, eventos de emisores de chamada especificados."</string>
+ <string name="zen_priority_introduction" msgid="3070506961866919502">"Non te molestará ningún son nin vibración, agás os procedentes de alarmas, recordatorios, eventos e os emisores de chamada especificados."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string>
<string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Esta acción bloquea TODOS os sons e vibracións, incluídos os das alarmas, música, vídeos e xogos. Aínda podes facer chamadas de teléfono."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Esta acción bloquea TODOS os sons e vibracións, incluídos os das alarmas, música, vídeos e xogos."</string>
@@ -578,7 +577,7 @@
<string name="snooze_undo" msgid="6074877317002985129">"DESFACER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Adiouse <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Uso de batería"</string>
- <string name="battery_detail_charging_summary" msgid="1279095653533044008">"A función aforro de batería non está dispoñible durante a carga"</string>
+ <string name="battery_detail_charging_summary" msgid="1279095653533044008">"A función de aforro da batería non está dispoñible durante a carga"</string>
<string name="battery_detail_switch_title" msgid="6285872470260795421">"Aforro de batería"</string>
<string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduce o rendemento e os datos en segundo plano"</string>
<string name="keyboard_key_button_template" msgid="6230056639734377300">"Botón <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -702,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -754,7 +751,7 @@
<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>
+ <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>
@@ -766,4 +763,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Ata: <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Manter"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Substituír"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 3e4d7dc..685359d 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> સુધી"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"રાખો"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"બદલો"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 82187ce..d6275c3 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> तक"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"रखें"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"बदलें"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index d2bf0c7..9b3cf36 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -158,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -308,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>
@@ -704,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -768,4 +765,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Do <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Zadrži"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Zamijeni"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index a074408..34f7d07 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -157,8 +157,7 @@
<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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -359,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>
@@ -606,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Eddig: <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Megtartás"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Csere"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 11167d6..703c17f 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,13 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -202,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>
@@ -265,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>
@@ -307,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>
@@ -353,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>
@@ -367,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>
@@ -406,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>
@@ -611,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>
@@ -622,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Մինչև <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Պահել"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Փոխարինել"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 5f776f0..b48d4a5 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Hingga <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Simpan"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Ganti"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 4ba685d..e5d1c33 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Þar til <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Halda"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Skipta út"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index b4cf6d5..2b08202 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -702,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -766,4 +763,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Fino alle ore <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Mantieni"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Sostituisci"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 3e864ed..e73be80 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -130,7 +130,7 @@
<string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"אתרנט מנותק."</string>
<string name="accessibility_ethernet_connected" msgid="2692130313069182636">"אתרנט מחובר."</string>
<string name="accessibility_no_signal" msgid="7064645320782585167">"אין אות."</string>
- <string name="accessibility_not_connected" msgid="6395326276213402883">"לא מחובר."</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"אין חיבור."</string>
<string name="accessibility_zero_bars" msgid="3806060224467027887">"אפס פסים."</string>
<string name="accessibility_one_bar" msgid="1685730113192081895">"פס אחד."</string>
<string name="accessibility_two_bars" msgid="6437363648385206679">"שני פסים."</string>
@@ -159,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -298,7 +297,7 @@
<string name="quick_settings_user_title" msgid="4467690427642392403">"משתמש"</string>
<string name="quick_settings_user_new_user" msgid="9030521362023479778">"משתמש חדש"</string>
<string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
- <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"לא מחובר"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"אין חיבור"</string>
<string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"אין רשת"</string>
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi כבוי"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi פועל"</string>
@@ -310,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>
@@ -357,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>
@@ -384,7 +383,7 @@
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"החלף משתמש. המשתמש הנוכחי הוא <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"משתמש נוכחי <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"הצג פרופיל"</string>
- <string name="user_add_user" msgid="5110251524486079492">"הוסף משתמש"</string>
+ <string name="user_add_user" msgid="5110251524486079492">"הוספת משתמש"</string>
<string name="user_new_user_name" msgid="426540612051178753">"משתמש חדש"</string>
<string name="guest_nickname" msgid="8059989128963789678">"אורח"</string>
<string name="guest_new_guest" msgid="600537543078847803">"הוסף אורח"</string>
@@ -573,7 +572,7 @@
<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>
@@ -581,7 +580,7 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 דקות"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 דקות"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"שעה אחת"</string>
- <string name="snooze_undo" msgid="6074877317002985129">"בטל"</string>
+ <string name="snooze_undo" msgid="6074877317002985129">"ביטול"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"נדחה לטיפול בעוד <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"שימוש בסוללה"</string>
<string name="battery_detail_charging_summary" msgid="1279095653533044008">"תכונת החיסכון בסוללה אינה זמינה בעת טעינת המכשיר"</string>
@@ -615,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>
@@ -638,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>
@@ -670,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>
@@ -708,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -772,4 +769,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"עד <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"שמור"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"החלף"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 011f439..03ff5c8 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -702,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -766,4 +763,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"終了時間: <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"設定を維持"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"設定を変更"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 4d2b4b4..7896f9c 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -662,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g>-მდე"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"შენარჩუნება"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"ჩანაცვლება"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 6041c36..038f461 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> дейін"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Қалсын"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Ауыстыру"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index f48d064..cad0182 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -353,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"រហូតដល់ <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"រក្សានៅដដែល"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"ជំនួស"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 97b4676..a821347 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -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>
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -249,7 +248,7 @@
<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">
@@ -283,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>
@@ -538,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>
@@ -688,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> ತನಕ"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"ಇರಿಸಿ"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"ಬದಲಿಸಿ"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 58e1e7c..e7446cd 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -702,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -766,4 +763,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g>까지"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"유지"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"바꾸기"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 7f2a25a..2beef3e 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -288,7 +287,7 @@
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"Медиа түзмөгү"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
<string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Куткаруучуларга чалуу гана"</string>
- <string name="quick_settings_settings_label" msgid="5326556592578065401">"Тууралоолор"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"Жөндөөлөр"</string>
<string name="quick_settings_time_label" msgid="4635969182239736408">"Убакыт"</string>
<string name="quick_settings_user_label" msgid="5238995632130897840">"Мен"</string>
<string name="quick_settings_user_title" msgid="4467690427642392403">"Колдонуучу"</string>
@@ -317,7 +316,7 @@
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Эскертмелер"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Кол чырак"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобилдик Интернет"</string>
- <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Дайындардын колдонулушу"</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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -754,7 +751,7 @@
<string name="instant_apps_message" msgid="8116608994995104836">"Ыкчам ачылуучу колдонмолорду орнотуу талап кылынбайт."</string>
<string name="app_info" msgid="6856026610594615344">"Колдонмо тууралуу"</string>
<string name="go_to_web" msgid="1106022723459948514">"Интернетке өтүү"</string>
- <string name="mobile_data" msgid="7094582042819250762">"Мобилдик дайындар"</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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> чейин"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Ушундай калтыруу"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Алмаштыруу"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index f9a1e874..ee263fa 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -306,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>
@@ -355,7 +354,7 @@
<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_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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"ຈົນຮອດ <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"ເກັບໄວ້"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"ແທນທີ່"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index f625eb6..e9374db 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -159,8 +159,7 @@
<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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -708,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -772,4 +769,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Iki <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Palikti"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Pakeisti"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index a42b440..a364b20 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -158,8 +158,7 @@
<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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -704,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -768,4 +765,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Līdz: <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Paturēt"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Aizstāt"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 673dbed..577b6c2 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -664,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"До <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Задржи"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Замени"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 20006d0..d4a448a 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>
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> വരെ"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"സൂക്ഷിക്കുക"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"മാറ്റിസ്ഥാപിക്കുക"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index f4ad8d4..73cfe2a 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -155,8 +155,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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> хүртэл"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Хадгалах"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Солих"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 930c0f0..80c7105 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -438,14 +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>
- <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_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>
- <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_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>
@@ -543,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> पर्यंत"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"ठेवा"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"पुनर्स्थित करा"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 01d1b24..9979ee9 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -157,8 +157,7 @@
<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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Hingga <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Simpan"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Gantikan"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index b8aa18f..b7240c4 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -155,10 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -298,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>
@@ -479,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -728,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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> အထိ"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"သိမ်းထားရန်"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"အစားထိုးရန်"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 353ff57..f1ea1b4 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -298,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>
@@ -662,7 +661,7 @@
<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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Til <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Behold"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Erstatt"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 293805b..750ea66 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -654,7 +653,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> सम्म"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"राख्नुहोस्"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"प्रतिस्थापन गर्नुहोस्"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index a9787d1..7bda230 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -157,8 +157,7 @@
<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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -194,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>
@@ -359,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>
@@ -577,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>
@@ -625,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Tot <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Behouden"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Vervangen"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 0b74ae7..bfdd66f 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> ਤੱਕ"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"ਰੱਖੋ"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"ਬਦਲੋ"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 9238519..3f6f2eb 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -159,8 +159,7 @@
<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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -359,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>
@@ -708,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -772,4 +769,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Do: <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Zachowaj"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Zastąp"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 7c99fc8..a1dc89b 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -702,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -766,4 +763,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Até <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Manter"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Substituir"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 0399c4e..c485e68 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Até à(s) <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Manter"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Substituir"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 7c99fc8..a1dc89b 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -702,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -766,4 +763,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Até <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Manter"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Substituir"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 1e04da1..a2aab3a 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -158,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -706,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -770,4 +767,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Până la <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Păstrați"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Înlocuiți"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 7ed059f..79dc9ad 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -159,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -280,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>
@@ -405,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>
@@ -710,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -774,4 +771,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"До <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Сохранить"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Заменить"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index a112f52..970f909 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> දක්වා"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"තබන්න"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"ප්රතිස්ථාපනය"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index ca50c67..3bb08ad 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -159,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -235,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>
@@ -359,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>
@@ -710,15 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -746,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>
@@ -764,7 +761,7 @@
<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>
<string name="go_to_web" msgid="1106022723459948514">"Prejsť na internet"</string>
- <string name="mobile_data" msgid="7094582042819250762">"Mobilné dátové prenosy"</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>
@@ -774,4 +771,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Do <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Ponechať"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Nahradiť"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index e4e6361..1b19346 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -159,8 +159,7 @@
<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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -221,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>
@@ -710,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -774,4 +771,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Do <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Obdrži"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Zamenjaj"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index e10063b..12ef7e4 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -616,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Deri në <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Mbaj"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Zëvendëso"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 577281a..a95d9ce 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -158,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -704,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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,4 +765,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"До <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Задржи"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Замени"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 8a3dad79..ca067d9 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Till <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Behåll"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Ersätt"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 0c32105..9367c8d 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -156,9 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -217,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>
@@ -354,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>
@@ -399,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>
@@ -611,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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 kuonyesha 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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Hadi <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Usibadilishe"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Badilisha"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index e82c7c56..0a0acdb 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> வரை"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"வைத்திரு"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"மாற்று"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 2a6ddd8..5cdb830 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -444,7 +443,7 @@
<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>
- <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"మీరు <xliff:g id="VPN_APP">%1$s</xliff:g>కి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ వ్యక్తిగత నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."</string>
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> వరకు"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"ఉంచు"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"భర్తీ చేయి"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 68222d9..d68a9a8 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"จนถึง <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"เก็บไว้"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"แทนที่"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 645711d..5dc3e78 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -157,8 +157,7 @@
<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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Hanggang <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Panatilihin"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Palitan"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 4ee3a65..ce01e29 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -157,8 +157,7 @@
<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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -199,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>
@@ -494,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>
@@ -688,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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Bitiş: <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Koru"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Değiştir"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 9f7c50c..ba60ba6 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -159,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -664,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>
@@ -710,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -774,4 +771,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"До <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Залишити"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Замінити"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 3737e0e..545ff66 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -155,10 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -306,13 +305,13 @@
<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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> تک"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"رکھیں"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"بدلیں"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 84ba6be..23716ac 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -504,8 +503,8 @@
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Ovoz balandligini boshqarish tugmalari ko‘rsatilgan: %s. Yopish uchun tepaga suring."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ovoz balandligini boshqarish tugmalari yashirilgan"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"SystemUI Tuner"</string>
- <string name="show_battery_percentage" msgid="5444136600512968798">"Batareya foizi ko‘rsatilsin"</string>
- <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Batareya quvvat olmayotgan vaqtda uning foizi holat qatorida ko‘rsatilsin"</string>
+ <string name="show_battery_percentage" msgid="5444136600512968798">"Batareya foizini chiqarish"</string>
+ <string name="show_battery_percentage_summary" msgid="3215025775576786037">"Quvvat olmayotgan vaqtda batareya foizi holat qatorida chiqib turadi"</string>
<string name="quick_settings" msgid="10042998191725428">"Tezkor sozlamalar"</string>
<string name="status_bar" msgid="4877645476959324760">"Holat qatori"</string>
<string name="overview" msgid="4018602013895926956">"Umumiy ma’lumot"</string>
@@ -702,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -766,4 +763,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"<xliff:g id="ID_1">%s</xliff:g> gacha"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Saqlab qolish"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Almashtirish"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 4d27b45..476098a 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -157,8 +157,7 @@
<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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -702,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -766,4 +763,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Cho tới <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Giữ"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Thay thế"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 90e821e..6b751ec 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"直到<xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"保留"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"替换"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index a63316a..95c9356 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -285,8 +284,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>
@@ -702,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -766,4 +763,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"直至<xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"保留"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"取代"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 23605d4..9a0c13e 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -157,8 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"直到 <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"保留"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"取代"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
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 944555a..6981bbd 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,12 +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>
- <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
- <skip />
+ <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>
@@ -700,10 +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>
- <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
- <skip />
- <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
- <skip />
+ <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>
@@ -764,4 +761,8 @@
<string name="qs_dnd_until" msgid="3469471136280079874">"Kuze kube-<xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Gcina"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Buyisela"</string>
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index cdb5af9..f072849 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -130,6 +130,9 @@
<!-- size at which Notification icons will be drawn in the status bar -->
<dimen name="status_bar_icon_drawing_size">17dp</dimen>
+ <!-- size at which Notification icons will be drawn on Ambient Display -->
+ <dimen name="status_bar_icon_drawing_size_dark">@*android:dimen/notification_header_icon_size_ambient</dimen>
+
<!-- opacity at which Notification icons will be drawn in the status bar -->
<item type="dimen" name="status_bar_icon_drawing_alpha">90%</item>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 9097c53..bf70c5a 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -2030,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/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..49e780c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/ForegroundServicesDialog.java
@@ -0,0 +1,207 @@
+/*
+ * 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.IconDrawableFactory;
+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;
+ final IconDrawableFactory mIconDrawableFactory;
+
+ public PackageItemAdapter(Context context) {
+ super(context, R.layout.foreground_service_item);
+ mPm = context.getPackageManager();
+ mInflater = LayoutInflater.from(context);
+ mIconDrawableFactory = IconDrawableFactory.newInstance(context, true);
+ }
+
+ 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(mIconDrawableFactory.getBadgedIcon(getItem(position)));
+
+ 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/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
index ba8e54a..eea09df 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
@@ -18,23 +18,18 @@
import android.app.AlarmManager;
import android.app.Application;
-import android.app.PendingIntent;
import android.content.Context;
import android.hardware.SensorManager;
import android.os.Handler;
import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.systemui.SystemUIApplication;
-import com.android.systemui.plugins.doze.DozeProvider;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.wakelock.WakeLock;
public class DozeFactory {
- private final DozeProvider mDozePlugin;
-
- public DozeFactory(DozeProvider plugin) {
- mDozePlugin = plugin;
+ public DozeFactory() {
}
/** Creates a DozeMachine with its parts for {@code dozeService}. */
@@ -65,89 +60,14 @@
private DozeTriggers createDozeTriggers(Context context, SensorManager sensorManager,
DozeHost host, AmbientDisplayConfiguration config, DozeParameters params,
Handler handler, WakeLock wakeLock, DozeMachine machine) {
- boolean allowPulseTriggers = mDozePlugin == null || mDozePlugin.allowDefaultPulseTriggers();
+ boolean allowPulseTriggers = true;
return new DozeTriggers(context, machine, host, config, params,
sensorManager, handler, wakeLock, allowPulseTriggers);
}
private DozeMachine.Part createDozeUi(Context context, DozeHost host, WakeLock wakeLock,
DozeMachine machine, Handler handler, AlarmManager alarmManager) {
- if (mDozePlugin != null) {
- DozeProvider.DozeUi dozeUi = mDozePlugin.provideDozeUi(context,
- pluginMachine(context, machine, host),
- wakeLock);
- return (oldState, newState) -> {
- dozeUi.transitionTo(pluginState(oldState),
- pluginState(newState));
- };
- } else {
- return new DozeUi(context, alarmManager, machine, wakeLock, host, handler);
- }
- }
-
- private DozeProvider.DozeMachine pluginMachine(Context context, DozeMachine machine,
- DozeHost host) {
- return new DozeProvider.DozeMachine() {
- @Override
- public void requestState(DozeProvider.DozeState state) {
- if (state == DozeProvider.DozeState.WAKE_UP) {
- machine.wakeUp();
- return;
- }
- machine.requestState(implState(state));
- }
-
- @Override
- public void requestSendIntent(PendingIntent intent) {
- host.startPendingIntentDismissingKeyguard(intent);
- }
- };
- }
-
- private DozeMachine.State implState(DozeProvider.DozeState s) {
- switch (s) {
- case UNINITIALIZED:
- return DozeMachine.State.UNINITIALIZED;
- case INITIALIZED:
- return DozeMachine.State.INITIALIZED;
- case DOZE:
- return DozeMachine.State.DOZE;
- case DOZE_AOD:
- return DozeMachine.State.DOZE_AOD;
- case DOZE_REQUEST_PULSE:
- return DozeMachine.State.DOZE_REQUEST_PULSE;
- case DOZE_PULSING:
- return DozeMachine.State.DOZE_PULSING;
- case DOZE_PULSE_DONE:
- return DozeMachine.State.DOZE_PULSE_DONE;
- case FINISH:
- return DozeMachine.State.FINISH;
- default:
- throw new IllegalArgumentException("Unknown state: " + s);
- }
- }
-
- private DozeProvider.DozeState pluginState(DozeMachine.State s) {
- switch (s) {
- case UNINITIALIZED:
- return DozeProvider.DozeState.UNINITIALIZED;
- case INITIALIZED:
- return DozeProvider.DozeState.INITIALIZED;
- case DOZE:
- return DozeProvider.DozeState.DOZE;
- case DOZE_AOD:
- return DozeProvider.DozeState.DOZE_AOD;
- case DOZE_REQUEST_PULSE:
- return DozeProvider.DozeState.DOZE_REQUEST_PULSE;
- case DOZE_PULSING:
- return DozeProvider.DozeState.DOZE_PULSING;
- case DOZE_PULSE_DONE:
- return DozeProvider.DozeState.DOZE_PULSE_DONE;
- case FINISH:
- return DozeProvider.DozeState.FINISH;
- default:
- throw new IllegalArgumentException("Unknown state: " + s);
- }
+ return new DozeUi(context, alarmManager, machine, wakeLock, host, handler);
}
public static DozeHost getHost(DozeService service) {
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
index 7139d59..af02e5b 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
@@ -37,6 +37,7 @@
private static final int PULSE_REASONS = 5;
+ public static final int PULSE_REASON_NONE = -1;
public static final int PULSE_REASON_INTENT = 0;
public static final int PULSE_REASON_NOTIFICATION = 1;
public static final int PULSE_REASON_SENSOR_SIGMOTION = 2;
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
index 38b32e9..44bb33a 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
@@ -106,6 +106,7 @@
private final ArrayList<State> mQueuedRequests = new ArrayList<>();
private State mState = State.UNINITIALIZED;
+ private int mPulseReason;
private boolean mWakeLockHeldForCurrentState = false;
public DozeMachine(Service service, AmbientDisplayConfiguration config,
@@ -133,6 +134,20 @@
*/
@MainThread
public void requestState(State requestedState) {
+ Preconditions.checkArgument(requestedState != State.DOZE_REQUEST_PULSE);
+ requestState(requestedState, DozeLog.PULSE_REASON_NONE);
+ }
+
+ @MainThread
+ public void requestPulse(int pulseReason) {
+ // Must not be called during a transition. There's no inherent problem with that,
+ // but there's currently no need to execute from a transition and it simplifies the
+ // code to not have to worry about keeping the pulseReason in mQueuedRequests.
+ Preconditions.checkState(!isExecutingTransition());
+ requestState(State.DOZE_REQUEST_PULSE, pulseReason);
+ }
+
+ private void requestState(State requestedState, int pulseReason) {
Assert.isMainThread();
if (DEBUG) {
Log.i(TAG, "request: current=" + mState + " req=" + requestedState,
@@ -146,7 +161,7 @@
for (int i = 0; i < mQueuedRequests.size(); i++) {
// Transitions in Parts can call back into requestState, which will
// cause mQueuedRequests to grow.
- transitionTo(mQueuedRequests.get(i));
+ transitionTo(mQueuedRequests.get(i), pulseReason);
}
mQueuedRequests.clear();
mWakeLock.release();
@@ -165,6 +180,20 @@
return mState;
}
+ /**
+ * @return the current pulse reason.
+ *
+ * This is only valid if the machine is currently in one of the pulse states.
+ */
+ @MainThread
+ public int getPulseReason() {
+ Assert.isMainThread();
+ Preconditions.checkState(mState == State.DOZE_REQUEST_PULSE
+ || mState == State.DOZE_PULSING
+ || mState == State.DOZE_PULSE_DONE, "must be in pulsing state, but is " + mState);
+ return mPulseReason;
+ }
+
/** Requests the PowerManager to wake up now. */
public void wakeUp() {
mDozeService.requestWakeUp();
@@ -174,7 +203,7 @@
return !mQueuedRequests.isEmpty();
}
- private void transitionTo(State requestedState) {
+ private void transitionTo(State requestedState, int pulseReason) {
State newState = transitionPolicy(requestedState);
if (DEBUG) {
@@ -190,6 +219,7 @@
State oldState = mState;
mState = newState;
+ updatePulseReason(newState, oldState, pulseReason);
performTransitionOnComponents(oldState, newState);
updateScreenState(newState);
updateWakeLockState(newState);
@@ -197,6 +227,14 @@
resolveIntermediateState(newState);
}
+ private void updatePulseReason(State newState, State oldState, int pulseReason) {
+ if (newState == State.DOZE_REQUEST_PULSE) {
+ mPulseReason = pulseReason;
+ } else if (oldState == State.DOZE_PULSE_DONE) {
+ mPulseReason = DozeLog.PULSE_REASON_NONE;
+ }
+ }
+
private void performTransitionOnComponents(State oldState, State newState) {
for (Part p : mParts) {
p.transitionTo(oldState, newState);
@@ -280,7 +318,8 @@
case INITIALIZED:
case DOZE_PULSE_DONE:
transitionTo(mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT)
- ? DozeMachine.State.DOZE_AOD : DozeMachine.State.DOZE);
+ ? DozeMachine.State.DOZE_AOD : DozeMachine.State.DOZE,
+ DozeLog.PULSE_REASON_NONE);
break;
default:
break;
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
index e55a597..5241266 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
@@ -24,7 +24,6 @@
import com.android.systemui.Dependency;
import com.android.systemui.plugins.Plugin;
import com.android.systemui.plugins.PluginManager;
-import com.android.systemui.plugins.doze.DozeProvider;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -50,9 +49,7 @@
return;
}
- DozeProvider provider = Dependency.get(PluginManager.class)
- .getOneShotPlugin(DozeProvider.class);
- mDozeMachine = new DozeFactory(provider).assembleMachine(this);
+ mDozeMachine = new DozeFactory().assembleMachine(this);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index 2096956..563b8fe 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -227,7 +227,7 @@
mDozeHost.isPulsingBlocked());
return;
}
- mMachine.requestState(DozeMachine.State.DOZE_REQUEST_PULSE);
+ mMachine.requestPulse(reason);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
index 03076cc..64a152e 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
@@ -83,7 +83,7 @@
unscheduleTimeTick();
break;
case DOZE_REQUEST_PULSE:
- pulseWhileDozing(DozeLog.PULSE_REASON_NOTIFICATION /* TODO */);
+ pulseWhileDozing(mMachine.getPulseReason());
break;
case DOZE_PULSE_DONE:
mHost.abortPulsing();
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/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
index f586ec6..9c7e3986 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
@@ -225,7 +225,7 @@
if (mIsMinimized) {
setMinimizedStateInternal(false);
}
- mDismissViewController.destroyDismissTarget();
+ cleanUpDismissTarget();
mShowPipMenuOnAnimationEnd = true;
}
@@ -334,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() {
@@ -578,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()) {
@@ -625,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;
}
@@ -640,18 +652,14 @@
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;
}
}
@@ -728,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/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/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index f5e096eb..c4d88ae 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -22,6 +22,7 @@
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.metrics.LogMaker;
import android.os.Handler;
import android.os.Message;
import android.service.quicksettings.Tile;
@@ -30,6 +31,7 @@
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
+
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settingslib.Utils;
@@ -179,7 +181,7 @@
public void openDetails(String subPanel) {
QSTile tile = getTile(subPanel);
- showDetailAdapter(true, tile.getDetailAdapter(), new int[] {getWidth() / 2, 0});
+ showDetailAdapter(true, tile.getDetailAdapter(), new int[]{getWidth() / 2, 0});
}
private QSTile getTile(String subPanel) {
@@ -485,8 +487,9 @@
private void logTiles() {
for (int i = 0; i < mRecords.size(); i++) {
- TileRecord tileRecord = mRecords.get(i);
- mMetricsLogger.visible(tileRecord.tile.getMetricsCategory());
+ QSTile tile = mRecords.get(i).tile;
+ mMetricsLogger.write(tile.populate(new LogMaker(tile.getMetricsCategory())
+ .setType(MetricsEvent.TYPE_OPEN)));
}
}
@@ -544,12 +547,13 @@
private static final int SHOW_DETAIL = 1;
private static final int SET_TILE_VISIBILITY = 2;
private static final int ANNOUNCE_FOR_ACCESSIBILITY = 3;
+
@Override
public void handleMessage(Message msg) {
if (msg.what == SHOW_DETAIL) {
- handleShowDetail((Record)msg.obj, msg.arg1 != 0);
+ handleShowDetail((Record) msg.obj, msg.arg1 != 0);
} else if (msg.what == ANNOUNCE_FOR_ACCESSIBILITY) {
- announceForAccessibility((CharSequence)msg.obj);
+ announceForAccessibility((CharSequence) msg.obj);
}
}
}
@@ -569,8 +573,11 @@
public interface QSTileLayout {
void addTile(TileRecord tile);
+
void removeTile(TileRecord tile);
+
int getOffsetTop(TileRecord tile);
+
boolean updateResources();
void setListening(boolean listening);
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..017365f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
@@ -157,7 +157,7 @@
}
@Override
- protected LogMaker populate(LogMaker logMaker) {
+ public LogMaker populate(LogMaker logMaker) {
return super.populate(logMaker).setComponentName(mComponent);
}
@@ -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;
}
@@ -275,7 +275,6 @@
} catch (RemoteException e) {
// Called through wrapper, won't happen here.
}
- MetricsLogger.action(mContext, getMetricsCategory(), mComponent.getPackageName());
}
@Override
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/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
index 976efb2..32af230 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
@@ -175,7 +175,7 @@
mHandler.sendEmptyMessage(H.LONG_CLICK);
}
- protected LogMaker populate(LogMaker logMaker) {
+ public LogMaker populate(LogMaker logMaker) {
if (mState instanceof BooleanState) {
logMaker.addTaggedData(FIELD_QS_VALUE, ((BooleanState) mState).value ? 1 : 0);
}
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/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
index 53a9eae..2b812a5 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
@@ -331,8 +331,7 @@
RecentsActivityLaunchState launchState = config.getLaunchState();
if (!launchState.launchedWithAltTab) {
// Has the user tapped quickly?
- boolean isQuickTap = ViewConfiguration.getDoubleTapMinTime() < elapsedTime &&
- elapsedTime < ViewConfiguration.getDoubleTapTimeout();
+ boolean isQuickTap = elapsedTime < ViewConfiguration.getDoubleTapTimeout();
if (Recents.getConfiguration().isGridEnabled) {
if (isQuickTap) {
EventBus.getDefault().post(new LaunchNextTaskRequestEvent());
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 0b4498c..802cb831 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
@@ -161,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
@@ -222,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));
+ }
+ }
+ }
}
/**
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/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/NotificationSnooze.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
index ccc99c5..8b3d6d9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
@@ -145,13 +145,15 @@
}
private void showSnoozeOptions(boolean show) {
- mExpanded = show;
- animateSnoozeOptions(show);
int drawableId = show ? com.android.internal.R.drawable.ic_collapse_notification
: com.android.internal.R.drawable.ic_expand_notification;
mExpandButton.setImageResource(drawableId);
- if (mGutsContainer != null) {
- mGutsContainer.onHeightChanged();
+ if (mExpanded != show) {
+ mExpanded = show;
+ animateSnoozeOptions(show);
+ if (mGutsContainer != null) {
+ mGutsContainer.onHeightChanged();
+ }
}
}
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/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 263df79..c7fbbf9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -89,6 +89,9 @@
};
private boolean mAlwaysScaleIcon;
+ private int mStatusBarIconDrawingSizeDark = 1;
+ private int mStatusBarIconDrawingSize = 1;
+ private int mStatusBarIconSize = 1;
private StatusBarIcon mIcon;
@ViewDebug.ExportedProperty private String mSlot;
private Drawable mNumberBackground;
@@ -139,7 +142,7 @@
mNumberPain.setColor(context.getColor(R.drawable.notification_number_text_color));
mNumberPain.setAntiAlias(true);
setNotification(notification);
- maybeUpdateIconScale();
+ maybeUpdateIconScaleDimens();
setScaleType(ScaleType.CENTER);
mDensity = context.getResources().getDisplayMetrics().densityDpi;
if (mNotification != null) {
@@ -149,18 +152,30 @@
reloadDimens();
}
- private void maybeUpdateIconScale() {
+ private void maybeUpdateIconScaleDimens() {
// We do not resize and scale system icons (on the right), only notification icons (on the
// left).
if (mNotification != null || mAlwaysScaleIcon) {
- updateIconScale();
+ updateIconScaleDimens();
}
}
- private void updateIconScale() {
+ private void updateIconScaleDimens() {
Resources res = mContext.getResources();
- final int outerBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_size);
- final int imageBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size);
+ mStatusBarIconSize = res.getDimensionPixelSize(R.dimen.status_bar_icon_size);
+ mStatusBarIconDrawingSizeDark =
+ res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size_dark);
+ mStatusBarIconDrawingSize =
+ res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size);
+ updateIconScale();
+ }
+
+ private void updateIconScale() {
+ final float imageBounds = NotificationUtils.interpolate(
+ mStatusBarIconDrawingSize,
+ mStatusBarIconDrawingSizeDark,
+ mDarkAmount);
+ final int outerBounds = mStatusBarIconSize;
mIconScale = (float)imageBounds / (float)outerBounds;
}
@@ -174,7 +189,7 @@
int density = newConfig.densityDpi;
if (density != mDensity) {
mDensity = density;
- maybeUpdateIconScale();
+ maybeUpdateIconScaleDimens();
updateDrawable();
reloadDimens();
}
@@ -198,7 +213,7 @@
mDozer = new NotificationIconDozeHelper(context);
mBlocked = false;
mAlwaysScaleIcon = true;
- updateIconScale();
+ updateIconScaleDimens();
mDensity = context.getResources().getDisplayMetrics().densityDpi;
}
@@ -681,6 +696,7 @@
public void setDark(boolean dark, boolean fade, long delay) {
mDozer.setIntensityDark(f -> {
mDarkAmount = f;
+ updateIconScale();
updateDecorColor();
updateIconColor();
}, dark, fade, delay);
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/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/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/src/com/android/systemui/util/wakelock/WakeLock.java b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java
index eea3de3..215604b 100644
--- a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java
+++ b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java
@@ -20,10 +20,17 @@
import android.os.PowerManager;
import android.support.annotation.VisibleForTesting;
-import com.android.systemui.plugins.doze.DozeProvider;
-
/** WakeLock wrapper for testability */
-public interface WakeLock extends DozeProvider.WakeLock {
+public interface WakeLock {
+
+ /** @see android.os.PowerManager.WakeLock#acquire() */
+ void acquire();
+
+ /** @see android.os.PowerManager.WakeLock#release() */
+ void release();
+
+ /** @see android.os.PowerManager.WakeLock#wrap(Runnable) */
+ Runnable wrap(Runnable r);
static WakeLock createPartial(Context context, String tag) {
return wrap(createPartialInner(context, tag));
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/DozeMachineTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
index cdbde5e..d203602 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
@@ -106,7 +106,7 @@
public void testPulseDone_goesToDoze() {
when(mConfigMock.alwaysOnEnabled(anyInt())).thenReturn(false);
mMachine.requestState(INITIALIZED);
- mMachine.requestState(DOZE_REQUEST_PULSE);
+ mMachine.requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
mMachine.requestState(DOZE_PULSING);
mMachine.requestState(DOZE_PULSE_DONE);
@@ -119,7 +119,7 @@
public void testPulseDone_goesToAoD() {
when(mConfigMock.alwaysOnEnabled(anyInt())).thenReturn(true);
mMachine.requestState(INITIALIZED);
- mMachine.requestState(DOZE_REQUEST_PULSE);
+ mMachine.requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
mMachine.requestState(DOZE_PULSING);
mMachine.requestState(DOZE_PULSE_DONE);
@@ -163,7 +163,7 @@
public void testWakeLock_heldInPulseStates() {
mMachine.requestState(INITIALIZED);
- mMachine.requestState(DOZE_REQUEST_PULSE);
+ mMachine.requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
assertTrue(mWakeLockFake.isHeld());
mMachine.requestState(DOZE_PULSING);
@@ -186,7 +186,7 @@
mMachine.requestState(INITIALIZED);
mMachine.requestState(DOZE);
- mMachine.requestState(DOZE_REQUEST_PULSE);
+ mMachine.requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
mMachine.requestState(DOZE_PULSING);
mMachine.requestState(DOZE_PULSE_DONE);
@@ -198,9 +198,9 @@
mMachine.requestState(INITIALIZED);
mMachine.requestState(DOZE);
- mMachine.requestState(DOZE_REQUEST_PULSE);
+ mMachine.requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
mMachine.requestState(DOZE_PULSING);
- mMachine.requestState(DOZE_REQUEST_PULSE);
+ mMachine.requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
mMachine.requestState(DOZE_PULSE_DONE);
}
@@ -209,7 +209,7 @@
mMachine.requestState(INITIALIZED);
mMachine.requestState(DOZE);
- mMachine.requestState(DOZE_REQUEST_PULSE);
+ mMachine.requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
mMachine.requestState(DOZE_PULSE_DONE);
}
@@ -235,7 +235,7 @@
public void testScreen_onInPulse() {
mMachine.requestState(INITIALIZED);
- mMachine.requestState(DOZE_REQUEST_PULSE);
+ mMachine.requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
mMachine.requestState(DOZE_PULSING);
assertEquals(Display.STATE_DOZE, mServiceFake.screenState);
@@ -246,7 +246,7 @@
mMachine.requestState(INITIALIZED);
mMachine.requestState(DOZE);
- mMachine.requestState(DOZE_REQUEST_PULSE);
+ mMachine.requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
assertEquals(Display.STATE_OFF, mServiceFake.screenState);
}
@@ -256,7 +256,7 @@
mMachine.requestState(INITIALIZED);
mMachine.requestState(DOZE_AOD);
- mMachine.requestState(DOZE_REQUEST_PULSE);
+ mMachine.requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
assertEquals(Display.STATE_DOZE, mServiceFake.screenState);
}
@@ -270,12 +270,43 @@
return null;
}).when(mPartMock).transitionTo(any(), eq(DOZE_REQUEST_PULSE));
- mMachine.requestState(DOZE_REQUEST_PULSE);
+ mMachine.requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
assertEquals(DOZE_PULSING, mMachine.getState());
}
@Test
+ public void testPulseReason_getMatchesRequest() {
+ mMachine.requestState(INITIALIZED);
+ mMachine.requestState(DOZE);
+ mMachine.requestPulse(DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP);
+
+ assertEquals(DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP, mMachine.getPulseReason());
+ }
+
+ @Test
+ public void testPulseReason_getFromTransition() {
+ mMachine.requestState(INITIALIZED);
+ mMachine.requestState(DOZE);
+ doAnswer(inv -> {
+ DozeMachine.State newState = inv.getArgument(1);
+ if (newState == DOZE_REQUEST_PULSE
+ || newState == DOZE_PULSING
+ || newState == DOZE_PULSE_DONE) {
+ assertEquals(DozeLog.PULSE_REASON_NOTIFICATION, mMachine.getPulseReason());
+ } else {
+ assertTrue("unexpected state " + newState,
+ newState == DOZE || newState == DOZE_AOD);
+ }
+ return null;
+ }).when(mPartMock).transitionTo(any(), any());
+
+ mMachine.requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
+ mMachine.requestState(DOZE_PULSING);
+ mMachine.requestState(DOZE_PULSE_DONE);
+ }
+
+ @Test
public void testWakeUp_wakesUp() {
mMachine.wakeUp();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
index 12e75a1..d57f813 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
@@ -22,7 +22,6 @@
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.withSettings;
import android.app.Instrumentation;
import android.content.Context;
@@ -39,8 +38,6 @@
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
-import org.mockito.Answers;
-import org.mockito.MockSettings;
public class DozeTriggersTest {
private Context mContext;
@@ -104,7 +101,7 @@
mSensors.PROXIMITY.sendProximityResult(true); /* Far */
});
- verify(mMachine).requestState(DozeMachine.State.DOZE_REQUEST_PULSE);
+ verify(mMachine).requestPulse(anyInt());
}
}
\ No newline at end of file
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/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/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/preloaded-classes b/preloaded-classes
index 892c593..493e980 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -1820,6 +1820,7 @@
android.text.GetChars
android.text.GraphicsOperations
android.text.Html
+android.text.Html$HtmlParser
android.text.Hyphenator
android.text.InputFilter
android.text.InputType
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 b6dfdd1..fa78f10 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -2808,7 +2808,7 @@
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;
}
@@ -4721,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) {
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index d424d38..b536ad9 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;
@@ -115,10 +118,6 @@
@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();
}
}
@@ -127,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);
@@ -151,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;
@@ -161,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
@@ -287,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.
*/
@@ -309,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;
}
}
@@ -425,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);
}
}
}
@@ -484,24 +601,34 @@
@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;
+ try {
+ synchronized (mLock) {
+ oldDebug = sDebug;
+ setDebugLocked(true);
+ pw.print("Debug mode: "); pw.println(oldDebug);
+ pw.print("Verbose mode: "); pw.println(sVerbose);
+ 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);
}
- 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 238cdd5..4507eae 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -16,11 +16,10 @@
package com.android.server.autofill;
-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;
@@ -48,8 +47,6 @@
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;
@@ -146,11 +143,20 @@
}
String getPackageName() {
- if (mInfo == null) {
- return null;
+ final ComponentName serviceComponent = getServiceComponentName();
+ if (serviceComponent != null) {
+ return serviceComponent.getPackageName();
}
- final ComponentName serviceComponent = mInfo.getServiceInfo().getComponentName();
- return serviceComponent.getPackageName();
+ return null;
+ }
+
+ ComponentName getServiceComponentName() {
+ synchronized (mLock) {
+ if (mInfo == null) {
+ return null;
+ }
+ return mInfo.getServiceInfo().getComponentName();
+ }
}
private String getComponentNameFromSettings() {
@@ -189,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);
}
}
@@ -240,7 +246,9 @@
}
final Session session = mSessions.get(sessionId);
if (session != null && uid == session.uid) {
- session.setHasCallback(hasIt);
+ synchronized (mLock) {
+ session.setHasCallbackLocked(hasIt);
+ }
}
}
@@ -264,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;
}
@@ -276,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();
}
}
@@ -330,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;
}
@@ -338,7 +347,7 @@
} 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);
@@ -384,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) {
@@ -414,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() {
@@ -505,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");
@@ -540,7 +543,7 @@
void destroySessionsLocked() {
while (mSessions.size() > 0) {
- mSessions.valueAt(0).removeSelf();
+ mSessions.valueAt(0).removeSelfLocked();
}
}
@@ -552,7 +555,7 @@
}
}
- private void sendStateToClients() {
+ private void sendStateToClients(boolean resetClient) {
final RemoteCallbackList<IAutoFillManagerClient> clients;
final int userClientCount;
synchronized (mLock) {
@@ -566,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 */
}
@@ -576,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 62226e3..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;
@@ -51,6 +51,10 @@
return requestDestroy(pw);
case "reset":
return requestReset();
+ case "get":
+ return requestGet(pw);
+ case "set":
+ return requestSet(pw);
default:
return handleDefaultCommands(cmd);
}
@@ -63,6 +67,12 @@
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("");
@@ -75,6 +85,48 @@
}
}
+ 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) {
if (!isNextArgSessions(pw)) {
return -1;
@@ -121,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();
@@ -144,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 5964172..68ade63 100644
--- a/services/autofill/java/com/android/server/autofill/Helper.java
+++ b/services/autofill/java/com/android/server/autofill/Helper.java
@@ -17,7 +17,6 @@
package com.android.server.autofill;
import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.app.assist.AssistStructure;
import android.app.assist.AssistStructure.ViewNode;
import android.os.Bundle;
@@ -27,14 +26,22 @@
import java.util.Objects;
import java.util.Set;
-final class Helper {
+public final class Helper {
- // TODO(b/36141126): set to false and remove guard from places that should always be on
- static final boolean DEBUG = true;
- 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;
}
diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
index 2aeb07e..a12ebb2 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
@@ -18,7 +18,8 @@
import static android.service.autofill.FillRequest.INVALID_REQUEST_ID;
-import static com.android.server.autofill.Helper.DEBUG;
+import static com.android.server.autofill.Helper.sDebug;
+import static com.android.server.autofill.Helper.sVerbose;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -89,7 +90,7 @@
private PendingRequest mPendingRequest;
public interface FillServiceCallbacks {
- void onFillRequestSuccess(@Nullable FillResponse response, int serviceUid,
+ void onFillRequestSuccess(int requestFlags, @Nullable FillResponse response, int serviceUid,
@NonNull String servicePackageName);
void onFillRequestFailure(@Nullable CharSequence message,
@NonNull String servicePackageName);
@@ -219,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;
@@ -237,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,
@@ -247,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) {
@@ -262,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 {
@@ -281,10 +274,10 @@
}
private void dispatchOnFillRequestSuccess(PendingRequest pendingRequest,
- int callingUid, FillResponse response) {
+ int callingUid, int requestFlags, FillResponse response) {
mHandler.getHandler().post(() -> {
if (handleResponseCallbackCommon(pendingRequest)) {
- mCallbacks.onFillRequestSuccess(response, callingUid,
+ mCallbacks.onFillRequestSuccess(requestFlags, response, callingUid,
mComponentName.getPackageName());
}
});
@@ -452,8 +445,8 @@
public void onSuccess(FillResponse response) {
RemoteFillService remoteService = mWeakService.get();
if (remoteService != null) {
- remoteService.dispatchOnFillRequestSuccess(
- PendingFillRequest.this, getCallingUid(), response);
+ 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 ac1f34d..9d03fde 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -14,20 +14,19 @@
* limitations under the License.
*/
-
package com.android.server.autofill;
import static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST;
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.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.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;
@@ -171,10 +170,8 @@
@GuardedBy("mLock")
private Bundle mClientState;
- /**
- * Flags used to start the session.
- */
- private final int mFlags;
+ @GuardedBy("mLock")
+ private boolean mDestroyed;
/**
* Receiver of assist data from the app's {@link Activity}.
@@ -182,13 +179,9 @@
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);
+ Slog.wtf(TAG, "no assist structure");
return;
}
@@ -200,8 +193,8 @@
final int requestId = receiverExtras.getInt(EXTRA_REQUEST_ID);
- if (DEBUG) {
- Slog.d(TAG, "New structure for requestId " + requestId + ": " + structure);
+ if (sVerbose) {
+ Slog.v(TAG, "New structure for requestId " + requestId + ": " + structure);
}
final FillRequest request;
@@ -216,6 +209,9 @@
// 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);
}
@@ -225,10 +221,10 @@
final int numContexts = mContexts.size();
for (int i = 0; i < numContexts; i++) {
- fillStructureWithAllowedValues(mContexts.get(i).getStructure());
+ fillStructureWithAllowedValues(mContexts.get(i).getStructure(), flags);
}
- request = new FillRequest(requestId, mContexts, mClientState, mFlags);
+ request = new FillRequest(requestId, mContexts, mClientState, flags);
}
mRemoteFillService.onFillRequest(request);
@@ -239,19 +235,19 @@
* 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
+ * - autofillValue is sent in the view used to force a request
*
* @param structure The structure to be filled
+ * @param flags The flags that started the session
*/
- private void fillStructureWithAllowedValues(@NonNull AssistStructure structure) {
+ private void fillStructureWithAllowedValues(@NonNull AssistStructure structure, int flags) {
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) {
- if (DEBUG) {
- Slog.w(TAG, "fillStructureWithAllowedValues(): no node for " + viewState.id);
- }
+ Slog.w(TAG, "fillStructureWithAllowedValues(): no node for " + viewState.id);
continue;
}
@@ -263,8 +259,10 @@
}
if (mCurrentViewId != null) {
overlay.focused = mCurrentViewId.equals(viewState.id);
+ if (overlay.focused && (flags & FLAG_MANUAL_REQUEST) != 0) {
+ overlay.value = node.getAutofillValue();
+ }
}
-
node.setAutofillOverlay(overlay);
}
}
@@ -293,15 +291,15 @@
/**
* Reads a new structure and then request a new fill response from the fill service.
*/
- private void requestNewFillResponseLocked() {
+ private void requestNewFillResponseLocked(int flags) {
int requestId;
do {
requestId = sIdCounter.getAndIncrement();
} while (requestId == INVALID_REQUEST_ID);
- if (DEBUG) {
- Slog.d(TAG, "Requesting structure for requestId " + requestId);
+ 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
@@ -317,7 +315,7 @@
final long identity = Binder.clearCallingIdentity();
try {
if (!ActivityManager.getService().requestAutofillData(mAssistReceiver,
- receiverExtras, mActivityToken)) {
+ receiverExtras, mActivityToken, flags)) {
Slog.w(TAG, "failed to request autofill data for " + mActivityToken);
}
} finally {
@@ -332,7 +330,7 @@
@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;
@@ -344,7 +342,6 @@
mWindowToken = windowToken;
mHasCallback = hasCallback;
mPackageName = packageName;
- mFlags = flags;
mClient = IAutoFillManagerClient.Stub.asInterface(client);
mMetricsLogger.action(MetricsEvent.AUTOFILL_SESSION_STARTED, mPackageName);
@@ -355,7 +352,7 @@
*
* @return The activity token
*/
- public IBinder getActivityTokenLocked() {
+ IBinder getActivityTokenLocked() {
return mActivityToken;
}
@@ -367,6 +364,11 @@
*/
void switchWindow(@NonNull IBinder newWindow) {
synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#switchWindow() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
mWindowToken = newWindow;
}
}
@@ -379,6 +381,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);
@@ -389,10 +396,17 @@
// FillServiceCallbacks
@Override
- public void onFillRequestSuccess(@Nullable FillResponse response, int serviceUid,
- @NonNull String servicePackageName) {
+ 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.
@@ -430,6 +444,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)
@@ -443,6 +464,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)
@@ -458,6 +486,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)
@@ -498,6 +533,13 @@
public void authenticate(int requestId, IntentSender intent, Bundle extras) {
final Intent fillInIntent;
synchronized (mLock) {
+ synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#authenticate() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
+ }
fillInIntent = createAuthFillInIntent(
getFillContextByRequestIdLocked(requestId).getStructure(), extras);
}
@@ -516,12 +558,26 @@
// AutoFillUiCallback
@Override
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();
@@ -530,6 +586,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());
}
@@ -538,6 +601,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);
@@ -547,7 +615,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");
}
@@ -559,6 +627,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) {
@@ -571,6 +641,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(() -> {
@@ -584,7 +659,12 @@
});
}
- 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 {
@@ -619,7 +699,12 @@
}
}
- 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;
}
@@ -629,6 +714,11 @@
* @return {@code true} if session is done, or {@code false} if it's pending user action.
*/
public boolean showSaveLocked() {
+ 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;
@@ -636,23 +726,23 @@
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 + ", mContexts=" + mContexts
+ if (sVerbose) {
+ Slog.v(TAG, "showSaveLocked(): mResponses=" + mResponses + ", mContexts=" + mContexts
+ ", mViewStates=" + mViewStates);
}
@@ -687,7 +777,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;
@@ -696,7 +786,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);
}
@@ -719,7 +809,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);
}
@@ -736,7 +826,7 @@
}
}
// Nothing changed...
- if (DEBUG) {
+ if (sDebug) {
Slog.d(TAG, "showSaveLocked(): with no changes, comes no responsibilities."
+ "allRequiredAreNotNull=" + allRequiredAreNotEmpty
+ ", atLeastOneChanged=" + atLeastOneChanged);
@@ -748,25 +838,25 @@
* 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;
}
- int numContexts = mContexts.size();
+ if (sVerbose) Slog.v(TAG, "callSaveLocked(): mViewStates=" + mViewStates);
+
+ final int numContexts = mContexts.size();
for (int i = 0; i < numContexts; i++) {
- FillContext context = mContexts.get(i);
+ final FillContext context = mContexts.get(i);
- if (VERBOSE) {
- Slog.v(TAG, "callSaveLocked(): updating " + context);
- }
+ 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 (VERBOSE) {
- Slog.v(TAG, "callSaveLocked(): skipping " + entry.getKey());
- }
+ if (sVerbose) Slog.v(TAG, "callSaveLocked(): skipping " + entry.getKey());
continue;
}
final AutofillId id = entry.getKey();
@@ -775,9 +865,7 @@
Slog.w(TAG, "callSaveLocked(): did not find node with id " + id);
continue;
}
- if (VERBOSE) {
- Slog.v(TAG, "callSaveLocked(): updating " + id + " to " + value);
- }
+ if (sVerbose) Slog.v(TAG, "callSaveLocked(): updating " + id + " to " + value);
node.updateAutofillValue(value);
}
@@ -785,7 +873,7 @@
// Sanitize structure before it's sent to service.
context.getStructure().sanitizeForParceling(false);
- if (VERBOSE) {
+ if (sVerbose) {
Slog.v(TAG, "Dumping structure of " + context + " before calling service.save()");
context.getStructure().dump();
}
@@ -831,108 +919,134 @@
final int numDatasets = datasets.size();
for (int dataSetNum = 0; dataSetNum < numDatasets; dataSetNum++) {
- final ArrayList fields = datasets.get(dataSetNum).getFieldIds();
+ final ArrayList<AutofillId> fields = datasets.get(dataSetNum).getFieldIds();
if (fields != null && fields.contains(id)) {
return false;
}
}
}
+
+ if (ArrayUtils.contains(response.getAuthenticationIds(), id)) {
+ return false;
+ }
}
return true;
}
- void updateLocked(AutofillId id, Rect virtualBounds, AutofillValue value, int flags) {
+ 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 | FLAG_VIEW_ENTERED)) != 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);
+ boolean isIgnored = isIgnoredLocked(id);
+ viewState = new ViewState(this, id, value, this,
+ isIgnored ? ViewState.STATE_IGNORED : ViewState.STATE_INITIAL);
mViewStates.put(id, viewState);
+ if (isIgnored) {
+ if (sDebug) Slog.d(TAG, "updateLocked(): ignoring view " + id);
+ return;
+ }
} 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);
- requestNewFillResponseLocked();
- return;
- }
+ 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 ((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);
- // 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;
+ //..and the UI
+ if (value.isText()) {
+ getUiForShowing().filterFillUi(value.getTextValue().toString());
+ } else {
+ getUiForShowing().filterFillUi(null);
+ }
}
- // 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) {
- if (shouldStartNewPartitionLocked(id)) {
- // TODO(b/37424539): proper implementation
- if (mResponseWaitingAuth != null && ((flags & FLAG_START_SESSION) == 0)) {
- viewState.setState(ViewState.STATE_WAITING_RESPONSE_AUTH);
- } else if ((flags & FLAG_START_SESSION) == 0){
- if (DEBUG) {
+ break;
+ case ACTION_VIEW_ENTERED:
+ if (shouldStartNewPartitionLocked(id)) {
+ if (sDebug) {
Slog.d(TAG, "Starting partition for view id " + viewState.id);
}
viewState.setState(ViewState.STATE_STARTED_PARTITION);
- requestNewFillResponseLocked();
+ requestNewFillResponseLocked(flags);
}
- }
- // Remove the UI if the ViewState has changed.
- if (mCurrentViewId != viewState.id) {
- mUi.hideFillUi(mCurrentViewId != null ? mCurrentViewId : null);
- mCurrentViewId = viewState.id;
- }
+ // 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);
-
- return;
+ // 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;
+ /**
+ * Checks whether a view should be ignored.
+ */
+ private boolean isIgnoredLocked(AutofillId id) {
+ if (mResponses == null || mResponses.size() == 0) {
+ return false;
}
-
- Slog.w(TAG, "updateLocked(): unknown flags " + flags + ": " + getFlagAsString(flags));
+ // Always check the latest response only
+ final FillResponse response = mResponses.valueAt(mResponses.size() - 1);
+ return ArrayUtils.contains(response.getIgnoredIds(), id);
}
@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();
@@ -941,8 +1055,20 @@
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() {
@@ -991,14 +1117,15 @@
}
private void processResponseLocked(@NonNull FillResponse response) {
- if (DEBUG) {
- Slog.d(TAG, "processResponseLocked(mCurrentViewId=" + mCurrentViewId + "):" + response);
+ if (sVerbose) {
+ Slog.v(TAG, "processResponseLocked(mCurrentViewId=" + mCurrentViewId + "):" + response);
}
if (mResponses == null) {
mResponses = new SparseArray<>(4);
}
- mResponses.put(response.getRequestId(), response);
+ final int requestId = response.getRequestId();
+ mResponses.put(requestId, response);
mClientState = response.getClientState();
setViewStatesLocked(response, ViewState.STATE_FILLABLE);
@@ -1008,13 +1135,18 @@
return;
}
- if ((mFlags & FLAG_MANUAL_REQUEST) != 0 && response.getDatasets() != null
- && response.getDatasets().size() == 1) {
- Slog.d(TAG, "autofilling manual request directly");
- autoFill(response.getRequestId(), 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();
@@ -1038,18 +1170,24 @@
final SaveInfo saveInfo = response.getSaveInfo();
if (saveInfo != null) {
final AutofillId[] requiredIds = saveInfo.getRequiredIds();
- for (int i = 0; i < requiredIds.length; i++) {
- final AutofillId id = requiredIds[i];
+ for (AutofillId id : requiredIds) {
createOrUpdateViewStateLocked(id, state, null);
}
final AutofillId[] optionalIds = saveInfo.getOptionalIds();
if (optionalIds != null) {
- for (int i = 0; i < optionalIds.length; i++) {
- final AutofillId id = optionalIds[i];
+ for (AutofillId id : optionalIds) {
createOrUpdateViewStateLocked(id, state, null);
}
}
}
+
+ final AutofillId[] authIds = response.getAuthenticationIds();
+ if (authIds != null) {
+ for (AutofillId id : authIds) {
+ createOrUpdateViewStateLocked(id, state, null);
+ }
+ }
+
}
/**
@@ -1069,14 +1207,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);
}
@@ -1102,6 +1240,11 @@
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());
@@ -1122,18 +1265,22 @@
}
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;
}
@@ -1152,12 +1299,12 @@
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());
@@ -1171,7 +1318,7 @@
FillContext context = mContexts.get(i);
pw.print(prefix2); pw.print(context);
- if (VERBOSE) {
+ if (sVerbose) {
pw.println(context.getStructure() + " (look at logcat)");
// TODO: add method on AssistStructure to dump on pw
@@ -1190,11 +1337,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);
@@ -1210,20 +1361,28 @@
}
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 3967f59..d114e14 100644
--- a/services/autofill/java/com/android/server/autofill/ViewState.java
+++ b/services/autofill/java/com/android/server/autofill/ViewState.java
@@ -16,7 +16,8 @@
package com.android.server.autofill;
-import static com.android.server.autofill.Helper.DEBUG;
+import static com.android.server.autofill.Helper.sDebug;
+import static com.android.server.autofill.Helper.sVerbose;
import android.annotation.Nullable;
import android.graphics.Rect;
@@ -61,19 +62,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/37424539): temporary workaround until partitioning supports auth
- public static final int STATE_WAITING_RESPONSE_AUTH = 0x80;
+ /** Service does not care about this view. */
+ public static final int STATE_IGNORED = 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) {
@@ -172,9 +173,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.
@@ -201,7 +200,16 @@
void dump(String prefix, PrintWriter pw) {
pw.print(prefix); pw.print("id:" ); pw.println(this.id);
pw.print(prefix); pw.print("state:" ); pw.println(getStateAsString());
- pw.print(prefix); pw.print("has response:" ); pw.println(mResponse != null);
+ pw.print(prefix); pw.print("response:");
+ if (mResponse == null) {
+ pw.println("N/A");
+ } else {
+ if (sVerbose) {
+ pw.println(mResponse);
+ } else {
+ pw.println(mResponse.getRequestId());
+ }
+ }
pw.print(prefix); pw.print("initialValue:" ); pw.println(mInitialValue);
pw.print(prefix); pw.print("currentValue:" ); pw.println(mCurrentValue);
pw.print(prefix); pw.print("autofilledValue:" ); pw.println(mAutofilledValue);
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 0556c67..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;
@@ -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))
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 bb47e5b..dd297a6 100644
--- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -15,16 +15,20 @@
*/
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;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
+import android.graphics.Point;
import android.graphics.Rect;
import android.service.autofill.Dataset;
import android.service.autofill.FillResponse;
import android.util.Slog;
+import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
@@ -50,6 +54,8 @@
private static final int VISIBLE_OPTIONS_MAX_COUNT = 3;
+ private static final TypedValue sTempTypedValue = new TypedValue();
+
interface Callback {
void onResponsePicked(@NonNull FillResponse response);
void onDatasetPicked(@NonNull Dataset dataset);
@@ -61,9 +67,13 @@
void startIntentSender(IntentSender intentSender);
}
+ private final @NonNull Point mTempPoint = new Point();
+
private final @NonNull AutofillWindowPresenter mWindowPresenter =
new AutofillWindowPresenter();
+ private final @NonNull Context mContext;
+
private final @NonNull AnchoredWindow mWindow;
private final @NonNull Callback mCallback;
@@ -82,6 +92,7 @@
FillUi(@NonNull Context context, @NonNull FillResponse response,
@NonNull AutofillId focusedViewId, @NonNull @Nullable String filterText,
@NonNull Callback callback) {
+ mContext = context;
mCallback = callback;
final LayoutInflater inflater = LayoutInflater.from(context);
@@ -113,13 +124,18 @@
mWindow = null;
return;
}
- final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
- final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
- content.measure(widthMeasureSpec, heightMeasureSpec);
+
+ Point maxSize = mTempPoint;
+ resolveMaxWindowSize(context, maxSize);
+ final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(maxSize.x,
+ MeasureSpec.AT_MOST);
+ final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxSize.y,
+ MeasureSpec.AT_MOST);
+
+ decor.measure(widthMeasureSpec, heightMeasureSpec);
decor.setOnClickListener(v -> mCallback.onResponsePicked(response));
- // TODO(b/37567439): temporary limiting maximum height and minimum width
- mContentWidth = Math.max(content.getMeasuredWidth(), 1000);
- mContentHeight = Math.min(content.getMeasuredHeight(), 500);
+ mContentWidth = content.getMeasuredWidth();
+ mContentHeight = content.getMeasuredHeight();
mWindow = new AnchoredWindow(decor);
mCallback.requestShowFillUi(mContentWidth, mContentHeight, mWindowPresenter);
@@ -243,6 +259,9 @@
return changed;
}
+ Point maxSize = mTempPoint;
+ resolveMaxWindowSize(mContext, maxSize);
+
mContentWidth = 0;
mContentHeight = 0;
@@ -252,12 +271,14 @@
for (int i = 0; i < itemCount; i++) {
View view = mAdapter.getItem(i).getView();
view.measure(widthMeasureSpec, heightMeasureSpec);
- final int newContentWidth = Math.max(mContentWidth, view.getMeasuredWidth());
+ final int clampedMeasuredWidth = Math.min(view.getMeasuredWidth(), maxSize.x);
+ final int newContentWidth = Math.max(mContentWidth, clampedMeasuredWidth);
if (newContentWidth != mContentWidth) {
mContentWidth = newContentWidth;
changed = true;
}
- final int newContentHeight = mContentHeight + view.getMeasuredHeight();
+ final int clampedMeasuredHeight = Math.min(view.getMeasuredHeight(), maxSize.y);
+ final int newContentHeight = mContentHeight + clampedMeasuredHeight;
if (newContentHeight != mContentHeight) {
mContentHeight = newContentHeight;
changed = true;
@@ -272,6 +293,17 @@
}
}
+ private static void resolveMaxWindowSize(Context context, Point outPoint) {
+ context.getDisplay().getSize(outPoint);
+ TypedValue typedValue = sTempTypedValue;
+ context.getTheme().resolveAttribute(R.attr.autofillDatasetPickerMaxWidth,
+ typedValue, true);
+ outPoint.x = (int) typedValue.getFraction(outPoint.x, outPoint.x);
+ context.getTheme().resolveAttribute(R.attr.autofillDatasetPickerMaxHeight,
+ typedValue, true);
+ outPoint.y = (int) typedValue.getFraction(outPoint.y, outPoint.y);
+ }
+
private static class ViewItem {
private final String mValue;
private final Dataset mDataset;
@@ -341,7 +373,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 cbaaef7..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,8 +154,9 @@
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);
@@ -174,7 +175,7 @@
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 1b970e5..a68a7dd 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -2387,7 +2387,7 @@
long token = mAncestralToken;
synchronized (mQueueLock) {
- if (mEverStoredApps.contains(packageName)) {
+ if (mCurrentToken != 0 && mEverStoredApps.contains(packageName)) {
if (MORE_DEBUG) {
Slog.i(TAG, "App in ever-stored, so using current token");
}
@@ -3868,9 +3868,14 @@
writeApkToBackup(mPackage, output);
}
+ final boolean isSharedStorage =
+ mPackage.packageName.equals(SHARED_BACKUP_AGENT_PACKAGE);
+ final long timeout = isSharedStorage ?
+ TIMEOUT_SHARED_BACKUP_INTERVAL : TIMEOUT_FULL_BACKUP_INTERVAL;
+
if (DEBUG) Slog.d(TAG, "Calling doFullBackup() on " + mPackage.packageName);
- prepareOperationTimeout(mToken, TIMEOUT_FULL_BACKUP_INTERVAL,
- mTimeoutMonitor /* in parent class */, OP_TYPE_BACKUP_WAIT);
+ prepareOperationTimeout(mToken, timeout, mTimeoutMonitor /* in parent class */,
+ OP_TYPE_BACKUP_WAIT);
mAgent.doFullBackup(mPipe, mQuota, mToken, mBackupManagerBinder);
} catch (IOException e) {
Slog.e(TAG, "Error running full backup for " + mPackage.packageName);
@@ -7578,9 +7583,12 @@
if (okay) {
boolean agentSuccess = true;
long toCopy = info.size;
+ final boolean isSharedStorage = pkg.equals(SHARED_BACKUP_AGENT_PACKAGE);
+ final long timeout = isSharedStorage ?
+ TIMEOUT_SHARED_BACKUP_INTERVAL : TIMEOUT_RESTORE_INTERVAL;
final int token = generateToken();
try {
- prepareOperationTimeout(token, TIMEOUT_RESTORE_INTERVAL, null,
+ prepareOperationTimeout(token, timeout, null,
OP_TYPE_RESTORE_WAIT);
if (FullBackup.OBB_TREE_TOKEN.equals(info.domain)) {
if (DEBUG) Slog.d(TAG, "Restoring OBB file for " + pkg
@@ -10456,8 +10464,7 @@
final long oldId = Binder.clearCallingIdentity();
try {
String prevTransport = mTransportManager.selectTransport(transport);
- Settings.Secure.putString(mContext.getContentResolver(),
- Settings.Secure.BACKUP_TRANSPORT, transport);
+ updateStateForTransport(transport);
Slog.v(TAG, "selectBackupTransport() set " + mTransportManager.getCurrentTransportName()
+ " returning " + prevTransport);
return prevTransport;
@@ -10480,9 +10487,7 @@
@Override
public void onSuccess(String transportName) {
mTransportManager.selectTransport(transportName);
- Settings.Secure.putString(mContext.getContentResolver(),
- Settings.Secure.BACKUP_TRANSPORT,
- mTransportManager.getCurrentTransportName());
+ updateStateForTransport(mTransportManager.getCurrentTransportName());
Slog.v(TAG, "Transport successfully selected: " + transport.flattenToShortString());
try {
listener.onSuccess(transportName);
@@ -10505,6 +10510,28 @@
Binder.restoreCallingIdentity(oldId);
}
+ private void updateStateForTransport(String newTransportName) {
+ // Publish the name change
+ Settings.Secure.putString(mContext.getContentResolver(),
+ Settings.Secure.BACKUP_TRANSPORT, newTransportName);
+
+ // And update our current-dataset bookkeeping
+ IBackupTransport transport = mTransportManager.getTransportBinder(newTransportName);
+ if (transport != null) {
+ try {
+ mCurrentToken = transport.getCurrentRestoreSet();
+ } catch (Exception e) {
+ // Oops. We can't know the current dataset token, so reset and figure it out
+ // when we do the next k/v backup operation on this transport.
+ mCurrentToken = 0;
+ }
+ } else {
+ // The named transport isn't bound at this particular moment, so we can't
+ // know yet what its current dataset token is. Reset as above.
+ mCurrentToken = 0;
+ }
+ }
+
// Supply the configuration Intent for the given transport. If the name is not one
// of the available transports, or if the transport does not supply any configuration
// UI, the method returns null.
diff --git a/services/backup/java/com/android/server/backup/TransportManager.java b/services/backup/java/com/android/server/backup/TransportManager.java
index 67f105e..da1f32c 100644
--- a/services/backup/java/com/android/server/backup/TransportManager.java
+++ b/services/backup/java/com/android/server/backup/TransportManager.java
@@ -182,13 +182,13 @@
String[] getBoundTransportNames() {
synchronized (mTransportLock) {
- return mBoundTransports.keySet().toArray(new String[0]);
+ return mBoundTransports.keySet().toArray(new String[mBoundTransports.size()]);
}
}
ComponentName[] getAllTransportCompenents() {
synchronized (mTransportLock) {
- return mValidTransports.keySet().toArray(new ComponentName[0]);
+ return mValidTransports.keySet().toArray(new ComponentName[mValidTransports.size()]);
}
}
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index 9bb0f86..6093241 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -48,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;
@@ -72,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;
@@ -87,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 {
@@ -235,8 +238,7 @@
checkNotNull(deviceMacAddress);
checkCallerIsSystemOr(callingPackage);
checkUsesFeature(callingPackage, getCallingUserId());
- updateAssociations(associations -> CollectionUtils.remove(associations,
- new Association(getCallingUserId(), deviceMacAddress, callingPackage)));
+ removeAssociation(getCallingUserId(), callingPackage, deviceMacAddress);
}
private void checkCallerIsSystemOr(String pkg) throws RemoteException {
@@ -244,7 +246,7 @@
}
private void checkCallerIsSystemOr(String pkg, int userId) throws RemoteException {
- if (getCallingUserId() == UserHandle.USER_SYSTEM) {
+ if (isCallerSystem()) {
return;
}
@@ -294,6 +296,11 @@
}
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);
@@ -304,12 +311,23 @@
+ 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,
@@ -367,8 +385,7 @@
@Override
public void onDeviceSelected(String packageName, int userId, String deviceAddress) {
- updateSpecialAccessPermissionForAssociatedPackage(packageName, userId);
- recordAssociation(packageName, deviceAddress);
+ addAssociation(userId, packageName, deviceAddress);
cleanup();
}
@@ -379,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) {
@@ -387,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);
@@ -398,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);
@@ -411,6 +440,10 @@
});
}
+ 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(() -> {
@@ -486,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
@@ -523,6 +556,8 @@
}
}
+
+
private class Association {
public final int uid;
public final String deviceAddress;
@@ -556,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/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index d5adf48..7ae4138 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -2636,6 +2636,17 @@
PROMPT_UNVALIDATED_DELAY_MS);
}
+ @Override
+ public void startCaptivePortalApp(Network network) {
+ enforceConnectivityInternalPermission();
+ mHandler.post(() -> {
+ NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
+ if (nai == null) return;
+ if (!nai.networkCapabilities.hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL)) return;
+ nai.networkMonitor.sendMessage(NetworkMonitor.CMD_LAUNCH_CAPTIVE_PORTAL_APP);
+ });
+ }
+
public boolean avoidBadWifi() {
return mMultinetworkPolicyTracker.getAvoidBadWifi();
}
diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java
index 8945952..8be859f 100644
--- a/services/core/java/com/android/server/DeviceIdleController.java
+++ b/services/core/java/com/android/server/DeviceIdleController.java
@@ -234,6 +234,12 @@
private final ArrayMap<String, Integer> mPowerSaveWhitelistAppsExceptIdle = new ArrayMap<>();
/**
+ * Package names the user has white-listed using commandline option to opt out of
+ * power save restrictions, except for device idle mode.
+ */
+ private final ArraySet<String> mPowerSaveWhitelistUserAppsExceptIdle = new ArraySet<>();
+
+ /**
* Package names the system has white-listed to opt out of power save restrictions for
* all modes.
*/
@@ -1506,6 +1512,45 @@
}
}
+ public boolean addPowerSaveWhitelistExceptIdleInternal(String name) {
+ synchronized (this) {
+ try {
+ final ApplicationInfo ai = getContext().getPackageManager().getApplicationInfo(name,
+ PackageManager.MATCH_ANY_USER);
+ if (mPowerSaveWhitelistAppsExceptIdle.put(name, UserHandle.getAppId(ai.uid))
+ == null) {
+ mPowerSaveWhitelistUserAppsExceptIdle.add(name);
+ reportPowerSaveWhitelistChangedLocked();
+ mPowerSaveWhitelistExceptIdleAppIdArray = buildAppIdArray(
+ mPowerSaveWhitelistAppsExceptIdle, mPowerSaveWhitelistUserApps,
+ mPowerSaveWhitelistExceptIdleAppIds);
+ }
+ return true;
+ } catch (PackageManager.NameNotFoundException e) {
+ return false;
+ }
+ }
+ }
+
+ public void resetPowerSaveWhitelistExceptIdleInternal() {
+ synchronized (this) {
+ if (mPowerSaveWhitelistAppsExceptIdle.removeAll(
+ mPowerSaveWhitelistUserAppsExceptIdle)) {
+ reportPowerSaveWhitelistChangedLocked();
+ mPowerSaveWhitelistExceptIdleAppIdArray = buildAppIdArray(
+ mPowerSaveWhitelistAppsExceptIdle, mPowerSaveWhitelistUserApps,
+ mPowerSaveWhitelistExceptIdleAppIds);
+ mPowerSaveWhitelistUserAppsExceptIdle.clear();
+ }
+ }
+ }
+
+ public boolean getPowerSaveWhitelistExceptIdleInternal(String name) {
+ synchronized (this) {
+ return mPowerSaveWhitelistAppsExceptIdle.containsKey(name);
+ }
+ }
+
public String[] getSystemPowerWhitelistExceptIdleInternal() {
synchronized (this) {
int size = mPowerSaveWhitelistAppsExceptIdle.size();
@@ -2556,6 +2601,12 @@
pw.println(" Print currently whitelisted apps.");
pw.println(" whitelist [package ...]");
pw.println(" Add (prefix with +) or remove (prefix with -) packages.");
+ pw.println(" except-idle-whitelist [package ...|reset]");
+ pw.println(" Prefix the package with '+' to add it to whitelist or "
+ + "'=' to check if it is already whitelisted");
+ pw.println(" [reset] will reset the whitelist to it's original state");
+ pw.println(" Note that unlike <whitelist> cmd, "
+ + "changes made using this won't be persisted across boots");
pw.println(" tempwhitelist");
pw.println(" Print packages that are temporarily whitelisted.");
pw.println(" tempwhitelist [-u USER] [-d DURATION] [package ..]");
@@ -2873,6 +2924,43 @@
} else {
dumpTempWhitelistSchedule(pw, false);
}
+ } else if ("except-idle-whitelist".equals(cmd)) {
+ getContext().enforceCallingOrSelfPermission(
+ android.Manifest.permission.DEVICE_POWER, null);
+ final long token = Binder.clearCallingIdentity();
+ try {
+ String arg = shell.getNextArg();
+ if (arg == null) {
+ pw.println("No arguments given");
+ return -1;
+ } else if ("reset".equals(arg)) {
+ resetPowerSaveWhitelistExceptIdleInternal();
+ } else {
+ do {
+ if (arg.length() < 1 || (arg.charAt(0) != '-'
+ && arg.charAt(0) != '+' && arg.charAt(0) != '=')) {
+ pw.println("Package must be prefixed with +, -, or =: " + arg);
+ return -1;
+ }
+ char op = arg.charAt(0);
+ String pkg = arg.substring(1);
+ if (op == '+') {
+ if (addPowerSaveWhitelistExceptIdleInternal(pkg)) {
+ pw.println("Added: " + pkg);
+ } else {
+ pw.println("Unknown package: " + pkg);
+ }
+ } else if (op == '=') {
+ pw.println(getPowerSaveWhitelistExceptIdleInternal(pkg));
+ } else {
+ pw.println("Unknown argument: " + arg);
+ return -1;
+ }
+ } while ((arg = shell.getNextArg()) != null);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
} else {
return shell.handleDefaultCommands(cmd);
}
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 114d761..fdc0bba 100644
--- a/services/core/java/com/android/server/NetworkScoreService.java
+++ b/services/core/java/com/android/server/NetworkScoreService.java
@@ -631,6 +631,11 @@
PackageManager.PERMISSION_GRANTED;
}
+ private boolean callerCanScoreNetworks() {
+ return mContext.checkCallingOrSelfPermission(permission.SCORE_NETWORKS) ==
+ PackageManager.PERMISSION_GRANTED;
+ }
+
@Override
public boolean clearScores() {
// Only the active scorer or the system should be allowed to flush all scores.
@@ -651,9 +656,9 @@
@Override
public boolean setActiveScorer(String packageName) {
// Only the system can set the active scorer
- if (!isCallerSystemProcess(getCallingUid()) && !callerCanRequestScores()) {
+ if (!isCallerSystemProcess(getCallingUid()) && !callerCanScoreNetworks()) {
throw new SecurityException(
- "Caller is neither the system process nor a score requester.");
+ "Caller is neither the system process or a network scorer.");
}
return mNetworkScorerAppManager.setActiveScorer(packageName);
diff --git a/services/core/java/com/android/server/NetworkScorerAppManager.java b/services/core/java/com/android/server/NetworkScorerAppManager.java
index 8404025..42777bf 100644
--- a/services/core/java/com/android/server/NetworkScorerAppManager.java
+++ b/services/core/java/com/android/server/NetworkScorerAppManager.java
@@ -208,11 +208,11 @@
*
* <p>The caller must have permission to write to {@link Settings.Global}.
*
- * @param packageName the packageName of the new scorer to use. If null, the scoring app will
- * revert back to the configured default. Otherwise, the scorer will only
- * be set if it is a valid scorer application.
- * @return true if the scorer was changed, or false if the package is not a valid scorer or
- * a valid network recommendation provider exists.
+ * @param packageName the packageName of the new scorer to use. If null, scoring will be forced
+ * off, otherwise the scorer will only be set if it is a valid scorer
+ * application.
+ * @return true if the package was a valid scorer (including <code>null</code>) and now
+ * represents the active scorer, false otherwise.
*/
@VisibleForTesting
public boolean setActiveScorer(String packageName) {
@@ -223,16 +223,19 @@
return true;
}
- if (packageName == null) {
- // revert to the default setting.
- packageName = getDefaultPackageSetting();
+ if (TextUtils.isEmpty(packageName)) {
+ Log.i(TAG, "Network scorer forced off, was: " + oldPackageName);
+ setNetworkRecommendationsPackage(null);
+ setNetworkRecommendationsEnabledSetting(
+ NetworkScoreManager.RECOMMENDATIONS_ENABLED_FORCED_OFF);
+ return true;
}
- Log.i(TAG, "Changing network scorer from " + oldPackageName + " to " + packageName);
-
// We only make the change if the new package is valid.
if (getScorer(packageName) != null) {
+ Log.i(TAG, "Changing network scorer from " + oldPackageName + " to " + packageName);
setNetworkRecommendationsPackage(packageName);
+ setNetworkRecommendationsEnabledSetting(NetworkScoreManager.RECOMMENDATIONS_ENABLED_ON);
return true;
} else {
Log.w(TAG, "Requested network scorer is not valid: " + packageName);
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/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/SystemService.java b/services/core/java/com/android/server/SystemService.java
index c105b12..94397d0 100644
--- a/services/core/java/com/android/server/SystemService.java
+++ b/services/core/java/com/android/server/SystemService.java
@@ -173,6 +173,9 @@
* state they maintain for running users. This is called prior to sending the SHUTDOWN
* broadcast to the user; it is a good place to stop making use of any resources of that
* user (such as binding to a service running in the user).
+ *
+ * <p>NOTE: This is the last callback where the callee may access the target user's CE storage.
+ *
* @param userHandle The identifier of the user.
*/
public void onStopUser(int userHandle) {}
@@ -181,6 +184,10 @@
* Called when an existing user is stopping, for system services to finalize any per-user
* state they maintain for running users. This is called after all application process
* teardown of the user is complete.
+ *
+ * <p>NOTE: When this callback is called, the CE storage for the target user may not be
+ * accessible already. Use {@link #onStopUser} instead if you need to access the CE storage.
+ *
* @param userHandle The identifier of the user.
*/
public void onCleanupUser(int userHandle) {}
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 018e41b..03da5b2 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -576,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);
@@ -641,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);
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index c6e44e0..4313533 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);
@@ -1067,6 +1258,10 @@
mAm.startAssociationLocked(callerApp.uid, callerApp.processName, callerApp.curProcState,
s.appInfo.uid, s.name, s.processName);
+ // Once the apps have become associated, if one of them is caller is ephemeral
+ // the target app should now be able to see the calling app
+ mAm.grantEphemeralAccessLocked(callerApp.userId, service,
+ s.appInfo.uid, UserHandle.getAppId(callerApp.uid));
AppBindRecord b = s.retrieveAppBindingLocked(service, callerApp);
ConnectionRecord c = new ConnectionRecord(b, activity,
@@ -1561,8 +1756,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 +1798,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 +1812,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 +2062,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 +2345,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 +2368,9 @@
}
cancelForegroundNotificationLocked(r);
+ if (r.isForeground) {
+ decActiveForegroundAppLocked(smap, r);
+ }
r.isForeground = false;
r.foregroundId = 0;
r.foregroundNoti = null;
@@ -2608,6 +2809,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()-1; 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 +3607,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 01ef01b..7ce1bf8 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;
@@ -513,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;
@@ -558,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;
@@ -613,11 +572,10 @@
// Determines whether to take full screen screenshots
static final boolean TAKE_FULLSCREEN_SCREENSHOTS = true;
- // STOPSHIP: Update default to a smaller value.
/**
* Default value for {@link Settings.Global#NETWORK_ACCESS_TIMEOUT_MS}.
*/
- private static final long NETWORK_ACCESS_TIMEOUT_DEFAULT_MS = 2000; // 2 sec
+ private static final long NETWORK_ACCESS_TIMEOUT_DEFAULT_MS = 200; // 0.2 sec
/**
* State indicating that there is no need for any blocking for network.
@@ -2147,7 +2105,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: {
@@ -4259,7 +4217,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");
}
@@ -4373,6 +4331,7 @@
validateUid.idle = false;
}
validateUid.curProcState = validateUid.setProcState = item.processState;
+ validateUid.lastDispatchedProcStateSeq = item.procStateSeq;
}
}
}
@@ -5345,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.
@@ -7103,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");
@@ -7818,29 +7777,38 @@
final long origId = Binder.clearCallingIdentity();
try {
synchronized(this) {
- final ActivityStack stack = ActivityRecord.getStackLocked(token);
- if (stack == null || stack.mStackId != PINNED_STACK_ID) {
- 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 PinnedStackWindowController windowController =
- ((PinnedActivityStack) stack).getWindowContainerController();
- return !windowController.isAnimatingBoundsToFullscreen();
+ 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
@@ -7851,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
@@ -7870,7 +7838,7 @@
MetricsLogger.action(mContext, MetricsEvent.ACTION_PICTURE_IN_PICTURE_ENTERED,
r.supportsPictureInPictureWhilePausing);
- logPictureInPictureArgs(args);
+ logPictureInPictureArgs(params);
};
if (isKeyguardLocked()) {
@@ -7909,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
@@ -7929,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);
}
}
@@ -7954,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.");
@@ -7977,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(
@@ -7989,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;
}
@@ -12265,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();
@@ -12286,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;
}
}
@@ -12824,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;
}
@@ -12894,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()");
@@ -12962,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) {
@@ -13074,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) {
@@ -14632,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 {
@@ -14643,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) {
@@ -14658,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;
}
@@ -14668,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;
@@ -14690,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 =
@@ -14746,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);
}
}
@@ -19018,6 +19007,8 @@
removeTasksByPackageNameLocked(ssp, userId);
+ mServices.removeUninstalledPackageLocked(ssp, userId);
+
// Hide the "unsupported display" dialog if necessary.
if (mUnsupportedDisplaySizeDialog != null && ssp.equals(
mUnsupportedDisplaySizeDialog.getPackageName())) {
@@ -19703,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;
@@ -20807,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;
@@ -20840,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.
@@ -20905,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
@@ -20952,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.
@@ -20996,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) {
@@ -21134,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;
@@ -21156,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.
@@ -21351,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;
}
}
@@ -21433,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.
@@ -21476,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);
}
@@ -21512,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)) {
@@ -21542,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();
@@ -21710,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);
}
@@ -21801,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);
@@ -21974,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
@@ -21983,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) {
@@ -22500,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 {
@@ -22605,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();
@@ -22630,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);
}
}
}
@@ -23796,11 +23800,8 @@
if (totalTime >= mWaitForNetworkTimeoutMs) {
Slog.wtf(TAG_NETWORK, "Total time waited for network rules to get updated: "
+ totalTime + ". Uid: " + callingUid + " procStateSeq: "
- + procStateSeq);
- } else if (DEBUG_NETWORK || totalTime >= mWaitForNetworkTimeoutMs / 2) {
- Slog.d(TAG_NETWORK, "Total time waited for network rules to get updated: "
- + totalTime + ". Uid: " + callingUid + " procStateSeq: "
- + procStateSeq);
+ + procStateSeq + " UidRec: " + record
+ + " validateUidRec: " + mValidateUids.get(callingUid));
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
diff --git a/services/core/java/com/android/server/am/ActivityMetricsLogger.java b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
index 2dd3b74..d4de521 100644
--- a/services/core/java/com/android/server/am/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
@@ -11,12 +11,12 @@
import static android.app.ActivityManagerInternal.APP_TRANSITION_TIMEOUT;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_CALLING_PACKAGE_NAME;
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CLASS_NAME;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_DELAY_MS;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_DEVICE_UPTIME_SECONDS;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_IS_EPHEMERAL;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_STARTING_WINDOW_DELAY_MS;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CLASS_NAME;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_INSTANT_APP_LAUNCH_TOKEN;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_COLD_LAUNCH;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_HOT_LAUNCH;
@@ -194,6 +194,11 @@
final int stackId = launchedActivity != null && launchedActivity.getStack() != null
? launchedActivity.getStack().mStackId
: INVALID_STACK_ID;
+
+ if (mCurrentTransitionStartTime == INVALID_START_TIME) {
+ return;
+ }
+
final StackTransitionInfo info = mStackTransitionInfo.get(stackId);
if (launchedActivity != null && info != null) {
info.launchedActivity = launchedActivity;
@@ -272,6 +277,25 @@
}
}
+ /**
+ * Notifies the tracker that the visibility of an app is changing.
+ *
+ * @param activityRecord the app that is changing its visibility
+ * @param visible whether it's going to be visible or not
+ */
+ void notifyVisibilityChanged(ActivityRecord activityRecord, boolean visible) {
+ final StackTransitionInfo info = mStackTransitionInfo.get(activityRecord.getStackId());
+
+ // If we have an active transition that's waiting on a certain activity that will be
+ // invisible now, we'll never get onWindowsDrawn, so abort the transition if necessary.
+ if (info != null && !visible && info.launchedActivity == activityRecord) {
+ mStackTransitionInfo.remove(activityRecord.getStackId());
+ if (mStackTransitionInfo.size() == 0) {
+ reset(true /* abort */);
+ }
+ }
+ }
+
private boolean allStacksWindowsDrawn() {
for (int index = mStackTransitionInfo.size() - 1; index >= 0; index--) {
if (!mStackTransitionInfo.valueAt(index).loggedWindowsDrawn) {
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 5f55411..18c8b32 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -61,6 +61,8 @@
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
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.pm.ActivityInfo.isFixedOrientationLandscape;
+import static android.content.pm.ActivityInfo.isFixedOrientationPortrait;
import static android.content.res.Configuration.EMPTY;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
@@ -117,7 +119,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;
@@ -293,8 +295,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.
@@ -1052,7 +1054,7 @@
return task != null ? (T) task.getStack() : null;
}
- private int getStackId() {
+ int getStackId() {
return getStack() != null ? getStack().mStackId : INVALID_STACK_ID;
}
@@ -1579,6 +1581,7 @@
void setVisibility(boolean visible) {
mWindowContainerController.setVisibility(visible, mDeferHidingClient);
+ mStackSupervisor.mActivityMetricsLogger.notifyVisibilityChanged(this, visible);
}
// TODO: Look into merging with #setVisibility()
@@ -2222,15 +2225,19 @@
}
@Override
- void onOverrideConfigurationChanged(Configuration overrideConfiguration) {
- super.onOverrideConfigurationChanged(overrideConfiguration);
- if (mWindowContainerController != null) {
- mWindowContainerController.onOverrideConfigurationChanged(
- overrideConfiguration, mBounds);
- // TODO(b/36505427): Can we consolidate the call points of onOverrideConfigurationSent()
- // to just use this method instead?
- onOverrideConfigurationSent();
+ void onOverrideConfigurationChanged(Configuration newConfig) {
+ final Configuration currentConfig = getOverrideConfiguration();
+ if (currentConfig.equals(newConfig)) {
+ return;
}
+ super.onOverrideConfigurationChanged(newConfig);
+ if (mWindowContainerController == null) {
+ return;
+ }
+ mWindowContainerController.onOverrideConfigurationChanged(newConfig, mBounds);
+ // TODO(b/36505427): Can we consolidate the call points of onOverrideConfigurationSent()
+ // to just use this method instead?
+ onOverrideConfigurationSent();
}
// TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer.
@@ -2238,6 +2245,26 @@
mTmpConfig.unset();
computeBounds(mTmpBounds);
if (mTmpBounds.equals(mBounds)) {
+ final ActivityStack stack = getStack();
+ if (!mBounds.isEmpty() || task == null || stack == null || !task.mFullscreen) {
+ // We don't want to influence the override configuration here if our task is in
+ // multi-window mode or there is a bounds specified to calculate the override
+ // config. In both of this cases the app should be compatible with whatever the
+ // current configuration is or will be.
+ return;
+ }
+
+ // Currently limited to the top activity for now to avoid situations where non-top
+ // visible activity and top might have conflicting requests putting the non-top activity
+ // windows in an odd state.
+ final ActivityRecord top = mStackSupervisor.topRunningActivityLocked();
+ final Configuration parentConfig = getParent().getConfiguration();
+ if (top != this || isConfigurationCompatible(parentConfig)) {
+ onOverrideConfigurationChanged(mTmpConfig);
+ } else if (isConfigurationCompatible(
+ mLastReportedConfiguration.getMergedConfiguration())) {
+ onOverrideConfigurationChanged(mLastReportedConfiguration.getMergedConfiguration());
+ }
return;
}
@@ -2250,6 +2277,21 @@
onOverrideConfigurationChanged(mTmpConfig);
}
+ /** Returns true if the configuration is compatible with this activity. */
+ boolean isConfigurationCompatible(Configuration config) {
+ final int orientation = mWindowContainerController != null
+ ? mWindowContainerController.getOrientation() : info.screenOrientation;
+ if (isFixedOrientationPortrait(orientation)
+ && config.orientation != ORIENTATION_PORTRAIT) {
+ return false;
+ }
+ if (isFixedOrientationLandscape(orientation)
+ && config.orientation != ORIENTATION_LANDSCAPE) {
+ return false;
+ }
+ return true;
+ }
+
/**
* Computes the bounds to fit the Activity within the bounds of the {@link Configuration}.
*/
@@ -2328,6 +2370,9 @@
return true;
}
+ // TODO: We should add ActivityRecord.shouldBeVisible() that checks if the activity should
+ // be visible based on the stack, task, and lockscreen state and use that here instead. The
+ // method should be based on the logic in ActivityStack.ensureActivitiesVisibleLocked().
// Skip updating configuration for activity is a stack that shouldn't be visible.
if (stack.shouldBeVisible(null /* starting */) == STACK_INVISIBLE) {
if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 728a3b9..912b22c 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -655,11 +655,11 @@
}
}
- final ActivityRecord topRunningActivityLocked() {
+ ActivityRecord topRunningActivityLocked() {
return topRunningActivityLocked(false /* focusableOnly */);
}
- final ActivityRecord topRunningActivityLocked(boolean focusableOnly) {
+ private ActivityRecord topRunningActivityLocked(boolean focusableOnly) {
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
ActivityRecord r = mTaskHistory.get(taskNdx).topRunningActivityLocked();
if (r != null && (!focusableOnly || r.isFocusable())) {
@@ -669,7 +669,21 @@
return null;
}
- final ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) {
+ ActivityRecord topRunningNonOverlayTaskActivity() {
+ for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
+ final TaskRecord task = mTaskHistory.get(taskNdx);
+ final ArrayList<ActivityRecord> activities = task.mActivities;
+ for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
+ final ActivityRecord r = activities.get(activityNdx);
+ if (!r.finishing && !r.mTaskOverlay) {
+ return r;
+ }
+ }
+ }
+ return null;
+ }
+
+ ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) {
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
final TaskRecord task = mTaskHistory.get(taskNdx);
final ArrayList<ActivityRecord> activities = task.mActivities;
@@ -987,7 +1001,7 @@
result.matchedByRootAffinity = false;
break;
} else if (!isDocument && !taskIsDocument
- && result.r == null && task.canMatchRootAffinity()) {
+ && result.r == null && task.rootAffinity != null) {
if (task.rootAffinity.equals(target.taskAffinity)) {
if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Found matching affinity candidate!");
// It is possible for multiple tasks to have the same root affinity especially
@@ -3301,13 +3315,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)
@@ -3373,8 +3395,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 bff3ce3..358d36d 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,7 +156,6 @@
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;
@@ -1129,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);
}
}
@@ -1143,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;
@@ -2505,7 +2503,7 @@
tempRect /* outStackBounds */,
otherTaskRect /* outTempTaskBounds */, true /* ignoreVisibility */);
- resizeStackLocked(i, tempRect,
+ resizeStackLocked(i, !tempRect.isEmpty() ? tempRect : null,
!otherTaskRect.isEmpty() ? otherTaskRect : tempOtherTaskBounds,
tempOtherTaskInsetBounds, preserveWindows,
true /* allowResizeInDockedMode */, deferResume);
@@ -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 */);
@@ -3045,11 +3043,15 @@
if (!mTmpFindTaskResult.matchedByRootAffinity) {
return mTmpFindTaskResult.r;
} else if (mTmpFindTaskResult.r.getDisplayId() == displayId) {
+ // Note: since the traversing through the stacks is top down, the floating
+ // tasks should always have lower priority than any affinity-matching tasks
+ // in the fullscreen stacks
affinityMatch = mTmpFindTaskResult.r;
}
}
}
}
+
if (DEBUG_TASKS && affinityMatch == null) Slog.d(TAG_TASKS, "No task found");
return affinityMatch;
}
@@ -3944,10 +3946,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 +5143,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..2273452 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);
}
@@ -948,7 +953,7 @@
// If we are not able to proceed, disassociate the activity from the task. Leaving an
// activity in an incomplete state can lead to issues, such as performing operations
// without a window container.
- if (result != START_SUCCESS && mStartActivity.getTask() != null) {
+ if (result < START_SUCCESS && mStartActivity.getTask() != null) {
mStartActivity.getTask().removeActivity(mStartActivity);
}
mService.mWindowManager.continueSurfaceLayout();
@@ -1040,9 +1045,6 @@
sendPowerHintForLaunchStartIfNeeded(false /* forceSend */);
reusedActivity = setTargetStackAndMoveToFrontIfNeeded(reusedActivity);
- if (outActivity != null && outActivity.length > 0) {
- outActivity[0] = reusedActivity;
- }
if ((mStartFlags & START_FLAG_ONLY_IF_NEEDED) != 0) {
// We don't need to start a new activity, and the client said not to do anything
@@ -1057,6 +1059,9 @@
// We didn't do anything... but it was needed (a.k.a., client don't use that
// intent!) And for paranoia, make sure we have correctly resumed the top activity.
resumeTargetStackIfNeeded();
+ if (outActivity != null && outActivity.length > 0) {
+ outActivity[0] = reusedActivity;
+ }
return START_TASK_TO_FRONT;
}
}
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/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/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java
index a580d4b..7ba67c5 100644
--- a/services/core/java/com/android/server/am/PendingIntentRecord.java
+++ b/services/core/java/com/android/server/am/PendingIntentRecord.java
@@ -271,10 +271,15 @@
resolvedType = key.requestResolvedType;
}
+ final int callingUid = Binder.getCallingUid();
+ final int callingPid = Binder.getCallingPid();
+
+ final long origId = Binder.clearCallingIdentity();
+
if (whitelistDuration > 0) {
StringBuilder tag = new StringBuilder(64);
tag.append("pendingintent:");
- UserHandle.formatUid(tag, Binder.getCallingUid());
+ UserHandle.formatUid(tag, callingUid);
tag.append(":");
if (finalIntent.getAction() != null) {
tag.append(finalIntent.getAction());
@@ -283,12 +288,10 @@
} else if (finalIntent.getData() != null) {
tag.append(finalIntent.getData());
}
- owner.tempWhitelistForPendingIntentLocked(Binder.getCallingPid(),
- Binder.getCallingUid(), uid, whitelistDuration, tag.toString());
+ owner.tempWhitelistForPendingIntentLocked(callingPid,
+ callingUid, uid, whitelistDuration, tag.toString());
}
- final long origId = Binder.clearCallingIdentity();
-
boolean sendFinish = finishedReceiver != null;
int userId = key.userId;
if (userId == UserHandle.USER_CURRENT) {
diff --git a/services/core/java/com/android/server/am/PinnedActivityStack.java b/services/core/java/com/android/server/am/PinnedActivityStack.java
index a4932bb..34cdb54 100644
--- a/services/core/java/com/android/server/am/PinnedActivityStack.java
+++ b/services/core/java/com/android/server/am/PinnedActivityStack.java
@@ -17,6 +17,7 @@
package com.android.server.am;
import android.app.RemoteAction;
+import android.content.res.Configuration;
import android.graphics.Rect;
import com.android.server.am.ActivityStackSupervisor.ActivityContainer;
@@ -43,10 +44,28 @@
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,
- animationDuration, schedulePipModeChangedOnAnimationEnd);
+ if (skipResizeAnimation(toBounds == null /* toFullscreen */)) {
+ mService.moveTasksToFullscreenStack(mStackId, true /* onTop */);
+ } else {
+ getWindowContainerController().animateResizePinnedStack(toBounds, sourceHintBounds,
+ animationDuration, schedulePipModeChangedOnAnimationEnd);
+ }
+ }
+
+ private boolean skipResizeAnimation(boolean toFullscreen) {
+ if (!toFullscreen) {
+ return false;
+ }
+ final Configuration parentConfig = getParent().getConfiguration();
+ final ActivityRecord top = topRunningNonOverlayTaskActivity();
+ return top != null && !top.isConfigurationCompatible(parentConfig);
}
void setPictureInPictureAspectRatio(float aspectRatio) {
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 056fec5..7eec945 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -550,15 +550,11 @@
boolean kept = true;
if (updatedConfig) {
final ActivityRecord r = topRunningActivityLocked();
- if (r != null) {
+ if (r != null && !deferResume) {
kept = r.ensureActivityConfigurationLocked(0 /* globalChanges */, preserveWindow);
-
- if (!deferResume) {
- // All other activities must be made visible with their correct configuration.
- mService.mStackSupervisor.ensureActivitiesVisibleLocked(r, 0, !PRESERVE_WINDOWS);
- if (!kept) {
- mService.mStackSupervisor.resumeFocusedStackTopActivityLocked();
- }
+ mService.mStackSupervisor.ensureActivitiesVisibleLocked(r, 0, !PRESERVE_WINDOWS);
+ if (!kept) {
+ mService.mStackSupervisor.resumeFocusedStackTopActivityLocked();
}
}
}
@@ -2229,12 +2225,6 @@
return mLastNonFullscreenBounds;
}
- boolean canMatchRootAffinity() {
- // We don't allow root affinity matching on the pinned stack as no other task should
- // be launching in it based on affinity.
- return rootAffinity != null && getStackId() != PINNED_STACK_ID;
- }
-
void addStartingWindowsForVisibleActivities(boolean taskSwitch) {
for (int activityNdx = mActivities.size() - 1; activityNdx >= 0; --activityNdx) {
final ActivityRecord r = mActivities.get(activityNdx);
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 742ee35..e9555f7 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, ...)
@@ -3250,9 +3251,10 @@
if (deviceList.size() > 0) {
btDevice = deviceList.get(0);
int state = mA2dp.getConnectionState(btDevice);
+ int intState = (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0;
int delay = checkSendBecomingNoisyIntent(
- AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
- (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0);
+ AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, intState,
+ AudioSystem.DEVICE_NONE);
queueMsgUnderWakeLock(mAudioHandler,
MSG_SET_A2DP_SINK_CONNECTION_STATE,
state,
@@ -3380,9 +3382,8 @@
}
}
if (toRemove != null) {
- int delay = checkSendBecomingNoisyIntent(
- AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
- 0);
+ int delay = checkSendBecomingNoisyIntent(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
+ 0, AudioSystem.DEVICE_NONE);
for (int i = 0; i < toRemove.size(); i++) {
makeA2dpDeviceUnavailableLater(toRemove.valueAt(i), delay);
}
@@ -3918,7 +3919,7 @@
Slog.i(TAG, "setWiredDeviceConnectionState(" + state + " nm: " + name + " addr:"
+ address + ")");
}
- int delay = checkSendBecomingNoisyIntent(type, state);
+ int delay = checkSendBecomingNoisyIntent(type, state, AudioSystem.DEVICE_NONE);
queueMsgUnderWakeLock(mAudioHandler,
MSG_SET_WIRED_DEVICE_CONNECTION_STATE,
0 /* arg1 unused */,
@@ -3930,14 +3931,25 @@
public int setBluetoothA2dpDeviceConnectionState(BluetoothDevice device, int state, int profile)
{
+ if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE)) {
+ return 0;
+ }
+ return setBluetoothA2dpDeviceConnectionStateInt(
+ device, state, profile, AudioSystem.DEVICE_NONE);
+ }
+
+ public int setBluetoothA2dpDeviceConnectionStateInt(
+ BluetoothDevice device, int state, int profile, int musicDevice)
+ {
int delay;
if (profile != BluetoothProfile.A2DP && profile != BluetoothProfile.A2DP_SINK) {
throw new IllegalArgumentException("invalid profile " + profile);
}
synchronized (mConnectedDevices) {
if (profile == BluetoothProfile.A2DP) {
+ int intState = (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0;
delay = checkSendBecomingNoisyIntent(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
- (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0);
+ intState, musicDevice);
} else {
delay = 0;
}
@@ -3964,6 +3976,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 +4893,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 +4985,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 +4999,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 +5160,7 @@
private void onBluetoothA2dpDeviceConfigChange(BluetoothDevice btDevice)
{
- if (DEBUG_VOL) {
+ if (DEBUG_DEVICES) {
Log.d(TAG, "onBluetoothA2dpDeviceConfigChange btDevice=" + btDevice);
}
if (btDevice == null) {
@@ -5128,12 +5173,22 @@
int device = AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP;
synchronized (mConnectedDevices) {
+ if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE)) {
+ return;
+ }
final String key = makeDeviceListKey(device, address);
final DeviceListSpec deviceSpec = mConnectedDevices.get(key);
if (deviceSpec != null) {
// Device is connected
- AudioSystem.handleDeviceConfigChange(device, address,
- btDevice.getName());
+ int musicDevice = getDeviceForStream(AudioSystem.STREAM_MUSIC);
+ 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
+ setBluetoothA2dpDeviceConnectionStateInt(
+ btDevice, BluetoothA2dp.STATE_DISCONNECTED, BluetoothProfile.A2DP,
+ musicDevice);
+ }
}
}
}
@@ -5176,6 +5231,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,
@@ -5201,7 +5258,9 @@
// must be called before removing the device from mConnectedDevices
// Called synchronized on mConnectedDevices
- private int checkSendBecomingNoisyIntent(int device, int state) {
+ // musicDevice argument is used when not AudioSystem.DEVICE_NONE instead of querying
+ // from AudioSystem
+ private int checkSendBecomingNoisyIntent(int device, int state, int musicDevice) {
int delay = 0;
if ((state == 0) && ((device & mBecomingNoisyIntentDevices) != 0)) {
int devices = 0;
@@ -5212,8 +5271,13 @@
devices |= dev;
}
}
- int musicDevice = getDeviceForStream(AudioSystem.STREAM_MUSIC);
- if ((device == musicDevice) && (device == devices)) {
+ if (musicDevice == AudioSystem.DEVICE_NONE) {
+ musicDevice = getDeviceForStream(AudioSystem.STREAM_MUSIC);
+ }
+ // ignore condition on device being actually used for music when in communication
+ // because music routing is altered in this case.
+ if (((device == musicDevice) || isInCommunication()) && (device == devices)) {
+ mAudioHandler.removeMessages(MSG_BROADCAST_AUDIO_BECOMING_NOISY);
sendMsg(mAudioHandler,
MSG_BROADCAST_AUDIO_BECOMING_NOISY,
SENDMSG_REPLACE,
@@ -5297,6 +5361,11 @@
}
}
+ private static final int DEVICE_OVERRIDE_A2DP_ROUTE_ON_PLUG =
+ AudioSystem.DEVICE_OUT_WIRED_HEADSET | AudioSystem.DEVICE_OUT_WIRED_HEADPHONE |
+ AudioSystem.DEVICE_OUT_LINE |
+ AudioSystem.DEVICE_OUT_ALL_USB;
+
private void onSetWiredDeviceConnectionState(int device, int state, String address,
String deviceName, String caller) {
if (DEBUG_DEVICES) {
@@ -5308,9 +5377,7 @@
}
synchronized (mConnectedDevices) {
- if ((state == 0) && ((device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) ||
- (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE) ||
- (device == AudioSystem.DEVICE_OUT_LINE))) {
+ if ((state == 0) && ((device & DEVICE_OVERRIDE_A2DP_ROUTE_ON_PLUG) != 0)) {
setBluetoothA2dpOnInt(true);
}
boolean isUsb = ((device & ~AudioSystem.DEVICE_OUT_ALL_USB) == 0) ||
@@ -5321,9 +5388,7 @@
return;
}
if (state != 0) {
- if ((device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) ||
- (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE) ||
- (device == AudioSystem.DEVICE_OUT_LINE)) {
+ if ((device & DEVICE_OVERRIDE_A2DP_ROUTE_ON_PLUG) != 0) {
setBluetoothA2dpOnInt(false);
}
if ((device & mSafeMediaVolumeDevices) != 0) {
@@ -6182,6 +6247,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 3bc603f..93a22494 100644
--- a/services/core/java/com/android/server/audio/FocusRequester.java
+++ b/services/core/java/com/android/server/audio/FocusRequester.java
@@ -342,6 +342,7 @@
mFocusLossWasNotified = false;
// before dispatching a focus loss, check if the following conditions are met:
// 1/ the framework is not supposed to notify the focus loser on a DUCK loss
+ // (i.e. it has a focus controller that implements a ducking policy)
// 2/ it is a DUCK loss
// 3/ the focus loser isn't flagged as pausing in a DUCK loss
// if they are, do not notify the focus loser
@@ -365,7 +366,14 @@
&& fr != null) {
// candidate for enforcement by the framework
if (fr.mCallingUid != this.mCallingUid) {
- handled = mFocusController.duckPlayers(fr, this);
+ if ((mGrantFlags
+ & AudioManager.AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS) != 0) {
+ // the focus loser declared it would pause instead of duck, let it
+ // handle it (the framework doesn't pause for apps)
+ handled = false;
+ } else {
+ handled = mFocusController.duckPlayers(fr, this);
+ }
} // else: the focus change is within the same app, so let the dispatching
// happen as if the framework was not involved.
}
diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
index d3c74e6..96f6f2d 100644
--- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
@@ -197,11 +197,13 @@
public static final int EVENT_PROVISIONING_NOTIFICATION = BASE + 10;
/**
- * Message to self indicating sign-in app should be launched.
+ * Message indicating sign-in app should be launched.
* Sent by mLaunchCaptivePortalAppBroadcastReceiver when the
- * user touches the sign in notification.
+ * user touches the sign in notification, or sent by
+ * ConnectivityService when the user touches the "sign into
+ * network" button in the wifi access point detail page.
*/
- private static final int CMD_LAUNCH_CAPTIVE_PORTAL_APP = BASE + 11;
+ public static final int CMD_LAUNCH_CAPTIVE_PORTAL_APP = BASE + 11;
/**
* Retest network to see if captive portal is still in place.
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/display/NightDisplayService.java b/services/core/java/com/android/server/display/NightDisplayService.java
index d1275bb..7849896 100644
--- a/services/core/java/com/android/server/display/NightDisplayService.java
+++ b/services/core/java/com/android/server/display/NightDisplayService.java
@@ -47,7 +47,6 @@
import com.android.server.twilight.TwilightListener;
import com.android.server.twilight.TwilightManager;
import com.android.server.twilight.TwilightState;
-import com.android.server.vr.VrManagerService;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.Calendar;
@@ -62,7 +61,6 @@
implements NightDisplayController.Callback {
private static final String TAG = "NightDisplayService";
- private static final boolean DEBUG = false;
/**
* The transition time, in milliseconds, for Night Display to turn on/off.
@@ -151,8 +149,9 @@
@Override
public void onBootPhase(int phase) {
- if (phase == PHASE_SYSTEM_SERVICES_READY) {
- IVrManager vrManager = (IVrManager) getBinderService(Context.VR_SERVICE);
+ if (phase >= PHASE_SYSTEM_SERVICES_READY) {
+ final IVrManager vrManager = IVrManager.Stub.asInterface(
+ getBinderService(Context.VR_SERVICE));
if (vrManager != null) {
try {
vrManager.registerListener(mVrStateCallbacks);
@@ -160,7 +159,9 @@
Slog.e(TAG, "Failed to register VR mode state listener: " + e);
}
}
- } else if (phase == PHASE_BOOT_COMPLETED) {
+ }
+
+ if (phase >= PHASE_BOOT_COMPLETED) {
mBootCompleted = true;
// Register listeners now that boot is complete.
@@ -284,12 +285,18 @@
if (mIsActivated == null || mIsActivated != activated) {
Slog.i(TAG, activated ? "Turning on night display" : "Turning off night display");
- if (mAutoMode != null) {
- mAutoMode.onActivated(activated);
+ if (mIsActivated != null) {
+ Secure.putLongForUser(getContext().getContentResolver(),
+ Secure.NIGHT_DISPLAY_LAST_ACTIVATED_TIME, System.currentTimeMillis(),
+ mCurrentUser);
}
mIsActivated = activated;
+ if (mAutoMode != null) {
+ mAutoMode.onActivated(activated);
+ }
+
applyTint(false);
}
}
@@ -401,7 +408,7 @@
* Set the color transformation {@code MATRIX_NIGHT} to the given color temperature.
*
* @param colorTemperature color temperature in Kelvin
- * @param outTemp the 4x4 display transformation matrix for that color temperature
+ * @param outTemp the 4x4 display transformation matrix for that color temperature
*/
private void setMatrix(int colorTemperature, float[] outTemp) {
if (outTemp.length != 16) {
@@ -423,8 +430,22 @@
outTemp[10] = blue;
}
+ private Calendar getLastActivatedTime() {
+ final ContentResolver cr = getContext().getContentResolver();
+ final long lastActivatedTimeMillis = Secure.getLongForUser(
+ cr, Secure.NIGHT_DISPLAY_LAST_ACTIVATED_TIME, -1, mCurrentUser);
+ if (lastActivatedTimeMillis < 0) {
+ return null;
+ }
+
+ final Calendar lastActivatedTime = Calendar.getInstance();
+ lastActivatedTime.setTimeInMillis(lastActivatedTimeMillis);
+ return lastActivatedTime;
+ }
+
private abstract class AutoMode implements NightDisplayController.Callback {
public abstract void onStart();
+
public abstract void onStop();
}
@@ -438,7 +459,7 @@
private Calendar mLastActivatedTime;
- public CustomAutoMode() {
+ CustomAutoMode() {
mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
mTimeChangedReceiver = new BroadcastReceiver() {
@Override
@@ -452,10 +473,10 @@
final Calendar now = Calendar.getInstance();
final Calendar startTime = mStartTime.getDateTimeBefore(now);
final Calendar endTime = mEndTime.getDateTimeAfter(startTime);
- final boolean activated = now.before(endTime);
- boolean setActivated = mIsActivated == null || mLastActivatedTime == null;
- if (!setActivated && mIsActivated != activated) {
+ boolean activate = now.before(endTime);
+ if (mLastActivatedTime != null) {
+ // Convert mLastActivatedTime to the current timezone if needed.
final TimeZone currentTimeZone = now.getTimeZone();
if (!currentTimeZone.equals(mLastActivatedTime.getTimeZone())) {
final int year = mLastActivatedTime.get(Calendar.YEAR);
@@ -470,17 +491,16 @@
mLastActivatedTime.set(Calendar.MINUTE, minute);
}
- if (mIsActivated) {
- setActivated = now.before(mStartTime.getDateTimeBefore(mLastActivatedTime))
- || now.after(mEndTime.getDateTimeAfter(mLastActivatedTime));
- } else {
- setActivated = now.before(mEndTime.getDateTimeBefore(mLastActivatedTime))
- || now.after(mStartTime.getDateTimeAfter(mLastActivatedTime));
+ // Maintain the existing activated state if within the current period.
+ if (mLastActivatedTime.before(now)
+ && mLastActivatedTime.after(startTime)
+ && (mLastActivatedTime.after(endTime) || now.before(endTime))) {
+ activate = mController.isActivated();
}
}
- if (setActivated) {
- mController.setActivated(activated);
+ if (mIsActivated == null || mIsActivated != activate) {
+ mController.setActivated(activate);
}
updateNextAlarm(mIsActivated, now);
}
@@ -502,6 +522,8 @@
mStartTime = mController.getCustomStartTime();
mEndTime = mController.getCustomEndTime();
+ mLastActivatedTime = getLastActivatedTime();
+
// Force an update to initialize state.
updateActivated();
}
@@ -516,11 +538,8 @@
@Override
public void onActivated(boolean activated) {
- final Calendar now = Calendar.getInstance();
- if (mIsActivated != null) {
- mLastActivatedTime = now;
- }
- updateNextAlarm(activated, now);
+ mLastActivatedTime = getLastActivatedTime();
+ updateNextAlarm(activated, Calendar.getInstance());
}
@Override
@@ -550,33 +569,33 @@
private Calendar mLastActivatedTime;
- public TwilightAutoMode() {
+ TwilightAutoMode() {
mTwilightManager = getLocalService(TwilightManager.class);
}
private void updateActivated(TwilightState state) {
- final boolean isNight = state != null && state.isNight();
- boolean setActivated = mIsActivated == null || mIsActivated != isNight;
- if (setActivated && state != null && mLastActivatedTime != null) {
+ boolean activate = state != null && state.isNight();
+ if (state != null && mLastActivatedTime != null) {
+ final Calendar now = Calendar.getInstance();
final Calendar sunrise = state.sunrise();
final Calendar sunset = state.sunset();
- if (sunrise.before(sunset)) {
- setActivated = mLastActivatedTime.before(sunrise)
- || mLastActivatedTime.after(sunset);
- } else {
- setActivated = mLastActivatedTime.before(sunset)
- || mLastActivatedTime.after(sunrise);
+
+ // Maintain the existing activated state if within the current period.
+ if (mLastActivatedTime.before(now)
+ && (mLastActivatedTime.after(sunrise) ^ mLastActivatedTime.after(sunset))) {
+ activate = mController.isActivated();
}
}
- if (setActivated) {
- mController.setActivated(isNight);
+ if (mIsActivated == null || mIsActivated != activate) {
+ mController.setActivated(activate);
}
}
@Override
public void onStart() {
mTwilightManager.registerListener(this, mHandler);
+ mLastActivatedTime = getLastActivatedTime();
// Force an update to initialize state.
updateActivated(mTwilightManager.getLastTwilightState());
@@ -591,7 +610,7 @@
@Override
public void onActivated(boolean activated) {
if (mIsActivated != null) {
- mLastActivatedTime = Calendar.getInstance();
+ mLastActivatedTime = getLastActivatedTime();
}
}
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..bdcf642 100644
--- a/services/core/java/com/android/server/job/JobServiceContext.java
+++ b/services/core/java/com/android/server/job/JobServiceContext.java
@@ -255,6 +255,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/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index 91c32e4..51bebb09 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -382,6 +382,8 @@
// Wakelocks
private final static String WAKELOCK_KEY = "GnssLocationProvider";
private final PowerManager.WakeLock mWakeLock;
+ private static final String DOWNLOAD_EXTRA_WAKELOCK_KEY = "GnssLocationProviderXtraDownload";
+ private final PowerManager.WakeLock mDownloadXtraWakeLock;
// Alarms
private final static String ALARM_WAKEUP = "com.android.internal.location.ALARM_WAKEUP";
@@ -686,6 +688,11 @@
mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY);
mWakeLock.setReferenceCounted(true);
+ // Create a separate wake lock for xtra downloader as it may be released due to timeout.
+ mDownloadXtraWakeLock = mPowerManager.newWakeLock(
+ PowerManager.PARTIAL_WAKE_LOCK, DOWNLOAD_EXTRA_WAKELOCK_KEY);
+ mDownloadXtraWakeLock.setReferenceCounted(true);
+
mAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
mWakeupIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ALARM_WAKEUP), 0);
mTimeoutIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ALARM_TIMEOUT), 0);
@@ -989,7 +996,7 @@
mDownloadXtraDataPending = STATE_DOWNLOADING;
// hold wake lock while task runs
- mWakeLock.acquire(DOWNLOAD_XTRA_DATA_TIMEOUT_MS);
+ mDownloadXtraWakeLock.acquire(DOWNLOAD_XTRA_DATA_TIMEOUT_MS);
Log.i(TAG, "WakeLock acquired by handleDownloadXtraData()");
AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
@Override
@@ -1011,13 +1018,17 @@
mXtraBackOff.nextBackoffMillis());
}
- // release wake lock held by task
- if (mWakeLock.isHeld()) {
- mWakeLock.release();
- } else {
- Log.e(TAG, "WakeLock expired before release in handleDownloadXtraData()");
+ // Release wake lock held by task, synchronize on mLock in case multiple
+ // download tasks overrun.
+ synchronized (mLock) {
+ if (mDownloadXtraWakeLock.isHeld()) {
+ mDownloadXtraWakeLock.release();
+ if (DEBUG) Log.d(TAG, "WakeLock released by handleDownloadXtraData()");
+ } else {
+ Log.e(TAG, "WakeLock expired before release in "
+ + "handleDownloadXtraData()");
+ }
}
- Log.i(TAG, "WakeLock released by handleDownloadXtraData()");
}
});
}
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/NotificationComparator.java b/services/core/java/com/android/server/notification/NotificationComparator.java
index 63647ff..8caaaa1 100644
--- a/services/core/java/com/android/server/notification/NotificationComparator.java
+++ b/services/core/java/com/android/server/notification/NotificationComparator.java
@@ -73,11 +73,13 @@
// Next: sufficiently import person to person communication
boolean leftPeople = isImportantPeople(left);
boolean rightPeople = isImportantPeople(right);
+ final int contactAffinityComparison =
+ Float.compare(left.getContactAffinity(), right.getContactAffinity());
if (leftPeople && rightPeople){
// by contact proximity, close to far. if same proximity, check further fields.
- if (Float.compare(left.getContactAffinity(), right.getContactAffinity()) != 0) {
- return -1 * Float.compare(left.getContactAffinity(), right.getContactAffinity());
+ if (contactAffinityComparison != 0) {
+ return -1 * contactAffinityComparison;
}
} else if (leftPeople != rightPeople) {
// People, messaging higher than non-messaging
@@ -91,6 +93,11 @@
return -1 * Integer.compare(leftImportance, rightImportance);
}
+ // by contact proximity, close to far. if same proximity, check further fields.
+ if (contactAffinityComparison != 0) {
+ return -1 * contactAffinityComparison;
+ }
+
// Whether or not the notification can bypass DND.
final int leftPackagePriority = left.getPackagePriority();
final int rightPackagePriority = right.getPackagePriority();
diff --git a/services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java b/services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java
index 31ed350..f92bf3d 100644
--- a/services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java
+++ b/services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java
@@ -19,6 +19,7 @@
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
+import android.net.Uri;
import android.service.notification.NotificationListenerService;
import android.util.Log;
import android.util.Slog;
@@ -46,12 +47,13 @@
}
if (record.getImportance() >= NotificationManager.IMPORTANCE_DEFAULT) {
- final Notification notification = record.getNotification();
- if ((notification.defaults & Notification.DEFAULT_VIBRATE) != 0 ||
- notification.vibrate != null ||
- (notification.defaults & Notification.DEFAULT_SOUND) != 0 ||
- notification.sound != null ||
- notification.fullScreenIntent != null) {
+ if (record.getSound() != null && record.getSound() != Uri.EMPTY) {
+ record.setRecentlyIntrusive(true);
+ }
+ if (record.getVibration() != null) {
+ record.setRecentlyIntrusive(true);
+ }
+ if (record.getNotification().fullScreenIntent != null) {
record.setRecentlyIntrusive(true);
}
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 1e7d076..48d11c3 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);
}
@@ -1466,7 +1477,7 @@
return ;
}
- final boolean isSystemToast = isCallerSystem() || ("android".equals(pkg));
+ final boolean isSystemToast = isCallerSystemOrPhone() || ("android".equals(pkg));
final boolean isPackageSuspended =
isPackageSuspendedForUser(pkg, Binder.getCallingUid());
@@ -1570,12 +1581,10 @@
Binder.getCallingUid(), userId, true, false, "cancelNotificationWithTag", pkg);
// Don't allow client applications to cancel foreground service notis or autobundled
// summaries.
+ final int mustNotHaveFlags = isCallingUidSystem() ? 0 :
+ (Notification.FLAG_FOREGROUND_SERVICE | Notification.FLAG_AUTOGROUP_SUMMARY);
cancelNotification(Binder.getCallingUid(), Binder.getCallingPid(), pkg, tag, id, 0,
- (Binder.getCallingUid() == Process.SYSTEM_UID
- ? 0 : Notification.FLAG_FOREGROUND_SERVICE)
- | (Binder.getCallingUid() == Process.SYSTEM_UID
- ? 0 : Notification.FLAG_AUTOGROUP_SUMMARY), false, userId,
- REASON_APP_CANCEL, null);
+ mustNotHaveFlags, false, userId, REASON_APP_CANCEL, null);
}
@Override
@@ -2441,7 +2450,7 @@
}
private void enforceSystemOrSystemUI(String message) {
- if (isCallerSystem()) return;
+ if (isCallerSystemOrPhone()) return;
getContext().enforceCallingPermission(android.Manifest.permission.STATUS_BAR_SERVICE,
message);
}
@@ -2838,6 +2847,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)
@@ -2859,7 +2869,8 @@
adjustedSbn.getUser(), GroupHelper.AUTOGROUP_KEY,
System.currentTimeMillis());
summaryRecord = new NotificationRecord(getContext(), summarySbn,
- notificationRecord.getChannel());
+ notificationRecord.getChannel(), mRankingHelper.supportsChannels(
+ summarySbn.getPackageName(), summarySbn.getUid()));
summaries.put(pkg, summarySbn.getKey());
}
}
@@ -3172,19 +3183,13 @@
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 */);
if (channel == null) {
- // STOPSHIP TODO: remove before release - should always throw without a valid channel.
- if (channelId == null) {
- Log.e(TAG, "Cannot post notification without channel ID when targeting O "
- + " - notification=" + notification);
- return;
- }
final String noChannelStr = "No Channel found for "
+ "pkg=" + pkg
+ ", channelId=" + channelId
@@ -3201,18 +3206,13 @@
"Failed to post notification on channel \"" + channelId + "\"\n" +
"See log for more details");
return;
- } else if (channelId == null && shouldWarnUseChannels(pkg, notificationUid)) {
- // STOPSHIP TODO: remove once default channel is removed for all apps that target O.
- Log.e(TAG, "Developer Warning for package " + pkg
- + ", no channel specified for posted notification: " + notification);
- doDebugOnlyToast("Developer warning for package \"" + pkg + "\"\n" +
- "Posted notification should specify a channel");
}
final StatusBarNotification n = new StatusBarNotification(
pkg, opPkg, id, tag, notificationUid, callingPid, notification,
user, null, System.currentTimeMillis());
- final NotificationRecord r = new NotificationRecord(getContext(), n, channel);
+ final NotificationRecord r = new NotificationRecord(getContext(), n, channel,
+ mRankingHelper.supportsChannels(pkg, notificationUid));
if (!checkDisqualifyingFeatures(userId, notificationUid, id,tag, r)) {
return;
@@ -3249,22 +3249,9 @@
}
}
- // STOPSHIP - Remove once RankingHelper deletes default channel for all apps targeting O.
- private boolean shouldWarnUseChannels(String pkg, int uid) {
- try {
- final int userId = UserHandle.getUserId(uid);
- final ApplicationInfo applicationInfo =
- mPackageManagerClient.getApplicationInfoAsUser(pkg, 0, userId);
- return applicationInfo.targetSdkVersion > Build.VERSION_CODES.N_MR1;
- } catch (NameNotFoundException e) {
- Slog.e(TAG, e.toString());
- return false;
- }
- }
-
private int resolveNotificationUid(String opPackageName, int callingUid, int userId) {
// The system can post notifications on behalf of any package it wants
- if (isCallerSystem() && opPackageName != null && !"android".equals(opPackageName)) {
+ if (isCallerSystemOrPhone() && opPackageName != null && !"android".equals(opPackageName)) {
try {
return getContext().getPackageManager()
.getPackageUidAsUser(opPackageName, userId);
@@ -3283,7 +3270,8 @@
private boolean checkDisqualifyingFeatures(int userId, int callingUid, int id, String tag,
NotificationRecord r) {
final String pkg = r.sbn.getPackageName();
- final boolean isSystemNotification = isUidSystem(callingUid) || ("android".equals(pkg));
+ final boolean isSystemNotification =
+ isUidSystemOrPhone(callingUid) || ("android".equals(pkg));
final boolean isNotificationFromListener = mListeners.isListenerPackage(pkg);
// Limit the number of notifications that any given package except the android
@@ -3304,7 +3292,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 +3366,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 +3470,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 +3647,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 +3657,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);
}
}
@@ -4105,7 +4168,7 @@
mNotificationsByKey.remove(recordInList.sbn.getKey());
wasPosted = true;
}
- if ((recordInList = findNotificationByListLocked(mEnqueuedNotifications, r.getKey()))
+ while ((recordInList = findNotificationByListLocked(mEnqueuedNotifications, r.getKey()))
!= null) {
mEnqueuedNotifications.remove(recordInList);
}
@@ -4130,7 +4193,9 @@
if (wasPosted) {
// status bar
if (r.getNotification().getSmallIcon() != null) {
- r.isCanceled = true;
+ if (reason != REASON_SNOOZED) {
+ r.isCanceled = true;
+ }
mListeners.notifyRemovedLocked(r.sbn, reason);
mHandler.post(new Runnable() {
@Override
@@ -4253,9 +4318,11 @@
updateLightsLocked();
} else {
// No notification was found, assume that it is snoozed and cancel it.
- final boolean wasSnoozed = mSnoozeHelper.cancel(userId, pkg, tag, id);
- if (wasSnoozed) {
- savePolicyFile();
+ if (reason != REASON_SNOOZED) {
+ final boolean wasSnoozed = mSnoozeHelper.cancel(userId, pkg, tag, id);
+ if (wasSnoozed) {
+ savePolicyFile();
+ }
}
}
}
@@ -4385,7 +4452,7 @@
void snoozeNotificationInt(String key, long duration, String snoozeCriterionId,
ManagedServiceInfo listener) {
String listenerName = listener == null ? null : listener.component.toShortString();
- if (duration <= 0 && snoozeCriterionId == null) {
+ if (duration <= 0 && snoozeCriterionId == null || key == null) {
return;
}
@@ -4394,31 +4461,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) {
@@ -4531,6 +4574,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?
@@ -4545,7 +4612,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;
@@ -4599,24 +4666,30 @@
}
}
- protected boolean isUidSystem(int uid) {
+ protected boolean isCallingUidSystem() {
+ final int uid = Binder.getCallingUid();
+ return uid == Process.SYSTEM_UID;
+ }
+
+ protected boolean isUidSystemOrPhone(int uid) {
final int appid = UserHandle.getAppId(uid);
return (appid == Process.SYSTEM_UID || appid == Process.PHONE_UID || uid == 0);
}
- protected boolean isCallerSystem() {
- return isUidSystem(Binder.getCallingUid());
+ // TODO: Most calls should probably move to isCallerSystem.
+ protected boolean isCallerSystemOrPhone() {
+ return isUidSystemOrPhone(Binder.getCallingUid());
}
private void checkCallerIsSystem() {
- if (isCallerSystem()) {
+ if (isCallerSystemOrPhone()) {
return;
}
throw new SecurityException("Disallowed call for uid " + Binder.getCallingUid());
}
private void checkCallerIsSystemOrSameApp(String pkg) {
- if (isCallerSystem()) {
+ if (isCallerSystemOrPhone()) {
return;
}
checkCallerIsSameApp(pkg);
@@ -4624,7 +4697,7 @@
private boolean isCallerInstantApp(String pkg) {
// System is always allowed to act for ephemeral apps.
- if (isCallerSystem()) {
+ if (isCallerSystemOrPhone()) {
return false;
}
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index b48fd5c..90257da 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -115,7 +115,7 @@
private int mSuppressedVisualEffects = 0;
private String mUserExplanation;
private String mPeopleExplanation;
- private boolean mPreChannelsNotification = true;
+ private boolean mSupportsChannels = false;
private Uri mSound;
private long[] mVibration;
private AudioAttributes mAttributes;
@@ -128,7 +128,7 @@
@VisibleForTesting
public NotificationRecord(Context context, StatusBarNotification sbn,
- NotificationChannel channel)
+ NotificationChannel channel, boolean supportsChannels)
{
this.sbn = sbn;
mOriginalFlags = sbn.getNotification().flags;
@@ -138,7 +138,7 @@
mContext = context;
stats = new NotificationUsageStats.SingleNotificationStats();
mChannel = channel;
- mPreChannelsNotification = isPreChannelsNotification();
+ mSupportsChannels = supportsChannels;
mSound = calculateSound();
mVibration = calculateVibration();
mAttributes = calculateAttributes();
@@ -146,27 +146,11 @@
mLight = calculateLights();
}
- private boolean isPreChannelsNotification() {
- try {
- if (NotificationChannel.DEFAULT_CHANNEL_ID.equals(getChannel().getId())) {
- final ApplicationInfo applicationInfo =
- mContext.getPackageManager().getApplicationInfoAsUser(sbn.getPackageName(),
- 0, UserHandle.getUserId(sbn.getUid()));
- if (applicationInfo.targetSdkVersion <= Build.VERSION_CODES.N_MR1) {
- return true;
- }
- }
- } catch (NameNotFoundException e) {
- Slog.e(TAG, "Can't find package", e);
- }
- return false;
- }
-
private Uri calculateSound() {
final Notification n = sbn.getNotification();
Uri sound = mChannel.getSound();
- if (mPreChannelsNotification && (getChannel().getUserLockedFields()
+ if (!mSupportsChannels && (getChannel().getUserLockedFields()
& NotificationChannel.USER_LOCKED_SOUND) == 0) {
final boolean useDefaultSound = (n.defaults & Notification.DEFAULT_SOUND) != 0;
@@ -191,7 +175,7 @@
: defaultLightColor;
Light light = getChannel().shouldShowLights() ? new Light(channelLightColor,
defaultLightOn, defaultLightOff) : null;
- if (mPreChannelsNotification
+ if (!mSupportsChannels
&& (getChannel().getUserLockedFields()
& NotificationChannel.USER_LOCKED_LIGHTS) == 0) {
final Notification notification = sbn.getNotification();
@@ -222,7 +206,7 @@
} else {
vibration = null;
}
- if (mPreChannelsNotification
+ if (!mSupportsChannels
&& (getChannel().getUserLockedFields()
& NotificationChannel.USER_LOCKED_VIBRATION) == 0) {
final Notification notification = sbn.getNotification();
@@ -244,7 +228,7 @@
attributes = Notification.AUDIO_ATTRIBUTES_DEFAULT;
}
- if (mPreChannelsNotification
+ if (!mSupportsChannels
&& (getChannel().getUserLockedFields()
& NotificationChannel.USER_LOCKED_SOUND) == 0) {
if (n.audioAttributes != null) {
@@ -293,7 +277,7 @@
stats.requestedImportance = requestedImportance;
stats.isNoisy = mSound != null || mVibration != null;
- if (mPreChannelsNotification
+ if (!mSupportsChannels
&& (importance == IMPORTANCE_UNSPECIFIED
|| (getChannel().getUserLockedFields()
& NotificationChannel.USER_LOCKED_IMPORTANCE) == 0)) {
@@ -392,7 +376,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;
@@ -459,7 +444,7 @@
pw.println(prefix + "mVisibleSinceMs=" + mVisibleSinceMs);
pw.println(prefix + "mUpdateTimeMs=" + mUpdateTimeMs);
pw.println(prefix + "mSuppressedVisualEffects= " + mSuppressedVisualEffects);
- if (mPreChannelsNotification) {
+ if (!mSupportsChannels) {
pw.println(prefix + String.format("defaults=0x%08x flags=0x%08x",
notification.defaults, notification.flags));
pw.println(prefix + "n.sound=" + notification.sound);
diff --git a/services/core/java/com/android/server/notification/RankingConfig.java b/services/core/java/com/android/server/notification/RankingConfig.java
index 4d19b52..14d796f 100644
--- a/services/core/java/com/android/server/notification/RankingConfig.java
+++ b/services/core/java/com/android/server/notification/RankingConfig.java
@@ -42,4 +42,6 @@
void permanentlyDeleteNotificationChannel(String pkg, int uid, String channelId);
void permanentlyDeleteNotificationChannels(String pkg, int uid);
ParceledListSlice<NotificationChannel> getNotificationChannels(String pkg, int uid, boolean includeDeleted);
+
+ boolean supportsChannels(String pkg, int uid);
}
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 6d18c83..3481556 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -273,31 +273,21 @@
}
private boolean shouldHaveDefaultChannel(Record r) throws NameNotFoundException {
+ if (supportsChannels(r)) {
+ return false;
+ }
+
final int userId = UserHandle.getUserId(r.uid);
- final ApplicationInfo applicationInfo = mPm.getApplicationInfoAsUser(r.pkg, 0, userId);
- if (applicationInfo.targetSdkVersion <= Build.VERSION_CODES.N_MR1) {
- // Pre-O apps should have it.
- return true;
+ final ApplicationInfo applicationInfo = mPm.getApplicationInfoAsUser(r.pkg,
+ PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
+ userId);
+ if (applicationInfo.targetSdkVersion > Build.VERSION_CODES.N_MR1) {
+ // O apps should not have the default channel.
+ return false;
}
- // STOPSHIP TODO: remove before release - O+ apps should never have a default channel.
- // But for now, leave the default channel until an app has created its first channel.
- boolean hasCreatedAChannel = false;
- final int size = r.channels.size();
- for (int i = 0; i < size; i++) {
- final NotificationChannel notificationChannel = r.channels.valueAt(i);
- if (notificationChannel != null &&
- !notificationChannel.getId().equals(NotificationChannel.DEFAULT_CHANNEL_ID)) {
- hasCreatedAChannel = true;
- break;
- }
- }
- if (!hasCreatedAChannel) {
- return true;
- }
-
- // Otherwise, should not have the default channel.
- return false;
+ // Otherwise, this app should have the default channel.
+ return true;
}
private void deleteDefaultChannelIfNeeded(Record r) throws NameNotFoundException {
@@ -516,6 +506,31 @@
}
@Override
+ public boolean supportsChannels(String pkg, int uid) {
+ Record r = getOrCreateRecord(pkg, uid);
+
+ if (r == null) {
+ return false;
+ }
+
+ if (r.channels.size() == 1
+ && r.channels.containsKey(NotificationChannel.DEFAULT_CHANNEL_ID)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ private boolean supportsChannels(Record r) {
+ if (r.channels.size() == 1
+ && r.channels.containsKey(NotificationChannel.DEFAULT_CHANNEL_ID)) {
+ return false;
+ }
+
+ return (r.channels.size() > 0);
+ }
+
+ @Override
public void createNotificationChannelGroup(String pkg, int uid, NotificationChannelGroup group,
boolean fromTargetApp) {
Preconditions.checkNotNull(pkg);
@@ -587,6 +602,10 @@
r.channels.put(channel.getId(), channel);
MetricsLogger.action(getChannelLog(channel, pkg).setType(
MetricsProto.MetricsEvent.TYPE_OPEN));
+
+ // Remove Default Channel.
+ r.channels.remove(NotificationChannel.DEFAULT_CHANNEL_ID);
+
updateConfig();
}
@@ -683,13 +702,7 @@
if (r == null) {
return;
}
- int N = r.channels.size() - 1;
- for (int i = N; i >= 0; i--) {
- String key = r.channels.keyAt(i);
- if (!NotificationChannel.DEFAULT_CHANNEL_ID.equals(key)) {
- r.channels.remove(key);
- }
- }
+ r.channels.clear();
updateConfig();
}
@@ -1041,6 +1054,8 @@
final int uid = uidList[i];
synchronized (mRecords) {
mRecords.remove(recordKey(pkg, uid));
+ // reset to default settings and re-add misc channel for pre-O apps
+ getOrCreateRecord(pkg, uid);
}
mRestoredWithoutUids.remove(pkg);
updated = true;
diff --git a/services/core/java/com/android/server/notification/SnoozeHelper.java b/services/core/java/com/android/server/notification/SnoozeHelper.java
index 913f636..a178a52 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());
+ }
}
}
}
@@ -165,16 +167,10 @@
for (Map.Entry<String, NotificationRecord> record : records) {
final StatusBarNotification sbn = record.getValue().sbn;
if (Objects.equals(sbn.getTag(), tag) && sbn.getId() == id) {
- key = record.getKey();
+ record.getValue().isCanceled = true;
+ return true;
}
}
- if (key != null) {
- recordsForPkg.remove(key);
- cancelAlarm(userId, pkg, key);
- mPackages.remove(key);
- mUsers.remove(key);
- return true;
- }
}
}
return false;
@@ -188,7 +184,7 @@
final int N = userIds.length;
for (int i = 0; i < N; i++) {
final ArrayMap<String, ArrayMap<String, NotificationRecord>> snoozedPkgs =
- mSnoozedNotifications.remove(userIds[i]);
+ mSnoozedNotifications.get(userIds[i]);
if (snoozedPkgs != null) {
final int M = snoozedPkgs.size();
for (int j = 0; j < M; j++) {
@@ -196,10 +192,7 @@
if (records != null) {
int P = records.size();
for (int k = 0; k < P; k++) {
- final String key = records.keyAt(k);
- cancelAlarm(userId, snoozedPkgs.keyAt(j), key);
- mPackages.remove(key);
- mUsers.remove(key);
+ records.valueAt(k).isCanceled = true;
}
}
}
@@ -213,13 +206,10 @@
if (mSnoozedNotifications.containsKey(userId)) {
if (mSnoozedNotifications.get(userId).containsKey(pkg)) {
ArrayMap<String, NotificationRecord> records =
- mSnoozedNotifications.get(userId).remove(pkg);
+ mSnoozedNotifications.get(userId).get(pkg);
int N = records.size();
for (int i = 0; i < N; i++) {
- final String key = records.keyAt(i);
- cancelAlarm(userId, pkg, key);
- mPackages.remove(key);
- mUsers.remove(key);
+ records.valueAt(i).isCanceled = true;
}
return true;
}
@@ -227,16 +217,6 @@
return false;
}
- private void cancelAlarm(int userId, String pkg, String key) {
- long identity = Binder.clearCallingIdentity();
- try {
- final PendingIntent pi = createPendingIntent(pkg, key, userId);
- mAm.cancel(pi);
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
-
/**
* Updates the notification record so the most up to date information is shown on re-post.
*/
@@ -250,6 +230,10 @@
if (pkgRecords == null) {
return;
}
+ NotificationRecord existing = pkgRecords.get(record.getKey());
+ if (existing != null && existing.isCanceled) {
+ return;
+ }
pkgRecords.put(record.getKey(), record);
}
@@ -272,8 +256,10 @@
return;
}
final NotificationRecord record = pkgRecords.remove(key);
+ mPackages.remove(key);
+ mUsers.remove(key);
- if (record != null) {
+ if (record != null && !record.isCanceled) {
MetricsLogger.action(record.getLogMaker()
.setCategory(MetricsProto.MetricsEvent.NOTIFICATION_SNOOZED)
.setType(MetricsProto.MetricsEvent.TYPE_OPEN));
@@ -281,6 +267,44 @@
}
}
+ 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);
+
+ if (record != null && !record.isCanceled) {
+ 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/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 254bc2a..f94a56f 100644
--- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java
+++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
@@ -24,6 +24,7 @@
import android.os.Environment;
import android.os.FileUtils;
import android.os.PowerManager;
+import android.os.SystemClock;
import android.os.UserHandle;
import android.os.WorkSource;
import android.util.Log;
@@ -54,6 +55,7 @@
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets;
+import static com.android.server.pm.PackageManagerService.WATCHDOG_TIMEOUT;
import static com.android.server.pm.PackageManagerServiceCompilerMapping.getNonProfileGuidedCompilerFilter;
import static dalvik.system.DexFile.isProfileGuidedCompilerFilter;
@@ -67,13 +69,17 @@
public static final int DEX_OPT_SKIPPED = 0;
public static final int DEX_OPT_PERFORMED = 1;
public static final int DEX_OPT_FAILED = -1;
+ // One minute over PM WATCHDOG_TIMEOUT
+ private static final long WAKELOCK_TIMEOUT_MS = WATCHDOG_TIMEOUT + 1000 * 60;
/** Special library name that skips shared libraries check during compilation. */
public static final String SKIP_SHARED_LIBRARY_CHECK = "&";
+ @GuardedBy("mInstallLock")
private final Installer mInstaller;
private final Object mInstallLock;
+ @GuardedBy("mInstallLock")
private final PowerManager.WakeLock mDexoptWakeLock;
private volatile boolean mSystemReady;
@@ -111,21 +117,12 @@
return DEX_OPT_SKIPPED;
}
synchronized (mInstallLock) {
- // During boot the system doesn't need to instantiate and obtain a wake lock.
- // PowerManager might not be ready, but that doesn't mean that we can't proceed with
- // dexopt.
- final boolean useLock = mSystemReady;
- if (useLock) {
- mDexoptWakeLock.setWorkSource(new WorkSource(pkg.applicationInfo.uid));
- mDexoptWakeLock.acquire();
- }
+ final long acquireTime = acquireWakeLockLI(pkg.applicationInfo.uid);
try {
return performDexOptLI(pkg, sharedLibraries, instructionSets, checkProfiles,
targetCompilationFilter, packageStats, isUsedByOtherApps);
} finally {
- if (useLock) {
- mDexoptWakeLock.release();
- }
+ releaseWakeLockLI(acquireTime);
}
}
}
@@ -250,26 +247,50 @@
public int dexOptSecondaryDexPath(ApplicationInfo info, String path, Set<String> isas,
String compilerFilter, boolean isUsedByOtherApps) {
synchronized (mInstallLock) {
- // During boot the system doesn't need to instantiate and obtain a wake lock.
- // PowerManager might not be ready, but that doesn't mean that we can't proceed with
- // dexopt.
- final boolean useLock = mSystemReady;
- if (useLock) {
- mDexoptWakeLock.setWorkSource(new WorkSource(info.uid));
- mDexoptWakeLock.acquire();
- }
+ final long acquireTime = acquireWakeLockLI(info.uid);
try {
return dexOptSecondaryDexPathLI(info, path, isas, compilerFilter,
isUsedByOtherApps);
} finally {
- if (useLock) {
- mDexoptWakeLock.release();
- }
+ releaseWakeLockLI(acquireTime);
}
}
}
@GuardedBy("mInstallLock")
+ private long acquireWakeLockLI(final int uid) {
+ // During boot the system doesn't need to instantiate and obtain a wake lock.
+ // PowerManager might not be ready, but that doesn't mean that we can't proceed with
+ // dexopt.
+ if (!mSystemReady) {
+ return -1;
+ }
+ mDexoptWakeLock.setWorkSource(new WorkSource(uid));
+ mDexoptWakeLock.acquire(WAKELOCK_TIMEOUT_MS);
+ return SystemClock.elapsedRealtime();
+ }
+
+ @GuardedBy("mInstallLock")
+ private void releaseWakeLockLI(final long acquireTime) {
+ if (acquireTime < 0) {
+ return;
+ }
+ try {
+ if (mDexoptWakeLock.isHeld()) {
+ mDexoptWakeLock.release();
+ }
+ final long duration = SystemClock.elapsedRealtime() - acquireTime;
+ if (duration >= WAKELOCK_TIMEOUT_MS) {
+ Slog.wtf(TAG, "WakeLock " + mDexoptWakeLock.getTag()
+ + " time out. Operation took " + duration + " ms. Thread: "
+ + Thread.currentThread().getName());
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, "Error while releasing " + mDexoptWakeLock.getTag() + " lock", e);
+ }
+ }
+
+ @GuardedBy("mInstallLock")
private int dexOptSecondaryDexPathLI(ApplicationInfo info, String path, Set<String> isas,
String compilerFilter, boolean isUsedByOtherApps) {
compilerFilter = getRealCompilerFilter(info, compilerFilter, isUsedByOtherApps);
@@ -361,10 +382,10 @@
boolean vmSafeMode = (flags & ApplicationInfo.FLAG_VM_SAFE_MODE) != 0;
if (vmSafeMode) {
// For the compilation, it doesn't really matter what we return here because installd
- // will replace the filter with interpret-only anyway.
+ // will replace the filter with 'quicken' anyway.
// However, we return a non profile guided filter so that we simplify the logic of
// merging profiles.
- // TODO(calin): safe mode path could be simplified if we pass interpret-only from
+ // TODO(calin): safe mode path could be simplified if we pass 'quicken' from
// here rather than letting installd decide on the filter.
return getNonProfileGuidedCompilerFilter(targetCompilerFilter);
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 7bbb1fe..cfcd0a5 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -444,7 +444,7 @@
* minute but we sometimes do very lengthy I/O operations on this thread,
* such as installing multi-gigabyte applications, so ours needs to be longer.
*/
- private static final long WATCHDOG_TIMEOUT = 1000*60*10; // ten minutes
+ static final long WATCHDOG_TIMEOUT = 1000*60*10; // ten minutes
/**
* Wall-clock timeout (in milliseconds) after which we *require* that an fstrim
@@ -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
@@ -4247,8 +4360,7 @@
}
SharedLibraryInfo resLibInfo = new SharedLibraryInfo(libInfo.getName(),
- // TODO: Remove cast for lib version once internally we support longs.
- (int) libInfo.getVersion(), libInfo.getType(),
+ libInfo.getVersion(), libInfo.getType(),
libInfo.getDeclaringPackage(), getPackagesUsingSharedLibraryLPr(libInfo,
flags, userId));
@@ -5758,10 +5870,9 @@
return mEphemeralAppsDisabled;
}
- private boolean isEphemeralAllowed(
+ private boolean isInstantAppAllowed(
Intent intent, List<ResolveInfo> resolvedActivities, int userId,
boolean skipPackageCheck) {
- final int callingUser = UserHandle.getCallingUserId();
if (mInstantAppResolverConnection == null) {
return false;
}
@@ -5820,10 +5931,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);
}
@@ -5861,7 +5972,13 @@
for (int i = 0; i < N; i++) {
ri = query.get(i);
if (ri.activityInfo.applicationInfo.isInstantApp()) {
- return ri;
+ final String packageName = ri.activityInfo.packageName;
+ final PackageSetting ps = mSettings.mPackages.get(packageName);
+ final long packedStatus = getDomainVerificationStatusLPr(ps, userId);
+ final int status = (int)(packedStatus >> 32);
+ if (status != INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK) {
+ return ri;
+ }
}
}
ri = new ResolveInfo(mResolveInfo);
@@ -6305,7 +6422,7 @@
result = filterIfNotSystemUser(mActivities.queryIntent(
intent, resolvedType, flags, userId), userId);
addEphemeral = !ephemeralDisabled
- && isEphemeralAllowed(intent, result, userId, false /*skipPackageCheck*/);
+ && isInstantAppAllowed(intent, result, userId, false /*skipPackageCheck*/);
// Check for cross profile results.
boolean hasNonNegativePriorityResult = hasNonNegativePriority(result);
xpResolveInfo = queryCrossProfileIntents(
@@ -6362,45 +6479,14 @@
// the caller wants to resolve for a particular package; however, there
// were no installed results, so, try to find an ephemeral result
addEphemeral = !ephemeralDisabled
- && isEphemeralAllowed(
+ && isInstantAppAllowed(
intent, null /*result*/, userId, true /*skipPackageCheck*/);
result = new ArrayList<ResolveInfo>();
}
}
}
if (addEphemeral) {
- Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "resolveEphemeral");
- final InstantAppRequest requestObject = new InstantAppRequest(
- null /*responseObj*/, intent /*origIntent*/, resolvedType,
- null /*callingPackage*/, userId);
- final AuxiliaryResolveInfo auxiliaryResponse =
- InstantAppResolver.doInstantAppResolutionPhaseOne(
- mContext, mInstantAppResolverConnection, requestObject);
- if (auxiliaryResponse != null) {
- if (DEBUG_EPHEMERAL) {
- Slog.v(TAG, "Adding ephemeral installer to the ResolveInfo list");
- }
- final ResolveInfo ephemeralInstaller = new ResolveInfo(mInstantAppInstallerInfo);
- final PackageSetting ps =
- mSettings.mPackages.get(mInstantAppInstallerActivity.packageName);
- if (ps != null) {
- ephemeralInstaller.activityInfo = PackageParser.generateActivityInfo(
- mInstantAppInstallerActivity, 0, ps.readUserState(userId), userId);
- ephemeralInstaller.activityInfo.launchToken = auxiliaryResponse.token;
- ephemeralInstaller.auxiliaryInfo = auxiliaryResponse;
- // make sure this resolver is the default
- ephemeralInstaller.isDefault = true;
- ephemeralInstaller.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART
- | IntentFilter.MATCH_ADJUSTMENT_NORMAL;
- // add a non-generic filter
- ephemeralInstaller.filter = new IntentFilter(intent.getAction());
- ephemeralInstaller.filter.addDataPath(
- intent.getData().getPath(), PatternMatcher.PATTERN_LITERAL);
- ephemeralInstaller.instantAppAvailable = true;
- result.add(ephemeralInstaller);
- }
- }
- Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
+ result = maybeAddInstantAppInstaller(result, intent, resolvedType, flags, userId);
}
if (sortResult) {
Collections.sort(result, mResolvePrioritySorter);
@@ -6408,6 +6494,86 @@
return applyPostResolutionFilter(result, instantAppPkgName);
}
+ private List<ResolveInfo> maybeAddInstantAppInstaller(List<ResolveInfo> result, Intent intent,
+ String resolvedType, int flags, int userId) {
+ // first, check to see if we've got an instant app already installed
+ final boolean alreadyResolvedLocally = (flags & PackageManager.MATCH_INSTANT) != 0;
+ boolean localInstantAppAvailable = false;
+ boolean blockResolution = false;
+ if (!alreadyResolvedLocally) {
+ final List<ResolveInfo> instantApps = mActivities.queryIntent(intent, resolvedType,
+ flags
+ | PackageManager.MATCH_INSTANT
+ | PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY,
+ userId);
+ for (int i = instantApps.size() - 1; i >= 0; --i) {
+ final ResolveInfo info = instantApps.get(i);
+ final String packageName = info.activityInfo.packageName;
+ final PackageSetting ps = mSettings.mPackages.get(packageName);
+ if (ps.getInstantApp(userId)) {
+ final long packedStatus = getDomainVerificationStatusLPr(ps, userId);
+ final int status = (int)(packedStatus >> 32);
+ final int linkGeneration = (int)(packedStatus & 0xFFFFFFFF);
+ if (status == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER) {
+ // there's a local instant application installed, but, the user has
+ // chosen to never use it; skip resolution and don't acknowledge
+ // an instant application is even available
+ if (DEBUG_EPHEMERAL) {
+ Slog.v(TAG, "Instant app marked to never run; pkg: " + packageName);
+ }
+ blockResolution = true;
+ break;
+ } else {
+ // we have a locally installed instant application; skip resolution
+ // but acknowledge there's an instant application available
+ if (DEBUG_EPHEMERAL) {
+ Slog.v(TAG, "Found installed instant app; pkg: " + packageName);
+ }
+ localInstantAppAvailable = true;
+ break;
+ }
+ }
+ }
+ }
+ // no app installed, let's see if one's available
+ AuxiliaryResolveInfo auxiliaryResponse = null;
+ if (!localInstantAppAvailable && !blockResolution) {
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "resolveEphemeral");
+ final InstantAppRequest requestObject = new InstantAppRequest(
+ null /*responseObj*/, intent /*origIntent*/, resolvedType,
+ null /*callingPackage*/, userId, null /*verificationBundle*/);
+ auxiliaryResponse =
+ InstantAppResolver.doInstantAppResolutionPhaseOne(
+ mContext, mInstantAppResolverConnection, requestObject);
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
+ }
+ if (localInstantAppAvailable || auxiliaryResponse != null) {
+ if (DEBUG_EPHEMERAL) {
+ Slog.v(TAG, "Adding ephemeral installer to the ResolveInfo list");
+ }
+ final ResolveInfo ephemeralInstaller = new ResolveInfo(mInstantAppInstallerInfo);
+ final PackageSetting ps =
+ mSettings.mPackages.get(mInstantAppInstallerActivity.packageName);
+ if (ps != null) {
+ ephemeralInstaller.activityInfo = PackageParser.generateActivityInfo(
+ mInstantAppInstallerActivity, 0, ps.readUserState(userId), userId);
+ ephemeralInstaller.activityInfo.launchToken = auxiliaryResponse.token;
+ ephemeralInstaller.auxiliaryInfo = auxiliaryResponse;
+ // make sure this resolver is the default
+ ephemeralInstaller.isDefault = true;
+ ephemeralInstaller.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART
+ | IntentFilter.MATCH_ADJUSTMENT_NORMAL;
+ // add a non-generic filter
+ ephemeralInstaller.filter = new IntentFilter(intent.getAction());
+ ephemeralInstaller.filter.addDataPath(
+ intent.getData().getPath(), PatternMatcher.PATTERN_LITERAL);
+ ephemeralInstaller.instantAppAvailable = true;
+ result.add(ephemeralInstaller);
+ }
+ }
+ return result;
+ }
+
private static class CrossProfileDomainInfo {
/* ResolveInfo for IntentForwarderActivity to send the intent to the other profile */
ResolveInfo resolveInfo;
@@ -7856,7 +8022,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;
@@ -8554,7 +8721,7 @@
// are verify-profile but for preopted apps there's no profile.
// Do a hacky check to ensure that if we have no profiles (a reasonable indication
// that before the OTA the app was preopted) the app gets compiled with a non-profile
- // filter (by default interpret-only).
+ // filter (by default 'quicken').
// Note that at this stage unused apps are already filtered.
if (isSystemApp(pkg) &&
DexFile.isProfileGuidedCompilerFilter(compilerFilter) &&
@@ -12497,7 +12664,7 @@
}
res.iconResourceId = info.icon;
res.system = res.activityInfo.applicationInfo.isSystemApp();
- res.instantAppAvailable = userState.instantApp;
+ res.isInstantAppAvailable = userState.instantApp;
return res;
}
@@ -17075,10 +17242,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;
@@ -17636,8 +17803,7 @@
for (int i = 0; i < versionCount; i++) {
SharedLibraryEntry libEntry = versionedLib.valueAt(i);
if (versionsCallerCanSee != null && versionsCallerCanSee.indexOfKey(
- // TODO: Remove cast for lib version once internally we support longs.
- (int) libEntry.info.getVersion()) < 0) {
+ libEntry.info.getVersion()) < 0) {
continue;
}
// TODO: We will change version code to long, so in the new API it is long
@@ -20570,6 +20736,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;
@@ -20815,6 +20982,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();
@@ -21145,6 +21314,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);
}
@@ -23423,9 +23617,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
@@ -23570,6 +23766,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/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 25a596a..c1d68b8 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -1598,10 +1598,10 @@
pw.println(" -f: force compilation even if not needed");
pw.println(" -m: select compilation mode");
pw.println(" MODE is one of the dex2oat compiler filters:");
- pw.println(" verify-none");
- pw.println(" verify-at-runtime");
- pw.println(" verify-profile");
- pw.println(" interpret-only");
+ pw.println(" assume-verified");
+ pw.println(" extract");
+ pw.println(" verify");
+ pw.println(" quicken");
pw.println(" space-profile");
pw.println(" space");
pw.println(" speed-profile");
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 7c89e1c..bed8f1a 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -555,8 +555,8 @@
}
@Override
- public void onCleanupUser(int userHandle) {
- mService.handleCleanupUser(userHandle);
+ public void onStopUser(int userHandle) {
+ mService.handleStopUser(userHandle);
}
@Override
@@ -606,9 +606,9 @@
}
/** lifecycle event */
- void handleCleanupUser(int userId) {
+ void handleStopUser(int userId) {
if (DEBUG) {
- Slog.d(TAG, "handleCleanupUser: user=" + userId);
+ Slog.d(TAG, "handleStopUser: user=" + userId);
}
synchronized (mLock) {
unloadUserLocked(userId);
@@ -3777,7 +3777,7 @@
Slog.i(TAG, "cmd: handleUnloadUser: user=" + mUserId);
- ShortcutService.this.handleCleanupUser(mUserId);
+ ShortcutService.this.handleStopUser(mUserId);
}
}
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/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java
index 3d7cedc..9b44646 100644
--- a/services/core/java/com/android/server/pm/dex/DexManager.java
+++ b/services/core/java/com/android/server/pm/dex/DexManager.java
@@ -60,6 +60,7 @@
// Maps package name to code locations.
// It caches the code locations for the installed packages. This allows for
// faster lookups (no locks) when finding what package owns the dex file.
+ @GuardedBy("mPackageCodeLocationsCache")
private final Map<String, PackageCodeLocations> mPackageCodeLocationsCache;
// PackageDexUsage handles the actual I/O operations. It is responsible to
@@ -204,7 +205,7 @@
// In case there was an update, write the package use info to disk async.
// Note that we do the writing here and not in PackageDexUsage in order to be
// consistent with other methods in DexManager (e.g. reconcileSecondaryDexFiles performs
- // multiple updates in PackaeDexUsage before writing it).
+ // multiple updates in PackageDexUsage before writing it).
if (mPackageDexUsage.clearUsedByOtherApps(packageName)) {
mPackageDexUsage.maybeWriteAsync();
}
@@ -224,7 +225,7 @@
// In case there was an update, write the package use info to disk async.
// Note that we do the writing here and not in PackageDexUsage in order to be
// consistent with other methods in DexManager (e.g. reconcileSecondaryDexFiles performs
- // multiple updates in PackaeDexUsage before writing it).
+ // multiple updates in PackageDexUsage before writing it).
if (updated) {
mPackageDexUsage.maybeWriteAsync();
}
@@ -243,17 +244,22 @@
private void cachePackageCodeLocation(String packageName, String baseCodePath,
String[] splitCodePaths, String[] dataDirs, int userId) {
- PackageCodeLocations pcl = putIfAbsent(mPackageCodeLocationsCache, packageName,
- new PackageCodeLocations(packageName, baseCodePath, splitCodePaths));
- pcl.updateCodeLocation(baseCodePath, splitCodePaths);
- if (dataDirs != null) {
- for (String dataDir : dataDirs) {
- // The set of data dirs includes deviceProtectedDataDir and
- // credentialProtectedDataDir which might be null for shared
- // libraries. Currently we don't track these but be lenient
- // and check in case we ever decide to store their usage data.
- if (dataDir != null) {
- pcl.mergeAppDataDirs(dataDir, userId);
+ synchronized (mPackageCodeLocationsCache) {
+ PackageCodeLocations pcl = putIfAbsent(mPackageCodeLocationsCache, packageName,
+ new PackageCodeLocations(packageName, baseCodePath, splitCodePaths));
+ // TODO(calin): We are forced to extend the scope of this synchronization because
+ // the values of the cache (PackageCodeLocations) are updated in place.
+ // Make PackageCodeLocations immutable to simplify the synchronization reasoning.
+ pcl.updateCodeLocation(baseCodePath, splitCodePaths);
+ if (dataDirs != null) {
+ for (String dataDir : dataDirs) {
+ // The set of data dirs includes deviceProtectedDataDir and
+ // credentialProtectedDataDir which might be null for shared
+ // libraries. Currently we don't track these but be lenient
+ // and check in case we ever decide to store their usage data.
+ if (dataDir != null) {
+ pcl.mergeAppDataDirs(dataDir, userId);
+ }
}
}
}
@@ -479,10 +485,12 @@
// The loadingPackage does not own the dex file.
// Perform a reverse look-up in the cache to detect if any package has ownership.
// Note that we can have false negatives if the cache falls out of date.
- for (PackageCodeLocations pcl : mPackageCodeLocationsCache.values()) {
- outcome = pcl.searchDex(dexPath, userId);
- if (outcome != DEX_SEARCH_NOT_FOUND) {
- return new DexSearchResult(pcl.mPackageName, outcome);
+ synchronized (mPackageCodeLocationsCache) {
+ for (PackageCodeLocations pcl : mPackageCodeLocationsCache.values()) {
+ outcome = pcl.searchDex(dexPath, userId);
+ if (outcome != DEX_SEARCH_NOT_FOUND) {
+ return new DexSearchResult(pcl.mPackageName, outcome);
+ }
}
}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 1d064de..ccdf61f 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -184,6 +184,7 @@
import android.service.dreams.DreamManagerInternal;
import android.service.dreams.DreamService;
import android.service.dreams.IDreamManager;
+import android.service.vr.IPersistentVrStateCallbacks;
import android.speech.RecognizerIntent;
import android.telecom.TelecomManager;
import android.util.DisplayMetrics;
@@ -512,6 +513,8 @@
volatile boolean mGoingToSleep;
volatile boolean mRecentsVisible;
volatile boolean mPictureInPictureVisible;
+ // Written by vr manager thread, only read in this class.
+ volatile private boolean mPersistentVrModeEnabled;
volatile private boolean mDismissImeOnBackKeyPressed;
// Used to hold the last user key used to wake the device. This helps us prevent up events
@@ -777,6 +780,10 @@
private boolean mBugreportTvKey2Pressed;
private boolean mBugreportTvScheduled;
+ private boolean mAccessibilityTvKey1Pressed;
+ private boolean mAccessibilityTvKey2Pressed;
+ private boolean mAccessibilityTvScheduled;
+
/* The number of steps between min and max brightness */
private static final int BRIGHTNESS_STEPS = 10;
@@ -821,6 +828,7 @@
private static final int MSG_BACK_DELAYED_PRESS = 20;
private static final int MSG_ACCESSIBILITY_SHORTCUT = 21;
private static final int MSG_BUGREPORT_TV = 22;
+ private static final int MSG_ACCESSIBILITY_TV = 23;
private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS = 0;
private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION = 1;
@@ -902,6 +910,11 @@
case MSG_BUGREPORT_TV:
takeBugreport();
break;
+ case MSG_ACCESSIBILITY_TV:
+ if (mAccessibilityShortcutController.isAccessibilityShortcutAvailable(false)) {
+ accessibilityShortcutActivated();
+ }
+ break;
}
}
}
@@ -1002,6 +1015,14 @@
}
MyOrientationListener mOrientationListener;
+ final IPersistentVrStateCallbacks mPersistentVrModeListener =
+ new IPersistentVrStateCallbacks.Stub() {
+ @Override
+ public void onPersistentVrStateChanged(boolean enabled) {
+ mPersistentVrModeEnabled = enabled;
+ }
+ };
+
private final StatusBarController mStatusBarController = new StatusBarController();
private final BarController mNavigationBarController = new BarController("NavigationBar",
@@ -3308,6 +3329,11 @@
if (!down) {
cancelPreloadRecentApps();
+ if (mHasFeatureLeanback) {
+ // Clear flags
+ mAccessibilityTvKey2Pressed = down;
+ }
+
mHomePressed = false;
if (mHomeConsumed) {
mHomeConsumed = false;
@@ -3362,6 +3388,13 @@
preloadRecentApps();
}
} else if ((event.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0) {
+ if (mHasFeatureLeanback) {
+ mAccessibilityTvKey2Pressed = down;
+ if (interceptAccessibilityGestureTv()) {
+ return -1;
+ }
+ }
+
if (!keyguardOn) {
handleLongPressOnHome(event.getDeviceId());
}
@@ -3521,6 +3554,11 @@
return 0;
} else if (mHasFeatureLeanback && interceptBugreportGestureTv(keyCode, down)) {
return -1;
+ } else if (mHasFeatureLeanback && keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
+ mAccessibilityTvKey1Pressed = down;
+ if (interceptAccessibilityGestureTv()) {
+ return -1;
+ }
}
// Toggle Caps Lock on META-ALT.
@@ -3739,6 +3777,25 @@
return mBugreportTvScheduled;
}
+ /**
+ * TV only: recognizes a remote control gesture as Accessibility shortcut.
+ * Shortcut: Long press (HOME + DPAD_CENTER)
+ */
+ private boolean interceptAccessibilityGestureTv() {
+ if (mAccessibilityTvKey1Pressed && mAccessibilityTvKey2Pressed) {
+ if (!mAccessibilityTvScheduled) {
+ mAccessibilityTvScheduled = true;
+ Message msg = Message.obtain(mHandler, MSG_ACCESSIBILITY_TV);
+ msg.setAsynchronous(true);
+ mHandler.sendMessage(msg);
+ }
+ } else if (mAccessibilityTvScheduled) {
+ mHandler.removeMessages(MSG_ACCESSIBILITY_TV);
+ mAccessibilityTvScheduled = false;
+ }
+ return mAccessibilityTvScheduled;
+ }
+
private void takeBugreport() {
if ("1".equals(SystemProperties.get("ro.debuggable"))
|| Settings.Global.getInt(mContext.getContentResolver(),
@@ -5909,7 +5966,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;
}
@@ -6909,7 +6966,13 @@
|| mAllowAllRotations == 1
|| orientation == ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR
|| orientation == ActivityInfo.SCREEN_ORIENTATION_FULL_USER) {
- preferredRotation = sensorRotation;
+ // In VrMode, we report the sensor as always being in default orientation so:
+ // 1) The orientation doesn't change as the user moves their head.
+ // 2) 2D apps within VR show in the device's default orientation.
+ // This only overwrites the sensor-provided orientation and does not affect any
+ // explicit orientation preferences specified by any activities.
+ preferredRotation =
+ mPersistentVrModeEnabled ? Surface.ROTATION_0 : sensorRotation;
} else {
preferredRotation = lastRotation;
}
@@ -7083,6 +7146,9 @@
mKeyguardDelegate.onSystemReady();
mVrManagerInternal = LocalServices.getService(VrManagerInternal.class);
+ if (mVrManagerInternal != null) {
+ mVrManagerInternal.addPersistentVrModeStateListener(mPersistentVrModeListener);
+ }
readCameraLensCoverState();
updateUiMode();
@@ -8215,6 +8281,14 @@
pw.print(prefix); pw.print("mDemoHdmiRotation="); pw.print(mDemoHdmiRotation);
pw.print(" mDemoHdmiRotationLock="); pw.println(mDemoHdmiRotationLock);
pw.print(prefix); pw.print("mUndockedHdmiRotation="); pw.println(mUndockedHdmiRotation);
+ if (mHasFeatureLeanback) {
+ pw.print(prefix);
+ pw.print("mAccessibilityTvKey1Pressed="); pw.println(mAccessibilityTvKey1Pressed);
+ pw.print(prefix);
+ pw.print("mAccessibilityTvKey2Pressed="); pw.println(mAccessibilityTvKey2Pressed);
+ pw.print(prefix);
+ pw.print("mAccessibilityTvScheduled="); pw.println(mAccessibilityTvScheduled);
+ }
mGlobalKeyManager.dump(prefix, pw);
mStatusBarController.dump(pw, prefix);
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 61ed72d..423bc0c 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) {
@@ -4577,12 +4632,6 @@
}
@Override
- public void setButtonBrightnessOverrideFromWindowManager(int screenBrightness) {
- // Do nothing.
- // Button lights are not currently supported in the new implementation.
- }
-
- @Override
public void setDozeOverrideFromDreamManager(int screenState, int screenBrightness) {
switch (screenState) {
case Display.STATE_UNKNOWN:
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/twilight/TwilightState.java b/services/core/java/com/android/server/twilight/TwilightState.java
index a12965d..30a8ccc 100644
--- a/services/core/java/com/android/server/twilight/TwilightState.java
+++ b/services/core/java/com/android/server/twilight/TwilightState.java
@@ -31,7 +31,7 @@
private final long mSunriseTimeMillis;
private final long mSunsetTimeMillis;
- TwilightState(long sunriseTimeMillis, long sunsetTimeMillis) {
+ public TwilightState(long sunriseTimeMillis, long sunsetTimeMillis) {
mSunriseTimeMillis = sunriseTimeMillis;
mSunsetTimeMillis = sunsetTimeMillis;
}
diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java
index c625cbe..b5e194b 100644
--- a/services/core/java/com/android/server/wm/AppWindowContainerController.java
+++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java
@@ -36,7 +36,6 @@
import android.os.Debug;
import android.os.Handler;
import android.os.IBinder;
-import android.os.Looper;
import android.os.Trace;
import android.util.Slog;
import android.view.IApplicationToken;
@@ -319,7 +318,7 @@
+ " token: " + mToken);
return;
}
- mContainer.setDisablePreviewSnapshots(disable);
+ mContainer.setDisablePreviewScreenshots(disable);
}
}
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 3c2dfa5..640bac2 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -23,6 +23,7 @@
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
+import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
@@ -48,6 +49,7 @@
import static com.android.server.wm.WindowManagerService.logWithStack;
import android.annotation.NonNull;
+import android.app.Activity;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Binder;
@@ -893,6 +895,7 @@
if (mPendingRelaunchCount > 0) {
mPendingRelaunchCount--;
}
+ updateAllDrawn();
}
void clearRelaunching() {
@@ -1301,16 +1304,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();
@@ -1327,7 +1334,9 @@
+ " interesting=" + numInteresting
+ " drawn=" + mNumDrawnWindowsExcludingSaved);
allDrawnExcludingSaved = true;
- dc.setLayoutNeeded();
+ if (mDisplayContent != null) {
+ mDisplayContent.setLayoutNeeded();
+ }
if (isAnimatingInvisibleWithSavedSurface()
&& !mService.mFinishedEarlyAnim.contains(this)) {
mService.mFinishedEarlyAnim.add(this);
@@ -1521,12 +1530,24 @@
return candidate;
}
- void setDisablePreviewSnapshots(boolean disable) {
+ /**
+ * See {@link Activity#setDisablePreviewScreenshots}.
+ */
+ void setDisablePreviewScreenshots(boolean disable) {
mDisbalePreviewScreenshots = disable;
}
- boolean shouldDisablePreviewScreenshots() {
- return mDisbalePreviewScreenshots;
+ /**
+ * Retrieves whether we'd like to generate a snapshot that's based solely on the theme. This is
+ * the case when preview screenshots are disabled {@link #setDisablePreviewScreenshots} or when
+ * we can't take a snapshot for other reasons, for example, if we have a secure window.
+ *
+ * @return True if we need to generate an app theme snapshot, false if we'd like to take a real
+ * screenshot.
+ */
+ boolean shouldUseAppThemeSnapshot() {
+ return mDisbalePreviewScreenshots || forAllWindows(w -> (w.mAttrs.flags & FLAG_SECURE) != 0,
+ true /* topToBottom */);
}
@Override
diff --git a/services/core/java/com/android/server/wm/DimLayerController.java b/services/core/java/com/android/server/wm/DimLayerController.java
index 4100446..d44cd13 100644
--- a/services/core/java/com/android/server/wm/DimLayerController.java
+++ b/services/core/java/com/android/server/wm/DimLayerController.java
@@ -188,6 +188,7 @@
boolean animateDimLayers() {
int fullScreen = -1;
int fullScreenAndDimming = -1;
+ int topFullScreenUserLayer = 0;
boolean result = false;
for (int i = mState.size() - 1; i >= 0; i--) {
@@ -213,8 +214,18 @@
// and we have to make sure we always animate the layer.
if (user.dimFullscreen() && state.dimLayer == mSharedFullScreenDimLayer) {
fullScreen = i;
- if (mState.valueAt(i).continueDimming) {
+ if (!state.continueDimming) {
+ continue;
+ }
+
+ // When choosing which user to assign the shared fullscreen layer to
+ // we need to look at Z-order.
+ if (topFullScreenUserLayer == 0 ||
+ (state.animator != null && state.animator.mAnimLayer > topFullScreenUserLayer)) {
fullScreenAndDimming = i;
+ if (state.animator != null) {
+ topFullScreenUserLayer = state.animator.mAnimLayer;
+ }
}
} else {
// We always want to animate the non fullscreen windows, they don't share their
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index b7a268c..be242b6 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -1503,8 +1503,16 @@
return mImeWindowsContainers.forAllWindows(callback, traverseTopToBottom);
}
- @Override
- int getOrientation() {
+ /**
+ * Returns the orientation that this display should be in factoring in its children containers.
+ *
+ * @param includeAppContainers True if then app containers (stacks, tasks, ...) should be
+ * factored in when determining the orientation. If false only
+ * non-app/system containers will be used to determine the returned
+ * orientation.
+ * @return The orientation the display should be in.
+ */
+ int getOrientation(boolean includeAppContainers) {
final WindowManagerPolicy policy = mService.mPolicy;
if (mService.mDisplayFrozen) {
@@ -1533,8 +1541,14 @@
}
}
- // Top system windows are not requesting an orientation. Start searching from apps.
- return mTaskStackContainers.getOrientation();
+ // Top system windows are not requesting an orientation. Get orientation from app containers
+ // if allowed. Otherwise, return the last orientation.
+ return includeAppContainers ? mTaskStackContainers.getOrientation() : mLastOrientation;
+ }
+
+ @Override
+ int getOrientation() {
+ return getOrientation(true /* includeAppContainers */);
}
void updateDisplayInfo() {
@@ -1793,7 +1807,13 @@
// events to be intercepted and used to change focus. This would likely cause a
// disappearance of the input method.
inputMethod.getTouchableRegion(mTmpRegion);
- mTouchExcludeRegion.op(mTmpRegion, Region.Op.UNION);
+ if (inputMethod.getDisplayId() == mDisplayId) {
+ mTouchExcludeRegion.op(mTmpRegion, Op.UNION);
+ } else {
+ // IME is on a different display, so we need to update its tap detector.
+ // TODO(multidisplay): Remove when IME will always appear on same display.
+ inputMethod.getDisplayContent().setTouchExcludeRegion(null /* focusedTask */);
+ }
}
for (int i = mTapExcludedWindows.size() - 1; i >= 0; i--) {
WindowState win = mTapExcludedWindows.get(i);
@@ -1954,7 +1974,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);
@@ -2729,7 +2750,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 60b136f..be3558b 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -21,7 +21,10 @@
import android.hardware.power.V1_0.PowerHint;
import android.os.Binder;
import android.os.Debug;
+import android.os.Handler;
import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.os.PowerManager;
import android.os.RemoteException;
@@ -34,6 +37,8 @@
import android.view.Display;
import android.view.DisplayInfo;
import android.view.WindowManager;
+
+import com.android.internal.os.SomeArgs;
import com.android.internal.util.ArrayUtils;
import com.android.server.EventLogTags;
@@ -87,13 +92,15 @@
class RootWindowContainer extends WindowContainer<DisplayContent> {
private static final String TAG = TAG_WITH_CLASS_NAME ? "RootWindowContainer" : TAG_WM;
+ private static final int SET_SCREEN_BRIGHTNESS_OVERRIDE = 1;
+ private static final int SET_USER_ACTIVITY_TIMEOUT = 2;
+
WindowManagerService mService;
private boolean mWallpaperForceHidingChanged = false;
private Object mLastWindowFreezeSource = null;
private Session mHoldScreen = null;
private float mScreenBrightness = -1;
- private float mButtonBrightness = -1;
private long mUserActivityTimeout = -1;
private boolean mUpdateRotation = false;
// Following variables are for debugging screen wakelock only.
@@ -128,6 +135,8 @@
private final WindowLayersController mLayersController;
final WallpaperController mWallpaperController;
+ private final Handler mHandler;
+
private String mCloseSystemDialogsReason;
private final Consumer<WindowState> mCloseSystemDialogsConsumer = w -> {
if (w.mHasSurface) {
@@ -147,6 +156,7 @@
RootWindowContainer(WindowManagerService service) {
mService = service;
+ mHandler = new MyHandler(service.mH.getLooper());
mLayersController = new WindowLayersController(mService);
mWallpaperController = new WallpaperController(mService);
}
@@ -552,7 +562,6 @@
mHoldScreen = null;
mScreenBrightness = -1;
- mButtonBrightness = -1;
mUserActivityTimeout = -1;
mObscureApplicationContentOnSecondaryDisplays = false;
mSustainedPerformanceModeCurrent = false;
@@ -702,20 +711,13 @@
mService.setHoldScreenLocked(mHoldScreen);
if (!mService.mDisplayFrozen) {
- if (mScreenBrightness < 0 || mScreenBrightness > 1.0f) {
- mService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager(-1);
- } else {
- mService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager(
- toBrightnessOverride(mScreenBrightness));
- }
- if (mButtonBrightness < 0 || mButtonBrightness > 1.0f) {
- mService.mPowerManagerInternal.setButtonBrightnessOverrideFromWindowManager(-1);
- } else {
- mService.mPowerManagerInternal.setButtonBrightnessOverrideFromWindowManager(
- toBrightnessOverride(mButtonBrightness));
- }
- mService.mPowerManagerInternal.setUserActivityTimeoutOverrideFromWindowManager(
- mUserActivityTimeout);
+ final int brightness = mScreenBrightness < 0 || mScreenBrightness > 1.0f
+ ? -1 : toBrightnessOverride(mScreenBrightness);
+
+ // Post these on a handler such that we don't call into power manager service while
+ // holding the window manager lock to avoid lock contention with power manager lock.
+ mHandler.obtainMessage(SET_SCREEN_BRIGHTNESS_OVERRIDE, brightness, 0).sendToTarget();
+ mHandler.obtainMessage(SET_USER_ACTIVITY_TIMEOUT, mUserActivityTimeout).sendToTarget();
}
if (mSustainedPerformanceModeCurrent != mSustainedPerformanceModeEnabled) {
@@ -863,9 +865,6 @@
if (!syswin && w.mAttrs.screenBrightness >= 0 && mScreenBrightness < 0) {
mScreenBrightness = w.mAttrs.screenBrightness;
}
- if (!syswin && w.mAttrs.buttonBrightness >= 0 && mButtonBrightness < 0) {
- mButtonBrightness = w.mAttrs.buttonBrightness;
- }
if (!syswin && w.mAttrs.userActivityTimeout >= 0 && mUserActivityTimeout < 0) {
mUserActivityTimeout = w.mAttrs.userActivityTimeout;
}
@@ -935,6 +934,29 @@
return (int)(value * PowerManager.BRIGHTNESS_ON);
}
+ private final class MyHandler extends Handler {
+
+ public MyHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case SET_SCREEN_BRIGHTNESS_OVERRIDE:
+ mService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager(
+ msg.arg1);
+ break;
+ case SET_USER_ACTIVITY_TIMEOUT:
+ mService.mPowerManagerInternal.setUserActivityTimeoutOverrideFromWindowManager(
+ (Long) msg.obj);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
void enableSurfaceTrace(ParcelFileDescriptor pfd) {
final FileDescriptor fd = pfd.getFileDescriptor();
if (mSurfaceTraceEnabled) {
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index bc749e1..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;
}
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index fbb826d..b79173c 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -31,11 +31,13 @@
import android.graphics.Rect;
import android.os.Environment;
import android.util.ArraySet;
+import android.view.WindowManager.LayoutParams;
import android.view.WindowManagerPolicy.StartingSurface;
import com.google.android.collect.Sets;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.wm.TaskSnapshotSurface.SystemBarBackgroundPainter;
import java.io.PrintWriter;
@@ -206,7 +208,7 @@
final AppWindowToken topChild = task.getTopChild();
if (StackId.isHomeOrRecentsStack(task.mStack.mStackId)) {
return SNAPSHOT_MODE_NONE;
- } else if (topChild != null && topChild.shouldDisablePreviewScreenshots()) {
+ } else if (topChild != null && topChild.shouldUseAppThemeSnapshot()) {
return SNAPSHOT_MODE_APP_THEME;
} else {
return SNAPSHOT_MODE_REAL;
@@ -227,6 +229,8 @@
return null;
}
final int color = task.getTaskDescription().getBackgroundColor();
+ final int statusBarColor = task.getTaskDescription().getStatusBarColor();
+ final int navigationBarColor = task.getTaskDescription().getNavigationBarColor();
final GraphicBuffer buffer = GraphicBuffer.create(mainWindow.getFrameLw().width(),
mainWindow.getFrameLw().height(),
RGBA_8888, USAGE_HW_TEXTURE | USAGE_SW_WRITE_RARELY | USAGE_SW_READ_NEVER);
@@ -235,6 +239,11 @@
}
final Canvas c = buffer.lockCanvas();
c.drawColor(color);
+ final LayoutParams attrs = mainWindow.getAttrs();
+ final SystemBarBackgroundPainter decorPainter = new SystemBarBackgroundPainter(attrs.flags,
+ attrs.privateFlags, attrs.systemUiVisibility, statusBarColor, navigationBarColor);
+ decorPainter.setInsets(mainWindow.mContentInsets, mainWindow.mStableInsets);
+ decorPainter.drawDecors(c, null /* statusBarExcludeFrame */);
buffer.unlockCanvasAndPost(c);
return new TaskSnapshot(buffer, topChild.getConfiguration().orientation,
mainWindow.mStableInsets, false /* reduced */, 1.0f /* scale */);
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java
index f2a92df..e5c7a72 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java
@@ -24,6 +24,7 @@
import android.app.ActivityManager.TaskSnapshot;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
+import android.graphics.Bitmap.Config;
import android.os.Process;
import android.os.SystemClock;
import android.util.ArraySet;
@@ -266,12 +267,13 @@
final File file = getBitmapFile(mTaskId, mUserId);
final File reducedFile = getReducedResolutionBitmapFile(mTaskId, mUserId);
final Bitmap bitmap = Bitmap.createHardwareBitmap(mSnapshot.getSnapshot());
- final Bitmap reduced = Bitmap.createScaledBitmap(bitmap,
+ final Bitmap swBitmap = bitmap.copy(Config.ARGB_8888, false /* isMutable */);
+ final Bitmap reduced = Bitmap.createScaledBitmap(swBitmap,
(int) (bitmap.getWidth() * REDUCED_SCALE),
(int) (bitmap.getHeight() * REDUCED_SCALE), true /* filter */);
try {
FileOutputStream fos = new FileOutputStream(file);
- bitmap.compress(JPEG, QUALITY, fos);
+ swBitmap.compress(JPEG, QUALITY, fos);
fos.close();
FileOutputStream reducedFos = new FileOutputStream(reducedFile);
reduced.compress(JPEG, QUALITY, reducedFos);
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
index c816ba3..2b9e800 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
@@ -42,8 +42,11 @@
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
+import android.annotation.Nullable;
import android.app.ActivityManager.TaskDescription;
import android.app.ActivityManager.TaskSnapshot;
+import android.app.ActivityThread;
+import android.content.Context;
import android.graphics.Canvas;
import android.graphics.GraphicBuffer;
import android.graphics.Paint;
@@ -118,13 +121,8 @@
private final Handler mHandler;
private boolean mSizeMismatch;
private final Paint mBackgroundPaint = new Paint();
- private final Paint mStatusBarPaint = new Paint();
- private final Paint mNavigationBarPaint = new Paint();
private final int mStatusBarColor;
- private final int mNavigationBarColor;
- private final int mSysUiVis;
- private final int mWindowFlags;
- private final int mWindowPrivateFlags;
+ @VisibleForTesting final SystemBarBackgroundPainter mSystemBarBackgroundPainter;
static TaskSnapshotSurface create(WindowManagerService service, AppWindowToken token,
TaskSnapshot snapshot) {
@@ -224,15 +222,9 @@
mTitle = title;
mBackgroundPaint.setColor(backgroundColor != 0 ? backgroundColor : WHITE);
mTaskBounds = taskBounds;
- mSysUiVis = sysUiVis;
- mWindowFlags = windowFlags;
- mWindowPrivateFlags = windowPrivateFlags;
- mStatusBarColor = DecorView.calculateStatusBarColor(windowFlags,
- service.mContext.getColor(R.color.system_bar_background_semi_transparent),
- statusBarColor);
- mNavigationBarColor = navigationBarColor;
- mStatusBarPaint.setColor(mStatusBarColor);
- mNavigationBarPaint.setColor(navigationBarColor);
+ mSystemBarBackgroundPainter = new SystemBarBackgroundPainter(windowFlags,
+ windowPrivateFlags, sysUiVis, statusBarColor, navigationBarColor);
+ mStatusBarColor = statusBarColor;
}
@Override
@@ -258,6 +250,7 @@
mStableInsets.set(stableInsets);
mSizeMismatch = (mFrame.width() != mSnapshot.getSnapshot().getWidth()
|| mFrame.height() != mSnapshot.getSnapshot().getHeight());
+ mSystemBarBackgroundPainter.setInsets(contentInsets, stableInsets);
}
private void drawSnapshot() {
@@ -346,7 +339,7 @@
@VisibleForTesting
void drawBackgroundAndBars(Canvas c, Rect frame) {
- final int statusBarHeight = getStatusBarColorViewHeight();
+ final int statusBarHeight = mSystemBarBackgroundPainter.getStatusBarColorViewHeight();
final boolean fillHorizontally = c.getWidth() > frame.right;
final boolean fillVertically = c.getHeight() > frame.bottom;
if (fillHorizontally) {
@@ -359,44 +352,7 @@
if (fillVertically) {
c.drawRect(0, frame.bottom, c.getWidth(), c.getHeight(), mBackgroundPaint);
}
- drawStatusBarBackground(c, frame, statusBarHeight);
- drawNavigationBarBackground(c);
- }
-
- private int getStatusBarColorViewHeight() {
- final boolean forceStatusBarBackground =
- (mWindowPrivateFlags & PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND) != 0;
- if (STATUS_BAR_COLOR_VIEW_ATTRIBUTES.isVisible(
- mSysUiVis, mStatusBarColor, mWindowFlags, forceStatusBarBackground)) {
- return getColorViewTopInset(mStableInsets.top, mContentInsets.top);
- } else {
- return 0;
- }
- }
-
- private boolean isNavigationBarColorViewVisible() {
- return NAVIGATION_BAR_COLOR_VIEW_ATTRIBUTES.isVisible(
- mSysUiVis, mNavigationBarColor, mWindowFlags, false /* force */);
- }
-
- @VisibleForTesting
- void drawStatusBarBackground(Canvas c, Rect frame, int statusBarHeight) {
- if (statusBarHeight > 0 && c.getWidth() > frame.right) {
- final int rightInset = DecorView.getColorViewRightInset(mStableInsets.right,
- mContentInsets.right);
- c.drawRect(frame.right, 0, c.getWidth() - rightInset, statusBarHeight, mStatusBarPaint);
- }
- }
-
- @VisibleForTesting
- void drawNavigationBarBackground(Canvas c) {
- final Rect navigationBarRect = new Rect();
- getNavigationBarRect(c.getWidth(), c.getHeight(), mStableInsets, mContentInsets,
- navigationBarRect);
- final boolean visible = isNavigationBarColorViewVisible();
- if (visible && !navigationBarRect.isEmpty()) {
- c.drawRect(navigationBarRect, mNavigationBarPaint);
- }
+ mSystemBarBackgroundPainter.drawDecors(c, frame);
}
private void reportDrawn() {
@@ -450,4 +406,84 @@
}
}
}
+
+ /**
+ * Helper class to draw the background of the system bars in regions the task snapshot isn't
+ * filling the window.
+ */
+ static class SystemBarBackgroundPainter {
+
+ private final Rect mContentInsets = new Rect();
+ private final Rect mStableInsets = new Rect();
+ private final Paint mStatusBarPaint = new Paint();
+ private final Paint mNavigationBarPaint = new Paint();
+ private final int mStatusBarColor;
+ private final int mNavigationBarColor;
+ private final int mWindowFlags;
+ private final int mWindowPrivateFlags;
+ private final int mSysUiVis;
+
+ SystemBarBackgroundPainter( int windowFlags, int windowPrivateFlags, int sysUiVis,
+ int statusBarColor, int navigationBarColor) {
+ mWindowFlags = windowFlags;
+ mWindowPrivateFlags = windowPrivateFlags;
+ mSysUiVis = sysUiVis;
+ final Context context = ActivityThread.currentActivityThread().getSystemUiContext();
+ mStatusBarColor = DecorView.calculateStatusBarColor(windowFlags,
+ context.getColor(R.color.system_bar_background_semi_transparent),
+ statusBarColor);
+ mNavigationBarColor = navigationBarColor;
+ mStatusBarPaint.setColor(mStatusBarColor);
+ mNavigationBarPaint.setColor(navigationBarColor);
+ }
+
+ void setInsets(Rect contentInsets, Rect stableInsets) {
+ mContentInsets.set(contentInsets);
+ mStableInsets.set(stableInsets);
+ }
+
+ int getStatusBarColorViewHeight() {
+ final boolean forceStatusBarBackground =
+ (mWindowPrivateFlags & PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND) != 0;
+ if (STATUS_BAR_COLOR_VIEW_ATTRIBUTES.isVisible(
+ mSysUiVis, mStatusBarColor, mWindowFlags, forceStatusBarBackground)) {
+ return getColorViewTopInset(mStableInsets.top, mContentInsets.top);
+ } else {
+ return 0;
+ }
+ }
+
+ private boolean isNavigationBarColorViewVisible() {
+ return NAVIGATION_BAR_COLOR_VIEW_ATTRIBUTES.isVisible(
+ mSysUiVis, mNavigationBarColor, mWindowFlags, false /* force */);
+ }
+
+ void drawDecors(Canvas c, @Nullable Rect alreadyDrawnFrame) {
+ drawStatusBarBackground(c, alreadyDrawnFrame, getStatusBarColorViewHeight());
+ drawNavigationBarBackground(c);
+ }
+
+ @VisibleForTesting
+ void drawStatusBarBackground(Canvas c, @Nullable Rect alreadyDrawnFrame,
+ int statusBarHeight) {
+ if (statusBarHeight > 0
+ && (alreadyDrawnFrame == null || c.getWidth() > alreadyDrawnFrame.right)) {
+ final int rightInset = DecorView.getColorViewRightInset(mStableInsets.right,
+ mContentInsets.right);
+ final int left = alreadyDrawnFrame != null ? alreadyDrawnFrame.right : 0;
+ c.drawRect(left, 0, c.getWidth() - rightInset, statusBarHeight, mStatusBarPaint);
+ }
+ }
+
+ @VisibleForTesting
+ void drawNavigationBarBackground(Canvas c) {
+ final Rect navigationBarRect = new Rect();
+ getNavigationBarRect(c.getWidth(), c.getHeight(), mStableInsets, mContentInsets,
+ navigationBarRect);
+ final boolean visible = isNavigationBarColorViewVisible();
+ if (visible && !navigationBarRect.isEmpty()) {
+ c.drawRect(navigationBarRect, mNavigationBarPaint);
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java
index 1367a06..067cc09 100644
--- a/services/core/java/com/android/server/wm/WindowAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowAnimator.java
@@ -87,8 +87,18 @@
private final SurfaceFlingerVsyncChoreographer mSfChoreographer;
private Choreographer mChoreographer;
- private boolean mAnimationScheduled;
+ /**
+ * Indicates whether we have an animation frame callback scheduled, which will happen at
+ * vsync-app and then schedule the animation tick at the right time (vsync-sf).
+ */
+ private boolean mAnimationFrameCallbackScheduled;
+
+ /**
+ * Indicates whether we have an animation tick scheduled. The tick is the thing that actually
+ * executes the animation step, which will happen at vsync-sf.
+ */
+ private boolean mAnimationTickScheduled;
WindowAnimator(final WindowManagerService service) {
mService = service;
@@ -104,13 +114,20 @@
mService.getDefaultDisplayContentLocked().getDisplay(), mChoreographer);
mAnimationTick = () -> {
synchronized (mService.mWindowMap) {
- mAnimationScheduled = false;
+ mAnimationTickScheduled = false;
animateLocked(mCurrentFrameTime);
}
};
mAnimationFrameCallback = frameTimeNs -> {
- mCurrentFrameTime = frameTimeNs;
- mSfChoreographer.scheduleAtSfVsync(mAnimationTick);
+ synchronized (mService.mWindowMap) {
+ mCurrentFrameTime = frameTimeNs;
+ mAnimationFrameCallbackScheduled = false;
+ if (mAnimationTickScheduled) {
+ return;
+ }
+ mAnimationTickScheduled = true;
+ mSfChoreographer.scheduleAtSfVsync(mAnimationTick);
+ }
};
}
@@ -371,8 +388,8 @@
}
void scheduleAnimation() {
- if (!mAnimationScheduled) {
- mAnimationScheduled = true;
+ if (!mAnimationFrameCallbackScheduled) {
+ mAnimationFrameCallbackScheduled = true;
mChoreographer.postFrameCallback(mAnimationFrameCallback);
}
}
@@ -386,7 +403,7 @@
}
boolean isAnimationScheduled() {
- return mAnimationScheduled;
+ return mAnimationFrameCallbackScheduled || mAnimationTickScheduled;
}
Choreographer getChoreographer() {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 05ec479..a48397b 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2373,7 +2373,7 @@
try {
synchronized(mWindowMap) {
config = updateOrientationFromAppTokensLocked(currentConfig, freezeThisOneIfNeeded,
- displayId);
+ displayId, true /* includeAppContainers */);
}
} finally {
Binder.restoreCallingIdentity(ident);
@@ -2383,13 +2383,13 @@
}
private Configuration updateOrientationFromAppTokensLocked(Configuration currentConfig,
- IBinder freezeThisOneIfNeeded, int displayId) {
+ IBinder freezeThisOneIfNeeded, int displayId, boolean includeAppContainers) {
if (!mDisplayReady) {
return null;
}
Configuration config = null;
- if (updateOrientationFromAppTokensLocked(false, displayId)) {
+ if (updateOrientationFromAppTokensLocked(false, displayId, includeAppContainers)) {
// If we changed the orientation but mOrientationChangeComplete is already true,
// we used seamless rotation, and we don't need to freeze the screen.
if (freezeThisOneIfNeeded != null && !mRoot.mOrientationChangeComplete) {
@@ -2427,6 +2427,11 @@
return config;
}
+ boolean updateOrientationFromAppTokensLocked(boolean inTransaction, int displayId) {
+ return updateOrientationFromAppTokensLocked(inTransaction, displayId,
+ false /* includeAppContainers */);
+ }
+
/**
* Determine the new desired orientation of the display, returning a non-null new Configuration
* if it has changed from the current orientation. IF TRUE IS RETURNED SOMEONE MUST CALL
@@ -2437,13 +2442,25 @@
* The orientation is computed from non-application windows first. If none of the
* non-application windows specify orientation, the orientation is computed from application
* tokens.
+ *
+ * @param inTransaction True if we are currently in a surface transaction.
+ * @param displayId Id of the display to update orientation for.
+ * @param includeAppContainers True if then app containers (stacks, tasks, ...) should be
+ * factored in when determining the orientation. If false only
+ * non-app/system containers will be used to determine the returned
+ * orientation.
+ * NOTE: Only call originating from activity manager are expected to
+ * set this to true as it needs to synchronize several app states
+ * like visibility with the update of display orientation.
+ * @return True if the display orientation was updated.
* @see android.view.IWindowManager#updateOrientationFromAppTokens(Configuration, IBinder, int)
*/
- boolean updateOrientationFromAppTokensLocked(boolean inTransaction, int displayId) {
- long ident = Binder.clearCallingIdentity();
+ private boolean updateOrientationFromAppTokensLocked(boolean inTransaction, int displayId,
+ boolean includeAppContainers) {
+ final long ident = Binder.clearCallingIdentity();
try {
final DisplayContent dc = mRoot.getDisplayContent(displayId);
- final int req = dc.getOrientation();
+ final int req = dc.getOrientation(includeAppContainers);
if (req != dc.getLastOrientation()) {
dc.setLastOrientation(req);
//send a message to Policy indicating orientation change to take
@@ -2761,44 +2778,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(
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 2236b59..a6b95d6 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -1132,7 +1132,10 @@
// Task is non-null per shouldCropToStackBounds
final TaskStack stack = w.getTask().mStack;
stack.getDimBounds(finalClipRect);
- w.expandForSurfaceInsets(finalClipRect);
+
+ if (StackId.tasksAreFloating(stack.mStackId)) {
+ w.expandForSurfaceInsets(finalClipRect);
+ }
return true;
}
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/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/BadgeExtractorTest.java b/services/tests/notification/src/com/android/server/notification/BadgeExtractorTest.java
index 0cf4994..2e8b068 100644
--- a/services/tests/notification/src/com/android/server/notification/BadgeExtractorTest.java
+++ b/services/tests/notification/src/com/android/server/notification/BadgeExtractorTest.java
@@ -69,7 +69,7 @@
Notification n = builder.build();
StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, mId, mTag, mUid,
mPid, n, mUser, null, System.currentTimeMillis());
- NotificationRecord r = new NotificationRecord(getContext(), sbn, channel);
+ NotificationRecord r = new NotificationRecord(getContext(), sbn, channel, true);
return r;
}
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 d4904f5..5e8b3d4 100644
--- a/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java
+++ b/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java
@@ -259,7 +259,7 @@
StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, id, mTag, mUid,
mPid, n, mUser, null, System.currentTimeMillis());
- NotificationRecord r = new NotificationRecord(getContext(), sbn, channel);
+ NotificationRecord r = new NotificationRecord(getContext(), sbn, channel, true);
mService.addNotification(r);
return r;
}
@@ -769,7 +769,7 @@
StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 0, mTag, mUid,
mPid, n, mUser, null, System.currentTimeMillis());
- NotificationRecord r = new NotificationRecord(getContext(), sbn, channel);
+ NotificationRecord r = new NotificationRecord(getContext(), sbn, channel, true);
mService.addNotification(r);
mService.buzzBeepBlinkLocked(r);
diff --git a/services/tests/notification/src/com/android/server/notification/GlobalSortKeyComparatorTest.java b/services/tests/notification/src/com/android/server/notification/GlobalSortKeyComparatorTest.java
index 24cb72e..33d2d07 100644
--- a/services/tests/notification/src/com/android/server/notification/GlobalSortKeyComparatorTest.java
+++ b/services/tests/notification/src/com/android/server/notification/GlobalSortKeyComparatorTest.java
@@ -53,21 +53,21 @@
new StatusBarNotification(PKG,
PKG, 1, "media", UID, UID, n,
new UserHandle(UserHandle.myUserId()),
- "", 1499), getDefaultChannel());
+ "", 1499), getDefaultChannel(), true);
left.setGlobalSortKey("first");
NotificationRecord right = new NotificationRecord(InstrumentationRegistry.getContext(),
new StatusBarNotification(PKG,
PKG, 1, "media", UID, UID, n,
new UserHandle(UserHandle.myUserId()),
- "", 1499), getDefaultChannel());
+ "", 1499), getDefaultChannel(), true);
right.setGlobalSortKey("second");
NotificationRecord last = new NotificationRecord(InstrumentationRegistry.getContext(),
new StatusBarNotification(PKG,
PKG, 1, "media", UID, UID, n,
new UserHandle(UserHandle.myUserId()),
- "", 1499), getDefaultChannel());
+ "", 1499), getDefaultChannel(), true);
final List<NotificationRecord> expected = new ArrayList<>();
@@ -93,13 +93,13 @@
new StatusBarNotification(PKG,
PKG, 1, "media", UID, UID, n,
new UserHandle(UserHandle.myUserId()),
- "", 1499), getDefaultChannel());
+ "", 1499), getDefaultChannel(), true);
NotificationRecord right = new NotificationRecord(InstrumentationRegistry.getContext(),
new StatusBarNotification(PKG,
PKG, 1, "media", UID, UID, n,
new UserHandle(UserHandle.myUserId()),
- "", 1499), getDefaultChannel());
+ "", 1499), getDefaultChannel(), true);
right.setGlobalSortKey("not null");
final List<NotificationRecord> expected = new ArrayList<>();
@@ -124,14 +124,14 @@
new StatusBarNotification(PKG,
PKG, 1, "media", UID, UID, n,
new UserHandle(UserHandle.myUserId()),
- "", 1499), getDefaultChannel());
+ "", 1499), getDefaultChannel(), true);
left.setGlobalSortKey("not null");
NotificationRecord right = new NotificationRecord(InstrumentationRegistry.getContext(),
new StatusBarNotification(PKG,
PKG, 1, "media", UID, UID, n,
new UserHandle(UserHandle.myUserId()),
- "", 1499), getDefaultChannel());
+ "", 1499), getDefaultChannel(), true);
final List<NotificationRecord> expected = new ArrayList<>();
expected.add(left);
diff --git a/services/tests/notification/src/com/android/server/notification/ImportanceExtractorTest.java b/services/tests/notification/src/com/android/server/notification/ImportanceExtractorTest.java
index 3dbd803..7a2dbaf 100644
--- a/services/tests/notification/src/com/android/server/notification/ImportanceExtractorTest.java
+++ b/services/tests/notification/src/com/android/server/notification/ImportanceExtractorTest.java
@@ -71,7 +71,7 @@
Notification n = builder.build();
StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, mId, mTag, mUid,
mPid, n, mUser, null, System.currentTimeMillis());
- NotificationRecord r = new NotificationRecord(getContext(), sbn, channel);
+ NotificationRecord r = new NotificationRecord(getContext(), sbn, channel, true);
return r;
}
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationComparatorTest.java b/services/tests/notification/src/com/android/server/notification/NotificationComparatorTest.java
index 84945ab..ccd2db0 100644
--- a/services/tests/notification/src/com/android/server/notification/NotificationComparatorTest.java
+++ b/services/tests/notification/src/com/android/server/notification/NotificationComparatorTest.java
@@ -108,7 +108,7 @@
.build();
mRecordMinCall = new NotificationRecord(mContext, new StatusBarNotification(callPkg,
callPkg, 1, "minCall", callUid, callUid, n1,
- new UserHandle(userId), "", 2000), getDefaultChannel());
+ new UserHandle(userId), "", 2000), getDefaultChannel(), false);
mRecordMinCall.setUserImportance(NotificationManager.IMPORTANCE_MIN);
Notification n2 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
@@ -118,7 +118,7 @@
.build();
mRecordHighCall = new NotificationRecord(mContext, new StatusBarNotification(callPkg,
callPkg, 1, "highcall", callUid, callUid, n2,
- new UserHandle(userId), "", 1999), getDefaultChannel());
+ new UserHandle(userId), "", 1999), getDefaultChannel(), false);
mRecordHighCall.setUserImportance(NotificationManager.IMPORTANCE_HIGH);
Notification n3 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
@@ -128,14 +128,14 @@
.build();
mRecordDefaultMedia = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "media", uid2, uid2, n3, new UserHandle(userId),
- "", 1499), getDefaultChannel());
+ "", 1499), getDefaultChannel(), false);
mRecordDefaultMedia.setUserImportance(NotificationManager.IMPORTANCE_DEFAULT);
Notification n4 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setStyle(new Notification.MessagingStyle("sender!")).build();
mRecordInlineReply = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "inlinereply", uid2, uid2, n4, new UserHandle(userId),
- "", 1599), getDefaultChannel());
+ "", 1599), getDefaultChannel(), false);
mRecordInlineReply.setUserImportance(NotificationManager.IMPORTANCE_HIGH);
mRecordInlineReply.setPackagePriority(Notification.PRIORITY_MAX);
@@ -143,27 +143,27 @@
.setCategory(Notification.CATEGORY_MESSAGE).build();
mRecordSms = new NotificationRecord(mContext, new StatusBarNotification(smsPkg,
smsPkg, 1, "sms", smsUid, smsUid, n5, new UserHandle(userId),
- "", 1299), getDefaultChannel());
+ "", 1299), getDefaultChannel(), false);
mRecordSms.setUserImportance(NotificationManager.IMPORTANCE_DEFAULT);
Notification n6 = new Notification.Builder(mContext, TEST_CHANNEL_ID).build();
mRecordStarredContact = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "starred", uid2, uid2, n6, new UserHandle(userId),
- "", 1259), getDefaultChannel());
+ "", 1259), getDefaultChannel(), false);
mRecordStarredContact.setContactAffinity(ValidateNotificationPeople.STARRED_CONTACT);
mRecordStarredContact.setUserImportance(NotificationManager.IMPORTANCE_DEFAULT);
Notification n7 = new Notification.Builder(mContext, TEST_CHANNEL_ID).build();
mRecordContact = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "contact", uid2, uid2, n7, new UserHandle(userId),
- "", 1259), getDefaultChannel());
+ "", 1259), getDefaultChannel(), false);
mRecordContact.setContactAffinity(ValidateNotificationPeople.VALID_CONTACT);
mRecordContact.setUserImportance(NotificationManager.IMPORTANCE_DEFAULT);
Notification n8 = new Notification.Builder(mContext, TEST_CHANNEL_ID).build();
mRecordUrgent = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "urgent", uid2, uid2, n8, new UserHandle(userId),
- "", 1258), getDefaultChannel());
+ "", 1258), getDefaultChannel(), false);
mRecordUrgent.setUserImportance(NotificationManager.IMPORTANCE_HIGH);
Notification n9 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
@@ -173,7 +173,7 @@
.build();
mRecordCheater = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "cheater", uid2, uid2, n9, new UserHandle(userId),
- "", 9258), getDefaultChannel());
+ "", 9258), getDefaultChannel(), false);
mRecordCheater.setUserImportance(NotificationManager.IMPORTANCE_LOW);
mRecordCheater.setPackagePriority(Notification.PRIORITY_MAX);
@@ -181,7 +181,7 @@
.setStyle(new Notification.InboxStyle().setSummaryText("message!")).build();
mRecordEmail = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "email", uid2, uid2, n10, new UserHandle(userId),
- "", 1599), getDefaultChannel());
+ "", 1599), getDefaultChannel(), false);
mRecordEmail.setUserImportance(NotificationManager.IMPORTANCE_HIGH);
Notification n11 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
@@ -190,7 +190,7 @@
.build();
mRecordCheaterColorized = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "cheater", uid2, uid2, n11, new UserHandle(userId),
- "", 9258), getDefaultChannel());
+ "", 9258), getDefaultChannel(), false);
mRecordCheaterColorized.setUserImportance(NotificationManager.IMPORTANCE_LOW);
}
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 d057eb5..f3eb4f8 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;
@@ -96,13 +97,19 @@
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 {
public TestableNotificationManagerService(Context context) { super(context); }
@Override
- protected boolean isCallerSystem() {
+ protected boolean isCallingUidSystem() {
+ return true;
+ }
+
+ @Override
+ protected boolean isCallerSystemOrPhone() {
return true;
}
@@ -133,7 +140,8 @@
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();
@@ -147,6 +155,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, true);
+ }
private NotificationRecord generateNotificationRecord(NotificationChannel channel) {
return generateNotificationRecord(channel, null);
}
@@ -164,7 +184,7 @@
}
StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1, "tag", uid, 0,
nb.build(), new UserHandle(uid), null, 0);
- return new NotificationRecord(mContext, sbn, channel);
+ return new NotificationRecord(mContext, sbn, channel, true);
}
@Test
@@ -396,6 +416,60 @@
}
@Test
+ public void testCancelAfterSecondEnqueueDoesNotSpecifyForegroundFlag() throws Exception {
+ final StatusBarNotification sbn = generateNotificationRecord(null).sbn;
+ sbn.getNotification().flags =
+ Notification.FLAG_ONGOING_EVENT | Notification.FLAG_FOREGROUND_SERVICE;
+ mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag",
+ sbn.getId(), sbn.getNotification(), sbn.getUserId());
+ sbn.getNotification().flags = Notification.FLAG_ONGOING_EVENT;
+ mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag",
+ sbn.getId(), sbn.getNotification(), sbn.getUserId());
+ mBinderService.cancelNotificationWithTag(PKG, "tag", sbn.getId(), sbn.getUserId());
+ waitForIdle();
+ assertEquals(0, mBinderService.getActiveNotifications(sbn.getPackageName()).length);
+ }
+
+ @Test
+ 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);
@@ -403,7 +477,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(
@@ -418,7 +492,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(
@@ -701,4 +775,134 @@
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..66f3799 100644
--- a/services/tests/notification/src/com/android/server/notification/NotificationRecordTest.java
+++ b/services/tests/notification/src/com/android/server/notification/NotificationRecordTest.java
@@ -21,7 +21,6 @@
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
-import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.when;
@@ -61,6 +60,10 @@
private final Context mMockContext = Mockito.mock(Context.class);
@Mock PackageManager mPm;
+ // constants for targetSdk version. N is pre channels, O is post.
+ private final boolean N = false;
+ private final boolean O = true;
+
private final String pkg = "com.android.server.notification";
private final int uid = 9583;
private final String pkg2 = "pkg2";
@@ -76,7 +79,6 @@
new NotificationChannel(NotificationChannel.DEFAULT_CHANNEL_ID, "test",
NotificationManager.IMPORTANCE_UNSPECIFIED);
private android.os.UserHandle mUser = UserHandle.of(ActivityManager.getCurrentUser());
- final ApplicationInfo legacy = new ApplicationInfo();
final ApplicationInfo upgrade = new ApplicationInfo();
private static final long[] CUSTOM_VIBRATION = new long[] {
@@ -100,17 +102,13 @@
InstrumentationRegistry.getContext().getResources());
when(mMockContext.getPackageManager()).thenReturn(mPm);
- legacy.targetSdkVersion = Build.VERSION_CODES.N_MR1;
upgrade.targetSdkVersion = Build.VERSION_CODES.N_MR1 + 1;
- try {
- when(mPm.getApplicationInfoAsUser(eq(pkg), anyInt(), anyInt())).thenReturn(legacy);
- when(mPm.getApplicationInfoAsUser(eq(pkg2), anyInt(), anyInt())).thenReturn(upgrade);
- } catch (PackageManager.NameNotFoundException e) {}
+ when(mMockContext.getApplicationInfo()).thenReturn(upgrade);
}
- private StatusBarNotification getNotification(boolean preO, boolean noisy, boolean defaultSound,
- boolean buzzy, boolean defaultVibration, boolean lights, boolean defaultLights) {
- when(mMockContext.getApplicationInfo()).thenReturn(preO ? legacy : upgrade);
+ private StatusBarNotification getNotification(boolean supportsChannels, boolean noisy,
+ boolean defaultSound, boolean buzzy, boolean defaultVibration, boolean lights,
+ boolean defaultLights) {
final Builder builder = new Builder(mMockContext)
.setContentTitle("foo")
.setSmallIcon(android.R.drawable.sym_def_app_icon)
@@ -149,13 +147,13 @@
}
builder.setDefaults(defaults);
- if (!preO) {
- builder.setChannel(channelId);
+ if (supportsChannels) {
+ builder.setChannelId(channelId);
}
Notification n = builder.build();
- if (preO) {
+ if (!supportsChannels) {
return new StatusBarNotification(pkg, pkg, id1, tag1, uid, uid, n,
mUser, null, uid);
} else {
@@ -172,11 +170,11 @@
public void testSound_default_preUpgradeUsesNotification() throws Exception {
defaultChannel.setSound(null, null);
// pre upgrade, default sound.
- StatusBarNotification sbn = getNotification(true /*preO */, true /* noisy */,
+ StatusBarNotification sbn = getNotification(N, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel, N);
assertEquals(Settings.System.DEFAULT_NOTIFICATION_URI, record.getSound());
assertEquals(Notification.AUDIO_ATTRIBUTES_DEFAULT, record.getAudioAttributes());
}
@@ -185,11 +183,11 @@
public void testSound_custom_preUpgradeUsesNotification() throws Exception {
defaultChannel.setSound(null, null);
// pre upgrade, custom sound.
- StatusBarNotification sbn = getNotification(true /*preO */, true /* noisy */,
+ StatusBarNotification sbn = getNotification(N, true /* noisy */,
false /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel, N);
assertEquals(CUSTOM_SOUND, record.getSound());
assertEquals(CUSTOM_ATTRIBUTES, record.getAudioAttributes());
}
@@ -199,11 +197,11 @@
defaultChannel.setSound(CUSTOM_SOUND, CUSTOM_ATTRIBUTES);
defaultChannel.lockFields(NotificationChannel.USER_LOCKED_SOUND);
// pre upgrade, default sound.
- StatusBarNotification sbn = getNotification(true /*preO */, true /* noisy */,
+ StatusBarNotification sbn = getNotification(N, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel, N);
assertEquals(CUSTOM_SOUND, record.getSound());
assertEquals(CUSTOM_ATTRIBUTES, record.getAudioAttributes());
}
@@ -211,11 +209,11 @@
@Test
public void testSound_noSound_preUpgrade() throws Exception {
// pre upgrade, default sound.
- StatusBarNotification sbn = getNotification(true /*preO */, false /* noisy */,
+ StatusBarNotification sbn = getNotification(N, false /* noisy */,
false /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel, N);
assertEquals(null, record.getSound());
assertEquals(Notification.AUDIO_ATTRIBUTES_DEFAULT, record.getAudioAttributes());
}
@@ -224,11 +222,11 @@
public void testSound_default_upgradeUsesChannel() throws Exception {
channel.setSound(CUSTOM_SOUND, CUSTOM_ATTRIBUTES);
// post upgrade, default sound.
- StatusBarNotification sbn = getNotification(false /*preO */, true /* noisy */,
+ StatusBarNotification sbn = getNotification(O, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel, O);
assertEquals(CUSTOM_SOUND, record.getSound());
assertEquals(CUSTOM_ATTRIBUTES, record.getAudioAttributes());
}
@@ -237,11 +235,11 @@
public void testVibration_default_preUpgradeUsesNotification() throws Exception {
defaultChannel.enableVibration(false);
// pre upgrade, default vibration.
- StatusBarNotification sbn = getNotification(true /*preO */, false /* noisy */,
+ StatusBarNotification sbn = getNotification(N, false /* noisy */,
false /* defaultSound */, true /* buzzy */, true /* defaultBuzz */,
false /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel, N);
assertNotNull(record.getVibration());
}
@@ -249,11 +247,11 @@
public void testVibration_custom_preUpgradeUsesNotification() throws Exception {
defaultChannel.enableVibration(false);
// pre upgrade, custom vibration.
- StatusBarNotification sbn = getNotification(true /*preO */, false /* noisy */,
+ StatusBarNotification sbn = getNotification(N, false /* noisy */,
false /* defaultSound */, true /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel, N);
assertEquals(CUSTOM_VIBRATION, record.getVibration());
}
@@ -262,11 +260,11 @@
defaultChannel.enableVibration(true);
defaultChannel.lockFields(NotificationChannel.USER_LOCKED_VIBRATION);
// pre upgrade, custom vibration.
- StatusBarNotification sbn = getNotification(true /*preO */, false /* noisy */,
+ StatusBarNotification sbn = getNotification(N, false /* noisy */,
false /* defaultSound */, true /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel, N);
assertTrue(!Objects.equals(CUSTOM_VIBRATION, record.getVibration()));
}
@@ -274,20 +272,20 @@
public void testVibration_custom_upgradeUsesChannel() throws Exception {
channel.enableVibration(true);
// post upgrade, custom vibration.
- StatusBarNotification sbn = getNotification(false /*preO */, false /* noisy */,
+ StatusBarNotification sbn = getNotification(O, false /* noisy */,
false /* defaultSound */, true /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel, O);
assertEquals(CUSTOM_CHANNEL_VIBRATION, record.getVibration());
}
@Test
public void testImportance_preUpgrade() throws Exception {
- StatusBarNotification sbn = getNotification(true /*preO */, true /* noisy */,
+ StatusBarNotification sbn = getNotification(N, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel, N);
assertEquals(NotificationManager.IMPORTANCE_HIGH, record.getImportance());
}
@@ -295,11 +293,11 @@
public void testImportance_locked_preUpgrade() throws Exception {
defaultChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
defaultChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
- StatusBarNotification sbn = getNotification(true /*preO */, true /* noisy */,
+ StatusBarNotification sbn = getNotification(N, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel, N);
assertEquals(NotificationManager.IMPORTANCE_LOW, record.getImportance());
}
@@ -307,39 +305,39 @@
public void testImportance_locked_unspecified_preUpgrade() throws Exception {
defaultChannel.setImportance(NotificationManager.IMPORTANCE_UNSPECIFIED);
defaultChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
- StatusBarNotification sbn = getNotification(true /*preO */, true /* noisy */,
+ StatusBarNotification sbn = getNotification(N, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel, N);
assertEquals(NotificationManager.IMPORTANCE_HIGH, record.getImportance());
}
@Test
public void testImportance_upgrade() throws Exception {
- StatusBarNotification sbn = getNotification(false /*preO */, true /* noisy */,
+ StatusBarNotification sbn = getNotification(O, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel, O);
assertEquals(NotificationManager.IMPORTANCE_DEFAULT, record.getImportance());
}
@Test
public void testLights_preUpgrade_noLight() throws Exception {
- StatusBarNotification sbn = getNotification(true /*preO */, true /* noisy */,
+ StatusBarNotification sbn = getNotification(N, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel, N);
assertNull(record.getLight());
}
@Test
public void testLights_preUpgrade() throws Exception {
- StatusBarNotification sbn = getNotification(true /*preO */, true /* noisy */,
+ StatusBarNotification sbn = getNotification(N, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
true /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel, N);
assertEquals(CUSTOM_LIGHT, record.getLight());
}
@@ -347,11 +345,11 @@
public void testLights_locked_preUpgrade() throws Exception {
defaultChannel.enableLights(true);
defaultChannel.lockFields(NotificationChannel.USER_LOCKED_LIGHTS);
- StatusBarNotification sbn = getNotification(true /*preO */, true /* noisy */,
+ StatusBarNotification sbn = getNotification(N, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
true /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel, N);
assertFalse(CUSTOM_LIGHT.equals(record.getLight()));
}
@@ -366,10 +364,10 @@
NotificationRecord.Light expected = new NotificationRecord.Light(
defaultLightColor, defaultLightOn, defaultLightOff);
- StatusBarNotification sbn = getNotification(false /*preO */, true /* noisy */,
+ StatusBarNotification sbn = getNotification(O, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
true /* lights */, true /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel, O);
assertEquals(expected, record.getLight());
}
@@ -382,19 +380,19 @@
NotificationRecord.Light expected = new NotificationRecord.Light(
Color.BLUE, defaultLightOn, defaultLightOff);
- StatusBarNotification sbn = getNotification(false /*preO */, true /* noisy */,
+ StatusBarNotification sbn = getNotification(O, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
true /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel, O);
assertEquals(expected, record.getLight());
}
@Test
public void testLights_upgrade_noLight() throws Exception {
- StatusBarNotification sbn = getNotification(false /*preO */, true /* noisy */,
+ StatusBarNotification sbn = getNotification(O, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /*defaultLights */);
- NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel, O);
assertNull(record.getLight());
}
}
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 ce899e3..e2428b9 100644
--- a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
@@ -124,7 +124,7 @@
.build();
mRecordGroupGSortA = new NotificationRecord(getContext(), new StatusBarNotification(
"package", "package", 1, null, 0, 0, mNotiGroupGSortA, user,
- null, System.currentTimeMillis()), getDefaultChannel());
+ null, System.currentTimeMillis()), getDefaultChannel(), false);
mNotiGroupGSortB = new Notification.Builder(getContext(), TEST_CHANNEL_ID)
.setContentTitle("B")
@@ -134,7 +134,7 @@
.build();
mRecordGroupGSortB = new NotificationRecord(getContext(), new StatusBarNotification(
"package", "package", 1, null, 0, 0, mNotiGroupGSortB, user,
- null, System.currentTimeMillis()), getDefaultChannel());
+ null, System.currentTimeMillis()), getDefaultChannel(), false);
mNotiNoGroup = new Notification.Builder(getContext(), TEST_CHANNEL_ID)
.setContentTitle("C")
@@ -142,7 +142,7 @@
.build();
mRecordNoGroup = new NotificationRecord(getContext(), new StatusBarNotification(
"package", "package", 1, null, 0, 0, mNotiNoGroup, user,
- null, System.currentTimeMillis()), getDefaultChannel());
+ null, System.currentTimeMillis()), getDefaultChannel(), false);
mNotiNoGroup2 = new Notification.Builder(getContext(), TEST_CHANNEL_ID)
.setContentTitle("D")
@@ -150,7 +150,7 @@
.build();
mRecordNoGroup2 = new NotificationRecord(getContext(), new StatusBarNotification(
"package", "package", 1, null, 0, 0, mNotiNoGroup2, user,
- null, System.currentTimeMillis()), getDefaultChannel());
+ null, System.currentTimeMillis()), getDefaultChannel(), false);
mNotiNoGroupSortA = new Notification.Builder(getContext(), TEST_CHANNEL_ID)
.setContentTitle("E")
@@ -159,7 +159,7 @@
.build();
mRecordNoGroupSortA = new NotificationRecord(getContext(), new StatusBarNotification(
"package", "package", 1, null, 0, 0, mNotiNoGroupSortA, user,
- null, System.currentTimeMillis()), getDefaultChannel());
+ null, System.currentTimeMillis()), getDefaultChannel(), false);
mAudioAttributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN)
@@ -314,8 +314,6 @@
assertEquals(channel1, mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false));
compareChannels(channel2,
mHelper.getNotificationChannel(PKG, UID, channel2.getId(), false));
- assertNotNull(mHelper.getNotificationChannel(
- PKG, UID, NotificationChannel.DEFAULT_CHANNEL_ID, false));
List<NotificationChannelGroup> actualGroups =
mHelper.getNotificationChannelGroups(PKG, UID, false).getList();
@@ -375,18 +373,13 @@
assertNull(mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false));
assertNull(mHelper.getNotificationChannel(PKG, UID, channel3.getId(), false));
assertNull(mHelper.getNotificationChannelGroup(ncg.getId(), PKG, UID));
- //assertEquals(ncg2, mHelper.getNotificationChannelGroup(ncg2.getId(), PKG, UID));
+ assertEquals(ncg2, mHelper.getNotificationChannelGroup(ncg2.getId(), PKG, UID));
assertEquals(channel2, mHelper.getNotificationChannel(PKG, UID, channel2.getId(), false));
}
@Test
public void testChannelXml_defaultChannelLegacyApp_noUserSettings() throws Exception {
- NotificationChannel channel1 =
- new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_DEFAULT);
-
- mHelper.createNotificationChannel(PKG, UID, channel1, true);
-
- ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false, channel1.getId(),
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
NotificationChannel.DEFAULT_CHANNEL_ID);
loadStreamXml(baos);
@@ -401,16 +394,12 @@
@Test
public void testChannelXml_defaultChannelUpdatedApp_userSettings() throws Exception {
- NotificationChannel channel1 =
- new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_MIN);
- mHelper.createNotificationChannel(PKG, UID, channel1, true);
-
final NotificationChannel defaultChannel = mHelper.getNotificationChannel(PKG, UID,
NotificationChannel.DEFAULT_CHANNEL_ID, false);
defaultChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
mHelper.updateNotificationChannel(PKG, UID, defaultChannel);
- ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false, channel1.getId(),
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
NotificationChannel.DEFAULT_CHANNEL_ID);
loadStreamXml(baos);
@@ -445,12 +434,9 @@
| NotificationChannel.USER_LOCKED_VISIBILITY,
updated1.getUserLockedFields());
- // STOPSHIP - this should be reversed after the STOPSHIP is removed in the tested code.
// No Default Channel created for updated packages
- // assertEquals(null, mHelper.getNotificationChannel(UPDATED_PKG, UID2,
- // NotificationChannel.DEFAULT_CHANNEL_ID, false));
- assertTrue(mHelper.getNotificationChannel(UPDATED_PKG, UID2,
- NotificationChannel.DEFAULT_CHANNEL_ID, false) != null);
+ assertEquals(null, mHelper.getNotificationChannel(UPDATED_PKG, UID2,
+ NotificationChannel.DEFAULT_CHANNEL_ID, false));
}
@Test
@@ -466,12 +452,9 @@
when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(upgraded);
loadStreamXml(baos);
- // STOPSHIP - this should be reversed after the STOPSHIP is removed in the tested code.
// Default Channel should be gone.
- // assertEquals(null, mHelper.getNotificationChannel(PKG, UID,
- // NotificationChannel.DEFAULT_CHANNEL_ID, false));
- assertTrue(mHelper.getNotificationChannel(UPDATED_PKG, UID2,
- NotificationChannel.DEFAULT_CHANNEL_ID, false) != null);
+ assertEquals(null, mHelper.getNotificationChannel(PKG, UID,
+ NotificationChannel.DEFAULT_CHANNEL_ID, false));
}
@Test
@@ -713,20 +696,14 @@
// Returns only non-deleted channels
List<NotificationChannel> channels =
mHelper.getNotificationChannels(PKG, UID, false).getList();
- assertEquals(2, channels.size()); // Default channel + non-deleted channel
- for (NotificationChannel nc : channels) {
- if (!NotificationChannel.DEFAULT_CHANNEL_ID.equals(nc.getId())) {
- compareChannels(channel2, nc);
- }
- }
+ assertEquals(1, channels.size());
+ compareChannels(channel2, channels.get(0));
// Returns deleted channels too
channels = mHelper.getNotificationChannels(PKG, UID, true).getList();
- assertEquals(3, channels.size()); // Includes default channel
+ assertEquals(2, channels.size());
for (NotificationChannel nc : channels) {
- if (!NotificationChannel.DEFAULT_CHANNEL_ID.equals(nc.getId())) {
- compareChannels(channelMap.get(nc.getId()), nc);
- }
+ compareChannels(channelMap.get(nc.getId()), nc);
}
}
@@ -824,8 +801,8 @@
mHelper.permanentlyDeleteNotificationChannels(PKG, UID);
- // Only default channel remains
- assertEquals(1, mHelper.getNotificationChannels(PKG, UID, true).getList().size());
+ // No channels remain
+ assertEquals(0, mHelper.getNotificationChannels(PKG, UID, true).getList().size());
}
@Test
@@ -874,13 +851,32 @@
mHelper.onPackagesChanged(true, UserHandle.USER_SYSTEM, new String[]{PKG}, new int[]{UID});
- assertEquals(0, mHelper.getNotificationChannels(PKG, UID, true).getList().size());
+ // since this is a pre upgrade app, clearing data should restore the default channel
+ assertEquals(1, mHelper.getNotificationChannels(PKG, UID, true).getList().size());
+ assertEquals(NotificationChannel.DEFAULT_CHANNEL_ID,
+ mHelper.getNotificationChannels(PKG, UID, true).getList().get(0).getId());
// Not deleted
mHelper.createNotificationChannel(PKG, UID, channel1, true);
-
mHelper.onPackagesChanged(false, UserHandle.USER_SYSTEM, new String[]{PKG}, new int[]{UID});
- assertEquals(2, mHelper.getNotificationChannels(PKG, UID, false).getList().size());
+ assertEquals(1, mHelper.getNotificationChannels(PKG, UID, false).getList().size());
+ }
+
+ @Test
+ public void testOnPackageChanged_packageRemoval_updatedPackage() throws Exception {
+ // Deleted
+ NotificationChannel channel1 =
+ new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
+ mHelper.createNotificationChannel(UPDATED_PKG, UID2, channel1, true);
+ mHelper.onPackagesChanged(
+ true, UserHandle.USER_SYSTEM, new String[]{UPDATED_PKG}, new int[]{UID2});
+ assertEquals(0, mHelper.getNotificationChannels(UPDATED_PKG, UID2, true).getList().size());
+
+ // Not deleted
+ mHelper.createNotificationChannel(UPDATED_PKG, UID2, channel1, true);
+ mHelper.onPackagesChanged(
+ false, UserHandle.USER_SYSTEM, new String[]{UPDATED_PKG}, new int[]{UID2});
+ assertEquals(1, mHelper.getNotificationChannels(UPDATED_PKG, UID2, false).getList().size());
}
@Test
@@ -901,7 +897,23 @@
mHelper.onPackagesChanged(true, UserHandle.USER_SYSTEM, new String[]{PKG}, new int[]{UID});
- assertEquals(0, mHelper.getNotificationChannelGroups(PKG, UID, true).getList().size());
+ // default channel restored
+ assertEquals(1, mHelper.getNotificationChannelGroups(PKG, UID, true).getList().size());
+ assertNull(mHelper.getNotificationChannelGroups(PKG, UID, true).getList().get(0).getId());
+ }
+
+ @Test
+ public void testOnPackageChanged_packageRemoval_groups_upgraded() throws Exception {
+ NotificationChannelGroup ncg = new NotificationChannelGroup("group1", "name1");
+ mHelper.createNotificationChannelGroup(UPDATED_PKG, UID2, ncg, true);
+ NotificationChannelGroup ncg2 = new NotificationChannelGroup("group2", "name2");
+ mHelper.createNotificationChannelGroup(UPDATED_PKG, UID2, ncg2, true);
+
+ mHelper.onPackagesChanged(
+ true, UserHandle.USER_SYSTEM, new String[]{UPDATED_PKG}, new int[]{UID2});
+
+ assertEquals(0,
+ mHelper.getNotificationChannelGroups(UPDATED_PKG, UID2, true).getList().size());
}
@Test
@@ -975,9 +987,8 @@
assertEquals(3, actual.size());
for (NotificationChannelGroup group : actual) {
if (group.getId() == null) {
- assertEquals(2, group.getChannels().size()); // misc channel too
- assertTrue(channel3.getId().equals(group.getChannels().get(0).getId())
- || channel3.getId().equals(group.getChannels().get(1).getId()));
+ assertEquals(1, group.getChannels().size());
+ assertTrue(channel3.getId().equals(group.getChannels().get(0).getId()));
} else if (group.getId().equals(ncg.getId())) {
assertEquals(2, group.getChannels().size());
if (group.getChannels().get(0).getId().equals(channel1.getId())) {
@@ -1011,12 +1022,8 @@
List<NotificationChannelGroup> actual =
mHelper.getNotificationChannelGroups(PKG, UID, true).getList();
- assertEquals(2, actual.size());
- for (NotificationChannelGroup group : actual) {
- if (Objects.equals(group.getId(), ncg.getId())) {
- assertEquals(1, group.getChannels().size());
- }
- }
+ assertEquals(1, actual.size());
+ assertEquals(1, actual.get(0).getChannels().size());
}
@Test
@@ -1067,7 +1074,7 @@
for (int i = 0; i < numPackages; i++) {
JSONObject object = actual.getJSONObject(i);
assertTrue(expectedChannels.containsKey(object.get("packageName")));
- assertEquals(expectedChannels.get(object.get("packageName")).intValue() + 1,
+ assertEquals(expectedChannels.get(object.get("packageName")).intValue(),
object.getInt("channelCount"));
}
}
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..b1cb4d7 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;
@@ -106,9 +107,9 @@
UserHandle.USER_SYSTEM, r2.sbn.getPackageName(), r2.getKey()));
mSnoozeHelper.cancel(UserHandle.USER_SYSTEM, r.sbn.getPackageName(), "one", 1);
- // 3 = one for each snooze, above + one for cancel itself.
- verify(mAm, times(3)).cancel(any(PendingIntent.class));
- assertFalse(mSnoozeHelper.isSnoozed(
+ // 2 = one for each snooze, above, zero for the cancel.
+ verify(mAm, times(2)).cancel(any(PendingIntent.class));
+ assertTrue(mSnoozeHelper.isSnoozed(
UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
assertTrue(mSnoozeHelper.isSnoozed(
UserHandle.USER_SYSTEM, r2.sbn.getPackageName(), r2.getKey()));
@@ -130,11 +131,11 @@
UserHandle.USER_ALL, r3.sbn.getPackageName(), r3.getKey()));
mSnoozeHelper.cancel(UserHandle.USER_SYSTEM, false);
- // 5 = once for each snooze above (3) + once for each notification canceled (2).
- verify(mAm, times(5)).cancel(any(PendingIntent.class));
- assertFalse(mSnoozeHelper.isSnoozed(
+ // 3 = once for each snooze above (3), only.
+ verify(mAm, times(3)).cancel(any(PendingIntent.class));
+ assertTrue(mSnoozeHelper.isSnoozed(
UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
- assertFalse(mSnoozeHelper.isSnoozed(
+ assertTrue(mSnoozeHelper.isSnoozed(
UserHandle.USER_SYSTEM, r2.sbn.getPackageName(), r2.getKey()));
assertTrue(mSnoozeHelper.isSnoozed(
UserHandle.USER_ALL, r3.sbn.getPackageName(), r3.getKey()));
@@ -156,17 +157,47 @@
UserHandle.USER_SYSTEM, r3.sbn.getPackageName(), r3.getKey()));
mSnoozeHelper.cancel(UserHandle.USER_SYSTEM, "pkg2");
- // 4 = once for each snooze above (3) + once for each notification canceled (1).
- verify(mAm, times(4)).cancel(any(PendingIntent.class));
+ // 3 = once for each snooze above (3), only.
+ verify(mAm, times(3)).cancel(any(PendingIntent.class));
assertTrue(mSnoozeHelper.isSnoozed(
UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
assertTrue(mSnoozeHelper.isSnoozed(
UserHandle.USER_SYSTEM, r2.sbn.getPackageName(), r2.getKey()));
- assertFalse(mSnoozeHelper.isSnoozed(
+ assertTrue(mSnoozeHelper.isSnoozed(
UserHandle.USER_SYSTEM, r3.sbn.getPackageName(), r3.getKey()));
}
@Test
+ public void testCancelDoesNotUnsnooze() throws Exception {
+ NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
+ mSnoozeHelper.snooze(r, 1000);
+ assertTrue(mSnoozeHelper.isSnoozed(
+ UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
+
+ mSnoozeHelper.cancel(UserHandle.USER_SYSTEM, r.sbn.getPackageName(), "one", 1);
+
+ assertTrue(mSnoozeHelper.isSnoozed(
+ UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
+ }
+
+ @Test
+ public void testCancelDoesNotRepost() throws Exception {
+ NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
+ NotificationRecord r2 = getNotificationRecord("pkg", 2, "two", UserHandle.SYSTEM);
+ mSnoozeHelper.snooze(r, 1000);
+ mSnoozeHelper.snooze(r2 , 1000);
+ assertTrue(mSnoozeHelper.isSnoozed(
+ UserHandle.USER_SYSTEM, r.sbn.getPackageName(), r.getKey()));
+ assertTrue(mSnoozeHelper.isSnoozed(
+ UserHandle.USER_SYSTEM, r2.sbn.getPackageName(), r2.getKey()));
+
+ mSnoozeHelper.cancel(UserHandle.USER_SYSTEM, r.sbn.getPackageName(), "one", 1);
+
+ mSnoozeHelper.repost(r.getKey(), UserHandle.USER_SYSTEM);
+ verify(mCallback, never()).repost(UserHandle.USER_SYSTEM, r);
+ }
+
+ @Test
public void testRepost() throws Exception {
NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
mSnoozeHelper.snooze(r, 1000);
@@ -232,18 +263,60 @@
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);
return new NotificationRecord(getContext(), new StatusBarNotification(
pkg, pkg, id, tag, 0, 0, n, user, null,
- System.currentTimeMillis()), notificationChannel);
+ System.currentTimeMillis()), notificationChannel, true);
+ }
+
+ 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/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml
index cc682c4..fa72416 100644
--- a/services/tests/servicestests/AndroidManifest.xml
+++ b/services/tests/servicestests/AndroidManifest.xml
@@ -18,6 +18,7 @@
package="com.android.frameworks.servicestests">
<uses-permission android:name="android.permission.READ_LOGS" />
+ <uses-permission android:name="android.permission.ACCESS_VR_MANAGER" />
<uses-permission android:name="android.permission.ACCOUNT_MANAGER" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
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 c78488f..bb7e20b 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
@@ -368,8 +368,8 @@
}
@Test
- public void testSetActiveScorer_noRequestNetworkScoresPermission() {
- when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
+ public void testSetActiveScorer_noScoreNetworksPermission() {
+ when(mContext.checkCallingOrSelfPermission(permission.SCORE_NETWORKS))
.thenReturn(PackageManager.PERMISSION_DENIED);
try {
diff --git a/services/tests/servicestests/src/com/android/server/NetworkScorerAppManagerTest.java b/services/tests/servicestests/src/com/android/server/NetworkScorerAppManagerTest.java
index 0694eae..ceb92de 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkScorerAppManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkScorerAppManagerTest.java
@@ -228,30 +228,23 @@
}
@Test
- public void testSetActiveScorer_nullPackage_validDefault() throws Exception {
- String packageName = "package";
- String defaultPackage = "defaultPackage";
- setNetworkRecoPackageSetting(packageName);
- setDefaultNetworkRecommendationPackage(defaultPackage);
- final ComponentName recoComponent = new ComponentName(defaultPackage, "class1");
- mockScoreNetworksGranted(recoComponent.getPackageName());
- mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, null);
+ public void testSetActiveScorer_nullPackage_currentIsSet() throws Exception {
+ setNetworkRecoPackageSetting("package");
assertTrue(mNetworkScorerAppManager.setActiveScorer(null));
verify(mSettingsFacade).putString(mMockContext,
- Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, defaultPackage);
+ Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, null);
+ verify(mSettingsFacade).putInt(mMockContext,
+ Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED,
+ NetworkScoreManager.RECOMMENDATIONS_ENABLED_FORCED_OFF);
}
@Test
- public void testSetActiveScorer_nullPackage_invalidDefault() throws Exception {
- String packageName = "package";
- String defaultPackage = "defaultPackage";
- setNetworkRecoPackageSetting(packageName);
- setDefaultNetworkRecommendationPackage(defaultPackage);
+ public void testSetActiveScorer_nullPackage_currentIsNull() throws Exception {
+ setNetworkRecoPackageSetting(null);
- assertFalse(mNetworkScorerAppManager.setActiveScorer(null));
- verify(mSettingsFacade, never()).putString(any(),
- eq(Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE), any());
+ assertTrue(mNetworkScorerAppManager.setActiveScorer(null));
+ verify(mSettingsFacade, never()).putString(any(), any(), any());
}
@Test
@@ -266,6 +259,9 @@
assertTrue(mNetworkScorerAppManager.setActiveScorer(newPackage));
verify(mSettingsFacade).putString(mMockContext,
Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, newPackage);
+ verify(mSettingsFacade).putInt(mMockContext,
+ Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED,
+ NetworkScoreManager.RECOMMENDATIONS_ENABLED_ON);
}
@Test
@@ -341,6 +337,32 @@
}
@Test
+ public void testUpdateState_currentPackageNull_defaultNull() throws Exception {
+ setDefaultNetworkRecommendationPackage(null);
+ setNetworkRecoPackageSetting(null);
+
+ mNetworkScorerAppManager.updateState();
+
+ verify(mSettingsFacade, never()).putString(any(),
+ eq(Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE), anyString());
+ verify(mSettingsFacade, never()).putInt(any(),
+ eq(Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED), anyInt());
+ }
+
+ @Test
+ public void testUpdateState_currentPackageEmpty_defaultEmpty() throws Exception {
+ setDefaultNetworkRecommendationPackage("");
+ setNetworkRecoPackageSetting("");
+
+ mNetworkScorerAppManager.updateState();
+
+ verify(mSettingsFacade, never()).putString(any(),
+ eq(Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE), anyString());
+ verify(mSettingsFacade, never()).putInt(any(),
+ eq(Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED), anyInt());
+ }
+
+ @Test
public void testUpdateState_currentPackageNotValid_sameAsDefault() throws Exception {
String defaultPackage = "defaultPackage";
setDefaultNetworkRecommendationPackage(defaultPackage);
diff --git a/services/tests/servicestests/src/com/android/server/NightDisplayServiceTest.java b/services/tests/servicestests/src/com/android/server/NightDisplayServiceTest.java
new file mode 100644
index 0000000..9a9c243
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/NightDisplayServiceTest.java
@@ -0,0 +1,620 @@
+/*
+ * 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;
+
+import android.app.ActivityManager;
+import android.app.AlarmManager;
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.provider.Settings.Secure;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.mock.MockContentResolver;
+
+import com.android.internal.app.NightDisplayController;
+import com.android.internal.app.NightDisplayController.LocalTime;
+import com.android.internal.util.test.FakeSettingsProvider;
+import com.android.server.display.DisplayTransformManager;
+import com.android.server.display.NightDisplayService;
+import com.android.server.twilight.TwilightManager;
+import com.android.server.twilight.TwilightState;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+
+import java.util.Calendar;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+import static org.mockito.Mockito.doReturn;
+
+@RunWith(AndroidJUnit4.class)
+public class NightDisplayServiceTest {
+
+ private Context mContext;
+ private int mUserId;
+
+ private TwilightManager mTwilightManager;
+
+ private NightDisplayController mNightDisplayController;
+ private NightDisplayService mNightDisplayService;
+
+ @Before
+ public void setUp() {
+ mContext = Mockito.spy(new ContextWrapper(InstrumentationRegistry.getTargetContext()));
+ mUserId = ActivityManager.getCurrentUser();
+
+ doReturn(mContext).when(mContext).getApplicationContext();
+
+ final MockContentResolver cr = new MockContentResolver(mContext);
+ cr.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
+ doReturn(cr).when(mContext).getContentResolver();
+
+ final AlarmManager am = Mockito.mock(AlarmManager.class);
+ doReturn(am).when(mContext).getSystemService(Context.ALARM_SERVICE);
+
+ final DisplayTransformManager dtm = Mockito.mock(DisplayTransformManager.class);
+ LocalServices.addService(DisplayTransformManager.class, dtm);
+
+ mTwilightManager = Mockito.mock(TwilightManager.class);
+ LocalServices.addService(TwilightManager.class, mTwilightManager);
+
+ mNightDisplayController = new NightDisplayController(mContext, mUserId);
+ mNightDisplayService = new NightDisplayService(mContext);
+ }
+
+ @After
+ public void tearDown() {
+ LocalServices.removeServiceForTest(DisplayTransformManager.class);
+ LocalServices.removeServiceForTest(TwilightManager.class);
+
+ mNightDisplayService = null;
+ mNightDisplayController = null;
+
+ mTwilightManager = null;
+
+ mUserId = UserHandle.USER_NULL;
+ mContext = null;
+ }
+
+ @Test
+ public void customSchedule_whenStartedAfterNight_ifOffAfterNight_turnsOff() {
+ setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
+ setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedAfterNight_ifOffBeforeNight_turnsOff() {
+ setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
+ setActivated(false /* activated */, -180 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedAfterNight_ifOffDuringNight_turnsOff() {
+ setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
+ setActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedAfterNight_ifOffInFuture_turnsOff() {
+ setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
+ setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedAfterNight_ifOnAfterNight_turnsOn() {
+ setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
+ setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedAfterNight_ifOnBeforeNight_turnsOff() {
+ setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
+ setActivated(true /* activated */, -180 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedAfterNight_ifOnDuringNight_turnsOff() {
+ setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
+ setActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedAfterNight_ifOnInFuture_turnsOff() {
+ setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
+ setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedBeforeNight_ifOffAfterNight_turnsOff() {
+ setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
+ setActivated(false /* activated */, 180 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedBeforeNight_ifOffBeforeNight_turnsOff() {
+ setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
+ setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedBeforeNight_ifOffDuringNight_turnsOff() {
+ setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
+ setActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedBeforeNight_ifOffInPast_turnsOff() {
+ setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
+ setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedBeforeNight_ifOnAfterNight_turnsOff() {
+ setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
+ setActivated(true /* activated */, 180 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedBeforeNight_ifOnBeforeNight_turnsOff() {
+ setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
+ setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedBeforeNight_ifOnDuringNight_turnsOff() {
+ setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
+ setActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedBeforeNight_ifOnInPast_turnsOn() {
+ setAutoModeCustom(60 /* startTimeOffset */, 120 /* endTimeOffset */);
+ setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedDuringNight_ifOffAfterNight_turnsOn() {
+ setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
+ setActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedDuringNight_ifOffBeforeNight_turnsOn() {
+ setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
+ setActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedDuringNight_ifOffDuringNightInFuture_turnsOn() {
+ setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
+ setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedDuringNight_ifOffDuringNightInPast_turnsOff() {
+ setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
+ setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedDuringNight_ifOnAfterNight_turnsOn() {
+ setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
+ setActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedDuringNight_ifOnBeforeNight_turnsOn() {
+ setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
+ setActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedDuringNight_ifOnDuringNightInFuture_turnsOn() {
+ setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
+ setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void customSchedule_whenStartedDuringNight_ifOnDuringNightInPast_turnsOn() {
+ setAutoModeCustom(-60 /* startTimeOffset */, 60 /* endTimeOffset */);
+ setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedAfterNight_ifOffAfterNight_turnsOff() {
+ setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
+ setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedAfterNight_ifOffBeforeNight_turnsOff() {
+ setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
+ setActivated(false /* activated */, -180 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedAfterNight_ifOffDuringNight_turnsOff() {
+ setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
+ setActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedAfterNight_ifOffInFuture_turnsOff() {
+ setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
+ setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedAfterNight_ifOnAfterNight_turnsOn() {
+ setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
+ setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedAfterNight_ifOnBeforeNight_turnsOff() {
+ setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
+ setActivated(true /* activated */, -180 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedAfterNight_ifOnDuringNight_turnsOff() {
+ setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
+ setActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedAfterNight_ifOnInFuture_turnsOff() {
+ setAutoModeTwilight(-120 /* sunsetOffset */, -60 /* sunriseOffset */);
+ setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedBeforeNight_ifOffAfterNight_turnsOff() {
+ setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
+ setActivated(false /* activated */, 180 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedBeforeNight_ifOffBeforeNight_turnsOff() {
+ setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
+ setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedBeforeNight_ifOffDuringNight_turnsOff() {
+ setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
+ setActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedBeforeNight_ifOffInPast_turnsOff() {
+ setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
+ setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedBeforeNight_ifOnAfterNight_turnsOff() {
+ setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
+ setActivated(true /* activated */, 180 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedBeforeNight_ifOnBeforeNight_turnsOff() {
+ setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
+ setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedBeforeNight_ifOnDuringNight_turnsOff() {
+ setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
+ setActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedBeforeNight_ifOnInPast_turnsOn() {
+ setAutoModeTwilight(60 /* sunsetOffset */, 120 /* sunriseOffset */);
+ setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedDuringNight_ifOffAfterNight_turnsOn() {
+ setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
+ setActivated(false /* activated */, 90 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedDuringNight_ifOffBeforeNight_turnsOn() {
+ setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
+ setActivated(false /* activated */, -90 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedDuringNight_ifOffDuringNightInFuture_turnsOn() {
+ setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
+ setActivated(false /* activated */, 30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedDuringNight_ifOffDuringNightInPast_turnsOff() {
+ setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
+ setActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(false /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedDuringNight_ifOnAfterNight_turnsOn() {
+ setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
+ setActivated(true /* activated */, 90 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedDuringNight_ifOnBeforeNight_turnsOn() {
+ setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
+ setActivated(true /* activated */, -90 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedDuringNight_ifOnDuringNightInFuture_turnsOn() {
+ setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
+ setActivated(true /* activated */, 30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ @Test
+ public void twilightSchedule_whenStartedDuringNight_ifOnDuringNightInPast_turnsOn() {
+ setAutoModeTwilight(-60 /* sunsetOffset */, 60 /* sunriseOffset */);
+ setActivated(true /* activated */, -30 /* lastActivatedTimeOffset */);
+
+ startService();
+ assertActivated(true /* activated */);
+ }
+
+ /**
+ * Convenience for making a {@link LocalTime} instance with an offset relative to now.
+ *
+ * @param offsetMinutes the offset relative to now (in minutes)
+ * @return the LocalTime instance
+ */
+ private LocalTime getLocalTimeRelativeToNow(int offsetMinutes) {
+ final Calendar c = Calendar.getInstance();
+ c.add(Calendar.MINUTE, offsetMinutes);
+ return new LocalTime(c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE));
+ }
+
+ /**
+ * Configures Night display to use a custom schedule.
+ *
+ * @param startTimeOffset the offset relative to now to activate Night display (in minutes)
+ * @param endTimeOffset the offset relative to now to deactivate Night display (in minutes)
+ */
+ private void setAutoModeCustom(int startTimeOffset, int endTimeOffset) {
+ mNightDisplayController.setAutoMode(NightDisplayController.AUTO_MODE_CUSTOM);
+ mNightDisplayController.setCustomStartTime(getLocalTimeRelativeToNow(startTimeOffset));
+ mNightDisplayController.setCustomEndTime(getLocalTimeRelativeToNow(endTimeOffset));
+ }
+
+ /**
+ * Configures Night display to use the twilight schedule.
+ *
+ * @param sunsetOffset the offset relative to now for sunset (in minutes)
+ * @param sunriseOffset the offset relative to now for sunrise (in minutes)
+ */
+ private void setAutoModeTwilight(int sunsetOffset, int sunriseOffset) {
+ mNightDisplayController.setAutoMode(NightDisplayController.AUTO_MODE_TWILIGHT);
+
+ final LocalTime sunset = getLocalTimeRelativeToNow(sunsetOffset);
+ final LocalTime sunrise = getLocalTimeRelativeToNow(sunriseOffset);
+
+ final Calendar now = Calendar.getInstance();
+ long sunsetMillis = sunset.getDateTimeBefore(now).getTimeInMillis();
+ long sunriseMillis = sunrise.getDateTimeBefore(now).getTimeInMillis();
+ if (sunsetMillis < sunriseMillis) {
+ sunsetMillis = sunset.getDateTimeAfter(now).getTimeInMillis();
+ } else {
+ sunriseMillis = sunrise.getDateTimeAfter(now).getTimeInMillis();
+ }
+
+ final TwilightState state = new TwilightState(sunriseMillis, sunsetMillis);
+ doReturn(state).when(mTwilightManager).getLastTwilightState();
+ }
+
+ /**
+ * Configures the Night display activated state.
+ *
+ * @param activated {@code true} if Night display should be activated
+ * @param lastActivatedTimeOffset the offset relative to now to record that Night display was
+ activated (in minutes)
+ */
+ private void setActivated(boolean activated, int lastActivatedTimeOffset) {
+ mNightDisplayController.setActivated(activated);
+
+ final Calendar c = Calendar.getInstance();
+ c.add(Calendar.MINUTE, lastActivatedTimeOffset);
+ Secure.putLongForUser(mContext.getContentResolver(),
+ Secure.NIGHT_DISPLAY_LAST_ACTIVATED_TIME, c.getTimeInMillis(), mUserId);
+ }
+
+ /**
+ * Convenience method to start {@link #mNightDisplayService}.
+ */
+ private void startService() {
+ Secure.putIntForUser(mContext.getContentResolver(), Secure.USER_SETUP_COMPLETE, 1, mUserId);
+
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mNightDisplayService.onStart();
+ mNightDisplayService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
+ mNightDisplayService.onStartUser(mUserId);
+ }
+ });
+ }
+
+ /**
+ * Convenience method for asserting whether Night display should be activated.
+ *
+ * @param activated the expected activated state of Night display
+ */
+ private void assertActivated(boolean activated) {
+ assertWithMessage("Invalid Night display activated state")
+ .that(mNightDisplayController.isActivated())
+ .isEqualTo(activated);
+ }
+}
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/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/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
index cd39d88..4c7bf4d 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
@@ -3241,7 +3241,7 @@
assertNull(mService.getShortcutsForTest().get(USER_10).getLastKnownLauncher());
// Try stopping the user
- mService.handleCleanupUser(USER_10);
+ mService.handleStopUser(USER_10);
// Now it's unloaded.
assertEquals(1, mService.getShortcutsForTest().size());
@@ -6106,7 +6106,7 @@
assertEmpty(mManager.getPinnedShortcuts());
});
// Send add broadcast, but the user is not running, so should be ignored.
- mService.handleCleanupUser(USER_10);
+ mService.handleStopUser(USER_10);
mRunningUsers.put(USER_10, false);
mUnlockedUsers.put(USER_10, false);
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
index 9880caa..2b40c51 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
@@ -2091,7 +2091,7 @@
assertFalse(mService.isUserUnlockedL(USER_10));
// Directly call the stop lifecycle event. Goes back to the initial state.
- mService.handleCleanupUser(USER_0);
+ mService.handleStopUser(USER_0);
assertFalse(mService.isUserUnlockedL(USER_0));
assertFalse(mService.isUserUnlockedL(USER_10));
}
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/DisplayContentTests.java b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
index e8dc69f..f9254ad 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
@@ -26,6 +26,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -236,6 +237,7 @@
}
@Test
+ @Ignore
public void testFocusedWindowMultipleDisplays() throws Exception {
// Create a focusable window and check that focus is calcualted correctly
final WindowState window1 =
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 2b4d9fb..f253632 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotControllerTest.java
@@ -17,6 +17,7 @@
package com.android.server.wm;
import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
+import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
import static com.android.server.wm.AppTransition.TRANSIT_UNSET;
import static com.android.server.wm.TaskSnapshotController.*;
import static junit.framework.Assert.assertEquals;
@@ -76,12 +77,19 @@
public void testGetSnapshotMode() throws Exception {
final WindowState disabledWindow = createWindow(null,
FIRST_APPLICATION_WINDOW, mDisplayContent, "disabledWindow");
- disabledWindow.mAppToken.setDisablePreviewSnapshots(true);
+ disabledWindow.mAppToken.setDisablePreviewScreenshots(true);
assertEquals(SNAPSHOT_MODE_APP_THEME,
sWm.mTaskSnapshotController.getSnapshotMode(disabledWindow.getTask()));
+
final WindowState normalWindow = createWindow(null,
FIRST_APPLICATION_WINDOW, mDisplayContent, "normalWindow");
assertEquals(SNAPSHOT_MODE_REAL,
sWm.mTaskSnapshotController.getSnapshotMode(normalWindow.getTask()));
+
+ final WindowState secureWindow = createWindow(null,
+ FIRST_APPLICATION_WINDOW, mDisplayContent, "secureWindow");
+ secureWindow.mAttrs.flags |= FLAG_SECURE;
+ assertEquals(SNAPSHOT_MODE_APP_THEME,
+ sWm.mTaskSnapshotController.getSnapshotMode(secureWindow.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/TaskSnapshotSurfaceTest.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java
index 717ddf2..e2868d7 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java
@@ -171,11 +171,25 @@
final Canvas mockCanvas = mock(Canvas.class);
when(mockCanvas.getWidth()).thenReturn(100);
when(mockCanvas.getHeight()).thenReturn(100);
- mSurface.drawStatusBarBackground(mockCanvas, new Rect(0, 0, 50, 100), 10);
+ mSurface.mSystemBarBackgroundPainter.drawStatusBarBackground(
+ mockCanvas, new Rect(0, 0, 50, 100), 10);
verify(mockCanvas).drawRect(eq(50.0f), eq(0.0f), eq(90.0f), eq(10.0f), any());
}
@Test
+ public void testDrawStatusBarBackground_nullFrame() {
+ setupSurface(100, 100);
+ final Rect insets = new Rect(0, 10, 10, 0);
+ mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets);
+ final Canvas mockCanvas = mock(Canvas.class);
+ when(mockCanvas.getWidth()).thenReturn(100);
+ when(mockCanvas.getHeight()).thenReturn(100);
+ mSurface.mSystemBarBackgroundPainter.drawStatusBarBackground(
+ mockCanvas, null, 10);
+ verify(mockCanvas).drawRect(eq(0.0f), eq(0.0f), eq(90.0f), eq(10.0f), any());
+ }
+
+ @Test
public void testDrawStatusBarBackground_nope() {
setupSurface(100, 100);
final Rect insets = new Rect(0, 10, 10, 0);
@@ -183,7 +197,8 @@
final Canvas mockCanvas = mock(Canvas.class);
when(mockCanvas.getWidth()).thenReturn(100);
when(mockCanvas.getHeight()).thenReturn(100);
- mSurface.drawStatusBarBackground(mockCanvas, new Rect(0, 0, 100, 100), 10);
+ mSurface.mSystemBarBackgroundPainter.drawStatusBarBackground(
+ mockCanvas, new Rect(0, 0, 100, 100), 10);
verify(mockCanvas, never()).drawRect(anyInt(), anyInt(), anyInt(), anyInt(), any());
}
@@ -196,7 +211,7 @@
final Canvas mockCanvas = mock(Canvas.class);
when(mockCanvas.getWidth()).thenReturn(100);
when(mockCanvas.getHeight()).thenReturn(100);
- mSurface.drawNavigationBarBackground(mockCanvas);
+ mSurface.mSystemBarBackgroundPainter.drawNavigationBarBackground(mockCanvas);
verify(mockCanvas).drawRect(eq(new Rect(0, 90, 100, 100)), any());
}
@@ -209,7 +224,7 @@
final Canvas mockCanvas = mock(Canvas.class);
when(mockCanvas.getWidth()).thenReturn(100);
when(mockCanvas.getHeight()).thenReturn(100);
- mSurface.drawNavigationBarBackground(mockCanvas);
+ mSurface.mSystemBarBackgroundPainter.drawNavigationBarBackground(mockCanvas);
verify(mockCanvas).drawRect(eq(new Rect(0, 0, 10, 100)), any());
}
@@ -222,7 +237,7 @@
final Canvas mockCanvas = mock(Canvas.class);
when(mockCanvas.getWidth()).thenReturn(100);
when(mockCanvas.getHeight()).thenReturn(100);
- mSurface.drawNavigationBarBackground(mockCanvas);
+ mSurface.mSystemBarBackgroundPainter.drawNavigationBarBackground(mockCanvas);
verify(mockCanvas).drawRect(eq(new Rect(90, 0, 100, 100)), any());
}
}
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 bb453a9..7cb176d 100644
--- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -1078,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/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/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..5dd42dd 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)
@@ -386,6 +385,23 @@
mNM.notify("timeout_min", 7013, n);
}
},
+ new Test("Too many cancels") {
+ public void run()
+ {
+ mNM.cancelAll();
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ Notification n = new Notification.Builder(NotificationTestList.this, "default")
+ .setSmallIcon(R.drawable.icon2)
+ .setContentTitle("Cancel then post")
+ .setContentText("instead of just updating the existing notification")
+ .build();
+ mNM.notify("cancel_madness", 7014, n);
+ }
+ },
new Test("Off") {
public void run() {
PowerManager pm = (PowerManager) NotificationTestList.this.getSystemService(
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index 6140a896..6e5ac8a 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -39,6 +39,7 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
+import android.net.CaptivePortal;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.ConnectivityManager.PacketKeepalive;
@@ -77,6 +78,7 @@
import android.os.Parcelable;
import android.os.Process;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.provider.Settings;
import android.test.AndroidTestCase;
import android.test.mock.MockContentResolver;
@@ -121,7 +123,7 @@
private static final int TIMEOUT_MS = 500;
private static final int TEST_LINGER_DELAY_MS = 120;
- private BroadcastInterceptingContext mServiceContext;
+ private MockContext mServiceContext;
private WrappedConnectivityService mService;
private WrappedConnectivityManager mCm;
private MockNetworkAgent mWiFiNetworkAgent;
@@ -152,6 +154,7 @@
private final MockContentResolver mContentResolver;
@Spy private Resources mResources;
+ private final LinkedBlockingQueue<Intent> mStartedActivities = new LinkedBlockingQueue<>();
MockContext(Context base) {
super(base);
@@ -169,6 +172,27 @@
}
@Override
+ public void startActivityAsUser(Intent intent, UserHandle handle) {
+ mStartedActivities.offer(intent);
+ }
+
+ public Intent expectStartActivityIntent(int timeoutMs) {
+ Intent intent = null;
+ try {
+ intent = mStartedActivities.poll(timeoutMs, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {}
+ assertNotNull("Did not receive sign-in intent after " + timeoutMs + "ms", intent);
+ return intent;
+ }
+
+ public void expectNoStartActivityIntent(int timeoutMs) {
+ try {
+ assertNull("Received unexpected Intent to start activity",
+ mStartedActivities.poll(timeoutMs, TimeUnit.MILLISECONDS));
+ } catch (InterruptedException e) {}
+ }
+
+ @Override
public Object getSystemService(String name) {
if (Context.CONNECTIVITY_SERVICE.equals(name)) return mCm;
if (Context.NOTIFICATION_SERVICE.equals(name)) return mock(NotificationManager.class);
@@ -1830,6 +1854,52 @@
}
@SmallTest
+ public void testCaptivePortalApp() {
+ final TestNetworkCallback captivePortalCallback = new TestNetworkCallback();
+ final NetworkRequest captivePortalRequest = new NetworkRequest.Builder()
+ .addCapability(NET_CAPABILITY_CAPTIVE_PORTAL).build();
+ mCm.registerNetworkCallback(captivePortalRequest, captivePortalCallback);
+
+ final TestNetworkCallback validatedCallback = new TestNetworkCallback();
+ final NetworkRequest validatedRequest = new NetworkRequest.Builder()
+ .addCapability(NET_CAPABILITY_VALIDATED).build();
+ mCm.registerNetworkCallback(validatedRequest, validatedCallback);
+
+ // Bring up wifi.
+ mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
+ mWiFiNetworkAgent.connect(true);
+ validatedCallback.expectAvailableAndValidatedCallbacks(mWiFiNetworkAgent);
+ Network wifiNetwork = mWiFiNetworkAgent.getNetwork();
+
+ // Check that calling startCaptivePortalApp does nothing.
+ final int fastTimeoutMs = 100;
+ mCm.startCaptivePortalApp(wifiNetwork);
+ mServiceContext.expectNoStartActivityIntent(fastTimeoutMs);
+
+ // Turn into a captive portal.
+ mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 302;
+ mCm.reportNetworkConnectivity(wifiNetwork, false);
+ captivePortalCallback.expectAvailableCallbacks(mWiFiNetworkAgent);
+ validatedCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
+
+ // Check that startCaptivePortalApp sends the expected intent.
+ mCm.startCaptivePortalApp(wifiNetwork);
+ Intent intent = mServiceContext.expectStartActivityIntent(TIMEOUT_MS);
+ assertEquals(ConnectivityManager.ACTION_CAPTIVE_PORTAL_SIGN_IN, intent.getAction());
+ assertEquals(wifiNetwork, intent.getExtra(ConnectivityManager.EXTRA_NETWORK));
+
+ // Have the app report that the captive portal is dismissed, and check that we revalidate.
+ mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 204;
+ CaptivePortal c = (CaptivePortal) intent.getExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL);
+ c.reportCaptivePortalDismissed();
+ validatedCallback.expectAvailableCallbacks(mWiFiNetworkAgent);
+ captivePortalCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
+
+ mCm.unregisterNetworkCallback(validatedCallback);
+ mCm.unregisterNetworkCallback(captivePortalCallback);
+ }
+
+ @SmallTest
public void testAvoidOrIgnoreCaptivePortals() {
final TestNetworkCallback captivePortalCallback = new TestNetworkCallback();
final NetworkRequest captivePortalRequest = new NetworkRequest.Builder()
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/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/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/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 b93c6ec..5413b33 100644
--- a/tools/aapt2/cmd/Compile.cpp
+++ b/tools/aapt2/cmd/Compile.cpp
@@ -598,6 +598,9 @@
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;
@@ -612,7 +615,7 @@
}
IDiagnostics* GetDiagnostics() override {
- return &diagnostics_;
+ return diagnostics_;
}
NameMangler* GetNameMangler() override {
@@ -639,7 +642,7 @@
}
private:
- StdErrDiagnostics diagnostics_;
+ IDiagnostics* diagnostics_;
bool verbose_ = false;
};
@@ -647,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;
diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp
index 258516d..8accfa8 100644
--- a/tools/aapt2/cmd/Link.cpp
+++ b/tools/aapt2/cmd/Link.cpp
@@ -118,7 +118,8 @@
class LinkContext : public IAaptContext {
public:
- LinkContext() : name_mangler_({}), symbols_(&name_mangler_) {
+ LinkContext(IDiagnostics* diagnostics)
+ : diagnostics_(diagnostics), name_mangler_({}), symbols_(&name_mangler_) {
}
PackageType GetPackageType() override {
@@ -130,7 +131,7 @@
}
IDiagnostics* GetDiagnostics() override {
- return &diagnostics_;
+ return diagnostics_;
}
NameMangler* GetNameMangler() override {
@@ -181,7 +182,7 @@
DISALLOW_COPY_AND_ASSIGN(LinkContext);
PackageType package_type_ = PackageType::kApp;
- StdErrDiagnostics diagnostics_;
+ 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) {
@@ -1463,6 +1520,19 @@
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");
@@ -1736,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;
diff --git a/tools/aapt2/cmd/Optimize.cpp b/tools/aapt2/cmd/Optimize.cpp
index 78ed49b..194c0c8 100644
--- a/tools/aapt2/cmd/Optimize.cpp
+++ b/tools/aapt2/cmd/Optimize.cpp
@@ -213,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 d44b3e0..f4d0226 100644
--- a/tools/aapt2/flatten/TableFlattener.cpp
+++ b/tools/aapt2/flatten/TableFlattener.cpp
@@ -573,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 8dff3a2..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,6 +411,26 @@
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');
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 27ab22b..f998d31 100644
--- a/tools/aapt2/link/ManifestFixer.cpp
+++ b/tools/aapt2/link/ManifestFixer.cpp
@@ -332,7 +332,7 @@
// Provider actions.
application_action["provider"] = component_action;
- application_action["provider"]["grant-uri-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/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 29d1838..0564db0 100644
--- a/tools/aapt2/test/Context.h
+++ b/tools/aapt2/test/Context.h
@@ -52,15 +52,27 @@
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();
}
+ void SetPackageId(uint8_t package_id) {
+ package_id_ = package_id;
+ }
+
NameMangler* GetNameMangler() override {
return &name_mangler_;
}
+ void SetNameManglerPolicy(const NameManglerPolicy& policy) {
+ name_mangler_ = NameMangler(policy);
+ }
+
bool IsVerbose() override {
return false;
}
diff --git a/tools/aapt2/unflatten/BinaryResourceParser.cpp b/tools/aapt2/unflatten/BinaryResourceParser.cpp
index 42786b5..f311670 100644
--- a/tools/aapt2/unflatten/BinaryResourceParser.cpp
+++ b/tools/aapt2/unflatten/BinaryResourceParser.cpp
@@ -439,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/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/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..d942d05 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();
+ int 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/RttManager.java b/wifi/java/android/net/wifi/RttManager.java
index ff632a5..b133a44 100644
--- a/wifi/java/android/net/wifi/RttManager.java
+++ b/wifi/java/android/net/wifi/RttManager.java
@@ -660,10 +660,10 @@
@Deprecated
public int tx_rate;
- /** average transmit rate. Unit (100kbps). */
+ /** average transmit rate. Unit (kbps). */
public int txRate;
- /** average receiving rate Unit (100kbps). */
+ /** average receiving rate Unit (kbps). */
public int rxRate;
/**
@@ -673,7 +673,7 @@
@Deprecated
public long rtt_ns;
- /** average round trip time in 0.1 nano second. */
+ /** average round trip time in picoseconds. */
public long rtt;
/**
@@ -683,7 +683,7 @@
@Deprecated
public long rtt_sd_ns;
- /** standard deviation of RTT in 0.1 ns. */
+ /** standard deviation of RTT in picoseconds. */
public long rttStandardDeviation;
/**
@@ -693,7 +693,7 @@
@Deprecated
public long rtt_spread_ns;
- /** spread (i.e. max - min) RTT in 0.1 ns. */
+ /** spread (i.e. max - min) RTT in picoseconds. */
public long rttSpread;
/**
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 7defa7c..f7333e2 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
@@ -838,6 +839,10 @@
*/
public static final int NETWORK_SELECTION_ENABLE = 0;
/**
+ * The starting index for network selection disabled reasons
+ */
+ public static final int NETWORK_SELECTION_DISABLED_STARTING_INDEX = 1;
+ /**
* @deprecated it is not used any more.
* This network is disabled because higher layer (>2) network is bad
*/
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index ed54c3b..e59b74f 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,34 @@
* @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 +852,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 +1477,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 +1776,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 +1829,179 @@
}
/**
+ * 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},
+ * {@link LocalOnlyHotspotCallback#ERROR_INCOMPATIBLE_MODE} and
+ * {@link LocalOnlyHotspotCallback#ERROR_TETHERING_DISALLOWED}.
+ * <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.
+ */
+ 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 {
+ int returnCode = mService.startLocalOnlyHotspot(proxy.getMessenger(), new Binder());
+ if (returnCode != LocalOnlyHotspotCallback.REQUEST_REGISTERED) {
+ // Send message to the proxy to make sure we call back on the correct thread
+ proxy.notifyFailed(returnCode);
+ 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 +2257,309 @@
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.
+ */
+ 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 getWifiConfiguration() {
+ 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.
+ */
+ public static class LocalOnlyHotspotCallback {
+ /** @hide */
+ public static final int REQUEST_REGISTERED = 0;
+
+ public static final int ERROR_NO_CHANNEL = 1;
+ public static final int ERROR_GENERIC = 2;
+ public static final int ERROR_INCOMPATIBLE_MODE = 3;
+ public static final int ERROR_TETHERING_DISALLOWED = 4;
+
+ /** 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_TETHERING_DISALLOWED}, {@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/hotspot2/PasspointConfiguration.java b/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java
index 333a4f7d..f892bb0 100644
--- a/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java
+++ b/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java
@@ -80,9 +80,15 @@
* Configurations under Policy subtree.
*/
private Policy mPolicy = null;
+ /**
+ * @hide
+ */
public void setPolicy(Policy policy) {
mPolicy = policy;
}
+ /**
+ * @hide
+ */
public Policy getPolicy() {
return mPolicy;
}
@@ -91,9 +97,15 @@
* Meta data for performing subscription update.
*/
private UpdateParameter mSubscriptionUpdate = null;
+ /**
+ * @hide
+ */
public void setSubscriptionUpdate(UpdateParameter subscriptionUpdate) {
mSubscriptionUpdate = subscriptionUpdate;
}
+ /**
+ * @hide
+ */
public UpdateParameter getSubscriptionUpdate() {
return mSubscriptionUpdate;
}
@@ -104,9 +116,15 @@
* identity during EAP authentication.
*/
private Map<String, byte[]> mTrustRootCertList = null;
+ /**
+ * @hide
+ */
public void setTrustRootCertList(Map<String, byte[]> trustRootCertList) {
mTrustRootCertList = trustRootCertList;
}
+ /**
+ * @hide
+ */
public Map<String, byte[]> getTrustRootCertList() {
return mTrustRootCertList;
}
@@ -118,9 +136,15 @@
* Use Integer.MIN_VALUE to indicate unset value.
*/
private int mUpdateIdentifier = Integer.MIN_VALUE;
+ /**
+ * @hide
+ */
public void setUpdateIdentifier(int updateIdentifier) {
mUpdateIdentifier = updateIdentifier;
}
+ /**
+ * @hide
+ */
public int getUpdateIdentifier() {
return mUpdateIdentifier;
}
@@ -131,9 +155,15 @@
* Use Integer.MIN_VALUE to indicate unset value.
*/
private int mCredentialPriority = Integer.MIN_VALUE;
+ /**
+ * @hide
+ */
public void setCredentialPriority(int credentialPriority) {
mCredentialPriority = credentialPriority;
}
+ /**
+ * @hide
+ */
public int getCredentialPriority() {
return mCredentialPriority;
}
@@ -144,12 +174,18 @@
*
* Use Long.MIN_VALUE to indicate unset value.
*/
- private long mSubscriptionCreationTimeInMs = Long.MIN_VALUE;
- public void setSubscriptionCreationTimeInMs(long subscriptionCreationTimeInMs) {
- mSubscriptionCreationTimeInMs = subscriptionCreationTimeInMs;
+ private long mSubscriptionCreationTimeInMillis = Long.MIN_VALUE;
+ /**
+ * @hide
+ */
+ public void setSubscriptionCreationTimeInMillis(long subscriptionCreationTimeInMillis) {
+ mSubscriptionCreationTimeInMillis = subscriptionCreationTimeInMillis;
}
- public long getSubscriptionCreationTimeInMs() {
- return mSubscriptionCreationTimeInMs;
+ /**
+ * @hide
+ */
+ public long getSubscriptionCreationTimeInMillis() {
+ return mSubscriptionCreationTimeInMillis;
}
/**
@@ -158,12 +194,18 @@
*
* Use Long.MIN_VALUE to indicate unset value.
*/
- private long mSubscriptionExpirationTimeInMs = Long.MIN_VALUE;
- public void setSubscriptionExpirationTimeInMs(long subscriptionExpirationTimeInMs) {
- mSubscriptionExpirationTimeInMs = subscriptionExpirationTimeInMs;
+ private long mSubscriptionExpirationTimeInMillis = Long.MIN_VALUE;
+ /**
+ * @hide
+ */
+ public void setSubscriptionExpirationTimeInMillis(long subscriptionExpirationTimeInMillis) {
+ mSubscriptionExpirationTimeInMillis = subscriptionExpirationTimeInMillis;
}
- public long getSubscriptionExpirationTimeInMs() {
- return mSubscriptionExpirationTimeInMs;
+ /**
+ * @hide
+ */
+ public long getSubscriptionExpirationTimeInMillis() {
+ return mSubscriptionExpirationTimeInMillis;
}
/**
@@ -171,9 +213,15 @@
* specific.
*/
private String mSubscriptionType = null;
+ /**
+ * @hide
+ */
public void setSubscriptionType(String subscriptionType) {
mSubscriptionType = subscriptionType;
}
+ /**
+ * @hide
+ */
public String getSubscriptionType() {
return mSubscriptionType;
}
@@ -184,9 +232,15 @@
* “pay as you go” - PAYG service). A non-zero value specifies the usage interval in minutes.
*/
private long mUsageLimitUsageTimePeriodInMinutes = Long.MIN_VALUE;
+ /**
+ * @hide
+ */
public void setUsageLimitUsageTimePeriodInMinutes(long usageLimitUsageTimePeriodInMinutes) {
mUsageLimitUsageTimePeriodInMinutes = usageLimitUsageTimePeriodInMinutes;
}
+ /**
+ * @hide
+ */
public long getUsageLimitUsageTimePeriodInMinutes() {
return mUsageLimitUsageTimePeriodInMinutes;
}
@@ -197,12 +251,18 @@
*
* Use Long.MIN_VALUE to indicate unset value.
*/
- private long mUsageLimitStartTimeInMs = Long.MIN_VALUE;
- public void setUsageLimitStartTimeInMs(long usageLimitStartTimeInMs) {
- mUsageLimitStartTimeInMs = usageLimitStartTimeInMs;
+ private long mUsageLimitStartTimeInMillis = Long.MIN_VALUE;
+ /**
+ * @hide
+ */
+ public void setUsageLimitStartTimeInMillis(long usageLimitStartTimeInMillis) {
+ mUsageLimitStartTimeInMillis = usageLimitStartTimeInMillis;
}
- public long getUsageLimitStartTimeInMs() {
- return mUsageLimitStartTimeInMs;
+ /**
+ * @hide
+ */
+ public long getUsageLimitStartTimeInMillis() {
+ return mUsageLimitStartTimeInMillis;
}
/**
@@ -212,9 +272,15 @@
* Use Long.MIN_VALUE to indicate unset value.
*/
private long mUsageLimitDataLimit = Long.MIN_VALUE;
+ /**
+ * @hide
+ */
public void setUsageLimitDataLimit(long usageLimitDataLimit) {
mUsageLimitDataLimit = usageLimitDataLimit;
}
+ /**
+ * @hide
+ */
public long getUsageLimitDataLimit() {
return mUsageLimitDataLimit;
}
@@ -224,9 +290,15 @@
* A value of zero indicate unlimited time usage.
*/
private long mUsageLimitTimeLimitInMinutes = Long.MIN_VALUE;
+ /**
+ * @hide
+ */
public void setUsageLimitTimeLimitInMinutes(long usageLimitTimeLimitInMinutes) {
mUsageLimitTimeLimitInMinutes = usageLimitTimeLimitInMinutes;
}
+ /**
+ * @hide
+ */
public long getUsageLimitTimeLimitInMinutes() {
return mUsageLimitTimeLimitInMinutes;
}
@@ -263,11 +335,11 @@
}
mUpdateIdentifier = source.mUpdateIdentifier;
mCredentialPriority = source.mCredentialPriority;
- mSubscriptionCreationTimeInMs = source.mSubscriptionCreationTimeInMs;
- mSubscriptionExpirationTimeInMs = source.mSubscriptionExpirationTimeInMs;
+ mSubscriptionCreationTimeInMillis = source.mSubscriptionCreationTimeInMillis;
+ mSubscriptionExpirationTimeInMillis = source.mSubscriptionExpirationTimeInMillis;
mSubscriptionType = source.mSubscriptionType;
mUsageLimitDataLimit = source.mUsageLimitDataLimit;
- mUsageLimitStartTimeInMs = source.mUsageLimitStartTimeInMs;
+ mUsageLimitStartTimeInMillis = source.mUsageLimitStartTimeInMillis;
mUsageLimitTimeLimitInMinutes = source.mUsageLimitTimeLimitInMinutes;
mUsageLimitUsageTimePeriodInMinutes = source.mUsageLimitUsageTimePeriodInMinutes;
}
@@ -286,11 +358,11 @@
writeTrustRootCerts(dest, mTrustRootCertList);
dest.writeInt(mUpdateIdentifier);
dest.writeInt(mCredentialPriority);
- dest.writeLong(mSubscriptionCreationTimeInMs);
- dest.writeLong(mSubscriptionExpirationTimeInMs);
+ dest.writeLong(mSubscriptionCreationTimeInMillis);
+ dest.writeLong(mSubscriptionExpirationTimeInMillis);
dest.writeString(mSubscriptionType);
dest.writeLong(mUsageLimitUsageTimePeriodInMinutes);
- dest.writeLong(mUsageLimitStartTimeInMs);
+ dest.writeLong(mUsageLimitStartTimeInMillis);
dest.writeLong(mUsageLimitDataLimit);
dest.writeLong(mUsageLimitTimeLimitInMinutes);
}
@@ -313,11 +385,11 @@
&& isTrustRootCertListEquals(mTrustRootCertList, that.mTrustRootCertList)
&& mUpdateIdentifier == that.mUpdateIdentifier
&& mCredentialPriority == that.mCredentialPriority
- && mSubscriptionCreationTimeInMs == that.mSubscriptionCreationTimeInMs
- && mSubscriptionExpirationTimeInMs == that.mSubscriptionExpirationTimeInMs
+ && mSubscriptionCreationTimeInMillis == that.mSubscriptionCreationTimeInMillis
+ && mSubscriptionExpirationTimeInMillis == that.mSubscriptionExpirationTimeInMillis
&& TextUtils.equals(mSubscriptionType, that.mSubscriptionType)
&& mUsageLimitUsageTimePeriodInMinutes == that.mUsageLimitUsageTimePeriodInMinutes
- && mUsageLimitStartTimeInMs == that.mUsageLimitStartTimeInMs
+ && mUsageLimitStartTimeInMillis == that.mUsageLimitStartTimeInMillis
&& mUsageLimitDataLimit == that.mUsageLimitDataLimit
&& mUsageLimitTimeLimitInMinutes == that.mUsageLimitTimeLimitInMinutes;
}
@@ -325,9 +397,9 @@
@Override
public int hashCode() {
return Objects.hash(mHomeSp, mCredential, mPolicy, mSubscriptionUpdate, mTrustRootCertList,
- mUpdateIdentifier, mCredentialPriority, mSubscriptionCreationTimeInMs,
- mSubscriptionExpirationTimeInMs, mUsageLimitUsageTimePeriodInMinutes,
- mUsageLimitStartTimeInMs, mUsageLimitDataLimit, mUsageLimitTimeLimitInMinutes);
+ mUpdateIdentifier, mCredentialPriority, mSubscriptionCreationTimeInMillis,
+ mSubscriptionExpirationTimeInMillis, mUsageLimitUsageTimePeriodInMinutes,
+ mUsageLimitStartTimeInMillis, mUsageLimitDataLimit, mUsageLimitTimeLimitInMinutes);
}
@Override
@@ -336,13 +408,13 @@
builder.append("UpdateIdentifier: ").append(mUpdateIdentifier).append("\n");
builder.append("CredentialPriority: ").append(mCredentialPriority).append("\n");
builder.append("SubscriptionCreationTime: ").append(
- mSubscriptionCreationTimeInMs != Long.MIN_VALUE
- ? new Date(mSubscriptionCreationTimeInMs) : "Not specified").append("\n");
+ mSubscriptionCreationTimeInMillis != Long.MIN_VALUE
+ ? new Date(mSubscriptionCreationTimeInMillis) : "Not specified").append("\n");
builder.append("SubscriptionExpirationTime: ").append(
- mSubscriptionExpirationTimeInMs != Long.MIN_VALUE
- ? new Date(mSubscriptionExpirationTimeInMs) : "Not specified").append("\n");
- builder.append("UsageLimitStartTime: ").append(mUsageLimitStartTimeInMs != Long.MIN_VALUE
- ? new Date(mUsageLimitStartTimeInMs) : "Not specified").append("\n");
+ mSubscriptionExpirationTimeInMillis != Long.MIN_VALUE
+ ? new Date(mSubscriptionExpirationTimeInMillis) : "Not specified").append("\n");
+ builder.append("UsageLimitStartTime: ").append(mUsageLimitStartTimeInMillis != Long.MIN_VALUE
+ ? new Date(mUsageLimitStartTimeInMillis) : "Not specified").append("\n");
builder.append("UsageTimePeriod: ").append(mUsageLimitUsageTimePeriodInMinutes)
.append("\n");
builder.append("UsageLimitDataLimit: ").append(mUsageLimitDataLimit).append("\n");
@@ -433,11 +505,11 @@
config.setTrustRootCertList(readTrustRootCerts(in));
config.setUpdateIdentifier(in.readInt());
config.setCredentialPriority(in.readInt());
- config.setSubscriptionCreationTimeInMs(in.readLong());
- config.setSubscriptionExpirationTimeInMs(in.readLong());
+ config.setSubscriptionCreationTimeInMillis(in.readLong());
+ config.setSubscriptionExpirationTimeInMillis(in.readLong());
config.setSubscriptionType(in.readString());
config.setUsageLimitUsageTimePeriodInMinutes(in.readLong());
- config.setUsageLimitStartTimeInMs(in.readLong());
+ config.setUsageLimitStartTimeInMillis(in.readLong());
config.setUsageLimitDataLimit(in.readLong());
config.setUsageLimitTimeLimitInMinutes(in.readLong());
return config;
diff --git a/wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java b/wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java
index 5dc5d13..f6183fa 100644
--- a/wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java
+++ b/wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java
@@ -903,10 +903,10 @@
for (PPSNode child: node.getChildren()) {
switch (child.getName()) {
case NODE_CREATION_DATE:
- credential.setCreationTimeInMs(parseDate(getPpsNodeValue(child)));
+ credential.setCreationTimeInMillis(parseDate(getPpsNodeValue(child)));
break;
case NODE_EXPIRATION_DATE:
- credential.setExpirationTimeInMs(parseDate(getPpsNodeValue(child)));
+ credential.setExpirationTimeInMillis(parseDate(getPpsNodeValue(child)));
break;
case NODE_USERNAME_PASSWORD:
credential.setUserCredential(parseUserCredential(child));
@@ -1517,10 +1517,10 @@
for (PPSNode child : node.getChildren()) {
switch (child.getName()) {
case NODE_CREATION_DATE:
- config.setSubscriptionCreationTimeInMs(parseDate(getPpsNodeValue(child)));
+ config.setSubscriptionCreationTimeInMillis(parseDate(getPpsNodeValue(child)));
break;
case NODE_EXPIRATION_DATE:
- config.setSubscriptionExpirationTimeInMs(parseDate(getPpsNodeValue(child)));
+ config.setSubscriptionExpirationTimeInMillis(parseDate(getPpsNodeValue(child)));
break;
case NODE_TYPE_OF_SUBSCRIPTION:
config.setSubscriptionType(getPpsNodeValue(child));
@@ -1555,7 +1555,7 @@
config.setUsageLimitDataLimit(parseLong(getPpsNodeValue(child), 10));
break;
case NODE_START_DATE:
- config.setUsageLimitStartTimeInMs(parseDate(getPpsNodeValue(child)));
+ config.setUsageLimitStartTimeInMillis(parseDate(getPpsNodeValue(child)));
break;
case NODE_TIME_LIMIT:
config.setUsageLimitTimeLimitInMinutes(parseLong(getPpsNodeValue(child), 10));
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
index 67fa1bb..d712feb 100644
--- a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
+++ b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
@@ -58,12 +58,18 @@
* of milliseconds since January 1, 1970, 00:00:00 GMT.
* Using Long.MIN_VALUE to indicate unset value.
*/
- private long mCreationTimeInMs = Long.MIN_VALUE;
- public void setCreationTimeInMs(long creationTimeInMs) {
- mCreationTimeInMs = creationTimeInMs;
+ private long mCreationTimeInMillis = Long.MIN_VALUE;
+ /**
+ * @hide
+ */
+ public void setCreationTimeInMillis(long creationTimeInMillis) {
+ mCreationTimeInMillis = creationTimeInMillis;
}
- public long getCreationTimeInMs() {
- return mCreationTimeInMs;
+ /**
+ * @hide
+ */
+ public long getCreationTimeInMillis() {
+ return mCreationTimeInMillis;
}
/**
@@ -71,12 +77,18 @@
* of milliseconds since January 1, 1970, 00:00:00 GMT.
* Using Long.MIN_VALUE to indicate unset value.
*/
- private long mExpirationTimeInMs = Long.MIN_VALUE;
- public void setExpirationTimeInMs(long expirationTimeInMs) {
- mExpirationTimeInMs = expirationTimeInMs;
+ private long mExpirationTimeInMillis = Long.MIN_VALUE;
+ /**
+ * @hide
+ */
+ public void setExpirationTimeInMillis(long expirationTimeInMillis) {
+ mExpirationTimeInMillis = expirationTimeInMillis;
}
- public long getExpirationTimeInMs() {
- return mExpirationTimeInMs;
+ /**
+ * @hide
+ */
+ public long getExpirationTimeInMillis() {
+ return mExpirationTimeInMillis;
}
/**
@@ -98,9 +110,15 @@
* Protocol) authentication.
*/
private boolean mCheckAaaServerCertStatus = false;
+ /**
+ * @hide
+ */
public void setCheckAaaServerCertStatus(boolean checkAaaServerCertStatus) {
mCheckAaaServerCertStatus = checkAaaServerCertStatus;
}
+ /**
+ * @hide
+ */
public boolean getCheckAaaServerCertStatus() {
return mCheckAaaServerCertStatus;
}
@@ -166,9 +184,15 @@
* Flag indicating if the password is machine managed.
*/
private boolean mMachineManaged = false;
+ /**
+ * @hide
+ */
public void setMachineManaged(boolean machineManaged) {
mMachineManaged = machineManaged;
}
+ /**
+ * @hide
+ */
public boolean getMachineManaged() {
return mMachineManaged;
}
@@ -177,9 +201,15 @@
* The name of the application used to generate the password.
*/
private String mSoftTokenApp = null;
+ /**
+ * @hide
+ */
public void setSoftTokenApp(String softTokenApp) {
mSoftTokenApp = softTokenApp;
}
+ /**
+ * @hide
+ */
public String getSoftTokenApp() {
return mSoftTokenApp;
}
@@ -188,9 +218,15 @@
* Flag indicating if this credential is usable on other mobile devices as well.
*/
private boolean mAbleToShare = false;
+ /**
+ * @hide
+ */
public void setAbleToShare(boolean ableToShare) {
mAbleToShare = ableToShare;
}
+ /**
+ * @hide
+ */
public boolean getAbleToShare() {
return mAbleToShare;
}
@@ -720,8 +756,8 @@
*/
public Credential(Credential source) {
if (source != null) {
- mCreationTimeInMs = source.mCreationTimeInMs;
- mExpirationTimeInMs = source.mExpirationTimeInMs;
+ mCreationTimeInMillis = source.mCreationTimeInMillis;
+ mExpirationTimeInMillis = source.mExpirationTimeInMillis;
mRealm = source.mRealm;
mCheckAaaServerCertStatus = source.mCheckAaaServerCertStatus;
if (source.mUserCredential != null) {
@@ -749,8 +785,8 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
- dest.writeLong(mCreationTimeInMs);
- dest.writeLong(mExpirationTimeInMs);
+ dest.writeLong(mCreationTimeInMillis);
+ dest.writeLong(mExpirationTimeInMillis);
dest.writeString(mRealm);
dest.writeInt(mCheckAaaServerCertStatus ? 1 : 0);
dest.writeParcelable(mUserCredential, flags);
@@ -772,8 +808,8 @@
Credential that = (Credential) thatObject;
return TextUtils.equals(mRealm, that.mRealm)
- && mCreationTimeInMs == that.mCreationTimeInMs
- && mExpirationTimeInMs == that.mExpirationTimeInMs
+ && mCreationTimeInMillis == that.mCreationTimeInMillis
+ && mExpirationTimeInMillis == that.mExpirationTimeInMillis
&& mCheckAaaServerCertStatus == that.mCheckAaaServerCertStatus
&& (mUserCredential == null ? that.mUserCredential == null
: mUserCredential.equals(that.mUserCredential))
@@ -788,7 +824,7 @@
@Override
public int hashCode() {
- return Objects.hash(mRealm, mCreationTimeInMs, mExpirationTimeInMs,
+ return Objects.hash(mRealm, mCreationTimeInMillis, mExpirationTimeInMillis,
mCheckAaaServerCertStatus, mUserCredential, mCertCredential, mSimCredential,
mCaCertificate, mClientCertificateChain, mClientPrivateKey);
}
@@ -797,10 +833,10 @@
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Realm: ").append(mRealm).append("\n");
- builder.append("CreationTime: ").append(mCreationTimeInMs != Long.MIN_VALUE
- ? new Date(mCreationTimeInMs) : "Not specified").append("\n");
- builder.append("ExpirationTime: ").append(mExpirationTimeInMs != Long.MIN_VALUE
- ? new Date(mExpirationTimeInMs) : "Not specified").append("\n");
+ builder.append("CreationTime: ").append(mCreationTimeInMillis != Long.MIN_VALUE
+ ? new Date(mCreationTimeInMillis) : "Not specified").append("\n");
+ builder.append("ExpirationTime: ").append(mExpirationTimeInMillis != Long.MIN_VALUE
+ ? new Date(mExpirationTimeInMillis) : "Not specified").append("\n");
builder.append("CheckAAAServerStatus: ").append(mCheckAaaServerCertStatus).append("\n");
if (mUserCredential != null) {
builder.append("UserCredential Begin ---\n");
@@ -863,8 +899,8 @@
@Override
public Credential createFromParcel(Parcel in) {
Credential credential = new Credential();
- credential.setCreationTimeInMs(in.readLong());
- credential.setExpirationTimeInMs(in.readLong());
+ credential.setCreationTimeInMillis(in.readLong());
+ credential.setExpirationTimeInMillis(in.readLong());
credential.setRealm(in.readString());
credential.setCheckAaaServerCertStatus(in.readInt() != 0);
credential.setUserCredential(in.readParcelable(null));
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java b/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java
index 9192ab0..2247860 100644
--- a/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java
+++ b/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java
@@ -74,9 +74,15 @@
* Icon URL of this home service provider.
*/
private String mIconUrl = null;
+ /**
+ * @hide
+ */
public void setIconUrl(String iconUrl) {
mIconUrl = iconUrl;
}
+ /**
+ * @hide
+ */
public String getIconUrl() {
return mIconUrl;
}
@@ -89,9 +95,15 @@
* string is assumed to be encoded using UTF-8.
*/
private Map<String, Long> mHomeNetworkIds = null;
+ /**
+ * @hide
+ */
public void setHomeNetworkIds(Map<String, Long> homeNetworkIds) {
mHomeNetworkIds = homeNetworkIds;
}
+ /**
+ * @hide
+ */
public Map<String, Long> getHomeNetworkIds() {
return mHomeNetworkIds;
}
@@ -107,9 +119,15 @@
* (MO) tree for more detail.
*/
private long[] mMatchAllOis = null;
+ /**
+ * @hide
+ */
public void setMatchAllOis(long[] matchAllOis) {
mMatchAllOis = matchAllOis;
}
+ /**
+ * @hide
+ */
public long[] getMatchAllOis() {
return mMatchAllOis;
}
@@ -128,9 +146,15 @@
* (MO) tree for more detail.
*/
private long[] mMatchAnyOis = null;
+ /**
+ * @hide
+ */
public void setMatchAnyOis(long[] matchAnyOis) {
mMatchAnyOis = matchAnyOis;
}
+ /**
+ * @hide
+ */
public long[] getMatchAnyOis() {
return mMatchAnyOis;
}
@@ -142,9 +166,15 @@
* operator merges between the providers.
*/
private String[] mOtherHomePartners = null;
+ /**
+ * @hide
+ */
public void setOtherHomePartners(String[] otherHomePartners) {
mOtherHomePartners = otherHomePartners;
}
+ /**
+ * @hide
+ */
public String[] getOtherHomePartners() {
return mOtherHomePartners;
}
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/Policy.java b/wifi/java/android/net/wifi/hotspot2/pps/Policy.java
index 1df70f8..ee0894b 100644
--- a/wifi/java/android/net/wifi/hotspot2/pps/Policy.java
+++ b/wifi/java/android/net/wifi/hotspot2/pps/Policy.java
@@ -40,6 +40,8 @@
*
* For more info, refer to Hotspot 2.0 PPS MO defined in section 9.1 of the Hotspot 2.0
* Release 2 Technical Specification.
+ *
+ * @hide
*/
public final class Policy implements Parcelable {
private static final String TAG = "Policy";
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.java b/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.java
index a7adfeb..9eb6314 100644
--- a/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.java
+++ b/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.java
@@ -34,6 +34,8 @@
*
* For more info, refer to Hotspot 2.0 PPS MO defined in section 9.1 of the Hotspot 2.0
* Release 2 Technical Specification.
+ *
+ * @hide
*/
public final class UpdateParameter implements Parcelable {
private static final String TAG = "UpdateParameter";
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..03ef319
--- /dev/null
+++ b/wifi/tests/src/android/net/wifi/WifiManagerTest.java
@@ -0,0 +1,762 @@
+/*
+ * 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 android.net.wifi.WifiManager.LocalOnlyHotspotCallback.REQUEST_REGISTERED;
+
+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(REQUEST_REGISTERED);
+ mWifiManager.startLocalOnlyHotspot(callback, mHandler);
+
+ callback.onStarted(mWifiManager.new LocalOnlyHotspotReservation(mApConfig));
+
+ assertEquals(mApConfig, callback.mRes.getWifiConfiguration());
+ 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(REQUEST_REGISTERED);
+ mWifiManager.startLocalOnlyHotspot(callback, mHandler);
+
+ callback.onStarted(mWifiManager.new LocalOnlyHotspotReservation(mApConfig));
+
+ try (WifiManager.LocalOnlyHotspotReservation res = callback.mRes) {
+ assertEquals(mApConfig, res.getWifiConfiguration());
+ }
+
+ 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(ERROR_INCOMPATIBLE_MODE);
+ 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(ERROR_INCOMPATIBLE_MODE);
+ 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(REQUEST_REGISTERED);
+ 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.getWifiConfiguration());
+ }
+
+ /**
+ * 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(REQUEST_REGISTERED);
+ 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(REQUEST_REGISTERED);
+ 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(REQUEST_REGISTERED);
+ 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(ERROR_INCOMPATIBLE_MODE);
+ 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(REQUEST_REGISTERED);
+ 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(REQUEST_REGISTERED);
+ 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(REQUEST_REGISTERED);
+ 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(ERROR_INCOMPATIBLE_MODE);
+ 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/hotspot2/PasspointConfigurationTest.java b/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java
index 7df4fcf..afcf3e3 100644
--- a/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java
+++ b/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java
@@ -158,11 +158,11 @@
config.setTrustRootCertList(trustRootCertList);
config.setUpdateIdentifier(1);
config.setCredentialPriority(120);
- config.setSubscriptionCreationTimeInMs(231200);
- config.setSubscriptionExpirationTimeInMs(2134232);
+ config.setSubscriptionCreationTimeInMillis(231200);
+ config.setSubscriptionExpirationTimeInMillis(2134232);
config.setSubscriptionType("Gold");
config.setUsageLimitUsageTimePeriodInMinutes(3600);
- config.setUsageLimitStartTimeInMs(124214213);
+ config.setUsageLimitStartTimeInMillis(124214213);
config.setUsageLimitDataLimit(14121);
config.setUsageLimitTimeLimitInMinutes(78912);
return config;
diff --git a/wifi/tests/src/android/net/wifi/hotspot2/omadm/PpsMoParserTest.java b/wifi/tests/src/android/net/wifi/hotspot2/omadm/PpsMoParserTest.java
index 7cd72f0..afa9fd6 100644
--- a/wifi/tests/src/android/net/wifi/hotspot2/omadm/PpsMoParserTest.java
+++ b/wifi/tests/src/android/net/wifi/hotspot2/omadm/PpsMoParserTest.java
@@ -113,11 +113,11 @@
config.setSubscriptionUpdate(subscriptionUpdate);
// Subscription parameters.
- config.setSubscriptionCreationTimeInMs(format.parse("2016-02-01T10:00:00Z").getTime());
- config.setSubscriptionExpirationTimeInMs(format.parse("2016-03-01T10:00:00Z").getTime());
+ config.setSubscriptionCreationTimeInMillis(format.parse("2016-02-01T10:00:00Z").getTime());
+ config.setSubscriptionExpirationTimeInMillis(format.parse("2016-03-01T10:00:00Z").getTime());
config.setSubscriptionType("Gold");
config.setUsageLimitDataLimit(921890);
- config.setUsageLimitStartTimeInMs(format.parse("2016-12-01T10:00:00Z").getTime());
+ config.setUsageLimitStartTimeInMillis(format.parse("2016-12-01T10:00:00Z").getTime());
config.setUsageLimitTimeLimitInMinutes(120);
config.setUsageLimitUsageTimePeriodInMinutes(99910);
@@ -138,8 +138,8 @@
// Credential configuration.
Credential credential = new Credential();
- credential.setCreationTimeInMs(format.parse("2016-01-01T10:00:00Z").getTime());
- credential.setExpirationTimeInMs(format.parse("2016-02-01T10:00:00Z").getTime());
+ credential.setCreationTimeInMillis(format.parse("2016-01-01T10:00:00Z").getTime());
+ credential.setExpirationTimeInMillis(format.parse("2016-02-01T10:00:00Z").getTime());
credential.setRealm("shaken.stirred.com");
credential.setCheckAaaServerCertStatus(true);
Credential.UserCredential userCredential = new Credential.UserCredential();
diff --git a/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java b/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java
index c7ade00..9bfc010 100644
--- a/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java
+++ b/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java
@@ -56,8 +56,8 @@
X509Certificate[] clientCertificateChain,
PrivateKey clientPrivateKey) {
Credential cred = new Credential();
- cred.setCreationTimeInMs(123455L);
- cred.setExpirationTimeInMs(2310093L);
+ cred.setCreationTimeInMillis(123455L);
+ cred.setExpirationTimeInMillis(2310093L);
cred.setRealm("realm");
cred.setCheckAaaServerCertStatus(true);
cred.setUserCredential(userCred);
@@ -440,4 +440,4 @@
Credential copyCred = new Credential(sourceCred);
assertTrue(copyCred.equals(sourceCred));
}
-}
\ No newline at end of file
+}