diff --git a/Android.mk b/Android.mk index 741c5708fba54c876730169bf99b4f0d6d0fa1ea..8bb366ae2fed326bd5c499834b1ce293fb72d5de 100644 --- a/Android.mk +++ b/Android.mk @@ -157,6 +157,7 @@ LOCAL_SRC_FILES += \ core/java/android/content/ISyncServiceAdapter.aidl \ core/java/android/content/ISyncStatusObserver.aidl \ core/java/android/content/om/IOverlayManager.aidl \ + core/java/android/content/pm/IDexModuleRegisterCallback.aidl \ core/java/android/content/pm/ILauncherApps.aidl \ core/java/android/content/pm/IOnAppsChangedListener.aidl \ core/java/android/content/pm/IOnPermissionsChangeListener.aidl \ @@ -490,10 +491,10 @@ LOCAL_SRC_FILES += \ telecomm/java/com/android/internal/telecom/IInCallService.aidl \ telecomm/java/com/android/internal/telecom/ITelecomService.aidl \ telecomm/java/com/android/internal/telecom/RemoteServiceCallback.aidl \ - telephony/java/android/telephony/mbms/IMbmsDownloadManagerListener.aidl \ - telephony/java/android/telephony/mbms/IMbmsStreamingManagerListener.aidl \ - telephony/java/android/telephony/mbms/IDownloadListener.aidl \ - telephony/java/android/telephony/mbms/IStreamingServiceListener.aidl \ + telephony/java/android/telephony/mbms/IMbmsDownloadManagerCallback.aidl \ + telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl \ + telephony/java/android/telephony/mbms/IDownloadCallback.aidl \ + telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl \ telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl \ telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl \ telephony/java/com/android/ims/internal/IImsCallSession.aidl \ diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg index 75de4a7833f18bf233f1e358fc80b09365d4273c..50a597407e5838e6126b90893cb0825f8614728a 100644 --- a/PREUPLOAD.cfg +++ b/PREUPLOAD.cfg @@ -1,14 +1,7 @@ [Hook Scripts] checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --sha ${PREUPLOAD_COMMIT} - -fw core/java/android/animation/ - core/java/android/hardware/usb/ - core/java/android/print/ - core/java/android/printservice/ - core/java/android/text/ - core/java/android/transition/ - core/java/android/view/ - core/java/android/widget/ - core/tests/coretests/src/android/print/ + -fw core/java/android/ + core/tests/coretests/src/android/ packages/PrintRecommendationService/ packages/PrintSpooler/ services/print/ diff --git a/api/current.txt b/api/current.txt index 2580fcf766c212f8054d31b3f9d53711e89ad6fd..2f33c34fd5b49805ccf41cc63e32d832e40b963f 100644 --- a/api/current.txt +++ b/api/current.txt @@ -15,7 +15,6 @@ package android { 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"; @@ -116,12 +115,12 @@ package android { 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"; @@ -140,7 +139,6 @@ package android { 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"; @@ -313,6 +311,7 @@ package android { 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 @@ -357,12 +356,12 @@ package android { 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 @@ -993,7 +992,7 @@ package android { 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 @@ -1062,6 +1061,7 @@ package android { 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 @@ -1086,7 +1086,6 @@ package android { 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 @@ -1297,7 +1296,7 @@ package android { 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 @@ -1612,7 +1611,6 @@ package android { 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 @@ -1710,7 +1708,6 @@ package android { 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 @@ -2831,13 +2828,13 @@ package android.accessibilityservice { 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 CREATOR; @@ -2849,13 +2846,13 @@ package android.accessibilityservice { 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; @@ -2877,7 +2874,7 @@ package android.accessibilityservice { 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); } @@ -2896,14 +2893,12 @@ package android.accessibilityservice { 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(); } } @@ -3035,8 +3030,8 @@ package android.accounts { 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,7 +3579,6 @@ package android.app { 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 deprecated void enterPictureInPictureMode(); - method public deprecated boolean enterPictureInPictureMode(android.app.PictureInPictureArgs); method public boolean enterPictureInPictureMode(android.app.PictureInPictureParams); method public T findViewById(int); method public void finish(); @@ -3682,7 +3676,6 @@ package android.app { method public void onLowMemory(); method public boolean onMenuItemSelected(int, android.view.MenuItem); method public boolean onMenuOpened(int, android.view.Menu); - method public void onMovedToDisplay(int, android.content.res.Configuration); method public void onMultiWindowModeChanged(boolean, android.content.res.Configuration); method public deprecated void onMultiWindowModeChanged(boolean); method public boolean onNavigateUp(); @@ -3760,7 +3753,6 @@ package android.app { 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); @@ -3840,7 +3832,6 @@ package android.app { method public int getLauncherLargeIconDensity(); method public int getLauncherLargeIconSize(); method public int getLockTaskModeState(); - method public static deprecated int getMaxNumPictureInPictureActions(); method public int getMemoryClass(); method public void getMemoryInfo(android.app.ActivityManager.MemoryInfo); method public static void getMyMemoryState(android.app.ActivityManager.RunningAppProcessInfo); @@ -3944,7 +3935,7 @@ package android.app { field public static final int IMPORTANCE_FOREGROUND_SERVICE = 125; // 0x7d field public static final int IMPORTANCE_GONE = 1000; // 0x3e8 field public static final int IMPORTANCE_PERCEPTIBLE = 230; // 0xe6 - field public static final deprecated int IMPORTANCE_PERCEPTIBLE_DEPRECATED = 130; // 0x82 + field public static final int IMPORTANCE_PERCEPTIBLE_PRE_26 = 130; // 0x82 field public static final int IMPORTANCE_SERVICE = 300; // 0x12c field public static final int IMPORTANCE_TOP_SLEEPING = 150; // 0x96 field public static final int IMPORTANCE_VISIBLE = 200; // 0xc8 @@ -4031,6 +4022,7 @@ package android.app { 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(); @@ -4703,7 +4695,6 @@ package android.app { 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 onFindViewById(int); method public abstract boolean onHasView(); } @@ -4818,6 +4809,7 @@ package android.app { method public void onFragmentDetached(android.app.FragmentManager, android.app.Fragment); method public void onFragmentPaused(android.app.FragmentManager, android.app.Fragment); method public void onFragmentPreAttached(android.app.FragmentManager, android.app.Fragment, android.content.Context); + method public void onFragmentPreCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle); method public void onFragmentResumed(android.app.FragmentManager, android.app.Fragment); method public void onFragmentSaveInstanceState(android.app.FragmentManager, android.app.Fragment, android.os.Bundle); method public void onFragmentStarted(android.app.FragmentManager, android.app.Fragment); @@ -4850,11 +4842,10 @@ package android.app { method public abstract android.app.FragmentTransaction hide(android.app.Fragment); method public abstract boolean isAddToBackStackAllowed(); method public abstract boolean isEmpty(); - method public abstract android.app.FragmentTransaction postOnCommit(java.lang.Runnable); method public abstract android.app.FragmentTransaction remove(android.app.Fragment); method public abstract android.app.FragmentTransaction replace(int, android.app.Fragment); method public abstract android.app.FragmentTransaction replace(int, android.app.Fragment, java.lang.String); - method public abstract android.app.FragmentTransaction setAllowOptimization(boolean); + method public abstract android.app.FragmentTransaction runOnCommit(java.lang.Runnable); method public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(int); method public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence); method public abstract android.app.FragmentTransaction setBreadCrumbTitle(int); @@ -4862,6 +4853,7 @@ package android.app { method public abstract android.app.FragmentTransaction setCustomAnimations(int, int); method public abstract android.app.FragmentTransaction setCustomAnimations(int, int, int, int); method public abstract android.app.FragmentTransaction setPrimaryNavigationFragment(android.app.Fragment); + method public abstract android.app.FragmentTransaction setReorderingAllowed(boolean); method public abstract android.app.FragmentTransaction setTransition(int); method public abstract android.app.FragmentTransaction setTransitionStyle(int); method public abstract android.app.FragmentTransaction show(android.app.Fragment); @@ -4955,7 +4947,7 @@ package android.app { method public final android.app.Activity getLastActivity(); method public final android.app.Instrumentation.ActivityResult getResult(); method public final boolean isBlocking(); - method public android.app.Instrumentation.ActivityResult onMatchIntent(android.content.Intent); + method public android.app.Instrumentation.ActivityResult onStartActivity(android.content.Intent); method public final android.app.Activity waitForActivity(); method public final android.app.Activity waitForActivityWithTimeout(long); } @@ -4975,7 +4967,6 @@ package android.app { 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(); @@ -4983,6 +4974,7 @@ package android.app { 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 { @@ -5123,7 +5115,6 @@ package android.app { 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(); @@ -5132,7 +5123,6 @@ package android.app { 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; @@ -5335,7 +5325,6 @@ package android.app { 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); @@ -5380,7 +5369,6 @@ package android.app { 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[]); @@ -5699,21 +5687,10 @@ package android.app { method public abstract void onSendFinished(android.app.PendingIntent, android.content.Intent, int, java.lang.String, android.os.Bundle); } - public final deprecated class PictureInPictureArgs extends android.app.PictureInPictureParams { - ctor public deprecated PictureInPictureArgs(); - ctor public deprecated PictureInPictureArgs(float, java.util.List); - method public deprecated void setActions(java.util.List); - method public deprecated void setAspectRatio(float); - method public deprecated void setSourceRectHint(android.graphics.Rect); - } - - public class PictureInPictureParams implements android.os.Parcelable { + public final class PictureInPictureParams implements android.os.Parcelable { method public int describeContents(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; - field protected android.util.Rational mAspectRatio; - field protected android.graphics.Rect mSourceRectHint; - field protected java.util.List mUserActions; } public static class PictureInPictureParams.Builder { @@ -6205,7 +6182,7 @@ package android.app { 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 CREATOR; @@ -6307,7 +6284,7 @@ package android.app.admin { method public int enableSystemApp(android.content.ComponentName, android.content.Intent); method public java.lang.String[] getAccountTypesWithManagementDisabled(); method public java.util.List getActiveAdmins(); - method public java.util.List getAffiliationIds(android.content.ComponentName); + method public java.util.Set 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); @@ -6394,7 +6371,7 @@ package android.app.admin { method public java.util.List retrievePreRebootSecurityLogs(android.content.ComponentName); method public java.util.List 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); + method public void setAffiliationIds(android.content.ComponentName, java.util.Set); 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); @@ -6512,7 +6489,7 @@ package android.app.admin { 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 @@ -6550,8 +6527,8 @@ package android.app.admin { 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 getInetAddresses(); + method public int getTotalResolvedAddressCount(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; } @@ -6722,7 +6699,6 @@ package android.app.backup { 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(); @@ -6757,6 +6733,7 @@ package android.app.backup { } 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; } @@ -6785,6 +6762,7 @@ package android.app.backup { } public class FullBackupDataOutput { + method public long getQuota(); } public abstract class RestoreObserver { @@ -7010,8 +6988,8 @@ package android.app.usage { 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 CREATOR; @@ -8044,7 +8022,7 @@ package android.bluetooth.le { 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); } @@ -8219,8 +8197,10 @@ package android.bluetooth.le { field public static final android.os.Parcelable.Creator 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 { @@ -8291,21 +8271,21 @@ package android.companion { 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 CREATOR; + field public static final android.os.Parcelable.Creator 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 { @@ -8441,7 +8421,7 @@ package android.content { 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); @@ -9347,15 +9327,12 @@ package android.content { 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"; @@ -9513,6 +9490,7 @@ package android.content { 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"; @@ -9558,7 +9536,6 @@ package android.content { 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"; @@ -10336,7 +10313,7 @@ package android.content.pm { 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 { @@ -10931,8 +10908,8 @@ package android.content.pm { 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; @@ -10969,7 +10946,7 @@ package android.content.pm { method public java.util.List 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 CREATOR; field public static final int TYPE_BUILTIN = 0; // 0x0 @@ -11057,7 +11034,7 @@ package android.content.pm { 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 CREATOR; } @@ -13303,7 +13280,7 @@ package android.graphics { 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); @@ -13779,6 +13756,7 @@ package android.graphics { 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); @@ -13829,7 +13807,7 @@ package android.graphics { 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); @@ -13855,6 +13833,7 @@ package android.graphics { 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(); @@ -14413,17 +14392,13 @@ package android.graphics.drawable.shapes { 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 { @@ -14511,7 +14486,7 @@ package android.hardware { 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 @@ -14772,18 +14747,16 @@ package android.hardware { 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 { @@ -21026,6 +20999,7 @@ package android.media { 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); } @@ -25415,8 +25389,8 @@ package android.net { 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); @@ -26571,6 +26545,7 @@ package android.net.wifi { 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); @@ -26621,6 +26596,22 @@ package android.net.wifi { 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(); @@ -26783,33 +26774,9 @@ package android.net.wifi.hotspot2 { 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 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); - 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 CREATOR; } @@ -26832,21 +26799,15 @@ package android.net.wifi.hotspot2.pps { 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); @@ -26882,19 +26843,13 @@ package android.net.wifi.hotspot2.pps { 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 CREATOR; @@ -26906,96 +26861,14 @@ package android.net.wifi.hotspot2.pps { method public int describeContents(); method public java.lang.String getFqdn(); method public java.lang.String getFriendlyName(); - method public java.util.Map 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); - 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 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 getPreferredRoamingPartnerList(); - method public java.util.Map 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); - method public void setRequiredProtoPortMap(java.util.Map); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator 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 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 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 { @@ -30695,7 +30568,6 @@ package android.os { method public android.util.SizeF getSizeF(java.lang.String); method public android.util.SparseArray getSparseParcelableArray(java.lang.String); method public java.util.ArrayList 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); @@ -30720,7 +30592,6 @@ package android.os { method public void putSizeF(java.lang.String, android.util.SizeF); method public void putSparseParcelableArray(java.lang.String, android.util.SparseArray); method public void putStringArrayList(java.lang.String, java.util.ArrayList); - 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); @@ -31250,7 +31121,6 @@ package android.os { method public final void readTypedArray(T[], android.os.Parcelable.Creator); method public final void readTypedList(java.util.List, android.os.Parcelable.Creator); method public final T readTypedObject(android.os.Parcelable.Creator); - 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); @@ -31296,7 +31166,6 @@ package android.os { method public final void writeTypedArray(T[], int); method public final void writeTypedList(java.util.List); method public final 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 STRING_CREATOR; } @@ -31627,7 +31496,7 @@ package android.os { 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(); @@ -31928,9 +31797,9 @@ package android.os.storage { } 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); @@ -31943,7 +31812,6 @@ package android.os.storage { 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; @@ -31951,7 +31819,6 @@ package android.os.storage { 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; } @@ -34063,7 +33930,6 @@ package android.provider { field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_CHAT_ID = "android.provider.extra.RECIPIENT_CONTACT_CHAT_ID"; field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_NAME = "android.provider.extra.RECIPIENT_CONTACT_NAME"; field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_URI = "android.provider.extra.RECIPIENT_CONTACT_URI"; - field public static final java.lang.String EXTRA_SENDER_ACCOUNT_HASH = "android.provider.extra.SENDER_ACCOUNT_HASH"; field public static final java.lang.String INVITE_CONTACT = "com.android.contacts.action.INVITE_CONTACT"; field public static final java.lang.String METADATA_ACCOUNT_TYPE = "android.provider.account_type"; field public static final java.lang.String METADATA_MIMETYPE = "android.provider.mimetype"; @@ -34442,7 +34308,6 @@ package android.provider { } 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); @@ -37041,7 +36906,7 @@ package android.service.autofill { public final class FillRequest implements android.os.Parcelable { method public int describeContents(); method public android.os.Bundle getClientState(); - method public java.util.ArrayList getFillContexts(); + method public java.util.List getFillContexts(); method public int getFlags(); method public int getId(); method public void writeToParcel(android.os.Parcel, int); @@ -37504,7 +37369,6 @@ package android.service.quicksettings { 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"; } @@ -38026,7 +37890,6 @@ package android.speech.tts { 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 { @@ -40108,8 +39971,11 @@ package android.telephony { 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 } @@ -45614,7 +45480,6 @@ package android.view { 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); @@ -45834,6 +45699,7 @@ package android.view { 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 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"; @@ -46545,7 +46411,7 @@ package android.view { public static abstract class ViewStructure.HtmlInfo { ctor public ViewStructure.HtmlInfo(); - method public abstract java.util.ArrayList> getAttributes(); + method public abstract java.util.List> getAttributes(); method public abstract java.lang.String getTag(); } @@ -47259,8 +47125,8 @@ package android.view.accessibility { 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"; @@ -47449,10 +47315,10 @@ package android.view.accessibility { 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(); @@ -47794,7 +47660,7 @@ package android.view.autofill { 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(); @@ -47810,7 +47676,7 @@ package android.view.autofill { 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 { @@ -48244,12 +48110,7 @@ package android.view.inputmethod { 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(); @@ -48260,19 +48121,24 @@ package android.view.textclassifier { 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"; @@ -48951,7 +48817,6 @@ package android.webkit { 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(); @@ -48998,7 +48863,6 @@ package android.webkit { 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); @@ -51458,7 +51322,7 @@ package android.widget { 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); @@ -52143,15 +52007,15 @@ package dalvik.system { 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 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 c132385f16310a0dee7637ca46f7878c95db8b6c..187349916286822b0f041044ae15d1e5ac56f0e6 100644 --- a/api/removed.txt +++ b/api/removed.txt @@ -1,9 +1,59 @@ 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 { + 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 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 setSourceRectHintInsets(android.graphics.Rect); + method public void truncateActions(int); + field public static final android.os.Parcelable.Creator 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); + 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 +67,18 @@ package android.app.admin { 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); + 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 +93,10 @@ package android.app.usage { 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 +126,10 @@ package android.content.pm { 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 +242,26 @@ package android.net { 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 +269,37 @@ package android.net { 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 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 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 +326,10 @@ package android.os { 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 +491,14 @@ package android.provider { } +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 +569,14 @@ package android.view { } +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 dc0a17622e2a53b18c675b82545fb495ef00f8b8..9a62752c79e1a86a86d650a7c92ea06000a10962 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -211,6 +211,8 @@ package android { 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"; @@ -218,7 +220,6 @@ package android { 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"; @@ -256,7 +257,6 @@ package android { 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"; @@ -432,6 +432,7 @@ package android { 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 @@ -476,12 +477,12 @@ package android { 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 @@ -1112,7 +1113,7 @@ package android { 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 @@ -1181,6 +1182,7 @@ package android { 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 @@ -1207,7 +1209,6 @@ package android { 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 @@ -1422,7 +1423,7 @@ package android { 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 @@ -1737,7 +1738,6 @@ package android { 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 @@ -1835,7 +1835,6 @@ package android { 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 @@ -2959,13 +2958,13 @@ package android.accessibilityservice { 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 CREATOR; @@ -2977,13 +2976,13 @@ package android.accessibilityservice { 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; @@ -3005,7 +3004,7 @@ package android.accessibilityservice { 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); } @@ -3024,14 +3023,12 @@ package android.accessibilityservice { 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(); } } @@ -3164,8 +3161,8 @@ package android.accounts { 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,7 +3712,6 @@ package android.app { 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 deprecated void enterPictureInPictureMode(); - method public deprecated boolean enterPictureInPictureMode(android.app.PictureInPictureArgs); method public boolean enterPictureInPictureMode(android.app.PictureInPictureParams); method public T findViewById(int); method public void finish(); @@ -3815,7 +3811,6 @@ package android.app { method public void onLowMemory(); method public boolean onMenuItemSelected(int, android.view.MenuItem); method public boolean onMenuOpened(int, android.view.Menu); - method public void onMovedToDisplay(int, android.content.res.Configuration); method public void onMultiWindowModeChanged(boolean, android.content.res.Configuration); method public deprecated void onMultiWindowModeChanged(boolean); method public boolean onNavigateUp(); @@ -3894,7 +3889,6 @@ package android.app { 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); @@ -3981,7 +3975,6 @@ package android.app { method public int getLauncherLargeIconDensity(); method public int getLauncherLargeIconSize(); method public int getLockTaskModeState(); - method public static deprecated int getMaxNumPictureInPictureActions(); method public int getMemoryClass(); method public void getMemoryInfo(android.app.ActivityManager.MemoryInfo); method public static void getMyMemoryState(android.app.ActivityManager.RunningAppProcessInfo); @@ -4093,7 +4086,7 @@ package android.app { field public static final int IMPORTANCE_FOREGROUND_SERVICE = 125; // 0x7d field public static final int IMPORTANCE_GONE = 1000; // 0x3e8 field public static final int IMPORTANCE_PERCEPTIBLE = 230; // 0xe6 - field public static final deprecated int IMPORTANCE_PERCEPTIBLE_DEPRECATED = 130; // 0x82 + field public static final int IMPORTANCE_PERCEPTIBLE_PRE_26 = 130; // 0x82 field public static final int IMPORTANCE_SERVICE = 300; // 0x12c field public static final int IMPORTANCE_TOP_SLEEPING = 150; // 0x96 field public static final int IMPORTANCE_VISIBLE = 200; // 0xc8 @@ -4180,6 +4173,7 @@ package android.app { 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(); @@ -4871,7 +4865,6 @@ package android.app { 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 onFindViewById(int); method public abstract boolean onHasView(); } @@ -4986,6 +4979,7 @@ package android.app { method public void onFragmentDetached(android.app.FragmentManager, android.app.Fragment); method public void onFragmentPaused(android.app.FragmentManager, android.app.Fragment); method public void onFragmentPreAttached(android.app.FragmentManager, android.app.Fragment, android.content.Context); + method public void onFragmentPreCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle); method public void onFragmentResumed(android.app.FragmentManager, android.app.Fragment); method public void onFragmentSaveInstanceState(android.app.FragmentManager, android.app.Fragment, android.os.Bundle); method public void onFragmentStarted(android.app.FragmentManager, android.app.Fragment); @@ -5018,11 +5012,10 @@ package android.app { method public abstract android.app.FragmentTransaction hide(android.app.Fragment); method public abstract boolean isAddToBackStackAllowed(); method public abstract boolean isEmpty(); - method public abstract android.app.FragmentTransaction postOnCommit(java.lang.Runnable); method public abstract android.app.FragmentTransaction remove(android.app.Fragment); method public abstract android.app.FragmentTransaction replace(int, android.app.Fragment); method public abstract android.app.FragmentTransaction replace(int, android.app.Fragment, java.lang.String); - method public abstract android.app.FragmentTransaction setAllowOptimization(boolean); + method public abstract android.app.FragmentTransaction runOnCommit(java.lang.Runnable); method public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(int); method public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence); method public abstract android.app.FragmentTransaction setBreadCrumbTitle(int); @@ -5030,6 +5023,7 @@ package android.app { method public abstract android.app.FragmentTransaction setCustomAnimations(int, int); method public abstract android.app.FragmentTransaction setCustomAnimations(int, int, int, int); method public abstract android.app.FragmentTransaction setPrimaryNavigationFragment(android.app.Fragment); + method public abstract android.app.FragmentTransaction setReorderingAllowed(boolean); method public abstract android.app.FragmentTransaction setTransition(int); method public abstract android.app.FragmentTransaction setTransitionStyle(int); method public abstract android.app.FragmentTransaction show(android.app.Fragment); @@ -5135,7 +5129,7 @@ package android.app { method public final android.app.Activity getLastActivity(); method public final android.app.Instrumentation.ActivityResult getResult(); method public final boolean isBlocking(); - method public android.app.Instrumentation.ActivityResult onMatchIntent(android.content.Intent); + method public android.app.Instrumentation.ActivityResult onStartActivity(android.content.Intent); method public final android.app.Activity waitForActivity(); method public final android.app.Activity waitForActivityWithTimeout(long); } @@ -5155,7 +5149,6 @@ package android.app { 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(); @@ -5163,6 +5156,7 @@ package android.app { 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 { @@ -5303,7 +5297,6 @@ package android.app { 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(); @@ -5313,7 +5306,6 @@ package android.app { 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; @@ -5519,7 +5511,6 @@ package android.app { 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); @@ -5564,7 +5555,6 @@ package android.app { 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[]); @@ -5669,7 +5659,6 @@ package android.app { 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(); @@ -5904,21 +5893,10 @@ package android.app { method public abstract void onSendFinished(android.app.PendingIntent, android.content.Intent, int, java.lang.String, android.os.Bundle); } - public final deprecated class PictureInPictureArgs extends android.app.PictureInPictureParams { - ctor public deprecated PictureInPictureArgs(); - ctor public deprecated PictureInPictureArgs(float, java.util.List); - method public deprecated void setActions(java.util.List); - method public deprecated void setAspectRatio(float); - method public deprecated void setSourceRectHint(android.graphics.Rect); - } - - public class PictureInPictureParams implements android.os.Parcelable { + public final class PictureInPictureParams implements android.os.Parcelable { method public int describeContents(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; - field protected android.util.Rational mAspectRatio; - field protected android.graphics.Rect mSourceRectHint; - field protected java.util.List mUserActions; } public static class PictureInPictureParams.Builder { @@ -6419,7 +6397,7 @@ package android.app { 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 CREATOR; @@ -6521,7 +6499,7 @@ package android.app.admin { method public int enableSystemApp(android.content.ComponentName, android.content.Intent); method public java.lang.String[] getAccountTypesWithManagementDisabled(); method public java.util.List getActiveAdmins(); - method public java.util.List getAffiliationIds(android.content.ComponentName); + method public java.util.Set 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); @@ -6626,7 +6604,7 @@ package android.app.admin { method public java.util.List 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); + method public void setAffiliationIds(android.content.ComponentName, java.util.Set); 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); @@ -6704,6 +6682,7 @@ package android.app.admin { field public static final java.lang.String ACTION_SET_NEW_PASSWORD = "android.app.action.SET_NEW_PASSWORD"; field public static final java.lang.String ACTION_SET_PROFILE_OWNER = "android.app.action.SET_PROFILE_OWNER"; field public static final java.lang.String ACTION_START_ENCRYPTION = "android.app.action.START_ENCRYPTION"; + field public static final java.lang.String ACTION_STATE_USER_SETUP_COMPLETE = "android.app.action.STATE_USER_SETUP_COMPLETE"; field public static final java.lang.String ACTION_SYSTEM_UPDATE_POLICY_CHANGED = "android.app.action.SYSTEM_UPDATE_POLICY_CHANGED"; field public static final java.lang.String DELEGATION_APP_RESTRICTIONS = "delegation-app-restrictions"; field public static final java.lang.String DELEGATION_BLOCK_UNINSTALL = "delegation-block-uninstall"; @@ -6755,7 +6734,7 @@ package android.app.admin { 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 @@ -6798,8 +6777,8 @@ package android.app.admin { 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 getInetAddresses(); + method public int getTotalResolvedAddressCount(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; } @@ -6970,7 +6949,6 @@ package android.app.backup { 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(); @@ -7007,6 +6985,8 @@ package android.app.backup { 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; } @@ -7183,6 +7163,7 @@ package android.app.backup { } public class FullBackupDataOutput { + method public long getQuota(); } public class RestoreDescription implements android.os.Parcelable { @@ -7478,8 +7459,8 @@ package android.app.usage { 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 CREATOR; @@ -8521,7 +8502,7 @@ package android.bluetooth.le { 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); } @@ -8709,8 +8690,10 @@ package android.bluetooth.le { field public static final android.os.Parcelable.Creator 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 { @@ -8790,21 +8773,21 @@ package android.companion { 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 CREATOR; + field public static final android.os.Parcelable.Creator 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 { @@ -8940,7 +8923,7 @@ package android.content { 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); @@ -9870,15 +9853,12 @@ package android.content { 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"; @@ -9895,6 +9875,7 @@ package android.content { 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"; @@ -10061,6 +10042,7 @@ package android.content { 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"; @@ -10129,7 +10111,6 @@ package android.content { 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"; @@ -10995,7 +10976,7 @@ package android.content.pm { 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 { @@ -11358,6 +11339,7 @@ package android.content.pm { method public abstract java.util.List queryIntentContentProviders(android.content.Intent, int); method public abstract java.util.List queryIntentServices(android.content.Intent, int); method public abstract java.util.List queryPermissionsByGroup(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; + method public abstract void registerDexModule(java.lang.String, android.content.pm.PackageManager.DexModuleRegisterCallback); method public abstract void removeOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener); method public abstract deprecated void removePackageFromPreferred(java.lang.String); method public abstract void removePermission(java.lang.String); @@ -11578,6 +11560,11 @@ package android.content.pm { field public static final int VERSION_CODE_HIGHEST = -1; // 0xffffffff } + public static abstract class PackageManager.DexModuleRegisterCallback { + ctor public PackageManager.DexModuleRegisterCallback(); + method public abstract void onDexModuleRegistered(java.lang.String, boolean, java.lang.String); + } + public static class PackageManager.NameNotFoundException extends android.util.AndroidException { ctor public PackageManager.NameNotFoundException(); ctor public PackageManager.NameNotFoundException(java.lang.String); @@ -11694,8 +11681,8 @@ package android.content.pm { 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; @@ -11732,7 +11719,7 @@ package android.content.pm { method public java.util.List 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 CREATOR; field public static final int TYPE_BUILTIN = 0; // 0x0 @@ -11820,7 +11807,7 @@ package android.content.pm { 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 CREATOR; } @@ -14080,7 +14067,7 @@ package android.graphics { 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); @@ -14556,6 +14543,7 @@ package android.graphics { 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); @@ -14606,7 +14594,7 @@ package android.graphics { 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); @@ -14632,6 +14620,7 @@ package android.graphics { 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(); @@ -15190,17 +15179,13 @@ package android.graphics.drawable.shapes { 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 { @@ -15288,7 +15273,7 @@ package android.hardware { 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 @@ -15549,18 +15534,16 @@ package android.hardware { 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 { @@ -22833,6 +22816,7 @@ package android.media { 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); } @@ -27289,6 +27273,7 @@ package android.metrics { method public java.lang.Object getTaggedData(int); method public long getTimestamp(); method public int getType(); + method public int getUid(); method public boolean isLongCounterBucket(); method public boolean isSubsetOf(android.metrics.LogMaker); method public boolean isValidValue(java.lang.Object); @@ -27595,8 +27580,8 @@ package android.net { 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); @@ -27798,17 +27783,6 @@ package android.net { field public static final android.os.Parcelable.Creator 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(); @@ -27903,17 +27877,9 @@ package android.net { } 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 { @@ -27979,41 +27945,6 @@ package android.net { field public static final android.os.Parcelable.Creator 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 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 CREATOR; - } - public final class RouteInfo implements android.os.Parcelable { method public int describeContents(); method public android.net.IpPrefix getDestination(); @@ -29148,6 +29079,7 @@ package android.net.wifi { 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); @@ -29225,6 +29157,22 @@ package android.net.wifi { 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(); @@ -29529,33 +29477,9 @@ package android.net.wifi.hotspot2 { 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 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); - 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 CREATOR; } @@ -29578,21 +29502,15 @@ package android.net.wifi.hotspot2.pps { 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); @@ -29628,19 +29546,13 @@ package android.net.wifi.hotspot2.pps { 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 CREATOR; @@ -29652,96 +29564,14 @@ package android.net.wifi.hotspot2.pps { method public int describeContents(); method public java.lang.String getFqdn(); method public java.lang.String getFriendlyName(); - method public java.util.Map 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); - 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 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 getPreferredRoamingPartnerList(); - method public java.util.Map 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); - method public void setRequiredProtoPortMap(java.util.Map); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator 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 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 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 { @@ -33455,7 +33285,6 @@ package android.os { method public android.util.SizeF getSizeF(java.lang.String); method public android.util.SparseArray getSparseParcelableArray(java.lang.String); method public java.util.ArrayList 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); @@ -33480,7 +33309,6 @@ package android.os { method public void putSizeF(java.lang.String, android.util.SizeF); method public void putSparseParcelableArray(java.lang.String, android.util.SparseArray); method public void putStringArrayList(java.lang.String, java.util.ArrayList); - 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); @@ -34042,7 +33870,6 @@ package android.os { method public final void readTypedArray(T[], android.os.Parcelable.Creator); method public final void readTypedList(java.util.List, android.os.Parcelable.Creator); method public final T readTypedObject(android.os.Parcelable.Creator); - 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); @@ -34088,7 +33915,6 @@ package android.os { method public final void writeTypedArray(T[], int); method public final void writeTypedList(java.util.List); method public final 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 STRING_CREATOR; } @@ -34448,7 +34274,7 @@ package android.os { 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(); @@ -34826,8 +34652,11 @@ package android.os.storage { } 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; @@ -34841,7 +34670,6 @@ package android.os.storage { 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; @@ -37023,7 +36851,6 @@ package android.provider { field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_CHAT_ID = "android.provider.extra.RECIPIENT_CONTACT_CHAT_ID"; field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_NAME = "android.provider.extra.RECIPIENT_CONTACT_NAME"; field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_URI = "android.provider.extra.RECIPIENT_CONTACT_URI"; - field public static final java.lang.String EXTRA_SENDER_ACCOUNT_HASH = "android.provider.extra.SENDER_ACCOUNT_HASH"; field public static final java.lang.String INVITE_CONTACT = "com.android.contacts.action.INVITE_CONTACT"; field public static final java.lang.String METADATA_ACCOUNT_TYPE = "android.provider.account_type"; field public static final java.lang.String METADATA_MIMETYPE = "android.provider.mimetype"; @@ -37432,7 +37259,6 @@ package android.provider { } 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); @@ -40156,7 +39982,7 @@ package android.service.autofill { public final class FillRequest implements android.os.Parcelable { method public int describeContents(); method public android.os.Bundle getClientState(); - method public java.util.ArrayList getFillContexts(); + method public java.util.List getFillContexts(); method public int getFlags(); method public int getId(); method public void writeToParcel(android.os.Parcel, int); @@ -40699,7 +40525,6 @@ package android.service.quicksettings { 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"; } @@ -41284,7 +41109,6 @@ package android.speech.tts { 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 { @@ -43586,8 +43410,11 @@ package android.telephony { 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 } @@ -44577,6 +44404,7 @@ package android.test.mock { method public java.util.List queryIntentContentProviders(android.content.Intent, int); method public java.util.List queryIntentServices(android.content.Intent, int); method public java.util.List queryPermissionsByGroup(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; + method public void registerDexModule(java.lang.String, android.content.pm.PackageManager.DexModuleRegisterCallback); method public void removeOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener); method public void removePackageFromPreferred(java.lang.String); method public void removePermission(java.lang.String); @@ -46765,6 +46593,7 @@ package android.util { method public int getTag(); method public int getThreadId(); method public long getTimeNanos(); + method public int getUid(); } public deprecated class EventLogTags { @@ -49198,7 +49027,6 @@ package android.view { 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); @@ -49418,6 +49246,7 @@ package android.view { 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 ALPHA; + field public static final int AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 1; // 0x1 field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE = "creditCardExpirationDate"; field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY = "creditCardExpirationDay"; field public static final java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH = "creditCardExpirationMonth"; @@ -50129,7 +49958,7 @@ package android.view { public static abstract class ViewStructure.HtmlInfo { ctor public ViewStructure.HtmlInfo(); - method public abstract java.util.ArrayList> getAttributes(); + method public abstract java.util.List> getAttributes(); method public abstract java.lang.String getTag(); } @@ -50698,6 +50527,7 @@ package android.view.accessibility { method public java.util.List getEnabledAccessibilityServiceList(int); method public java.util.List getInstalledAccessibilityServiceList(); method public void interrupt(); + method public static boolean isAccessibilityButtonSupported(); method public boolean isEnabled(); method public boolean isTouchExplorationEnabled(); method public void removeAccessibilityRequestPreparer(android.view.accessibility.AccessibilityRequestPreparer); @@ -50846,8 +50676,8 @@ package android.view.accessibility { 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"; @@ -51036,10 +50866,10 @@ package android.view.accessibility { 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(); @@ -51381,7 +51211,7 @@ package android.view.autofill { 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(); @@ -51397,7 +51227,7 @@ package android.view.autofill { 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 { @@ -51831,12 +51661,7 @@ package android.view.inputmethod { 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(); @@ -51847,19 +51672,24 @@ package android.view.textclassifier { 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"; @@ -52631,7 +52461,6 @@ package android.webkit { 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(); @@ -52679,7 +52508,6 @@ package android.webkit { 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); @@ -55410,7 +55238,7 @@ package android.widget { 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); @@ -56095,15 +55923,15 @@ package dalvik.system { 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 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 039cd74e982d9198877736ceb4a80e3394758d5f..60865a3892dacfc3116d77cb7e0dd736c4f1d45f 100644 --- a/api/system-removed.txt +++ b/api/system-removed.txt @@ -1,9 +1,59 @@ 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 { + 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 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 setSourceRectHintInsets(android.graphics.Rect); + method public void truncateActions(int); + field public static final android.os.Parcelable.Creator 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); + 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 +65,18 @@ package android.app.admin { 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); + 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 +91,10 @@ package android.app.usage { 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 +124,10 @@ package android.content.pm { 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 +240,26 @@ package android.net { 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 +267,37 @@ package android.net { 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 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 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 +320,10 @@ package android.os { 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 +485,14 @@ package android.provider { } +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 +563,14 @@ package android.view { } +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 0e96329d92017e6d465339a1fe3e3876080e402e..6ea9b11aa41dd48ac9bf1ff2a45c537ad1506c77 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -15,7 +15,6 @@ package android { 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"; @@ -116,12 +115,12 @@ package android { 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"; @@ -140,7 +139,6 @@ package android { 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"; @@ -313,6 +311,7 @@ package android { 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 @@ -357,12 +356,12 @@ package android { 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 @@ -993,7 +992,7 @@ package android { 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 @@ -1062,6 +1061,7 @@ package android { 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 @@ -1086,7 +1086,6 @@ package android { 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 @@ -1297,7 +1296,7 @@ package android { 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 @@ -1612,7 +1611,6 @@ package android { 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 @@ -1710,7 +1708,6 @@ package android { 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 @@ -2831,13 +2828,13 @@ package android.accessibilityservice { 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 CREATOR; @@ -2849,13 +2846,13 @@ package android.accessibilityservice { 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; @@ -2877,7 +2874,7 @@ package android.accessibilityservice { 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); } @@ -2896,14 +2893,12 @@ package android.accessibilityservice { 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(); } } @@ -3035,8 +3030,8 @@ package android.accounts { 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,7 +3581,6 @@ package android.app { 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 deprecated void enterPictureInPictureMode(); - method public deprecated boolean enterPictureInPictureMode(android.app.PictureInPictureArgs); method public boolean enterPictureInPictureMode(android.app.PictureInPictureParams); method public T findViewById(int); method public void finish(); @@ -3684,7 +3678,6 @@ package android.app { method public void onLowMemory(); method public boolean onMenuItemSelected(int, android.view.MenuItem); method public boolean onMenuOpened(int, android.view.Menu); - method public void onMovedToDisplay(int, android.content.res.Configuration); method public void onMultiWindowModeChanged(boolean, android.content.res.Configuration); method public deprecated void onMultiWindowModeChanged(boolean); method public boolean onNavigateUp(); @@ -3762,7 +3755,6 @@ package android.app { 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); @@ -3843,7 +3835,6 @@ package android.app { method public int getLauncherLargeIconDensity(); method public int getLauncherLargeIconSize(); method public int getLockTaskModeState(); - method public static deprecated int getMaxNumPictureInPictureActions(); method public int getMemoryClass(); method public void getMemoryInfo(android.app.ActivityManager.MemoryInfo); method public static void getMyMemoryState(android.app.ActivityManager.RunningAppProcessInfo); @@ -3954,7 +3945,7 @@ package android.app { field public static final int IMPORTANCE_FOREGROUND_SERVICE = 125; // 0x7d field public static final int IMPORTANCE_GONE = 1000; // 0x3e8 field public static final int IMPORTANCE_PERCEPTIBLE = 230; // 0xe6 - field public static final deprecated int IMPORTANCE_PERCEPTIBLE_DEPRECATED = 130; // 0x82 + field public static final int IMPORTANCE_PERCEPTIBLE_PRE_26 = 130; // 0x82 field public static final int IMPORTANCE_SERVICE = 300; // 0x12c field public static final int IMPORTANCE_TOP_SLEEPING = 150; // 0x96 field public static final int IMPORTANCE_VISIBLE = 200; // 0xc8 @@ -4041,6 +4032,7 @@ package android.app { 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); @@ -4716,7 +4708,6 @@ package android.app { 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 onFindViewById(int); method public abstract boolean onHasView(); } @@ -4831,6 +4822,7 @@ package android.app { method public void onFragmentDetached(android.app.FragmentManager, android.app.Fragment); method public void onFragmentPaused(android.app.FragmentManager, android.app.Fragment); method public void onFragmentPreAttached(android.app.FragmentManager, android.app.Fragment, android.content.Context); + method public void onFragmentPreCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle); method public void onFragmentResumed(android.app.FragmentManager, android.app.Fragment); method public void onFragmentSaveInstanceState(android.app.FragmentManager, android.app.Fragment, android.os.Bundle); method public void onFragmentStarted(android.app.FragmentManager, android.app.Fragment); @@ -4863,11 +4855,10 @@ package android.app { method public abstract android.app.FragmentTransaction hide(android.app.Fragment); method public abstract boolean isAddToBackStackAllowed(); method public abstract boolean isEmpty(); - method public abstract android.app.FragmentTransaction postOnCommit(java.lang.Runnable); method public abstract android.app.FragmentTransaction remove(android.app.Fragment); method public abstract android.app.FragmentTransaction replace(int, android.app.Fragment); method public abstract android.app.FragmentTransaction replace(int, android.app.Fragment, java.lang.String); - method public abstract android.app.FragmentTransaction setAllowOptimization(boolean); + method public abstract android.app.FragmentTransaction runOnCommit(java.lang.Runnable); method public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(int); method public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence); method public abstract android.app.FragmentTransaction setBreadCrumbTitle(int); @@ -4875,6 +4866,7 @@ package android.app { method public abstract android.app.FragmentTransaction setCustomAnimations(int, int); method public abstract android.app.FragmentTransaction setCustomAnimations(int, int, int, int); method public abstract android.app.FragmentTransaction setPrimaryNavigationFragment(android.app.Fragment); + method public abstract android.app.FragmentTransaction setReorderingAllowed(boolean); method public abstract android.app.FragmentTransaction setTransition(int); method public abstract android.app.FragmentTransaction setTransitionStyle(int); method public abstract android.app.FragmentTransaction show(android.app.Fragment); @@ -4968,7 +4960,7 @@ package android.app { method public final android.app.Activity getLastActivity(); method public final android.app.Instrumentation.ActivityResult getResult(); method public final boolean isBlocking(); - method public android.app.Instrumentation.ActivityResult onMatchIntent(android.content.Intent); + method public android.app.Instrumentation.ActivityResult onStartActivity(android.content.Intent); method public final android.app.Activity waitForActivity(); method public final android.app.Activity waitForActivityWithTimeout(long); } @@ -4988,7 +4980,6 @@ package android.app { 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(); @@ -4996,6 +4987,7 @@ package android.app { 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 { @@ -5136,7 +5128,6 @@ package android.app { 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(); @@ -5145,7 +5136,6 @@ package android.app { 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; @@ -5348,7 +5338,6 @@ package android.app { 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); @@ -5393,7 +5382,6 @@ package android.app { 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[]); @@ -5713,21 +5701,10 @@ package android.app { method public abstract void onSendFinished(android.app.PendingIntent, android.content.Intent, int, java.lang.String, android.os.Bundle); } - public final deprecated class PictureInPictureArgs extends android.app.PictureInPictureParams { - ctor public deprecated PictureInPictureArgs(); - ctor public deprecated PictureInPictureArgs(float, java.util.List); - method public deprecated void setActions(java.util.List); - method public deprecated void setAspectRatio(float); - method public deprecated void setSourceRectHint(android.graphics.Rect); - } - - public class PictureInPictureParams implements android.os.Parcelable { + public final class PictureInPictureParams implements android.os.Parcelable { method public int describeContents(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; - field protected android.util.Rational mAspectRatio; - field protected android.graphics.Rect mSourceRectHint; - field protected java.util.List mUserActions; } public static class PictureInPictureParams.Builder { @@ -6225,7 +6202,7 @@ package android.app { 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 CREATOR; @@ -6327,7 +6304,7 @@ package android.app.admin { method public int enableSystemApp(android.content.ComponentName, android.content.Intent); method public java.lang.String[] getAccountTypesWithManagementDisabled(); method public java.util.List getActiveAdmins(); - method public java.util.List getAffiliationIds(android.content.ComponentName); + method public java.util.Set 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); @@ -6421,7 +6398,7 @@ package android.app.admin { method public java.util.List retrievePreRebootSecurityLogs(android.content.ComponentName); method public java.util.List 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); + method public void setAffiliationIds(android.content.ComponentName, java.util.Set); 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); @@ -6542,7 +6519,7 @@ package android.app.admin { 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 @@ -6580,8 +6557,8 @@ package android.app.admin { 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 getInetAddresses(); + method public int getTotalResolvedAddressCount(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; } @@ -6752,7 +6729,6 @@ package android.app.backup { 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(); @@ -6787,6 +6763,7 @@ package android.app.backup { } 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; } @@ -6815,6 +6792,7 @@ package android.app.backup { } public class FullBackupDataOutput { + method public long getQuota(); } public abstract class RestoreObserver { @@ -7040,8 +7018,8 @@ package android.app.usage { 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 CREATOR; @@ -8075,7 +8053,7 @@ package android.bluetooth.le { 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); } @@ -8250,8 +8228,10 @@ package android.bluetooth.le { field public static final android.os.Parcelable.Creator 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 { @@ -8322,21 +8302,21 @@ package android.companion { 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 CREATOR; + field public static final android.os.Parcelable.Creator 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 { @@ -8472,7 +8452,7 @@ package android.content { 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); @@ -9381,15 +9361,12 @@ package android.content { 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"; @@ -9547,6 +9524,7 @@ package android.content { 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"; @@ -9592,7 +9570,6 @@ package android.content { 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"; @@ -10372,7 +10349,7 @@ package android.content.pm { 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 { @@ -10972,8 +10949,8 @@ package android.content.pm { 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; @@ -11010,7 +10987,7 @@ package android.content.pm { method public java.util.List 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 CREATOR; field public static final int TYPE_BUILTIN = 0; // 0x0 @@ -11099,7 +11076,7 @@ package android.content.pm { 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 CREATOR; } @@ -13345,7 +13322,7 @@ package android.graphics { 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); @@ -13821,6 +13798,7 @@ package android.graphics { 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); @@ -13871,7 +13849,7 @@ package android.graphics { 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); @@ -13897,6 +13875,7 @@ package android.graphics { 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(); @@ -13910,6 +13889,7 @@ package android.graphics.drawable { 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 { @@ -14459,17 +14439,13 @@ package android.graphics.drawable.shapes { 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 { @@ -14557,7 +14533,7 @@ package android.hardware { 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 @@ -14818,18 +14794,16 @@ package android.hardware { 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 { @@ -21134,6 +21108,7 @@ package android.media { 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); } @@ -25523,8 +25498,8 @@ package android.net { 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); @@ -26679,6 +26654,7 @@ package android.net.wifi { 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); @@ -26729,6 +26705,22 @@ package android.net.wifi { 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(); @@ -26891,33 +26883,9 @@ package android.net.wifi.hotspot2 { 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 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); - 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 CREATOR; } @@ -26940,21 +26908,15 @@ package android.net.wifi.hotspot2.pps { 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); @@ -26990,19 +26952,13 @@ package android.net.wifi.hotspot2.pps { 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 CREATOR; @@ -27014,96 +26970,14 @@ package android.net.wifi.hotspot2.pps { method public int describeContents(); method public java.lang.String getFqdn(); method public java.lang.String getFriendlyName(); - method public java.util.Map 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); - 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 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 getPreferredRoamingPartnerList(); - method public java.util.Map 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); - method public void setRequiredProtoPortMap(java.util.Map); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator 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 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 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 { @@ -30803,7 +30677,6 @@ package android.os { method public android.util.SizeF getSizeF(java.lang.String); method public android.util.SparseArray getSparseParcelableArray(java.lang.String); method public java.util.ArrayList 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); @@ -30828,7 +30701,6 @@ package android.os { method public void putSizeF(java.lang.String, android.util.SizeF); method public void putSparseParcelableArray(java.lang.String, android.util.SparseArray); method public void putStringArrayList(java.lang.String, java.util.ArrayList); - 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); @@ -31379,7 +31251,6 @@ package android.os { method public final void readTypedArray(T[], android.os.Parcelable.Creator); method public final void readTypedList(java.util.List, android.os.Parcelable.Creator); method public final T readTypedObject(android.os.Parcelable.Creator); - 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); @@ -31425,7 +31296,6 @@ package android.os { method public final void writeTypedArray(T[], int); method public final void writeTypedList(java.util.List); method public final 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 STRING_CREATOR; } @@ -31757,7 +31627,7 @@ package android.os { 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(); @@ -32061,9 +31931,9 @@ package android.os.storage { } 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); @@ -32076,7 +31946,6 @@ package android.os.storage { 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; @@ -32084,7 +31953,6 @@ package android.os.storage { 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; } @@ -34199,7 +34067,6 @@ package android.provider { field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_CHAT_ID = "android.provider.extra.RECIPIENT_CONTACT_CHAT_ID"; field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_NAME = "android.provider.extra.RECIPIENT_CONTACT_NAME"; field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_URI = "android.provider.extra.RECIPIENT_CONTACT_URI"; - field public static final java.lang.String EXTRA_SENDER_ACCOUNT_HASH = "android.provider.extra.SENDER_ACCOUNT_HASH"; field public static final java.lang.String INVITE_CONTACT = "com.android.contacts.action.INVITE_CONTACT"; field public static final java.lang.String METADATA_ACCOUNT_TYPE = "android.provider.account_type"; field public static final java.lang.String METADATA_MIMETYPE = "android.provider.mimetype"; @@ -34578,7 +34445,6 @@ package android.provider { } 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); @@ -37195,7 +37061,7 @@ package android.service.autofill { public final class FillRequest implements android.os.Parcelable { method public int describeContents(); method public android.os.Bundle getClientState(); - method public java.util.ArrayList getFillContexts(); + method public java.util.List getFillContexts(); method public int getFlags(); method public int getId(); method public void writeToParcel(android.os.Parcel, int); @@ -37699,7 +37565,6 @@ package android.service.quicksettings { 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"; } @@ -38221,7 +38086,6 @@ package android.speech.tts { 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 { @@ -40319,8 +40183,11 @@ package android.telephony { 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 } @@ -45998,7 +45865,6 @@ package android.view { 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); @@ -46221,6 +46087,7 @@ package android.view { 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 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"; @@ -46936,7 +46803,7 @@ package android.view { public static abstract class ViewStructure.HtmlInfo { ctor public ViewStructure.HtmlInfo(); - method public abstract java.util.ArrayList> getAttributes(); + method public abstract java.util.List> getAttributes(); method public abstract java.lang.String getTag(); } @@ -47653,8 +47520,8 @@ package android.view.accessibility { 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"; @@ -47843,10 +47710,10 @@ package android.view.accessibility { 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(); @@ -48189,7 +48056,7 @@ package android.view.autofill { 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(); @@ -48205,7 +48072,7 @@ package android.view.autofill { 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 { @@ -48639,12 +48506,7 @@ package android.view.inputmethod { 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(); @@ -48655,19 +48517,24 @@ package android.view.textclassifier { 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"; @@ -49346,7 +49213,6 @@ package android.webkit { 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(); @@ -49393,7 +49259,6 @@ package android.webkit { 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); @@ -51860,7 +51725,7 @@ package android.widget { 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); @@ -52553,15 +52418,15 @@ package dalvik.system { 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 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 c132385f16310a0dee7637ca46f7878c95db8b6c..187349916286822b0f041044ae15d1e5ac56f0e6 100644 --- a/api/test-removed.txt +++ b/api/test-removed.txt @@ -1,9 +1,59 @@ 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 { + 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 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 setSourceRectHintInsets(android.graphics.Rect); + method public void truncateActions(int); + field public static final android.os.Parcelable.Creator 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); + 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 +67,18 @@ package android.app.admin { 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); + 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 +93,10 @@ package android.app.usage { 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 +126,10 @@ package android.content.pm { 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 +242,26 @@ package android.net { 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 +269,37 @@ package android.net { 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 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 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 +326,10 @@ package android.os { 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 +491,14 @@ package android.provider { } +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 +569,14 @@ package android.view { } +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 c3a5daba4cfcef40f0909a6152de76ea58758fe9..a70085cbde4f132d3c16e1cf35e3b896f09e670f 100644 --- a/core/java/android/accessibilityservice/AccessibilityButtonController.java +++ b/core/java/android/accessibilityservice/AccessibilityButtonController.java @@ -19,10 +19,13 @@ package android.accessibilityservice; 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 *

@@ -89,7 +92,7 @@ public final class AccessibilityButtonController { * @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 @@ public final class AccessibilityButtonController { * {@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 final class AccessibilityButtonController { */ public void unregisterAccessibilityButtonCallback( @NonNull AccessibilityButtonCallback callback) { + Preconditions.checkNotNull(callback); synchronized (mLock) { if (mCallbacks == null) { return; @@ -154,12 +159,7 @@ public final class AccessibilityButtonController { 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 @@ public final class AccessibilityButtonController { 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 64d7d4c1be977597d269ed9953a0ce9a7c275f07..af0a204fed13f51683cb5b8715e9730ab77de319 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -619,20 +619,10 @@ public abstract class AccessibilityService extends Service { * @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 3cda489c50050def519bed78c85ef88562e7bc0a..06a9b0676d0828ae26430d44015914dbe69cf5d5 100644 --- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java +++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java @@ -119,9 +119,9 @@ public class AccessibilityServiceInfo implements Parcelable { /** * 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 sAvailableCapabilityInfos; @@ -301,7 +301,7 @@ public class AccessibilityServiceInfo implements Parcelable { * 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 @@ public class AccessibilityServiceInfo implements Parcelable { 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 @@ public class AccessibilityServiceInfo implements Parcelable { * Statically set from * {@link AccessibilityService#SERVICE_META_DATA meta-data}. *

- * @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 @@ public class AccessibilityServiceInfo implements Parcelable { 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 @@ public class AccessibilityServiceInfo implements Parcelable { 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 @@ public class AccessibilityServiceInfo implements Parcelable { 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 e203c6de8fb5276bd6081f464dbe675dadeeb727..9f04cea885afd62ccc843ce79cdcf25b2b239b18 100644 --- a/core/java/android/accessibilityservice/FingerprintGestureController.java +++ b/core/java/android/accessibilityservice/FingerprintGestureController.java @@ -156,9 +156,9 @@ public final class FingerprintGestureController { 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 @@ public final class FingerprintGestureController { * @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 c9da1526a4fa641bfde1c29951f1c347b5925d32..92567d75885665b1db08b6e0fd8b3c7408f04404 100644 --- a/core/java/android/accessibilityservice/GestureDescription.java +++ b/core/java/android/accessibilityservice/GestureDescription.java @@ -24,6 +24,8 @@ import android.graphics.RectF; 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 @@ public final class GestureDescription { 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 @@ public final class GestureDescription { * 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 @@ public final class GestureDescription { 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 @@ public final class GestureDescription { * @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 @@ public final class GestureDescription { * 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 @@ public final class GestureDescription { * 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 @@ public final class GestureDescription { * 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 06b09c041f1fa5d9a9043e759c98027d940ff350..a5b37f391c16ed7572d3a47646b73e87480ce1a7 100644 --- a/core/java/android/accounts/AccountManager.java +++ b/core/java/android/accounts/AccountManager.java @@ -376,7 +376,7 @@ public class AccountManager { * {@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 @@ public class AccountManager { * {@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 cdeca13432d94a49e752ed8cb1ff8581aecc94c0..ca4b4d5e36ad2373b917d0c908dda3c501cdaff6 100644 --- a/core/java/android/animation/AnimatorSet.java +++ b/core/java/android/animation/AnimatorSet.java @@ -930,12 +930,14 @@ public final class AnimatorSet extends Animator implements AnimationHandler.Anim } /** - * 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. + *

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 e621c01748f92f40c4a3d74239e38088d4397021..4f6c0c9d8f9164a2c4e8290ada3c0ea56d8d20bc 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -2050,20 +2050,10 @@ public class Activity extends ContextThemeWrapper enterPictureInPictureMode(new PictureInPictureParams.Builder().build()); } - /** - * TO BE REMOVED - */ + /** @removed */ @Deprecated public boolean enterPictureInPictureMode(@NonNull PictureInPictureArgs args) { - try { - if (args == null) { - throw new IllegalArgumentException("Expected non-null picture-in-picture args"); - } - updatePictureInPictureParamsForContentInsets(args); - return ActivityManagerNative.getDefault().enterPictureInPictureMode(mToken, args); - } catch (RemoteException e) { - return false; - } + return enterPictureInPictureMode(PictureInPictureArgs.convert(args)); } /** @@ -2095,11 +2085,10 @@ public class Activity extends ContextThemeWrapper } } - /** - * TO BE REMOVED - */ + /** @removed */ + @Deprecated public void setPictureInPictureArgs(@NonNull PictureInPictureArgs args) { - setPictureInPictureParams(args); + setPictureInPictureParams(PictureInPictureArgs.convert(args)); } /** @@ -2172,6 +2161,7 @@ public class Activity extends ContextThemeWrapper * * @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 e079d25eab8849ff0b2c085b1ba8ba856961bc22..4c3e1b077091476a2de0e12a1a8f1cbba22b4595 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -458,42 +458,45 @@ public class ActivityManager { /** @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; @@ -503,7 +506,7 @@ public class ActivityManager { /** @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. */ @@ -1140,13 +1143,7 @@ public class ActivityManager { com.android.internal.R.bool.config_supportsSplitScreenMultiWindow); } - /** - * Return the number of actions that will be displayed in the picture-in-picture UI when the - * user interacts with the activity currently in picture-in-picture mode. This number may change - * if the global configuration changes (ie. if the device is plugged into an external display). - * - * TO BE REMOVED - */ + /** @removed */ @Deprecated public static int getMaxNumPictureInPictureActions() { return 3; @@ -3159,10 +3156,15 @@ public class ActivityManager { * 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. + *

The system will return this value instead of {@link #IMPORTANCE_PERCEPTIBLE} + * on Android versions below {@link Build.VERSION_CODES#O}. + * + *

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 @@ -3176,11 +3178,17 @@ public class ActivityManager { * 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. + *

The system will return this value instead of {@link #IMPORTANCE_CANT_SAVE_STATE} + * on Android versions below {@link Build.VERSION_CODES#O}. + * + *

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 @@ -3238,7 +3246,7 @@ public class ActivityManager { 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; @@ -3260,15 +3268,25 @@ public class ActivityManager { */ 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; @@ -3285,7 +3303,7 @@ public class ActivityManager { } 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 63e8cc641ce98a7fab50c7dc11c38c2c110b57f2..3eec596fcb174b5607f582fde72e4eabc7b36b91 100644 --- a/core/java/android/app/ActivityOptions.java +++ b/core/java/android/app/ActivityOptions.java @@ -211,6 +211,9 @@ public class ActivityOptions { 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 @@ public class ActivityOptions { 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 @@ public class ActivityOptions { 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 @@ public class ActivityOptions { 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 @@ public class ActivityOptions { 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 195ba247896ec2d933b10f9c07b587f297c65466..dd9db8a98202683d7ca8ebffd6c7a8bce0a36fe5 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -670,6 +670,7 @@ public final class ActivityThread { IBinder requestToken; int requestType; int sessionId; + int flags; } static final class ActivityConfigChangeData { @@ -1288,12 +1289,13 @@ public final class ActivityThread { @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 @@ public final class ActivityThread { 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 7d81c4c029de7fc833d6d9c016a462597e6eacf2..b7f1068faa3c6c026e41e5399dab6c5c46d888fd 100644 --- a/core/java/android/app/AlertDialog.java +++ b/core/java/android/app/AlertDialog.java @@ -215,7 +215,8 @@ public class AlertDialog extends Dialog implements DialogInterface { 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/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index e50c307df8545504900345f95f9718720e25307b..f6aea96bf7e280108b1804277a3f42aa0cff4102 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -78,6 +78,10 @@ import android.os.UserManager; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; import android.provider.Settings; +import android.system.ErrnoException; +import android.system.Os; +import android.system.OsConstants; +import android.system.StructStat; import android.util.ArrayMap; import android.util.IconDrawableFactory; import android.util.LauncherIcons; @@ -2662,4 +2666,78 @@ public class ApplicationPackageManager extends PackageManager { throw e.rethrowAsRuntimeException(); } } + + private static class DexModuleRegisterResult { + final String dexModulePath; + final boolean success; + final String message; + + private DexModuleRegisterResult(String dexModulePath, boolean success, String message) { + this.dexModulePath = dexModulePath; + this.success = success; + this.message = message; + } + } + + private static class DexModuleRegisterCallbackDelegate + extends android.content.pm.IDexModuleRegisterCallback.Stub + implements Handler.Callback { + private static final int MSG_DEX_MODULE_REGISTERED = 1; + private final DexModuleRegisterCallback callback; + private final Handler mHandler; + + DexModuleRegisterCallbackDelegate(@NonNull DexModuleRegisterCallback callback) { + this.callback = callback; + mHandler = new Handler(Looper.getMainLooper(), this); + } + + @Override + public void onDexModuleRegistered(@NonNull String dexModulePath, boolean success, + @Nullable String message)throws RemoteException { + mHandler.obtainMessage(MSG_DEX_MODULE_REGISTERED, + new DexModuleRegisterResult(dexModulePath, success, message)).sendToTarget(); + } + + @Override + public boolean handleMessage(Message msg) { + if (msg.what != MSG_DEX_MODULE_REGISTERED) { + return false; + } + DexModuleRegisterResult result = (DexModuleRegisterResult)msg.obj; + callback.onDexModuleRegistered(result.dexModulePath, result.success, result.message); + return true; + } + } + + @Override + public void registerDexModule(@NonNull String dexModule, + @Nullable DexModuleRegisterCallback callback) { + // Check if this is a shared module by looking if the others can read it. + boolean isSharedModule = false; + try { + StructStat stat = Os.stat(dexModule); + if ((OsConstants.S_IROTH & stat.st_mode) != 0) { + isSharedModule = true; + } + } catch (ErrnoException e) { + callback.onDexModuleRegistered(dexModule, false, + "Could not get stat the module file: " + e.getMessage()); + return; + } + + // Module path is ok. + // Create the callback delegate to be passed to package manager service. + DexModuleRegisterCallbackDelegate callbackDelegate = null; + if (callback != null) { + callbackDelegate = new DexModuleRegisterCallbackDelegate(callback); + } + + // Invoke the package manager service. + try { + mPM.registerDexModule(mContext.getPackageName(), dexModule, + isSharedModule, callbackDelegate); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } } diff --git a/core/java/android/app/BackStackRecord.java b/core/java/android/app/BackStackRecord.java index cf274b4127ef4bf618281a823d843c8d949f34d0..46e6defbb41aece59bf4eecde172cb6fa04a6d7f 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 class BackStackState implements Parcelable { final CharSequence mBreadCrumbShortTitleText; final ArrayList mSharedElementSourceNames; final ArrayList mSharedElementTargetNames; - final boolean mAllowOptimization; + final boolean mReorderingAllowed; public BackStackState(FragmentManagerImpl fm, BackStackRecord bse) { final int numOps = bse.mOps.size(); @@ -75,7 +73,7 @@ final class BackStackState implements Parcelable { mBreadCrumbShortTitleText = bse.mBreadCrumbShortTitleText; mSharedElementSourceNames = bse.mSharedElementSourceNames; mSharedElementTargetNames = bse.mSharedElementTargetNames; - mAllowOptimization = bse.mAllowOptimization; + mReorderingAllowed = bse.mReorderingAllowed; } public BackStackState(Parcel in) { @@ -90,7 +88,7 @@ final class BackStackState implements Parcelable { 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 @@ final class BackStackState implements Parcelable { bse.mBreadCrumbShortTitleText = mBreadCrumbShortTitleText; bse.mSharedElementSourceNames = mSharedElementSourceNames; bse.mSharedElementTargetNames = mSharedElementTargetNames; - bse.mAllowOptimization = mAllowOptimization; + bse.mReorderingAllowed = mReorderingAllowed; bse.bumpBackStackNesting(1); return bse; } @@ -154,7 +152,7 @@ final class BackStackState implements Parcelable { 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 CREATOR @@ -218,7 +216,7 @@ final class BackStackRecord extends FragmentTransaction implements String mName; boolean mCommitted; int mIndex = -1; - boolean mAllowOptimization; + boolean mReorderingAllowed; ArrayList mCommitRunnables; @@ -370,7 +368,7 @@ final class BackStackRecord extends FragmentTransaction implements 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 @@ final class BackStackRecord extends FragmentTransaction implements } @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 @@ final class BackStackRecord extends FragmentTransaction implements } @Override - public FragmentTransaction setAllowOptimization(boolean allowOptimization) { - mAllowOptimization = allowOptimization; + public FragmentTransaction setReorderingAllowed(boolean reorderingAllowed) { + mReorderingAllowed = reorderingAllowed; return this; } @@ -800,11 +798,11 @@ final class BackStackRecord extends FragmentTransaction implements 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 @@ final class BackStackRecord extends FragmentTransaction implements 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 28a5709d8a0aa648f7b222e10555c9e81ea8f802..66dc6a193af1bb2bbb4a9c59de6479fa27308b6a 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -2309,7 +2309,7 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene * 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 77c9c312ce24769734d163db86cc9c5052003285..f8836bc829a0fd5a582b1608a212b5404a50851f 100644 --- a/core/java/android/app/FragmentContainer.java +++ b/core/java/android/app/FragmentContainer.java @@ -42,6 +42,8 @@ public abstract class FragmentContainer { * 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 9e8809aed58344e71e36ec87f07e9694e0e71965..63c0ef33ff366136085ef8df394dc0d9c49acc0b 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -54,7 +54,6 @@ import java.io.FileDescriptor; 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; @@ -452,6 +451,18 @@ public abstract class FragmentManager { */ 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 @@ -682,7 +693,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate String mNoTransactionsBecause; boolean mHavePendingDeferredStart; - // Temporary vars for optimizing execution of BackStackRecords: + // Temporary vars for removing redundant operations in BackStackRecords: ArrayList mTmpRecords; ArrayList mTmpIsPop; ArrayList mTmpAddedFragments; @@ -853,7 +864,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate if (executePop) { mExecutingActions = true; try { - optimizeAndExecuteOps(mTmpRecords, mTmpIsPop); + removeRedundantOperationsAndExecute(mTmpRecords, mTmpIsPop); } finally { cleanupExec(); } @@ -1219,6 +1230,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate 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 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate if (action.generateOps(mTmpRecords, mTmpIsPop)) { mExecutingActions = true; try { - optimizeAndExecuteOps(mTmpRecords, mTmpIsPop); + removeRedundantOperationsAndExecute(mTmpRecords, mTmpIsPop); } finally { cleanupExec(); } @@ -2032,7 +2044,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate while (generateOpsForPendingActions(mTmpRecords, mTmpIsPop)) { mExecutingActions = true; try { - optimizeAndExecuteOps(mTmpRecords, mTmpIsPop); + removeRedundantOperationsAndExecute(mTmpRecords, mTmpIsPop); } finally { cleanupExec(); } @@ -2080,19 +2092,20 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } /** - * 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)}. *

* 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. *

* 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 records, + private void removeRedundantOperationsAndExecute(ArrayList records, ArrayList isRecordPop) { if (records == null || records.isEmpty()) { return; @@ -2108,24 +2121,25 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate 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 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } /** - * 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 records to be optimized - * @param endIndex One more than the final record index in records to optimize. + * @param startIndex The index of the first record in records to be executed + * @param endIndex One more than the final record index in records to executed. */ private void executeOpsTogether(ArrayList records, ArrayList 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 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } 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 addedFragments = new ArraySet<>(); addAddedFragments(addedFragments); postponeIndex = postponePostponableTransactions(records, isRecordPop, @@ -2181,7 +2195,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate 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 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } } + 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 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 c938aa607e105bbdccc6a3f3c54a98040927d6ca..c910e9035a3f145e16b18e7738c1b4b0c80b38b9 100644 --- a/core/java/android/app/FragmentTransaction.java +++ b/core/java/android/app/FragmentTransaction.java @@ -6,6 +6,7 @@ import android.annotation.IntDef; 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 @@ public abstract class FragmentTransaction { /** * 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. *

- * 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. *

+ * 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. + *

* 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. * - *

postOnCommit may not be used with transactions + * + *

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.

+ * + *

runOnCommit may not be used with transactions * {@link #addToBackStack(String) added to the back stack} as Runnables cannot be persisted - * with back stack state.

+ * 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 runOnCommit.

* * @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 b4c6dce91a48a7ec8f9dcdde3dac94da8c4d5046..ceb828b64addc9a2ddd03b28e6a95a0d05633757 100644 --- a/core/java/android/app/FragmentTransition.java +++ b/core/java/android/app/FragmentTransition.java @@ -34,9 +34,10 @@ import java.util.List; 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 @@ class FragmentTransition { * {@link Fragment#getSharedElementReturnTransition()} and the entering * {@link Fragment#getReenterTransition()} will be run. *

- * 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 @@ class FragmentTransition { * 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 records, ArrayList isRecordPop, - int startIndex, int endIndex, boolean isOptimized) { + int startIndex, int endIndex, boolean isReordered) { if (fragmentManager.mCurState < Fragment.CREATED) { return; } @@ -95,9 +96,9 @@ class FragmentTransition { 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 @@ class FragmentTransition { 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 @@ class FragmentTransition { /** * 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 @@ class FragmentTransition { * 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 nameOverrides) { ViewGroup sceneRoot = null; @@ -208,7 +209,7 @@ class FragmentTransition { 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 @@ class FragmentTransition { /** * 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 @@ class FragmentTransition { * 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 nameOverrides) { ViewGroup sceneRoot = null; @@ -281,7 +282,7 @@ class FragmentTransition { ArrayList sharedElementsOut = new ArrayList<>(); ArrayList sharedElementsIn = new ArrayList<>(); - TransitionSet sharedElementTransition = configureSharedElementsUnoptimized(sceneRoot, + TransitionSet sharedElementTransition = configureSharedElementsOrdered(sceneRoot, nonExistentView, nameOverrides, fragments, sharedElementsOut, sharedElementsIn, enterTransition, exitTransition); @@ -345,7 +346,7 @@ class FragmentTransition { } /** - * 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 @@ class FragmentTransition { } /** - * 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. *

@@ -474,7 +475,7 @@ class FragmentTransition { * 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 nameOverrides, final FragmentContainerTransition fragments, final ArrayList sharedElementsOut, @@ -576,7 +577,7 @@ class FragmentTransition { } /** - * 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 @@ class FragmentTransition { * 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 nameOverrides, final FragmentContainerTransition fragments, final ArrayList sharedElementsOut, @@ -1195,11 +1196,11 @@ class FragmentTransition { */ public static void calculateFragments(BackStackRecord transaction, SparseArray 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 @@ class FragmentTransition { * this method. */ public static void calculatePopFragments(BackStackRecord transaction, - SparseArray transitioningFragments, boolean isOptimized) { + SparseArray 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 @@ class FragmentTransition { * @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 transitioningFragments, boolean isPop, - boolean isOptimizedTransaction) { + boolean isReorderedTransaction) { final Fragment fragment = op.fragment; if (fragment == null) { return; // no fragment, no transition @@ -1255,7 +1256,7 @@ class FragmentTransition { 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 @@ class FragmentTransition { 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 @@ class FragmentTransition { wasAdded = true; break; case BackStackRecord.OP_HIDE: - if (isOptimizedTransaction) { + if (isReorderedTransaction) { setFirstOut = fragment.mHiddenChanged && fragment.mAdded && fragment.mHidden; } else { @@ -1283,7 +1284,7 @@ class FragmentTransition { 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 @@ class FragmentTransition { 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 @@ class FragmentTransition { 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 @@ class FragmentTransition { 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 5ee8e0c258f74c6eea452f08978e165063467c9b..aeccf56292347d4f60e3559fae569983387306bb 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -594,7 +594,7 @@ interface IActivityManager { 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); @@ -605,7 +605,7 @@ interface IActivityManager { 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 1b3c00b6153977cc86d58d16e7c61e8bac6a0051..b3521c06ae9608451ec88c140f8ee9198d996b65 100644 --- a/core/java/android/app/IApplicationThread.aidl +++ b/core/java/android/app/IApplicationThread.aidl @@ -135,7 +135,7 @@ oneway interface IApplicationThread { 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/IWallpaperManager.aidl b/core/java/android/app/IWallpaperManager.aidl index 75a5bf7f77a2201df48b6999de45e0be22109173..411d0e208e54d099b6131315dca28744724ec085 100644 --- a/core/java/android/app/IWallpaperManager.aidl +++ b/core/java/android/app/IWallpaperManager.aidl @@ -22,6 +22,7 @@ import android.os.ParcelFileDescriptor; import android.app.IWallpaperManagerCallback; import android.app.WallpaperInfo; import android.content.ComponentName; +import android.app.WallpaperColors; /** @hide */ interface IWallpaperManager { @@ -135,4 +136,23 @@ interface IWallpaperManager { * wallpaper content has changed. */ boolean setLockWallpaperCallback(IWallpaperManagerCallback cb); + + /** + * Returns the colors used by the lock screen or system wallpaper. + * + * @param which either {@link WallpaperManager#FLAG_LOCK} + * or {@link WallpaperManager#FLAG_SYSTEM} + * @return colors of chosen wallpaper + */ + WallpaperColors getWallpaperColors(int which); + + /** + * Register a callback to receive color updates + */ + void registerWallpaperColorsCallback(IWallpaperManagerCallback cb); + + /** + * Unregister a callback that was receiving color updates + */ + void unregisterWallpaperColorsCallback(IWallpaperManagerCallback cb); } diff --git a/core/java/android/app/IWallpaperManagerCallback.aidl b/core/java/android/app/IWallpaperManagerCallback.aidl index 991b2bc924b5fa34fd0ab84d7449bd7062452693..0cfbaef6d6eb1685c4aaf4bc94eeb669ab2ddb93 100644 --- a/core/java/android/app/IWallpaperManagerCallback.aidl +++ b/core/java/android/app/IWallpaperManagerCallback.aidl @@ -16,6 +16,8 @@ package android.app; +import android.app.WallpaperColors; + /** * Callback interface used by IWallpaperManager to send asynchronous * notifications back to its clients. Note that this is a @@ -28,4 +30,10 @@ oneway interface IWallpaperManagerCallback { * Called when the wallpaper has changed */ void onWallpaperChanged(); + + /** + * Called when wallpaper colors change + */ + void onWallpaperColorsChanged(in WallpaperColors colors, int which); + } diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java index bb169c2516b83949dce9813d34fa3b37e6a9347d..5b2cf81f2c69ea276e49724770502d980750fffa 100644 --- a/core/java/android/app/Instrumentation.java +++ b/core/java/android/app/Instrumentation.java @@ -543,10 +543,10 @@ public class Instrumentation { * Create a new ActivityMonitor that can be used for intercepting any activity to be * started. * - *

When an activity is started, {@link #onMatchIntent(Intent)} will be called on + *

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 @@ public class Instrumentation { /** * @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 @@ public class Instrumentation { * @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 @@ public class Instrumentation { 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 @@ public class Instrumentation { 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 @@ public class Instrumentation { 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 @@ public class Instrumentation { 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 @@ public class Instrumentation { 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 @@ public class Instrumentation { 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 b8a5f572ccfc87ea7f6551ae041530d4dadf0a2f..fcf0aab0c82139dabfa788dd1ffb6d72ad0d05fb 100644 --- a/core/java/android/app/KeyguardManager.java +++ b/core/java/android/app/KeyguardManager.java @@ -362,6 +362,13 @@ public class KeyguardManager { } } + /** @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 @@ public class KeyguardManager { * 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 bbcf7ba5912869ee45378aae067a8a3d24dc1704..3de5245b523664dc355360e1d13ac996668aa2a6 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -448,10 +448,13 @@ public final class LoadedApk { } } + // Prepend the shared libraries, maintaining their original order where possible. if (sharedLibraries != null) { + int index = 0; for (String lib : sharedLibraries) { if (!outZipPaths.contains(lib)) { - outZipPaths.add(0, lib); + outZipPaths.add(index, lib); + index++; } } } diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 9296d4447f59f602854dcbc4b3af7774be44e53e..c8b8c6c1b262a3dbf4df4be0fe819e142fbed725 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -239,16 +239,11 @@ public class Notification implements Parcelable * 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 @@ -2499,9 +2494,8 @@ public class Notification implements Parcelable } } - /** - * Returns the id of the channel this notification posts to. - */ + /** @removed */ + @Deprecated public String getChannel() { return mChannelId; } @@ -2513,10 +2507,8 @@ public class Notification implements Parcelable return mChannelId; } - /** - * Returns the time at which this notification should be canceled by the system, if it's not - * canceled already. - */ + /** @removed */ + @Deprecated public long getTimeout() { return mTimeout; } @@ -2681,21 +2673,12 @@ public class Notification implements Parcelable 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: * - - * - * - * - * - * - * - * - *
priority{@link #PRIORITY_DEFAULT}
whennow ({@link System#currentTimeMillis()})
audio stream{@link #STREAM_DEFAULT}
- * - * @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 @@ -2825,9 +2808,8 @@ public class Notification implements Parcelable return this; } - /** - * Specifies the channel the notification should be delivered on. - */ + /** @removed */ + @Deprecated public Builder setChannel(String channelId) { mN.mChannelId = channelId; return this; @@ -2841,10 +2823,8 @@ public class Notification implements Parcelable return this; } - /** - * Specifies a duration in milliseconds after which this notification should be canceled, - * if it is not already canceled. - */ + /** @removed */ + @Deprecated public Builder setTimeout(long durationMs) { mN.mTimeout = durationMs; return this; @@ -3854,10 +3834,62 @@ public class Notification implements Parcelable || 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); } @@ -4845,7 +4877,7 @@ public class Notification implements Parcelable private int getBackgroundColor() { if (isColorized()) { - return mN.color; + return mBackgroundColor != COLOR_INVALID ? mBackgroundColor : mN.color; } else { return COLOR_DEFAULT; } @@ -4863,6 +4895,21 @@ public class Notification implements Parcelable 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(); + } } /** @@ -4899,6 +4946,18 @@ public class Notification implements Parcelable * @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 style = getNotificationStyle(); if (MediaStyle.class.equals(style)) { Boolean colorized = (Boolean) extras.get(EXTRA_COLORIZED); @@ -4910,7 +4969,23 @@ public class Notification implements Parcelable return true; } } - return extras.getBoolean(EXTRA_COLORIZED) && isForegroundService(); + return false; + } + + + /** + * @return true if this is a media notification + * + * @hide + */ + public boolean isMediaNotification() { + Class style = getNotificationStyle(); + if (MediaStyle.class.equals(style)) { + return true; + } else if (DecoratedMediaCustomViewStyle.class.equals(style)) { + return true; + } + return false; } private boolean hasLargeIcon() { @@ -7959,9 +8034,8 @@ public class Notification implements Parcelable return this; } - /** - * Returns the id of the channel this notification posts to on TV. - */ + /** @removed */ + @Deprecated public String getChannel() { return mChannelId; } diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 7c361b9f9853d7f93addd74b088f3dd6ed498b35..6c55548c2ea4937c006978c008361a516a002af2 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -422,7 +422,9 @@ public class NotificationManager * 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. + * + *

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 @@ public class NotificationManager /** * 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 @@ public class NotificationManager } /** - * Returns all notification channels belonging to the calling app. + * Returns all notification channels belonging to the calling package. */ public List getNotificationChannels() { INotificationManager service = getService(); @@ -478,6 +482,10 @@ public class NotificationManager /** * Deletes the given notification channel. + * + *

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 @@ public class NotificationManager } /** - * 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 63db86aac9a8872cb46af12d67dbf0d36a24c9e2..88e6b998148693148b6d7f2d901cc4c1dfceeade 100644 --- a/core/java/android/app/PictureInPictureArgs.java +++ b/core/java/android/app/PictureInPictureArgs.java @@ -16,91 +16,314 @@ 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; -/** - * TO BE REMOVED - */ +/** @removed */ @Deprecated -public final class PictureInPictureArgs extends PictureInPictureParams { +public final class PictureInPictureArgs implements Parcelable { /** - * Creates a new set of picture-in-picture arguments. - * - * TODO: Remove once we remove PictureInPictureArgs. + * Builder class for {@link PictureInPictureArgs} objects. */ - @Deprecated - public PictureInPictureArgs() { - // Empty constructor + public static class Builder { + + @Nullable + private Rational mAspectRatio; + + @Nullable + private List 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 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; + } } /** - * Creates a new set of picture-in-picture arguments from the given {@param aspectRatio} and - * {@param actions}. - * - * TODO: Remove once we remove PictureInPictureArgs. + * The expected aspect ratio of the picture-in-picture. */ - @Deprecated - public PictureInPictureArgs(float aspectRatio, List actions) { - setAspectRatio(aspectRatio); - if (actions != null) { - setActions(actions); + @Nullable + private Rational mAspectRatio; + + /** + * The set of actions that are associated with this activity when in picture-in-picture. + */ + @Nullable + private List 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; + + private PictureInPictureArgs() { + } + + private PictureInPictureArgs(Parcel in) { + if (in.readInt() != 0) { + mAspectRatio = new Rational(in.readInt(), in.readInt()); + } + if (in.readInt() != 0) { + mUserActions = new ArrayList<>(); + in.readParcelableList(mUserActions, RemoteAction.class.getClassLoader()); + } + if (in.readInt() != 0) { + mSourceRectHint = Rect.CREATOR.createFromParcel(in); + } + if (in.readInt() != 0) { + mSourceRectHintInsets = Rect.CREATOR.createFromParcel(in); } } + private PictureInPictureArgs(Rational aspectRatio, List actions, + Rect sourceRectHint) { + mAspectRatio = aspectRatio; + mUserActions = actions; + mSourceRectHint = sourceRectHint; + } + /** - * Sets the aspect ratio. - * - * @param aspectRatio the new aspect ratio for picture-in-picture, must be within 2.39:1 and - * 1:2.39. - * - * TODO: Remove once we remove PictureInPictureArgs. + * Copies the set parameters from the other picture-in-picture args. + * @hide */ - @Deprecated - public void setAspectRatio(float aspectRatio) { - // Temporary workaround - mAspectRatio = new Rational((int) (aspectRatio * 1000000000), 1000000000); + public void copyOnlySet(PictureInPictureArgs otherArgs) { + if (otherArgs.hasSetAspectRatio()) { + mAspectRatio = otherArgs.mAspectRatio; + } + if (otherArgs.hasSetActions()) { + mUserActions = otherArgs.mUserActions; + } + if (otherArgs.hasSourceBoundsHint()) { + mSourceRectHint = new Rect(otherArgs.getSourceRectHint()); + } + if (otherArgs.hasSourceBoundsHintInsets()) { + mSourceRectHintInsets = new Rect(otherArgs.getSourceRectHintInsets()); + } } /** - * Sets the user actions. If there are more than - * {@link ActivityManager#getMaxNumPictureInPictureActions()} actions, then the input will be - * truncated to that number. - * - * @param actions the new actions to show in the picture-in-picture menu. - * - * @see RemoteAction - * - * TODO: Remove once we remove PictureInPictureArgs. + * @return the aspect ratio. If none is set, return 0. + * @hide */ - @Deprecated - public void setActions(List actions) { - if (mUserActions != null) { - mUserActions = null; + public float getAspectRatio() { + if (mAspectRatio != null) { + return mAspectRatio.floatValue(); } - if (actions != null) { - mUserActions = new ArrayList<>(actions); + 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 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 source bounds hint. These bounds are only used when an activity first enters - * picture-in-picture, and describe the bounds in window coordinates of activity entering - * picture-in-picture that will be visible following the transition. For the best effect, these - * bounds should also match the aspect ratio in the arguments. - * - * TODO: Remove once we remove PictureInPictureArgs. + * Sets the insets to be used with the source rect hint bounds. + * @hide */ @Deprecated - public void setSourceRectHint(Rect launchBounds) { - if (launchBounds == null) { - mSourceRectHint = null; + public void setSourceRectHintInsets(Rect insets) { + if (insets == null) { + mSourceRectHintInsets = null; } else { - mSourceRectHint = new Rect(launchBounds); + mSourceRectHintInsets = new Rect(insets); } } -} \ No newline at end of file + + /** + * @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 CREATOR = + new Creator() { + public PictureInPictureArgs createFromParcel(Parcel in) { + return new PictureInPictureArgs(in); + } + public PictureInPictureArgs[] newArray(int size) { + return new PictureInPictureArgs[size]; + } + }; + + 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/PictureInPictureParams.java b/core/java/android/app/PictureInPictureParams.java index 875d5927226788307c3155482ca354b9b990a291..323a0fbaa5b14a7bce001a01a775e0e437203d9f 100644 --- a/core/java/android/app/PictureInPictureParams.java +++ b/core/java/android/app/PictureInPictureParams.java @@ -28,10 +28,8 @@ import java.util.List; /** * Represents a set of parameters used to initialize and update an Activity in picture-in-picture * mode. - * - * TODO: Make this final after we remove PictureInPictureArgs */ -public class PictureInPictureParams implements Parcelable { +public final class PictureInPictureParams implements Parcelable { /** * Builder class for {@link PictureInPictureParams} objects. @@ -63,7 +61,7 @@ public class PictureInPictureParams implements Parcelable { /** * Sets the user actions. If there are more than - * {@link ActivityManager#getMaxNumPictureInPictureActions()} actions, then the input list + * {@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. @@ -120,25 +118,22 @@ public class PictureInPictureParams implements Parcelable { /** * The expected aspect ratio of the picture-in-picture. */ - // TODO: Make private once we removed PictureInPictureArgs @Nullable - protected Rational mAspectRatio; + private Rational mAspectRatio; /** * The set of actions that are associated with this activity when in picture-in-picture. */ - // TODO: Make private once we removed PictureInPictureArgs @Nullable - protected List mUserActions; + private List mUserActions; /** * The source bounds hint used when entering picture-in-picture, relative to the window bounds. * We can use this internally for the transition into picture-in-picture to ensure that a * particular source rect is visible throughout the whole transition. */ - // TODO: Make private once we removed PictureInPictureArgs @Nullable - protected Rect mSourceRectHint; + private Rect mSourceRectHint; /** * The content insets that are used with the source hint rect for the transition into PiP where @@ -147,15 +142,12 @@ public class PictureInPictureParams implements Parcelable { @Nullable private Rect mSourceRectHintInsets; - /** - * TO BE REMOVED - */ - @Deprecated + /** {@hide} */ PictureInPictureParams() { - // TODO: Remove once we remove PictureInPictureArgs } - private PictureInPictureParams(Parcel in) { + /** {@hide} */ + PictureInPictureParams(Parcel in) { if (in.readInt() != 0) { mAspectRatio = new Rational(in.readInt(), in.readInt()); } @@ -171,7 +163,8 @@ public class PictureInPictureParams implements Parcelable { } } - private PictureInPictureParams(Rational aspectRatio, List actions, + /** {@hide} */ + PictureInPictureParams(Rational aspectRatio, List actions, Rect sourceRectHint) { mAspectRatio = aspectRatio; mUserActions = actions; @@ -208,6 +201,11 @@ public class PictureInPictureParams implements Parcelable { return 0f; } + /** @hide */ + public Rational getAspectRatioRational() { + return mAspectRatio; + } + /** * @return whether the aspect ratio is set. * @hide @@ -238,7 +236,7 @@ public class PictureInPictureParams implements Parcelable { */ public void truncateActions(int size) { if (hasSetActions()) { - mUserActions = mUserActions.subList(0, size); + mUserActions = mUserActions.subList(0, Math.min(mUserActions.size(), size)); } } diff --git a/core/java/android/app/RemoteInput.java b/core/java/android/app/RemoteInput.java index d1dc859314047133f77ea00656008729b74d7dd4..8ab19c06df80835439745a62686141666f0f2150 100644 --- a/core/java/android/app/RemoteInput.java +++ b/core/java/android/app/RemoteInput.java @@ -118,6 +118,11 @@ public final class RemoteInput implements Parcelable { 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 getAllowedDataTypes() { return mAllowedDataTypes; } @@ -202,7 +207,9 @@ public final class RemoteInput implements Parcelable { } /** - * 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 @@ public final class RemoteInput implements Parcelable { } /** - * 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/services/autofill/java/com/android/server/autofill/ui/Helper.java b/core/java/android/app/WallpaperColors.aidl similarity index 67% rename from services/autofill/java/com/android/server/autofill/ui/Helper.java rename to core/java/android/app/WallpaperColors.aidl index 996e4213ac440ce9481b147841b0092c6de81d64..f5edff271615f6776bed7741b79c4b46abfd1189 100644 --- a/services/autofill/java/com/android/server/autofill/ui/Helper.java +++ b/core/java/android/app/WallpaperColors.aidl @@ -14,13 +14,6 @@ * limitations under the License. */ -package com.android.server.autofill.ui; +package android.app; -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"); - } -} +parcelable WallpaperColors; \ No newline at end of file diff --git a/core/java/android/app/WallpaperColors.java b/core/java/android/app/WallpaperColors.java index 5ed66cac5f8fed561ea915ef59495faf4116a39f..b3c70a49f660a09fd3f46e09958522c4973c04de 100644 --- a/core/java/android/app/WallpaperColors.java +++ b/core/java/android/app/WallpaperColors.java @@ -22,6 +22,7 @@ import android.os.Parcelable; import android.util.Pair; +import java.util.ArrayList; import java.util.List; /** @@ -29,7 +30,19 @@ import java.util.List; */ public final class WallpaperColors implements Parcelable { + private static final float BRIGHT_LUMINANCE = 0.9f; + private final List> mColors; + private final boolean mSupportsDarkText; + public WallpaperColors(Parcel parcel) { + mColors = new ArrayList<>(); + int count = parcel.readInt(); + for (int i=0; i < count; i++) { + Color color = Color.valueOf(parcel.readInt()); + int weight = parcel.readInt(); + mColors.add(new Pair<>(color, weight)); + } + mSupportsDarkText = parcel.readBoolean(); } /** @@ -43,6 +56,7 @@ public final class WallpaperColors implements Parcelable { * and number of occurrences/influence. */ public WallpaperColors(List> colors) { + this(colors, calculateDarkTextSupport(colors)); } /** @@ -55,6 +69,10 @@ public final class WallpaperColors implements Parcelable { * @param supportsDarkText can have dark text on top or not */ public WallpaperColors(List> colors, boolean supportsDarkText) { + if (colors == null) + colors = new ArrayList<>(); + mColors = colors; + mSupportsDarkText = supportsDarkText; } public static final Creator CREATOR = new Creator() { @@ -76,6 +94,13 @@ public final class WallpaperColors implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { + int count = mColors.size(); + dest.writeInt(count); + for (Pair color : mColors) { + dest.writeInt(color.first.toArgb()); + dest.writeInt(color.second); + } + dest.writeBoolean(mSupportsDarkText); } /** @@ -83,7 +108,22 @@ public final class WallpaperColors implements Parcelable { * @return list of colors paired with their weights. */ public List> getColors() { - return null; + return mColors; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + + WallpaperColors other = (WallpaperColors) o; + return mColors.equals(other.mColors) && mSupportsDarkText == other.mSupportsDarkText; + } + + @Override + public int hashCode() { + return 31 * mColors.hashCode() + (mSupportsDarkText ? 1 : 0); } /** @@ -92,6 +132,24 @@ public final class WallpaperColors implements Parcelable { * @return true if dark text is supported */ public boolean supportsDarkText() { - return false; + return mSupportsDarkText; + } + + private static boolean calculateDarkTextSupport(List> colors) { + if (colors == null) { + return false; + } + + Pair mainColor = null; + + for (Pair color : colors) { + if (mainColor == null) { + mainColor = color; + } else if (color.second > mainColor.second) { + mainColor = color; + } + } + return mainColor != null && + mainColor.first.luminance() > BRIGHT_LUMINANCE; } } diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index 6d87de8e300138b3ad12d559abe7d115a443ee08..8a33791adfdbde80ba9bcd2b04ce8f4fdc49159c 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -52,13 +52,13 @@ import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.ParcelFileDescriptor; -import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; +import android.util.Pair; import android.view.WindowManagerGlobal; import libcore.io.IoUtils; @@ -71,6 +71,8 @@ import java.io.IOException; import java.io.InputStream; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -271,15 +273,20 @@ public class WallpaperManager { } } - static class Globals extends IWallpaperManagerCallback.Stub { + private static class Globals extends IWallpaperManagerCallback.Stub { private final IWallpaperManager mService; + private boolean mColorCallbackRegistered; + private final ArrayList> mColorListeners = + new ArrayList<>(); private Bitmap mCachedWallpaper; private int mCachedWallpaperUserId; private Bitmap mDefaultWallpaper; + private Handler mMainLooperHandler; Globals(Looper looper) { IBinder b = ServiceManager.getService(Context.WALLPAPER_SERVICE); mService = IWallpaperManager.Stub.asInterface(b); + mMainLooperHandler = new Handler(looper); forgetLoadedWallpaper(); } @@ -292,6 +299,88 @@ public class WallpaperManager { forgetLoadedWallpaper(); } + /** + * Start listening to wallpaper color events. + * Will be called whenever someone changes their wallpaper or if a live wallpaper + * changes its colors. + * @param callback Listener + * @param handler Thread to call it from. Main thread if null. + */ + public void addOnColorsChangedListener(@NonNull OnColorsChangedListener callback, + @Nullable Handler handler) { + synchronized (this) { + if (!mColorCallbackRegistered) { + try { + mService.registerWallpaperColorsCallback(this); + mColorCallbackRegistered = true; + } catch (RemoteException e) { + // Failed, service is gone + Log.w(TAG, "Can't register for color updates", e); + } + } + mColorListeners.add(new Pair<>(callback, handler)); + } + } + + /** + * Stop listening to wallpaper color events. + * + * @param callback listener + */ + public void removeOnColorsChangedListener(@NonNull OnColorsChangedListener callback) { + synchronized (this) { + mColorListeners.removeIf(pair -> pair.first == callback); + + if (mColorListeners.size() == 0 && mColorCallbackRegistered) { + mColorCallbackRegistered = false; + try { + mService.unregisterWallpaperColorsCallback(this); + } catch (RemoteException e) { + // Failed, service is gone + Log.w(TAG, "Can't unregister color updates", e); + } + } + } + } + + @Override + public void onWallpaperColorsChanged(WallpaperColors colors, int which) { + synchronized (this) { + for (Pair listener : mColorListeners) { + Handler handler = listener.second; + if (listener.second == null) { + handler = mMainLooperHandler; + } + handler.post(() -> { + // Dealing with race conditions between posting a callback and + // removeOnColorsChangedListener being called. + boolean stillExists; + synchronized (sGlobals) { + stillExists = mColorListeners.contains(listener); + } + if (stillExists) { + listener.first.onColorsChanged(colors, which); + } + }); + } + } + } + + WallpaperColors getWallpaperColors(int which) { + synchronized (this) { + if (which != FLAG_LOCK && which != FLAG_SYSTEM) + throw new IllegalArgumentException( + "which should be either FLAG_LOCK or FLAG_SYSTEM"); + + try { + return mService.getWallpaperColors(which); + } catch (RemoteException e) { + // Can't get colors, connection lost. + } + return null; + } + } + public Bitmap peekWallpaperBitmap(Context context, boolean returnDefault, @SetWallpaperFlags int which) { return peekWallpaperBitmap(context, returnDefault, which, context.getUserId()); @@ -746,7 +835,6 @@ public class WallpaperManager { 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. @@ -754,16 +842,18 @@ public class WallpaperManager { * @param listener A listener to register */ public void addOnColorsChangedListener(@NonNull OnColorsChangedListener listener) { + sGlobals.addOnColorsChangedListener(listener, null); } /** * 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 + * @param handler Where to call it from. Will be called from the main thread * if null. */ public void addOnColorsChangedListener(@NonNull OnColorsChangedListener listener, - @Nullable Handler handler) { + @NonNull Handler handler) { + sGlobals.addOnColorsChangedListener(listener, handler); } /** @@ -771,6 +861,7 @@ public class WallpaperManager { * @param callback A callback to unsubscribe */ public void removeOnColorsChangedListener(@NonNull OnColorsChangedListener callback) { + sGlobals.removeOnColorsChangedListener(callback); } /** @@ -780,7 +871,7 @@ public class WallpaperManager { * @return a list of colors ordered by priority */ public @Nullable WallpaperColors getWallpaperColors(int which) { - return null; + return sGlobals.getWallpaperColors(which); } /** @@ -1773,6 +1864,12 @@ public class WallpaperManager { public void onWallpaperChanged() throws RemoteException { mLatch.countDown(); } + + @Override + public void onWallpaperColorsChanged(WallpaperColors colors, int which) + throws RemoteException { + sGlobals.onWallpaperColorsChanged(colors, which); + } } /** diff --git a/core/java/android/app/admin/ConnectEvent.java b/core/java/android/app/admin/ConnectEvent.java index 5111443d7045d4b9c3f4f805ad9ec35ae5e76e26..423ee52ee6a13fee53edb931a9e5f622cf638bfa 100644 --- a/core/java/android/app/admin/ConnectEvent.java +++ b/core/java/android/app/admin/ConnectEvent.java @@ -19,6 +19,9 @@ package android.app.admin; 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 @@ public final class ConnectEvent extends NetworkEvent implements Parcelable { 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 8801b143f9f77f949c95ed124c85d0ccb8741176..a20284802729030675b39a5c6b0e297371eaa5bd 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -56,6 +56,7 @@ import android.provider.Settings; 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.ArrayList; 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 @@ -257,6 +259,26 @@ public class DevicePolicyManager { public static final String ACTION_PROVISION_MANAGED_DEVICE = "android.app.action.PROVISION_MANAGED_DEVICE"; + /** + * Activity action: launch when user provisioning completed, i.e. + * {@link #getUserProvisioningState()} returns one of the complete state. + * + *

Please note that the API behavior is not necessarily consistent across various releases, + * and devices, as it's contract between SetupWizard and ManagedProvisioning. The default + * implementation is that ManagedProvisioning launches SetupWizard in NFC provisioning only. + * + *

The activity must be protected by permission + * {@link android.Manifest.permission#BIND_DEVICE_ADMIN}, and the process must hold + * {@link android.Manifest.permission#DISPATCH_PROVISIONING_MESSAGE} to be launched. + * Only one {@link ComponentName} in the entire system should be enabled, and the rest of the + * components are not started by this intent. + * @hide + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + @SystemApi + public static final String ACTION_STATE_USER_SETUP_COMPLETE = + "android.app.action.STATE_USER_SETUP_COMPLETE"; + /** * Activity action: Starts the provisioning flow which sets up a managed device. * @@ -3028,17 +3050,24 @@ public class DevicePolicyManager { * 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. *

- * 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}. *

* 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 +3099,17 @@ public class DevicePolicyManager { * 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) { @@ -7588,13 +7619,31 @@ public class DevicePolicyManager { * 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 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 ids) { throwIfParentInstance("setAffiliationIds"); + if (ids == null) { + throw new IllegalArgumentException("ids must not be null"); + } try { mService.setAffiliationIds(admin, ids); } catch (RemoteException e) { @@ -7603,13 +7652,12 @@ public class DevicePolicyManager { } /** - * 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 getAffiliationIds(@NonNull ComponentName admin) { - throwIfParentInstance("getAffiliationIds"); + public @NonNull Set getAffiliationIds(@NonNull ComponentName admin) { try { - return mService.getAffiliationIds(admin); + return new ArraySet<>(mService.getAffiliationIds(admin)); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -7906,7 +7954,8 @@ public class DevicePolicyManager { * See {@link #getBindDeviceAdminTargetUsers} for a definition of which * device/profile owners are allowed to bind to services of another profile/device owner. *

- * 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 a3a3f586008d414f4f0dcb07463aacb61e9d96a9..c21725f0e86f695e8a1dbfac135c9e7fc355c6ea 100644 --- a/core/java/android/app/admin/DnsEvent.java +++ b/core/java/android/app/admin/DnsEvent.java @@ -19,6 +19,12 @@ package android.app.admin; 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 @@ public final class DnsEvent extends NetworkEvent implements Parcelable { } /** Returns (possibly a subset of) the IP addresses returned. */ - public String[] getIpAddresses() { - return ipAddresses; + public List getInetAddresses() { + if (ipAddresses == null || ipAddresses.length == 0) { + return Collections.emptyList(); + } + final List 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/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java index d6b89a17c624f4df44f8b79c24621c3459f280c4..33535302bd5c2b0e92d2aa388161ca3f4741f0d0 100644 --- a/core/java/android/app/assist/AssistStructure.java +++ b/core/java/android/app/assist/AssistStructure.java @@ -29,10 +29,12 @@ import android.view.ViewStructure.HtmlInfo.Builder; 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 @@ public class AssistStructure implements Parcelable { ComponentName mActivityComponent; private boolean mIsHomeActivity; + private int mFlags; final ArrayList mWindowNodes = new ArrayList<>(); @@ -184,6 +187,7 @@ public class AssistStructure implements Parcelable { 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 @@ public class AssistStructure implements Parcelable { 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 @@ public class AssistStructure implements Parcelable { 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 @@ public class AssistStructure implements Parcelable { 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 @@ public class AssistStructure implements Parcelable { } } 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); } @@ -1788,7 +1795,7 @@ public class AssistStructure implements Parcelable { } @Override - public ArrayList> getAttributes() { + public List> getAttributes() { if (mAttributes == null && mNames != null) { mAttributes = new ArrayList<>(mNames.length); for (int i = 0; i < mNames.length; i++) { @@ -1869,20 +1876,22 @@ public class AssistStructure implements Parcelable { } /** @hide */ - public AssistStructure(Activity activity, boolean forAutoFill) { + public AssistStructure(Activity activity, boolean forAutoFill, int flags) { mHaveData = true; mActivityComponent = activity.getComponentName(); + mFlags = flags; ArrayList views = WindowManagerGlobal.getInstance().getRootViews( activity.getActivityToken()); for (int i=0; iCan 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 @@ -918,10 +901,8 @@ public abstract class BackupAgent extends ContextWrapper { // 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 @@ public abstract class BackupAgent extends ContextWrapper { // guarantee themselves). waitForSharedPrefs(); - // Unset quota after onBackup is done. - mBackupQuotaBytes = -1; - Binder.restoreCallingIdentity(ident); try { callbackBinder.opComplete(token, 0); @@ -997,8 +975,6 @@ public abstract class BackupAgent extends ContextWrapper { // 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 @@ public abstract class BackupAgent extends ContextWrapper { 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 @@ public abstract class BackupAgent extends ContextWrapper { // ... 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 abstract class BackupAgent extends ContextWrapper { 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 @@ public abstract class BackupAgent extends ContextWrapper { 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 1fe63e7ec30f940cdd73bf6590a2437d3ece5c52..c7586a299dd8d2491b3893ee1161688b93a678d7 100644 --- a/core/java/android/app/backup/BackupDataOutput.java +++ b/core/java/android/app/backup/BackupDataOutput.java @@ -62,18 +62,39 @@ import java.io.IOException; * @see BackupAgent */ public class BackupDataOutput { + final long mQuota; long mBackupWriter; - /** @hide */ + /** + * 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, 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); } } + /** + * 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}. diff --git a/core/java/android/app/backup/FullBackupDataOutput.java b/core/java/android/app/backup/FullBackupDataOutput.java index 94704b95da7b5bd5f48c14f2e5c03d1586fbb615..5deedd035d0b4b53915c29a388ad76465985bd36 100644 --- a/core/java/android/app/backup/FullBackupDataOutput.java +++ b/core/java/android/app/backup/FullBackupDataOutput.java @@ -10,17 +10,35 @@ import android.os.ParcelFileDescriptor; 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 10c9b5ff5a50477874b82580457d3aab817ae600..83ac779ee7dba2d3b82b13613a73cf91c7eadfd4 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 @@ public final class ExternalStorageStats implements Parcelable { * 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 @@ public final class ExternalStorageStats implements Parcelable { * 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 @@ public final class ExternalStorageStats implements Parcelable { * 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 @@ public final class ExternalStorageStats implements Parcelable { * 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 @@ public final class ExternalStorageStats implements Parcelable { * 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 26c702c0eb4e5a10d7be66ea0b676226952f33fa..3a277518977d96a3253f13ff6f4e6b034f603c2f 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 @@ public final class StorageStats implements Parcelable { /** {@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. *

* If the primary external/shared storage is hosted on this storage device, * then this includes files stored under {@link Context#getObbDir()}. *

* 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 @@ public final class StorageStats implements Parcelable { *

* Data is isolated for each user on a multiuser device. */ - public long getDataBytes() { + public @BytesLong long getDataBytes() { return dataBytes; } @@ -72,7 +79,7 @@ public final class StorageStats implements Parcelable { *

* 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 5497d57ba264011fe6ab586f1065c96eb175f96a..d9d958c0653c1fca16600bcd90bd37791eb7cf07 100644 --- a/core/java/android/app/usage/StorageStatsManager.java +++ b/core/java/android/app/usage/StorageStatsManager.java @@ -18,6 +18,7 @@ package android.app.usage; 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.io.IOException; 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. *

- * 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. *

*/ public class StorageStatsManager { @@ -73,19 +77,22 @@ public class StorageStatsManager { } /** - * 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. *

- * 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. + *

+ * 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 @@ public class StorageStatsManager { /** * Return the free space on the requested storage volume. *

- * 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 and and cached space that + * could be reclaimed by the system. *

- * 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 @@ public class StorageStatsManager { /** * Return storage statistics for a specific package on the requested storage * volume. - *

- * This method may take several seconds to calculate the requested values, - * so it should only be called from a worker thread. + *

+ * 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. + *

*

* 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 @@ public class StorageStatsManager { * @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 @@ public class StorageStatsManager { /** * Return storage statistics for a specific UID on the requested storage * volume. - *

- * This method may take several seconds to calculate the requested values, - * so it should only be called from a worker thread. + *

+ * 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. + *

* * @param storageUuid the UUID of the storage volume you're interested in, * such as {@link StorageManager#UUID_DEFAULT}. @@ -194,7 +215,8 @@ public class StorageStatsManager { * @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 @@ public class StorageStatsManager { /** * Return storage statistics for a specific {@link UserHandle} on the * requested storage volume. - *

- * This method may take several seconds to calculate the requested values, - * so it should only be called from a worker thread. + *

+ * 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. + *

* * @param storageUuid the UUID of the storage volume you're interested in, * such as {@link StorageManager#UUID_DEFAULT}. @@ -226,8 +253,8 @@ public class StorageStatsManager { * @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 @@ public class StorageStatsManager { /** * Return shared/external storage statistics for a specific * {@link UserHandle} on the requested storage volume. - *

- * This method may take several seconds to calculate the requested values, - * so it should only be called from a worker thread. + *

+ * 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. + *

* * @param storageUuid the UUID of the storage volume you're interested in, * such as {@link StorageManager#UUID_DEFAULT}. @@ -258,8 +290,8 @@ public class StorageStatsManager { * @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 06fdb32fe4956b507f9752fa0cc1f2685ee6279b..52fa8a67532ced6b5e7930f6c68e88fd16d7e466 100644 --- a/core/java/android/appwidget/AppWidgetProviderInfo.java +++ b/core/java/android/appwidget/AppWidgetProviderInfo.java @@ -368,11 +368,11 @@ public class AppWidgetProviderInfo implements Parcelable { 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/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java index e77ab2e61a07bb4a0b0ffeddf5a7f25f4875671f..0f01d62f8b6953324bab6c48bfcf9129dbcfd183 100644 --- a/core/java/android/bluetooth/BluetoothGatt.java +++ b/core/java/android/bluetooth/BluetoothGatt.java @@ -159,8 +159,10 @@ public final class BluetoothGatt implements BluetoothProfile { mHandler.post(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); + } } }); @@ -192,7 +194,9 @@ public final class BluetoothGatt implements BluetoothProfile { mHandler.post(new Runnable() { @Override public void run() { - mCallback.onPhyUpdate(BluetoothGatt.this, txPhy, rxPhy, status); + if (mCallback != null) { + mCallback.onPhyUpdate(BluetoothGatt.this, txPhy, rxPhy, status); + } } }); } @@ -212,7 +216,9 @@ public final class BluetoothGatt implements BluetoothProfile { mHandler.post(new Runnable() { @Override public void run() { - mCallback.onPhyRead(BluetoothGatt.this, txPhy, rxPhy, status); + if (mCallback != null) { + mCallback.onPhyRead(BluetoothGatt.this, txPhy, rxPhy, status); + } } }); } @@ -235,7 +241,10 @@ public final class BluetoothGatt implements BluetoothProfile { mHandler.post(new Runnable() { @Override public void run() { - mCallback.onConnectionStateChange(BluetoothGatt.this, status, profileState); + if (mCallback != null) { + mCallback.onConnectionStateChange(BluetoothGatt.this, status, + profileState); + } } }); @@ -294,7 +303,9 @@ public final class BluetoothGatt implements BluetoothProfile { mHandler.post(new Runnable() { @Override public void run() { - mCallback.onServicesDiscovered(BluetoothGatt.this, status); + if (mCallback != null) { + mCallback.onServicesDiscovered(BluetoothGatt.this, status); + } } }); } @@ -344,7 +355,10 @@ public final class BluetoothGatt implements BluetoothProfile { mHandler.post(new Runnable() { @Override public void run() { - mCallback.onCharacteristicRead(BluetoothGatt.this, characteristic, status); + if (mCallback != null) { + mCallback.onCharacteristicRead(BluetoothGatt.this, characteristic, + status); + } } }); } @@ -390,7 +404,10 @@ public final class BluetoothGatt implements BluetoothProfile { mHandler.post(new Runnable() { @Override public void run() { - mCallback.onCharacteristicWrite(BluetoothGatt.this, characteristic, status); + if (mCallback != null) { + mCallback.onCharacteristicWrite(BluetoothGatt.this, characteristic, + status); + } } }); } @@ -416,7 +433,9 @@ public final class BluetoothGatt implements BluetoothProfile { mHandler.post(new Runnable() { @Override public void run() { - mCallback.onCharacteristicChanged(BluetoothGatt.this, characteristic); + if (mCallback != null) { + mCallback.onCharacteristicChanged(BluetoothGatt.this, characteristic); + } } }); } @@ -461,7 +480,9 @@ public final class BluetoothGatt implements BluetoothProfile { mHandler.post(new Runnable() { @Override public void run() { - mCallback.onDescriptorRead(BluetoothGatt.this, descriptor, status); + if (mCallback != null) { + mCallback.onDescriptorRead(BluetoothGatt.this, descriptor, status); + } } }); } @@ -505,7 +526,9 @@ public final class BluetoothGatt implements BluetoothProfile { mHandler.post(new Runnable() { @Override public void run() { - mCallback.onDescriptorWrite(BluetoothGatt.this, descriptor, status); + if (mCallback != null) { + mCallback.onDescriptorWrite(BluetoothGatt.this, descriptor, status); + } } }); } @@ -529,7 +552,9 @@ public final class BluetoothGatt implements BluetoothProfile { mHandler.post(new Runnable() { @Override public void run() { - mCallback.onReliableWriteCompleted(BluetoothGatt.this, status); + if (mCallback != null) { + mCallback.onReliableWriteCompleted(BluetoothGatt.this, status); + } } }); } @@ -548,7 +573,9 @@ public final class BluetoothGatt implements BluetoothProfile { mHandler.post(new Runnable() { @Override public void run() { - mCallback.onReadRemoteRssi(BluetoothGatt.this, rssi, status); + if (mCallback != null) { + mCallback.onReadRemoteRssi(BluetoothGatt.this, rssi, status); + } } }); } @@ -568,7 +595,9 @@ public final class BluetoothGatt implements BluetoothProfile { mHandler.post(new Runnable() { @Override public void run() { - mCallback.onMtuChanged(BluetoothGatt.this, mtu, status); + if (mCallback != null) { + mCallback.onMtuChanged(BluetoothGatt.this, mtu, status); + } } }); } @@ -590,8 +619,10 @@ public final class BluetoothGatt implements BluetoothProfile { mHandler.post(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); + } } }); } diff --git a/core/java/android/bluetooth/le/AdvertisingSet.java b/core/java/android/bluetooth/le/AdvertisingSet.java index 3021be1f8c02397554416cd23f069f8911bdcdef..1bc211cb83a2cf448dc864b5e420e5cb66db0f96 100644 --- a/core/java/android/bluetooth/le/AdvertisingSet.java +++ b/core/java/android/bluetooth/le/AdvertisingSet.java @@ -172,7 +172,7 @@ public final class AdvertisingSet { * * @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) { diff --git a/core/java/android/bluetooth/le/AdvertisingSetCallback.java b/core/java/android/bluetooth/le/AdvertisingSetCallback.java index 2c46e856db4a92a81713da3dcf63b6e84acaaf6a..c3c16a479e7186b9f643a3261434e8693bfcb903 100644 --- a/core/java/android/bluetooth/le/AdvertisingSetCallback.java +++ b/core/java/android/bluetooth/le/AdvertisingSetCallback.java @@ -135,7 +135,7 @@ public abstract class AdvertisingSetCallback { 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. diff --git a/core/java/android/bluetooth/le/AdvertisingSetParameters.java b/core/java/android/bluetooth/le/AdvertisingSetParameters.java index 31d8f482090dbba4db0f49bd8afe5db96532b0de..71c4484a94748c79749ef2bc99bba4e011971451 100644 --- a/core/java/android/bluetooth/le/AdvertisingSetParameters.java +++ b/core/java/android/bluetooth/le/AdvertisingSetParameters.java @@ -242,7 +242,7 @@ public final class AdvertisingSetParameters implements Parcelable { * 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 @@ public final class AdvertisingSetParameters implements Parcelable { * 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 @@ public final class AdvertisingSetParameters implements Parcelable { /** * Build the {@link AdvertisingSetParameters} object. + * @throws IllegalStateException if invalid combination of parameters is used. */ public AdvertisingSetParameters build() { if (isLegacy) { @@ -394,22 +395,22 @@ public final class AdvertisingSetParameters implements Parcelable { } 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/ScanResult.java b/core/java/android/bluetooth/le/ScanResult.java index 5b2fa406cd3f4e47eb11a53320b8c47a8995ef9e..e552398e9e26703ef1a6ffc99d600e72af13830d 100644 --- a/core/java/android/bluetooth/le/ScanResult.java +++ b/core/java/android/bluetooth/le/ScanResult.java @@ -51,6 +51,16 @@ public final class ScanResult implements Parcelable { */ 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. */ @@ -265,15 +275,16 @@ public final class ScanResult implements Parcelable { /** * 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 e5ea4e94b67ff3629d8a5b09950dab48788c4da2..7fb768c67386b2505fcde48ad39fc9f64f9f95d4 100644 --- a/core/java/android/companion/BluetoothLEDeviceFilter.java +++ b/core/java/android/companion/BluetoothLeDeviceFilter.java @@ -38,6 +38,7 @@ import com.android.internal.util.BitUtils; 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 @@ import java.util.regex.Pattern; * * @see ScanFilter */ -public final class BluetoothLEDeviceFilter implements DeviceFilter { +public final class BluetoothLeDeviceFilter implements DeviceFilter { 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 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter { 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 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter { mRenamePrefix = renamePrefix; mRenameSuffix = renameSuffix; mRenameBytesFrom = renameBytesFrom; - mRenameBytesTo = renameBytesTo; + mRenameBytesLength = renameBytesLength; mRenameNameFrom = renameNameFrom; - mRenameNameTo = renameNameTo; + mRenameNameLength = renameNameLength; mRenameBytesReverseOrder = renameBytesReverseOrder; } @@ -125,8 +126,8 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter { } /** @hide */ - public int getRenameBytesTo() { - return mRenameBytesTo; + public int getRenameBytesLength() { + return mRenameBytesLength; } /** @hide */ @@ -145,7 +146,7 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter { 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 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter { } 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 final class BluetoothLEDeviceFilter implements DeviceFilter { 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 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter { @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 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter { 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 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter { ", mRenamePrefix='" + mRenamePrefix + '\'' + ", mRenameSuffix='" + mRenameSuffix + '\'' + ", mRenameBytesFrom=" + mRenameBytesFrom + - ", mRenameBytesTo=" + mRenameBytesTo + + ", mRenameBytesLength=" + mRenameBytesLength + ", mRenameNameFrom=" + mRenameNameFrom + - ", mRenameNameTo=" + mRenameNameTo + + ", mRenameNameLength=" + mRenameNameLength + ", mRenameBytesReverseOrder=" + mRenameBytesReverseOrder + '}'; } - public static final Creator CREATOR - = new Creator() { + public static final Creator CREATOR + = new Creator() { @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 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter { 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 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter { } @Override - public BluetoothLEDeviceFilter[] newArray(int size) { - return new BluetoothLEDeviceFilter[size]; + public BluetoothLeDeviceFilter[] newArray(int size) { + return new BluetoothLeDeviceFilter[size]; } }; @@ -283,9 +286,9 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter { } /** - * Builder for {@link BluetoothLEDeviceFilter} + * Builder for {@link BluetoothLeDeviceFilter} */ - public static final class Builder extends OneTimeUseBuilder { + public static final class Builder extends OneTimeUseBuilder { private ScanFilter mScanFilter; private Pattern mNamePattern; private byte[] mRawDataFilter; @@ -293,9 +296,9 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter { 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 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter { * @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 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter { * @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 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter { 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 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter { /** @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 7f03c3abcddb760a231f7466629c6327f4648d48..9323261f052c887777a3d33ac5be81aeff433330 100644 --- a/core/java/android/content/ClipData.java +++ b/core/java/android/content/ClipData.java @@ -847,7 +847,7 @@ public class ClipData implements Parcelable { * Add a new Item to the overall ClipData container. *

This method will not 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. */ @@ -858,15 +858,21 @@ public class ClipData implements Parcelable { 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. *

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/ContentResolver.java b/core/java/android/content/ContentResolver.java index dff06ac0ab3f4ce3d42245a5a6294504ea392875..9ccc552f77f576a33e1f7a1c99199834ca85a7bd 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -36,7 +36,6 @@ import android.database.IContentObserver; 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; @@ -516,12 +515,7 @@ public abstract class ContentResolver { 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 c03883cf9b034a1fcf575ab6a18ae85e9f48299e..a8214fac26a2311be696dfe399f670e494821847 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -322,6 +322,12 @@ public abstract class Context { */ 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 93f75206918f547b9b9bd0969bb42b65eb90f4b8..852e5f708ec3d313d2b4f60a579bfc2b501bfc2b 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -1709,19 +1709,6 @@ public class Intent implements Parcelable, Cloneable { @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_UNINSTALL_PACKAGE = "android.intent.action.UNINSTALL_PACKAGE"; - /** - * Activity Action: Launch application uninstaller. - *

- * 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}. - *

- * Output: Nothing. - *

- */ - @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) - public static final String ACTION_CLEAR_PACKAGE = "android.intent.action.CLEAR_PACKAGE"; - /** * Specify whether the package should be uninstalled for all users. * @hide because these should not be part of normal application flow. @@ -1839,6 +1826,14 @@ public class Intent implements Parcelable, Cloneable { @SystemApi public static final String EXTRA_SPLIT_NAME = "android.intent.extra.SPLIT_NAME"; + /** + * Intent extra: A {@link ComponentName} value. + *

+ * Type: String + *

+ */ + public static final String EXTRA_COMPONENT_NAME = "android.intent.extra.COMPONENT_NAME"; + /** * Intent extra: An extra for specifying whether a result is needed. *

@@ -3228,6 +3223,7 @@ public class Intent implements Parcelable, Cloneable { * caused the broadcast. * @hide */ + @SystemApi public static final String ACTION_GLOBAL_BUTTON = "android.intent.action.GLOBAL_BUTTON"; /** @@ -3388,32 +3384,6 @@ public class Intent implements Parcelable, Cloneable { public static final String ACTION_DYNAMIC_SENSOR_CHANGED = "android.intent.action.DYNAMIC_SENSOR_CHANGED"; - /** - * Broadcast Action: The default subscription has changed. This has the following - * extra values:

- * 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:

- * {@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 @@ -4421,6 +4391,21 @@ public class Intent implements Parcelable, Cloneable { */ 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 diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java index 0be0885c5bdcf94eb0011f541fa7182afc0bb436..cf7f017daf607315f2b12c60605377e318fb0163 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -883,9 +883,12 @@ public class ActivityInfo extends ComponentInfo /** * 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; diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 6c5d26a9706f543560ddcf8e5a588eace475acb9..06f7916be4b634a039a3a46cb8e1467a5ea9e143 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -1205,7 +1205,8 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { 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 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { 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/IDexModuleRegisterCallback.aidl b/core/java/android/content/pm/IDexModuleRegisterCallback.aidl new file mode 100644 index 0000000000000000000000000000000000000000..4af6999c09bac00485ad75a428ad7cc75293bd89 --- /dev/null +++ b/core/java/android/content/pm/IDexModuleRegisterCallback.aidl @@ -0,0 +1,28 @@ +/* +** Copyright 2017, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + +package android.content.pm; + +import android.os.Bundle; + +/** + * Callback for registering a dex module with the Package Manager. + * + * @hide + */ +oneway interface IDexModuleRegisterCallback { + void onDexModuleRegistered(in String dexModulePath, in boolean success, in String message); +} diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index c7dd1fad4edc69dd56db785826bb09d30a56f7c4..77891fa84f78eb87a71b71c352236ecbe5c656ac 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -25,6 +25,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.ChangedPackages; import android.content.pm.InstantAppInfo; import android.content.pm.FeatureInfo; +import android.content.pm.IDexModuleRegisterCallback; import android.content.pm.IPackageInstallObserver2; import android.content.pm.IPackageInstaller; import android.content.pm.IPackageDeleteObserver; @@ -473,6 +474,38 @@ interface IPackageManager { */ void notifyDexLoad(String loadingPackageName, in List dexPaths, String loaderIsa); + /** + * Register an application dex module with the package manager. + * The package manager will keep track of the given module for future optimizations. + * + * Dex module optimizations will disable the classpath checking at runtime. The client bares + * the responsibility to ensure that the static assumptions on classes in the optimized code + * hold at runtime (e.g. there's no duplicate classes in the classpath). + * + * Note that the package manager already keeps track of dex modules loaded with + * {@link dalvik.system.DexClassLoader} and {@link dalvik.system.PathClassLoader}. + * This can be called for an eager registration. + * + * The call might take a while and the results will be posted on the main thread, using + * the given callback. + * + * If the module is intended to be shared with other apps, make sure that the file + * permissions allow for it. + * If at registration time the permissions allow for others to read it, the module would + * be marked as a shared module which might undergo a different optimization strategy. + * (usually shared modules will generated larger optimizations artifacts, + * taking more disk space). + * + * @param packageName the package name to which the dex module belongs + * @param dexModulePath the absolute path of the dex module. + * @param isSharedModule whether or not the module is intended to be used by other apps. + * @param callback if not null, + * {@link android.content.pm.IDexModuleRegisterCallback.IDexModuleRegisterCallback#onDexModuleRegistered} + * will be called once the registration finishes. + */ + void registerDexModule(in String packageName, in String dexModulePath, + in boolean isSharedModule, IDexModuleRegisterCallback callback); + /** * Ask the package manager to perform a dex-opt for the given reason. The package * manager will map the reason to a compiler filter according to the current system diff --git a/core/java/android/content/pm/InstantAppRequest.java b/core/java/android/content/pm/InstantAppRequest.java index b45169d324be6d799ff49daf034551d43e9a5159..27d28287b6ae3a6e6136bb769a6ba5bdb59e59e5 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 class InstantAppRequest { 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 f6f1be63baeedae4a7145a328fd08ba286d1ce20..3faa9517d17a78c7b028a341ee7bde10ba186d0f 100644 --- a/core/java/android/content/pm/InstrumentationInfo.java +++ b/core/java/android/content/pm/InstrumentationInfo.java @@ -19,7 +19,6 @@ package android.content.pm; 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 @@ public class InstrumentationInfo extends PackageItemInfo implements Parcelable { * 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 class InstrumentationInfo extends PackageItemInfo implements Parcelable { 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 class InstrumentationInfo extends PackageItemInfo implements Parcelable { 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 @@ public class InstrumentationInfo extends PackageItemInfo implements Parcelable { private InstrumentationInfo(Parcel source) { super(source); targetPackage = source.readString(); - targetProcess = source.readString(); + targetProcesses = source.readString(); sourceDir = source.readString(); publicSourceDir = source.readString(); splitNames = source.readStringArray(); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 10b7965c58ea85868002d84f97c1b3e636a44dc8..07125e035edce7de6a56a4464801da46ca510d26 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -5725,4 +5725,48 @@ public abstract class PackageManager { * @hide */ public abstract String getInstantAppAndroidId(String packageName, @NonNull UserHandle user); + + /** + * Callback use to notify the callers of module registration that the operation + * has finished. + * + * @hide + */ + @SystemApi + public static abstract class DexModuleRegisterCallback { + public abstract void onDexModuleRegistered(String dexModulePath, boolean success, + String message); + } + + /** + * Register an application dex module with the package manager. + * The package manager will keep track of the given module for future optimizations. + * + * Dex module optimizations will disable the classpath checking at runtime. The client bares + * the responsibility to ensure that the static assumptions on classes in the optimized code + * hold at runtime (e.g. there's no duplicate classes in the classpath). + * + * Note that the package manager already keeps track of dex modules loaded with + * {@link dalvik.system.DexClassLoader} and {@link dalvik.system.PathClassLoader}. + * This can be called for an eager registration. + * + * The call might take a while and the results will be posted on the main thread, using + * the given callback. + * + * If the module is intended to be shared with other apps, make sure that the file + * permissions allow for it. + * If at registration time the permissions allow for others to read it, the module would + * be marked as a shared module which might undergo a different optimization strategy. + * (usually shared modules will generated larger optimizations artifacts, + * taking more disk space). + * + * @param dexModulePath the absolute path of the dex module. + * @param callback if not null, {@link DexModuleRegisterCallback#onDexModuleRegistered} will + * be called once the registration finishes. + * + * @hide + */ + @SystemApi + public abstract void registerDexModule(String dexModulePath, + @Nullable DexModuleRegisterCallback callback); } diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 7bfde751e1559a1ec3b7682b956d6dee3503b2e7..426f3cf792aa519bc6ee57e86bc956593296b802 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -19,6 +19,7 @@ package android.content.pm; 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 @@ public abstract class PackageManagerInternal { * @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 @@ public abstract class PackageManagerInternal { * @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 e4db0f07b80180ec6e46aa6be13f01eb61480399..9b0bab427478b9a7407f75281d28fad6883c8256 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -148,7 +148,7 @@ public class PackageParser { 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 @@ public class PackageParser { 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 class PackageParser { */ public interface Callback { boolean hasFeature(String feature); + String[] getOverlayPaths(String targetPackageName, String targetPath); + String[] getOverlayApks(String targetPackageName); } /** @@ -563,6 +565,14 @@ public class PackageParser { @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 @@ public class PackageParser { 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 @@ public class PackageParser { 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 @@ public class PackageParser { * 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 @@ public class PackageParser { * @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 @@ public class PackageParser { 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 @@ public class PackageParser { 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 @@ public class PackageParser { 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 @@ public class PackageParser { 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 @@ public class PackageParser { /** * @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 @@ public class PackageParser { 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 650b4c008dcc561580803190b112f7aa45ae0957..f312204e9467a5bb102ebfc5b233a1a19cf9b0a5 100644 --- a/core/java/android/content/pm/ResolveInfo.java +++ b/core/java/android/content/pm/ResolveInfo.java @@ -71,6 +71,10 @@ public class ResolveInfo implements Parcelable { /** * Whether or not an instant app is available for the resolved intent. */ + public boolean isInstantAppAvailable; + + /** @removed */ + @Deprecated public boolean instantAppAvailable; /** @@ -330,7 +334,8 @@ public class ResolveInfo implements Parcelable { system = orig.system; targetUserId = orig.targetUserId; handleAllWebDataURI = orig.handleAllWebDataURI; - instantAppAvailable = orig.instantAppAvailable; + isInstantAppAvailable = orig.isInstantAppAvailable; + instantAppAvailable = isInstantAppAvailable; } public String toString() { @@ -394,7 +399,7 @@ public class ResolveInfo implements Parcelable { 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 CREATOR @@ -442,7 +447,7 @@ public class ResolveInfo implements Parcelable { 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 0ad4874d41fe24586af899ebce5b43983002ef0d..5032e6a59a8b415944220f31a4448a62d65c0bcf 100644 --- a/core/java/android/content/pm/SharedLibraryInfo.java +++ b/core/java/android/content/pm/SharedLibraryInfo.java @@ -131,7 +131,7 @@ public final class SharedLibraryInfo implements Parcelable { * * @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 83e78152862e5a3230b3c69586e182e2e75f0412..29c5efe7c77adb0e208e182008adc9294e013cf7 100644 --- a/core/java/android/content/pm/VersionedPackage.java +++ b/core/java/android/content/pm/VersionedPackage.java @@ -28,7 +28,7 @@ import java.lang.annotation.RetentionPolicy; */ 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 @@ public final class VersionedPackage implements Parcelable { private VersionedPackage(Parcel parcel) { mPackageName = parcel.readString(); - mVersionCode = parcel.readLong(); + mVersionCode = parcel.readInt(); } /** @@ -66,7 +66,7 @@ public final class VersionedPackage implements Parcelable { * * @return The version code. */ - public @VersionCode long getVersionCode() { + public @VersionCode int getVersionCode() { return mVersionCode; } @@ -83,7 +83,7 @@ public final class VersionedPackage implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeString(mPackageName); - parcel.writeLong(mVersionCode); + parcel.writeInt(mVersionCode); } public static final Creator CREATOR = new Creator() { diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index 061346c18bbe292999c4583ae43694d9dc5c7686..aa35a6610db7aec74a3fc2fa336d34687b72db85 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -189,7 +189,7 @@ public class Camera { * *

In {@link android.os.Build.VERSION_CODES#O Android O} this broadcast has been brought * back, but only for registered 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.

*/ @@ -208,12 +208,11 @@ public class Camera { * *

In {@link android.os.Build.VERSION_CODES#O Android O} this broadcast has been brought * back, but only for registered 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.

*/ @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 9d217d3652a0a3b5e618d60a273a480cb23c8a5d..7049628b3590903d28dfeb5c8b18d4325b225d00 100644 --- a/core/java/android/hardware/HardwareBuffer.java +++ b/core/java/android/hardware/HardwareBuffer.java @@ -70,37 +70,34 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable { /** @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 {}; - - /** 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); + @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 {}; + + /** 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 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable { * {@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 HardwareBuffer 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 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable { */ @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 80cbde75efd2b0c232b9a61246a17b9e660949b3..0dab5d7b1453211ec8449d5c1d716df765398833 100644 --- a/core/java/android/hardware/SystemSensorManager.java +++ b/core/java/android/hardware/SystemSensorManager.java @@ -589,9 +589,9 @@ public class SystemSensorManager extends SensorManager { "Width if HaradwareBuffer must be greater than " + MIN_DIRECT_CHANNEL_BUFFER_SIZE); } - if ((hardwareBuffer.getUsage() & HardwareBuffer.USAGE0_SENSOR_DIRECT_DATA) == 0) { + if ((hardwareBuffer.getUsage() & HardwareBuffer.USAGE_SENSOR_DIRECT_DATA) == 0) { throw new IllegalArgumentException( - "HardwareBuffer must set usage flag USAGE0_SENSOR_DIRECT_DATA"); + "HardwareBuffer must set usage flag USAGE_SENSOR_DIRECT_DATA"); } size = hardwareBuffer.getWidth(); id = nativeCreateDirectChannel( diff --git a/core/java/android/hardware/radio/RadioManager.java b/core/java/android/hardware/radio/RadioManager.java index 7a2fa767f0909c0b232b89e57456a149d7d7bd4e..e659a3ecdc416b06771c810d10cc240e28fc2436 100644 --- a/core/java/android/hardware/radio/RadioManager.java +++ b/core/java/android/hardware/radio/RadioManager.java @@ -840,8 +840,9 @@ public class RadioManager { if (!(obj instanceof BandConfig)) return false; BandConfig other = (BandConfig) obj; - if (mDescriptor != other.getDescriptor()) - return false; + BandDescriptor otherDesc = other.getDescriptor(); + if ((mDescriptor == null) != (otherDesc == null)) return false; + if (mDescriptor != null && !mDescriptor.equals(otherDesc)) return false; return true; } } diff --git a/core/java/android/metrics/LogMaker.java b/core/java/android/metrics/LogMaker.java index 3c6baa76558af83f3d5c755716244d590cc56f4d..2bb43bd36be3bd6caddcc731ccbe8f02a5553e30 100644 --- a/core/java/android/metrics/LogMaker.java +++ b/core/java/android/metrics/LogMaker.java @@ -169,6 +169,27 @@ public class LogMaker { return this; } + /** + * 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. @@ -319,6 +340,16 @@ public class LogMaker { } } + /** @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 5be977ae183d9dd3bd9f01f8016921503e997049..5f356ca00d88fd73b0b2e127c5981621b3a363e2 100644 --- a/core/java/android/metrics/MetricsReader.java +++ b/core/java/android/metrics/MetricsReader.java @@ -93,6 +93,7 @@ public class MetricsReader { } 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 class MetricsReader { 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 @@ public class MetricsReader { mTimeMillis = TimeUnit.MILLISECONDS.convert( nativeEvent.getTimeNanos(), TimeUnit.NANOSECONDS); mPid = nativeEvent.getProcessId(); + mUid = nativeEvent.getUid(); mData = nativeEvent.getData(); } @@ -178,6 +182,10 @@ public class MetricsReader { 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 d6acae0ba50c732e2c7115e74debbcd963f9106a..5edefb5e23596d6e6a2b582d6190f18f0a2b16f2 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -2982,11 +2982,6 @@ public class ConnectivityManager { } /** - * 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. * @@ -2999,7 +2994,7 @@ public class ConnectivityManager { * request that timed out is not an error. * *

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 + * timeout) - {@link #registerNetworkCallback(NetworkRequest, NetworkCallback)} is provided * for that purpose. Calling this method will attempt to bring up the requested network. * *

This method requires the caller to hold either the @@ -3008,13 +3003,11 @@ public class ConnectivityManager { * {@link android.provider.Settings.System#canWrite}.

* * @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 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). - * @hide */ public void requestNetwork(NetworkRequest request, NetworkCallback networkCallback, int timeoutMs) { @@ -3025,43 +3018,6 @@ public class ConnectivityManager { requestNetwork(request, networkCallback, timeoutMs, legacyType, getDefaultHandler()); } - /** - * 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. - * - *

Do not use this method to poll for the existence of specific networks (e.g. with a small - * timeout) - {@link #registerNetworkCallback(NetworkRequest, NetworkCallback)} is provided - * for that purpose. Calling this method will attempt to bring up the requested network. - * - *

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}.

- * - * @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. 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) { - 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 @@ -3084,14 +3040,14 @@ public class ConnectivityManager { * {@link android.provider.Settings.System#canWrite}.

* * @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"); } @@ -3424,11 +3380,27 @@ public class ConnectivityManager { } } + /** + * 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 63a1f0513e20b40163906f0173513996badc0f10..27729dcce7794f8aec0bf31b1934f8b9bbe0dcc1 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -161,6 +161,7 @@ interface IConnectivityManager 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/NetworkBadging.java b/core/java/android/net/NetworkBadging.java index b4ef69542bd1933183d6a20304f4407a93ed43a2..6de28b7146e86cab6c65d25ba01c02447d0472c7 100644 --- a/core/java/android/net/NetworkBadging.java +++ b/core/java/android/net/NetworkBadging.java @@ -35,9 +35,10 @@ import java.lang.annotation.RetentionPolicy; /** * 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 1eaa1f90d64c99c6fd4372293b36af169a41c3cd..d7b58f77962543ebed00ed8dc82c0ccbea5b08db 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 @@ public abstract class NetworkRecommendationProvider { 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 @@ public abstract class NetworkRecommendationProvider { * 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 @@ public abstract class NetworkRecommendationProvider { * 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 @@ public abstract class NetworkRecommendationProvider { * is available. * * @deprecated to be removed. + * @removed */ public static class ResultCallback { private final IRemoteCallback mCallback; diff --git a/core/java/android/net/RecommendationRequest.java b/core/java/android/net/RecommendationRequest.java index 45ee3a5283dd4c31cede426fff51cc599a556b74..21641d9e7fe3b3b0c3c3833c5be6b98c242d9ea2 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 @@ import com.android.internal.annotations.VisibleForTesting; * @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 @@ public final class RecommendationRequest implements Parcelable { * 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 ce4d83af3f0170716468a305bfc97474741a9fd0..d66dd22de40a7c9b351e7ccca4d09489bbb980c3 100644 --- a/core/java/android/net/RecommendationResult.java +++ b/core/java/android/net/RecommendationResult.java @@ -18,12 +18,10 @@ package android.net; 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 @@ import com.android.internal.util.Preconditions; * @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/net/nsd/NsdManager.java b/core/java/android/net/nsd/NsdManager.java index 83c469103f55807fe99d828aeb49a3faa6765f30..4c33c36dc16b1e434780c4c7df0cf0b41ead3b8d 100644 --- a/core/java/android/net/nsd/NsdManager.java +++ b/core/java/android/net/nsd/NsdManager.java @@ -393,6 +393,8 @@ public final class NsdManager { ((RegistrationListener) listener).onUnregistrationFailed(ns, message.arg1); break; case UNREGISTER_SERVICE_SUCCEEDED: + // TODO: do not unregister listener until service is unregistered, or provide + // alternative way for unregistering ? removeListener(message.arg2); ((RegistrationListener) listener).onServiceUnregistered(ns); break; diff --git a/core/java/android/os/Bundle.java b/core/java/android/os/Bundle.java index 167c46d6ded06f3205c021316909852041dc8fb2..9b5ff29d592e5a16b988d146f18be122fb96dfb9 100644 --- a/core/java/android/os/Bundle.java +++ b/core/java/android/os/Bundle.java @@ -25,7 +25,6 @@ import android.util.SparseArray; 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. @@ -476,18 +475,6 @@ public final class Bundle extends BaseBundle implements Cloneable, Parcelable { mMap.put(key, value); } - /** - * 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 @@ -865,26 +852,6 @@ public final class Bundle extends BaseBundle implements Cloneable, Parcelable { } } - /** - * 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 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 diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl index b71578060fdcf60f7e84681e68d007b0b205d688..037cccf14615baaf5fa7d0f236b53bb68517adcd 100644 --- a/core/java/android/os/IPowerManager.aidl +++ b/core/java/android/os/IPowerManager.aidl @@ -55,6 +55,7 @@ interface IPowerManager 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 c1647c74f36360cbf070b2f6b49f2bbd6f87ec26..28bdacfaea9c33a11e1cab4323d48f93cccf6b74 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -50,7 +50,6 @@ import java.util.HashMap; 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 @@ public final class Parcel { 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. @@ -830,15 +828,6 @@ public final class Parcel { writeFloat(val.getHeight()); } - /** - * 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 @@ -1687,9 +1676,6 @@ public final class Parcel { } 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) { @@ -2193,13 +2179,6 @@ public final class Parcel { return new SizeF(width, height); } - /** - * 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. */ @@ -2750,9 +2729,6 @@ public final class Parcel { 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 a713eef72c45aec4729de666e520bac415e54b2e..7d1369fe1b69484d55e49b36f99d1e32b811c1bf 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 final class PowerManager { */ 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; @@ -1084,6 +1130,22 @@ public final class PowerManager { com.android.internal.R.bool.config_sustainedPerformanceModeSupported); } + /** + * 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/TestLooperManager.java b/core/java/android/os/TestLooperManager.java index 745642efc42320c8e36ede9ac83219bfe975e42a..5e7549fa67d83000f8670466256391669dfeb24f 100644 --- a/core/java/android/os/TestLooperManager.java +++ b/core/java/android/os/TestLooperManager.java @@ -58,11 +58,17 @@ public class TestLooperManager { /** * 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 548a46098a3af50c834f1850a4852df0a7ea172a..52b2f52c452e97dc18028f51f3f0aa4609d7ba07 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -218,9 +218,9 @@ public class UserManager { public static final String DISALLOW_BLUETOOTH = "no_bluetooth"; /** - * Specifies if 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. + * 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. * *

Default is true 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 diff --git a/core/java/android/os/VintfRuntimeInfo.java b/core/java/android/os/VintfRuntimeInfo.java new file mode 100644 index 0000000000000000000000000000000000000000..29698b9fa68442c98c83a6ac6348c38706108ae3 --- /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 baa29b078dd8e13292638e77adafea076d7ac37e..bd43d6a3c2185b0e9ded849cbdafc0fc1f8e9e04 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -19,14 +19,18 @@ package android.os.storage; 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 @@ public class StorageManager { * 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 @@ public class StorageManager { * @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 class StorageManager { 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 @@ public class StorageManager { } } - /** - * 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 class StorageManager { 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 @@ public class StorageManager { * 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 @@ public class StorageManager { * 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 @@ public class StorageManager { * @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 @@ public class StorageManager { * the returned value will fail. *

* 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. *

@@ -1670,13 +1670,19 @@ public class StorageManager { * 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 @@ public class StorageManager { * 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 @@ public class StorageManager { /** @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 @@ public class StorageManager { * 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/ContactsContract.java b/core/java/android/provider/ContactsContract.java index 5408e1319e36558f915637892b14c60fc12237f9..70ef0355af8ce9cb4f8112841f57e0d535eee8c8 100644 --- a/core/java/android/provider/ContactsContract.java +++ b/core/java/android/provider/ContactsContract.java @@ -8915,15 +8915,11 @@ public final class ContactsContract { * ambiguous then the activity should prompt the user for the recipient to send the message * to. *

- * Voice Assistant may provide additional information to messaging app about which account - * to use for sending a message by populating {@link #EXTRA_SENDER_ACCOUNT_HASH}. - *

* Output: nothing * * @see #EXTRA_RECIPIENT_CONTACT_URI * @see #EXTRA_RECIPIENT_CONTACT_CHAT_ID * @see #EXTRA_RECIPIENT_CONTACT_NAME - * @see #EXTRA_SENDER_ACCOUNT_HASH * @see #METADATA_ACCOUNT_TYPE * @see #METADATA_MIMETYPE */ @@ -8981,21 +8977,6 @@ public final class ContactsContract { public static final String EXTRA_RECIPIENT_CONTACT_NAME = "android.provider.extra.RECIPIENT_CONTACT_NAME"; - /** - * This optional extra specifies the hash of the account that should be used by messaging - * app for sending voice message with {@link #ACTION_VOICE_SEND_MESSAGE_TO_CONTACTS}. The - * value of this extra is a {@code String} and should be the value of {@link - * android.accounts.Account#hashCode()} for some account returned by {@link - * android.accounts.AccountManager#getAccounts()}. - *

- * If the extra is not specified, the app can decide which account to use. - *

- * If the account specified in the extra cannot be used for any reason (account missing, not - * usable by the app, etc), the message should not be sent. - */ - public static final String EXTRA_SENDER_ACCOUNT_HASH = - "android.provider.extra.SENDER_ACCOUNT_HASH"; - /** * A string associated with an {@link #ACTION_VOICE_SEND_MESSAGE_TO_CONTACTS} activity * describing {@link RawContacts#ACCOUNT_TYPE} for the corresponding Contacts Provider diff --git a/core/java/android/provider/FontsContract.java b/core/java/android/provider/FontsContract.java index 6c038c787d59c51acd7ad9ac35613ef0267b00e4..f90911421e1091b968f51b2b6b078e6f61a07162 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,48 +600,11 @@ public class FontsContract { 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 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} * @@ -792,7 +754,7 @@ public class FontsContract { @VisibleForTesting public static @NonNull FontInfo[] getFontFromProvider( Context context, FontRequest request, String authority, - CancellationSignal cancellationSignal) throws InvalidFormatException { + CancellationSignal cancellationSignal) { ArrayList 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 7f1b437d75ddd0cdaeb9d5492c9f7a73538c2d00..ea58925479699962295d39b9ac6e8ecc50bb20b9 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -723,6 +723,19 @@ public final class Settings { public static final String ACTION_APPLICATION_DETAILS_SETTINGS = "android.settings.APPLICATION_DETAILS_SETTINGS"; + /** + * Activity Action: Show list of applications that have been running + * foreground services (to the user "running in the background"). + *

+ * Input: Extras "packages" is a string array of package names. + *

+ * 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. *

@@ -6621,6 +6634,13 @@ public final class Settings { */ 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. @@ -7087,6 +7107,12 @@ public final class Settings { 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); @@ -7732,6 +7758,14 @@ public final class Settings { public static final String LOCATION_BACKGROUND_THROTTLE_INTERVAL_MS = "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 @@ -7739,7 +7773,22 @@ public final class Settings { 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 @@ -8966,13 +9015,30 @@ public final class Settings { * 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: * *

-         * 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)
          * 
* *

diff --git a/core/java/android/service/autofill/AutofillService.java b/core/java/android/service/autofill/AutofillService.java index 416455d596be34f4652ba1fd1deafd1cf7b28749..88d17ef32c1393e1ec5eab374ccb313d8c3331db 100644 --- a/core/java/android/service/autofill/AutofillService.java +++ b/core/java/android/service/autofill/AutofillService.java @@ -119,7 +119,7 @@ public abstract class AutofillService extends Service { try { onFillRequest(request, cancellation, fillCallback); } catch (AbstractMethodError e) { - final ArrayList contexts = request.getFillContexts(); + final List contexts = request.getFillContexts(); onFillRequest(contexts.get(contexts.size() - 1).getStructure(), request.getClientState(), request.getFlags(), cancellation, fillCallback); diff --git a/core/java/android/service/autofill/Dataset.java b/core/java/android/service/autofill/Dataset.java index e04fae7bc2b519e70d53cdb8e06b201398616b42..69f3f6723244f50efe288fbe543c52efa85804b3 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.content.IntentSender; 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 @@ public final class Dataset implements Parcelable { @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 8a28c45d145f3b0693a7a46bb10049537eeef74e..d6616bfb8d6650116e68e3253607bab9f10e6c89 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 @@ public final class FillContext implements Parcelable { @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 8ac399c776ec8f2501945eb2697d4bcbaae4e7b9..b1145ee38929d8b15dfa009ae595fc19a5c84b53 100644 --- a/core/java/android/service/autofill/FillRequest.java +++ b/core/java/android/service/autofill/FillRequest.java @@ -29,6 +29,7 @@ import com.android.internal.util.Preconditions; 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 @@ public final class FillRequest implements Parcelable { /** * @return The contexts associated with each previous fill request. */ - public @NonNull ArrayList getFillContexts() { + public @NonNull List getFillContexts() { return mContexts; } diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java index 5c8f3cec9c598ed26e34694acdac31dd5c8ff2bc..1914db9eb43879e599cc515383eeef6541b98bf9 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.view.autofill.AutofillManager; import android.widget.RemoteViews; import java.util.ArrayList; +import java.util.Arrays; /** * Response for a {@link @@ -258,12 +259,17 @@ public final class FillResponse implements Parcelable { * @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"); @@ -274,17 +280,6 @@ public final class FillResponse implements Parcelable { return this; } - /** - * 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, @@ -394,8 +389,9 @@ public final class FillResponse implements Parcelable { ///////////////////////////////////// @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 @@ public final class FillResponse implements Parcelable { .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 @@ public final class FillResponse implements Parcelable { } 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 94e5e3ec0d50d34b6825131c57fe93f959ce61a5..277c6223985b5bd2ca96377d84c9ad6f453b3c8f 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 @@ public final class SaveInfo implements Parcelable { ///////////////////////////////////// @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 00bd30456c9ead611bd84cc859fe564e4d7726c3..76c96bd41475875ce0e64e19dd7bba1e7613297d 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -1094,9 +1094,9 @@ public abstract class NotificationListenerService extends Service { /** * Request that the service be unbound. * - *

This will no longer receive updates until - * {@link #requestRebind(ComponentName)} is called. - * The service will likely be kiled by the system after this call. + *

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. * *

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/oemlock/OemLockManager.java b/core/java/android/service/oemlock/OemLockManager.java index 9e69362708142ceeca73b124f78a1c61b8042092..644ca6c435063f8018ca8ee9bd9cc9be2956d63c 100644 --- a/core/java/android/service/oemlock/OemLockManager.java +++ b/core/java/android/service/oemlock/OemLockManager.java @@ -147,7 +147,7 @@ public class OemLockManager { */ public boolean isDeviceOemUnlocked() { try { - return mService.isOemUnlockAllowed(); + return mService.isDeviceOemUnlocked(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/service/quicksettings/TileService.java b/core/java/android/service/quicksettings/TileService.java index 56b267fb2c9dd42e14614dc32e02c9727d5067c4..c35423fb09c61be3411e23994fa9773622afcd6f 100644 --- a/core/java/android/service/quicksettings/TileService.java +++ b/core/java/android/service/quicksettings/TileService.java @@ -80,8 +80,13 @@ import com.android.internal.R; 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. + *

+ * 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 @@ -129,13 +134,6 @@ public class TileService extends Service { */ 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 */ @@ -445,7 +443,7 @@ public class TileService extends Service { */ 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/IWallpaperConnection.aidl b/core/java/android/service/wallpaper/IWallpaperConnection.aidl index f9c5aaa97612f312181ea72661243182964dcf7e..3c3ef0c0e9eb4e7440392f1d1b3db0c28475ab97 100644 --- a/core/java/android/service/wallpaper/IWallpaperConnection.aidl +++ b/core/java/android/service/wallpaper/IWallpaperConnection.aidl @@ -18,6 +18,7 @@ package android.service.wallpaper; import android.os.ParcelFileDescriptor; import android.service.wallpaper.IWallpaperEngine; +import android.app.WallpaperColors; /** * @hide @@ -26,4 +27,5 @@ interface IWallpaperConnection { void attachEngine(IWallpaperEngine engine); void engineShown(IWallpaperEngine engine); ParcelFileDescriptor setWallpaper(String name); + void onWallpaperColorsChanged(in WallpaperColors colors); } diff --git a/core/java/android/service/wallpaper/IWallpaperEngine.aidl b/core/java/android/service/wallpaper/IWallpaperEngine.aidl index de527e958c6b24f881e71ec54d1a3942857dcb22..eff52e6ca1b5fbf5cc80b3b8dcd609c4a392d12e 100644 --- a/core/java/android/service/wallpaper/IWallpaperEngine.aidl +++ b/core/java/android/service/wallpaper/IWallpaperEngine.aidl @@ -30,5 +30,5 @@ oneway interface IWallpaperEngine { void dispatchPointer(in MotionEvent event); void dispatchWallpaperCommand(String action, int x, int y, int z, in Bundle extras); - void destroy(); + void destroy(); } diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index 98780a7d73d56f3c8e0616e4c3c6adb30f73c2e3..539278fd47f1e7ce256f99697330e075d6301292 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -550,6 +550,12 @@ public abstract class WallpaperService extends Service { * This will trigger a {@link #onComputeWallpaperColors()} call. */ public void invalidateColors() { + try { + mConnection.onWallpaperColorsChanged(onComputeWallpaperColors()); + } catch (RemoteException e) { + Log.w(TAG, "Can't invalidate wallpaper colors because " + + "wallpaper connection was lost", e); + } } /** @@ -562,7 +568,7 @@ public abstract class WallpaperService extends Service { 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); out.print(" mDestroyed="); out.println(mDestroyed); @@ -1199,6 +1205,7 @@ public abstract class WallpaperService extends Service { mEngine = engine; mActiveEngines.add(engine); engine.attach(this); + engine.invalidateColors(); return; } case DO_DETACH: { diff --git a/core/java/android/speech/tts/UtteranceProgressListener.java b/core/java/android/speech/tts/UtteranceProgressListener.java index ef81f12113644047541bb7833db55fca7914e7ad..7381a12af083bed2bc77550060fbfad8e09877bb 100644 --- a/core/java/android/speech/tts/UtteranceProgressListener.java +++ b/core/java/android/speech/tts/UtteranceProgressListener.java @@ -144,9 +144,8 @@ public abstract class UtteranceProgressListener { 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/util/EventLog.java b/core/java/android/util/EventLog.java index 6d4281b9e0f7107464a447ca64e7d15c19823525..92f218b4155aa02eab7e6aafb698ec124e358789 100644 --- a/core/java/android/util/EventLog.java +++ b/core/java/android/util/EventLog.java @@ -68,6 +68,7 @@ public class EventLog { 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 @@ public class EventLog { return mBuffer.getInt(PROCESS_OFFSET); } + /** + * @return the UID which wrote the log entry + * @hide + */ + @SystemApi + public int getUid() { + try { + return mBuffer.getInt(UID_OFFSET); + } catch (IndexOutOfBoundsException e) { + // buffer won't contain the UID if the caller doesn't have permission. + return -1; + } + } + /** @return the thread ID which wrote the log entry */ public int getThreadId() { return mBuffer.getInt(THREAD_OFFSET); diff --git a/core/java/android/util/Log.java b/core/java/android/util/Log.java index d857bf712bfe91b8eb1cd618f349d5a40a2f825a..951aa8df9ea31fa5ad519a1a0d2df5b8bed7b433 100644 --- a/core/java/android/util/Log.java +++ b/core/java/android/util/Log.java @@ -89,8 +89,9 @@ public final class Log { /** * Exception class used to capture a stack trace in {@link #wtf}. + * @hide */ - private static class TerribleFailure extends Exception { + public static class TerribleFailure extends Exception { TerribleFailure(String msg, Throwable cause) { super(msg, cause); } } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index cb06a8bb2a6fd30ab2585c36b11594addb4a57ad..e9e9d7cc33dc08000016f757ef3d3e601c9c74b7 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -804,6 +804,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ 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 class View implements Drawable.Callback, KeyEvent.Callback, */ 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 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * 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 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * 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 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * * @param structure Fill in with structured view data. The default implementation * fills in all data that can be inferred from the view itself. - * @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 @@ public class View implements Drawable.Callback, KeyEvent.Callback, *

See {@link #autofill(AutofillValue)} and * {@link #onProvideAutofillVirtualStructure(ViewStructure, int)} for more info. *

To indicate that a virtual view was autofilled - * @android:drawable/autofilled_highlight should be drawn over it until the data + * ?android:attr/autofilledHighlight 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 values) { } @@ -7546,6 +7571,17 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /** * Sets the mode for determining whether this View is important for autofill. * + *

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. + * + *

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. + * *

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 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * * @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(); @@ -7642,9 +7694,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return mContext.getSystemService(AutofillManager.class); } - /** @hide */ - public boolean isAutofillable() { - return getAutofillType() != AUTOFILL_TYPE_NONE && !isAutofillBlocked(); + private boolean isAutofillable() { + return getAutofillType() != AUTOFILL_TYPE_NONE && isImportantForAutofill(); } private void populateVirtualStructure(ViewStructure structure, @@ -7728,26 +7779,33 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * set the {@link AutofillId} in the structure (for example, by calling * {@code structure.setAutofillId(getAutofillId())}). * + *

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); @@ -9583,22 +9641,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return (mPrivateFlags3 & PFLAG3_ASSIST_BLOCKED) != 0; } - /** - * @hide - * Indicates whether this view will participate in data collection through - * {@link ViewStructure} for autofill purposes. - * - *

If {@code true}, it will not provide any data for itself or its children. - *

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 @@ -16577,6 +16619,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @param config Configuration of the resources on new display after move. * * @see #onConfigurationChanged(Configuration) + * @hide */ public void onMovedToDisplay(int displayId, Configuration config) { } @@ -20373,15 +20416,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * * @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; @@ -20396,8 +20437,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, 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); + } } } @@ -21084,7 +21127,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ @Nullable public final 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 b783482378648978d682dd1b7006002ce0e61836..18c1b8c3ad228ee9ca2d6c70cf8c916c45e4119d 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -57,7 +57,6 @@ import android.view.animation.Animation; 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 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * 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 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * 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 list) { + private void populateChildrenForAutofill(ArrayList list, @AutofillFlags int flags) { final int childrenCount = mChildrenCount; if (childrenCount <= 0) { return; @@ -3482,10 +3482,11 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager 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 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager 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 fb910b83e927b79390f90df697d11b9a1a639d65..f71589c6c5ef5d28f7fb176eebfb5994dcd392f7 100644 --- a/core/java/android/view/ViewStructure.java +++ b/core/java/android/view/ViewStructure.java @@ -26,7 +26,7 @@ import android.util.Pair; 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 @@ -429,7 +429,7 @@ public abstract class ViewStructure { * @return list of key/value pairs; could contain pairs with the same keys. */ @Nullable - public abstract ArrayList> getAttributes(); + public abstract List> 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 4c266a66a7af1b273e7edd8c24a56586f6885547..c8f297ae9c1f7a5b467a88b6dbb2f5336ec1598c 100644 --- a/core/java/android/view/accessibility/AccessibilityManager.java +++ b/core/java/android/view/accessibility/AccessibilityManager.java @@ -23,10 +23,12 @@ import android.accessibilityservice.AccessibilityServiceInfo; 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; @@ -1113,6 +1115,19 @@ public final class AccessibilityManager { } } + /** + * 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 94a4547fca64fdc6c28f8992df80e277f5fad28f..5148d92a827997dfa2f895e4c7b2e59e5d18fa76 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java @@ -487,7 +487,7 @@ public class AccessibilityNodeInfo implements Parcelable { * @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 @@ public class AccessibilityNodeInfo implements Parcelable { * @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 2a7537b08921d449ec623dbf4c4a1c2d0adac1d1..f11767debbc92caa2ed4c1005a9c8198deeaaeb4 100644 --- a/core/java/android/view/accessibility/AccessibilityWindowInfo.java +++ b/core/java/android/view/accessibility/AccessibilityWindowInfo.java @@ -231,8 +231,18 @@ public final class AccessibilityWindowInfo implements Parcelable { * 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 268f7f3557d1f4ff9db4d21856731053dc00e72b..1cee529b9d624dae43f317bfd6d50e6d076f8d20 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 @@ public final class AutofillId implements Parcelable { @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 9ee0cb1f811ed9553e709efb9b0ed0d6e738d9cc..d0133ed6653535d668f099e65d112767abc9b006 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 @@ public final class AutofillManager { *

* 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 @@ public final class AutofillManager { @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 @@ public final class AutofillManager { 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 @@ public final class AutofillManager { * @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,19 +376,7 @@ public final class AutofillManager { * @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); } /** @@ -406,6 +385,10 @@ public final class AutofillManager { * @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; } @@ -423,10 +406,10 @@ public final class AutofillManager { 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); } } } @@ -452,7 +435,7 @@ public final class AutofillManager { 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); } } } @@ -481,6 +464,10 @@ public final class AutofillManager { * @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; } @@ -497,10 +484,10 @@ public final class AutofillManager { 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); } } } @@ -528,7 +515,7 @@ public final class AutofillManager { 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); } } } @@ -580,7 +567,7 @@ public final class AutofillManager { value = view.getAutofillValue(); } - updateSessionLocked(id, null, value, FLAG_VALUE_CHANGED); + updateSessionLocked(id, null, value, ACTION_VALUE_CHANGED, 0); } } @@ -601,7 +588,7 @@ public final class AutofillManager { } final AutofillId id = getAutofillId(view, childId); - updateSessionLocked(id, null, value, FLAG_VALUE_CHANGED); + updateSessionLocked(id, null, value, ACTION_VALUE_CHANGED, 0); } } @@ -643,11 +630,16 @@ public final class AutofillManager { } } + /** @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; } @@ -708,7 +700,7 @@ public final class AutofillManager { // 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) { @@ -735,8 +727,8 @@ public final class AutofillManager { 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); } @@ -744,7 +736,7 @@ public final class AutofillManager { 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(); } @@ -754,9 +746,7 @@ public final class AutofillManager { } private void finishSessionLocked() { - if (DEBUG) { - Log.d(TAG, "finishSessionLocked()"); - } + if (sVerbose) Log.v(TAG, "finishSessionLocked()"); try { mService.finishSession(mSessionId, mContext.getUserId()); @@ -769,9 +759,7 @@ public final class AutofillManager { } private void cancelSessionLocked() { - if (DEBUG) { - Log.d(TAG, "cancelSessionLocked()"); - } + if (sVerbose) Log.v(TAG, "cancelSessionLocked()"); try { mService.cancelSession(mSessionId, mContext.getUserId()); @@ -787,16 +775,16 @@ public final class AutofillManager { mTrackedViews = null; } - 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 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(); } @@ -810,7 +798,10 @@ public final class AutofillManager { 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(); } @@ -1192,8 +1183,8 @@ public final class AutofillManager { } } - if (DEBUG) { - Log.d(TAG, "TrackedViews(trackedIds=" + trackedIds + "): " + if (sVerbose) { + Log.v(TAG, "TrackedViews(trackedIds=" + trackedIds + "): " + " mVisibleTrackedIds=" + mVisibleTrackedIds + " mInvisibleTrackedIds=" + mInvisibleTrackedIds); } @@ -1213,7 +1204,7 @@ public final class AutofillManager { AutofillId id = getAutofillId(view); AutofillClient client = getClientLocked(); - if (DEBUG) { + if (sDebug) { Log.d(TAG, "notifyViewVisibilityChange(): id=" + id + " isVisible=" + isVisible); } @@ -1254,8 +1245,8 @@ public final class AutofillManager { 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); @@ -1270,8 +1261,8 @@ public final class AutofillManager { } else { updatedInvisibleTrackedIds = addToSet(updatedInvisibleTrackedIds, id); - if (DEBUG) { - Log.i(TAG, "onVisibleForAutofill() " + id + " became invisible"); + if (sDebug) { + Log.d(TAG, "onVisibleForAutofill() " + id + " became invisible"); } } } diff --git a/core/java/android/view/autofill/AutofillValue.java b/core/java/android/view/autofill/AutofillValue.java index b1a9d90cc4ca3e12433ce31144bbdde758b4a1fd..b57dab56318ed8971dafb2afcf309e5ebf2482e8 100644 --- a/core/java/android/view/autofill/AutofillValue.java +++ b/core/java/android/view/autofill/AutofillValue.java @@ -20,8 +20,7 @@ import static android.view.View.AUTOFILL_TYPE_DATE; import static android.view.View.AUTOFILL_TYPE_LIST; import static android.view.View.AUTOFILL_TYPE_TEXT; import static android.view.View.AUTOFILL_TYPE_TOGGLE; -import static android.view.autofill.Helper.DEBUG; -import static android.view.autofill.Helper.VERBOSE; +import static android.view.autofill.Helper.sDebug; import android.annotation.NonNull; import android.annotation.Nullable; @@ -171,12 +170,17 @@ public final class AutofillValue implements Parcelable { @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(); } ///////////////////////////////////// diff --git a/core/java/android/view/autofill/Helper.java b/core/java/android/view/autofill/Helper.java index 2b25ae7aa5e86db708eb72a4060e9e9702d1d291..829e7f3aa5ac790450dab36507dde318c3df5ac4 100644 --- a/core/java/android/view/autofill/Helper.java +++ b/core/java/android/view/autofill/Helper.java @@ -25,15 +25,16 @@ import java.util.Set; /** @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 keySet = bundle.keySet(); diff --git a/core/java/android/view/autofill/IAutoFillManager.aidl b/core/java/android/view/autofill/IAutoFillManager.aidl index 9417bd07a267b004cfa385e4c289d83e1db795ee..f28d8bad595a034618c3e1b9494f0046766761ca 100644 --- a/core/java/android/view/autofill/IAutoFillManager.aidl +++ b/core/java/android/view/autofill/IAutoFillManager.aidl @@ -30,7 +30,8 @@ import android.view.autofill.IAutoFillManagerClient; * {@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 @@ interface IAutoFillManager { 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/textclassifier/SmartSelection.java b/core/java/android/view/textclassifier/SmartSelection.java index f0f39b683fbde09ae58f3ee4ab4698acb8fbabce..f0e83d1fd85f48dbce1df22c7c6a4554cbd9e410 100644 --- a/core/java/android/view/textclassifier/SmartSelection.java +++ b/core/java/android/view/textclassifier/SmartSelection.java @@ -75,6 +75,20 @@ final class SmartSelection { 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 @@ final class SmartSelection { 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 94% rename from core/java/android/view/textclassifier/TextClassificationResult.java rename to core/java/android/view/textclassifier/TextClassification.java index e188d11a0cc28865d398c8aba183defc26a38071..b6dd0b9487399b55ddbe6fbad18bcc4b997a0c18 100644 --- a/core/java/android/view/textclassifier/TextClassificationResult.java +++ b/core/java/android/view/textclassifier/TextClassification.java @@ -33,12 +33,12 @@ import java.util.List; /** * 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 @@ public final class TextClassificationResult { @NonNull private final List mEntities; private int mLogType; - private TextClassificationResult( + private TextClassification( @NonNull String text, Drawable icon, String label, @@ -147,7 +147,7 @@ public final class TextClassificationResult { @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 @@ public final class TextClassificationResult { } /** - * Builder for building {@link TextClassificationResult}s. + * Builder for building {@link TextClassification} objects. */ public static final class Builder { @@ -244,10 +244,10 @@ public final class TextClassificationResult { } /** - * 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 46fed43cbe6a5a0b2d268a8f8874b82239644dd3..1f3be84fc8ce930ece1fc172d6bbb2250abc8e26 100644 --- a/core/java/android/view/textclassifier/TextClassifier.java +++ b/core/java/android/view/textclassifier/TextClassifier.java @@ -20,6 +20,7 @@ import android.annotation.IntRange; 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 @@ public interface TextClassifier { } @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 @@ public interface TextClassifier { * @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 @@ public interface TextClassifier { @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 @@ public interface TextClassifier { * @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 @@ public interface TextClassifier { * @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 246fab37cfa7a5fa5b2bb9db0287abd536318602..108107e39936d086e41ec34c821814bdfd7874be 100644 --- a/core/java/android/view/textclassifier/TextClassifierImpl.java +++ b/core/java/android/view/textclassifier/TextClassifierImpl.java @@ -44,6 +44,7 @@ import com.android.internal.util.Preconditions; 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 @@ final class TextClassifierImpl implements TextClassifier { 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 @@ final class TextClassifierImpl implements TextClassifier { } @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 @@ final class TextClassifierImpl implements TextClassifier { .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 @@ final class TextClassifierImpl implements TextClassifier { 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,21 +178,80 @@ final class TextClassifierImpl implements TextClassifier { synchronized (mSmartSelectionLock) { localeList = localeList == null ? LocaleList.getEmptyLocaleList() : localeList; final Locale locale = findBestSupportedLocaleLocked(localeList); + if (locale == null) { + throw new FileNotFoundException("No file for null locale"); + } if (mSmartSelection == null || !Objects.equals(mLocale, locale)) { destroySmartSelectionIfExistsLocked(); - mSmartSelection = new SmartSelection( - ParcelFileDescriptor.open( - // findBestSupportedLocaleLocked should have initialized - // mModelFilePaths - new File(mModelFilePaths.get(locale)), - ParcelFileDescriptor.MODE_READ_ONLY) - .getFd()); + mSmartSelection = new SmartSelection(getFdLocked(locale)); mLocale = locale; } return mSmartSelection; } } + @GuardedBy("mSmartSelectionLock") // Do not call outside this lock. + private int getFdLocked(Locale locale) throws FileNotFoundException { + ParcelFileDescriptor updateFd; + try { + updateFd = ParcelFileDescriptor.open( + new File(UPDATED_MODEL_FILE_PATH), ParcelFileDescriptor.MODE_READ_ONLY); + } catch (FileNotFoundException e) { + updateFd = null; + } + ParcelFileDescriptor factoryFd; + try { + final String factoryModelFilePath = getFactoryModelFilePathsLocked().get(locale); + if (factoryModelFilePath != null) { + factoryFd = ParcelFileDescriptor.open( + new File(factoryModelFilePath), ParcelFileDescriptor.MODE_READ_ONLY); + } else { + factoryFd = null; + } + } catch (FileNotFoundException e) { + factoryFd = null; + } + + if (updateFd == null) { + if (factoryFd != null) { + return factoryFd.getFd(); + } else { + throw new FileNotFoundException( + String.format("No model file found for %s", locale)); + } + } + + final int updateFdInt = updateFd.getFd(); + final boolean localeMatches = Objects.equals( + locale.getLanguage().trim().toLowerCase(), + SmartSelection.getLanguage(updateFdInt).trim().toLowerCase()); + if (factoryFd == null) { + if (localeMatches) { + return updateFdInt; + } else { + closeAndLogError(updateFd); + throw new FileNotFoundException( + String.format("No model file found for %s", locale)); + } + } + + if (!localeMatches) { + closeAndLogError(updateFd); + return factoryFd.getFd(); + } + + final int updateVersion = SmartSelection.getVersion(updateFdInt); + final int factoryFdInt = factoryFd.getFd(); + final int factoryVersion = SmartSelection.getVersion(factoryFdInt); + if (updateVersion > factoryVersion) { + closeAndLogError(factoryFd); + return updateFdInt; + } else { + closeAndLogError(updateFd); + return factoryFdInt; + } + } + @GuardedBy("mSmartSelectionLock") // Do not call outside this lock. private void destroySmartSelectionIfExistsLocked() { if (mSmartSelection != null) { @@ -206,11 +268,18 @@ final class TextClassifierImpl implements TextClassifier { ? LocaleList.getDefault().toLanguageTags() : localeList.toLanguageTags() + "," + LocaleList.getDefault().toLanguageTags(); final List languageRangeList = Locale.LanguageRange.parse(languages); - return Locale.lookup(languageRangeList, loadModelFilePathsLocked().keySet()); + + final List 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 loadModelFilePathsLocked() { + private Map getFactoryModelFilePathsLocked() { if (mModelFilePaths == null) { final Map modelFilePaths = new HashMap<>(); final File modelsDir = new File(MODEL_DIR); @@ -233,9 +302,23 @@ final class TextClassifierImpl implements TextClassifier { return mModelFilePaths; } - private TextClassificationResult createClassificationResult( + @Nullable + private Locale getUpdatedModelLocale() { + try { + final ParcelFileDescriptor updateFd = ParcelFileDescriptor.open( + new File(UPDATED_MODEL_FILE_PATH), ParcelFileDescriptor.MODE_READ_ONLY); + final Locale locale = Locale.forLanguageTag( + SmartSelection.getLanguage(updateFd.getFd())); + closeAndLogError(updateFd); + return locale; + } catch (FileNotFoundException e) { + return null; + } + } + + private TextClassification createClassificationResult( SmartSelection.ClassificationResult[] classifications, CharSequence text) { - final TextClassificationResult.Builder builder = new TextClassificationResult.Builder() + final TextClassification.Builder builder = new TextClassification.Builder() .setText(text.toString()); final int size = classifications.length; @@ -258,7 +341,7 @@ final class TextClassifierImpl implements TextClassifier { } if (resolveInfo != null && resolveInfo.activityInfo != null) { builder.setIntent(intent) - .setOnClickListener(TextClassificationResult.createStartActivityOnClickListener( + .setOnClickListener(TextClassification.createStartActivityOnClickListener( mContext, intent)); final String packageName = resolveInfo.activityInfo.packageName; @@ -318,6 +401,17 @@ final class TextClassifierImpl implements TextClassifier { return type; } + /** + * Closes the ParcelFileDescriptor and logs any errors that occur. + */ + private static void closeAndLogError(ParcelFileDescriptor fd) { + try { + fd.close(); + } catch (IOException e) { + Log.e(LOG_TAG, "Error closing file.", e); + } + } + /** * @throws IllegalArgumentException if text is null; startIndex is negative; * endIndex is greater than text.length() or is not greater than startIndex diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 6213a63e108a5b3eb0d1644d6743b4d10d06da16..52c82a71fb7eb1cc569ee44822b77eb45a7eddc6 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -2255,6 +2255,7 @@ public class WebView extends AbsoluteLayout /** * Sets the {@link TextClassifier} for this WebView. + * @hide */ public void setTextClassifier(@Nullable TextClassifier textClassifier) { mProvider.setTextClassifier(textClassifier); @@ -2263,6 +2264,7 @@ public class WebView extends AbsoluteLayout /** * 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 @@ public class WebView extends AbsoluteLayout 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 1c87726b3ca9eac2335ef681769f782d0ba18e85..5476ab216f2f5709c79fe65c8b63e4d70d08b179 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -7088,7 +7088,8 @@ public abstract class AbsListView extends AdapterView implements Te 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/Editor.java b/core/java/android/widget/Editor.java index 4ae35103a8149dcb1c7e1d48d401901f3582a096..481c160369b30790fba767ab1510e017c5325ed6 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -106,7 +106,7 @@ import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputMethodManager; -import android.view.textclassifier.TextClassificationResult; +import android.view.textclassifier.TextClassification; import android.widget.AdapterView.OnItemClickListener; import android.widget.TextView.Drawables; import android.widget.TextView.OnEditorActionListener; @@ -3836,9 +3836,11 @@ public class Editor { } if (mTextView.canRequestAutofill()) { + final int mode = mTextView.getText().length() <= 0 + ? MenuItem.SHOW_AS_ACTION_IF_ROOM : MenuItem.SHOW_AS_ACTION_NEVER; menu.add(Menu.NONE, TextView.ID_AUTOFILL, MENU_ITEM_ORDER_AUTOFILL, com.android.internal.R.string.autofill) - .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + .setShowAsAction(mode); } updateSelectAllItem(menu); @@ -3884,14 +3886,14 @@ public class Editor { private void updateAssistMenuItem(Menu menu) { menu.removeItem(TextView.ID_ASSIST); - final TextClassificationResult textClassificationResult = - getSelectionActionModeHelper().getTextClassificationResult(); - if (textClassificationResult != null) { - final Drawable icon = textClassificationResult.getIcon(); - final CharSequence label = textClassificationResult.getLabel(); + final TextClassification textClassification = + getSelectionActionModeHelper().getTextClassification(); + if (textClassification != null) { + final Drawable icon = textClassification.getIcon(); + final CharSequence label = textClassification.getLabel(); final OnClickListener onClickListener = - textClassificationResult.getOnClickListener(); - final Intent intent = textClassificationResult.getIntent(); + textClassification.getOnClickListener(); + final Intent intent = textClassification.getIntent(); if ((icon != null || !TextUtils.isEmpty(label)) && (onClickListener != null || intent != null)) { menu.add(TextView.ID_ASSIST, TextView.ID_ASSIST, MENU_ITEM_ORDER_ASSIST, label) @@ -3900,7 +3902,7 @@ public class Editor { mMetricsLogger.write( new LogMaker(MetricsEvent.TEXT_SELECTION_MENU_ITEM_ASSIST) .setType(MetricsEvent.TYPE_OPEN) - .setSubtype(textClassificationResult.getLogType())); + .setSubtype(textClassification.getLogType())); } } } @@ -3914,24 +3916,24 @@ public class Editor { 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 ff3c85c99f539e7e88192fe1ad6ee0473413e754..88c3c5b6101e1db930159ad93e53c720b510f94f 100644 --- a/core/java/android/widget/LinearLayout.java +++ b/core/java/android/widget/LinearLayout.java @@ -258,9 +258,9 @@ public class LinearLayout extends ViewGroup { 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/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java index 003db061c1404431297ee5bae30fa1e527ec0c0e..beff1b03ef777a162ccee7bb849387b67369e023 100644 --- a/core/java/android/widget/SelectionActionModeHelper.java +++ b/core/java/android/widget/SelectionActionModeHelper.java @@ -26,7 +26,7 @@ import android.text.Selection; import android.text.Spannable; import android.text.TextUtils; import android.view.ActionMode; -import android.view.textclassifier.TextClassificationResult; +import android.view.textclassifier.TextClassification; import android.view.textclassifier.TextClassifier; import android.view.textclassifier.TextSelection; import android.widget.Editor.SelectionModifierCursorController; @@ -52,7 +52,7 @@ final class SelectionActionModeHelper { private final Editor mEditor; private final TextClassificationHelper mTextClassificationHelper; - private TextClassificationResult mTextClassificationResult; + private TextClassification mTextClassification; private AsyncTask mTextClassificationAsyncTask; private final SelectionInfo mSelectionInfo = new SelectionInfo(); @@ -107,8 +107,8 @@ final class SelectionActionModeHelper { } @Nullable - public TextClassificationResult getTextClassificationResult() { - return mTextClassificationResult; + public TextClassification getTextClassification() { + return mTextClassification; } public void onDestroyActionMode() { @@ -121,7 +121,7 @@ final class SelectionActionModeHelper { mTextClassificationAsyncTask.cancel(true); mTextClassificationAsyncTask = null; } - mTextClassificationResult = null; + mTextClassification = null; } private boolean isNoOpTextClassifier() { @@ -140,9 +140,9 @@ final class SelectionActionModeHelper { textView.getSelectionStart(), textView.getSelectionEnd()); if (result != null && text instanceof Spannable) { Selection.setSelection((Spannable) text, result.mStart, result.mEnd); - mTextClassificationResult = result.mResult; + mTextClassification = result.mClassification; } else { - mTextClassificationResult = null; + mTextClassification = null; } if (mEditor.startSelectionActionModeInternal()) { final SelectionModifierCursorController controller = mEditor.getSelectionController(); @@ -158,7 +158,7 @@ final class SelectionActionModeHelper { } private void invalidateActionMode(@Nullable SelectionResult result) { - mTextClassificationResult = result != null ? result.mResult : null; + mTextClassification = result != null ? result.mClassification : null; final ActionMode actionMode = mEditor.getTextActionMode(); if (actionMode != null) { actionMode.invalidate(); @@ -332,7 +332,7 @@ final class SelectionActionModeHelper { return new SelectionResult( mSelectionStart, mSelectionEnd, - mTextClassifier.getTextClassificationResult( + mTextClassifier.classifyText( mTrimmedText, mRelativeStart, mRelativeEnd, mLocales)); } @@ -361,12 +361,12 @@ final class SelectionActionModeHelper { 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 406386aa97d0851989d969141deb43f3d5bcba48..629216e32fa95b3a30907615143b4c996aeeb270 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -125,6 +125,7 @@ import android.view.ContextMenu; import android.view.DragEvent; import android.view.Gravity; import android.view.HapticFeedbackConstants; +import android.view.InputDevice; import android.view.KeyCharacterMap; import android.view.KeyEvent; import android.view.MotionEvent; @@ -394,6 +395,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private TextClassifier mTextClassifier; + // A flag to prevent repeated movements from escaping the enclosing text view. The idea here is + // that if a user is holding down a movement key to traverse text, we shouldn't also traverse + // the view hierarchy. On the other hand, if the user is using the movement key to traverse + // views (i.e. the first movement was to traverse out of this view, or this view was traversed + // into by the user holding the movement key down) then we shouldn't prevent the focus from + // changing. + private boolean mPreventDefaultMovement; + private TextUtils.TruncateAt mEllipsize; static class Drawables { @@ -903,10 +912,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener break; case com.android.internal.R.styleable.TextAppearance_fontFamily: - try { - fontTypeface = appearance.getFont(attr); - } catch (UnsupportedOperationException | Resources.NotFoundException e) { - // Expected if it is not a font resource. + if (!context.isRestricted()) { + try { + fontTypeface = appearance.getFont(attr); + } catch (UnsupportedOperationException + | Resources.NotFoundException e) { + // Expected if it is not a font resource. + } } if (fontTypeface == null) { fontFamily = appearance.getString(attr); @@ -1220,11 +1232,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener break; case com.android.internal.R.styleable.TextView_fontFamily: - try { - fontTypeface = a.getFont(attr); - } catch (UnsupportedOperationException | Resources.NotFoundException e) { - // Expected if it is not a resource reference or if it is a reference to - // another resource type. + if (!context.isRestricted()) { + try { + fontTypeface = a.getFont(attr); + } catch (UnsupportedOperationException | Resources.NotFoundException e) { + // Expected if it is not a resource reference or if it is a reference to + // another resource type. + } } if (fontTypeface == null) { fontFamily = a.getString(attr); @@ -3371,10 +3385,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener Typeface fontTypeface = null; String fontFamily = null; - try { - fontTypeface = ta.getFont(R.styleable.TextAppearance_fontFamily); - } catch (UnsupportedOperationException | Resources.NotFoundException e) { - // Expected if it is not a font resource. + if (!context.isRestricted()) { + try { + fontTypeface = ta.getFont(R.styleable.TextAppearance_fontFamily); + } catch (UnsupportedOperationException | Resources.NotFoundException e) { + // Expected if it is not a font resource. + } } if (fontTypeface == null) { fontFamily = ta.getString(R.styleable.TextAppearance_fontFamily); @@ -3886,26 +3902,42 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * are invalid. If a specified axis name is not defined in the font, the settings will be * ignored. * + *

+ * Examples, + *

    + *
  • Set font width to 150. + *
    +     * 
    +     *   TextView textView = (TextView) findViewById(R.id.textView);
    +     *   textView.setFontVariationSettings("'wdth' 150");
    +     * 
    +     * 
    + *
  • + * + *
  • Set the font slant to 20 degrees and ask for italic style. *
    -     *   textView.setFontVariationSettings("'wdth' 1.0");
    -     *   textView.setFontVariationSettings("'AX  ' 1.8, 'FB  ' 2.0");
    +     * 
    +     *   TextView textView = (TextView) findViewById(R.id.textView);
    +     *   textView.setFontVariationSettings("'slnt' 20, 'ital' 1");
    +     * 
          * 
    + *

    + *
  • + *
* * @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 @@ -7137,6 +7169,15 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return KEY_EVENT_NOT_HANDLED; } + // If this is the initial keydown, we don't want to prevent a movement away from this view. + // While this shouldn't be necessary because any time we're preventing default movement we + // should be restricting the focus to remain within this view, thus we'll also receive + // the key up event, occasionally key up events will get dropped and we don't want to + // prevent the user from traversing out of this on the next key down. + if (event.getRepeatCount() == 0 && !KeyEvent.isModifierKey(keyCode)) { + mPreventDefaultMovement = false; + } + switch (keyCode) { case KeyEvent.KEYCODE_ENTER: if (event.hasNoModifiers()) { @@ -7268,16 +7309,23 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } if (doDown) { if (mMovement.onKeyDown(this, (Spannable) mText, keyCode, event)) { + if (event.getRepeatCount() == 0 && !KeyEvent.isModifierKey(keyCode)) { + mPreventDefaultMovement = true; + } return KEY_DOWN_HANDLED_BY_MOVEMENT_METHOD; } } - // Consume arrows to prevent focus leaving the editor. - if (isDirectionalNavigationKey(keyCode)) { + // Consume arrows from keyboard devices to prevent focus leaving the editor. + // DPAD/JOY devices (Gamepads, TV remotes) often lack a TAB key so allow those + // to move focus with arrows. + if (event.getSource() == InputDevice.SOURCE_KEYBOARD + && isDirectionalNavigationKey(keyCode)) { return KEY_EVENT_HANDLED; } } - return KEY_EVENT_NOT_HANDLED; + return mPreventDefaultMovement && !KeyEvent.isModifierKey(keyCode) + ? KEY_EVENT_HANDLED : KEY_EVENT_NOT_HANDLED; } /** @@ -7310,6 +7358,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return super.onKeyUp(keyCode, event); } + if (!KeyEvent.isModifierKey(keyCode)) { + mPreventDefaultMovement = false; + } + switch (keyCode) { case KeyEvent.KEYCODE_DPAD_CENTER: if (event.hasNoModifiers()) { @@ -9286,6 +9338,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } 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; } @@ -9298,6 +9352,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } + 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(); @@ -10174,6 +10234,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } boolean canRequestAutofill() { + if (!isAutofillable()) { + return false; + } final AutofillManager afm = mContext.getSystemService(AutofillManager.class); if (afm != null) { return afm.isEnabled(); diff --git a/core/java/com/android/internal/alsa/AlsaCardsParser.java b/core/java/com/android/internal/alsa/AlsaCardsParser.java index 17e8c9c80592b4ea055317dad4ee434447dc4a00..5b92a1734d47b58dc39a78e604c27951d1fa98a1 100644 --- a/core/java/com/android/internal/alsa/AlsaCardsParser.java +++ b/core/java/com/android/internal/alsa/AlsaCardsParser.java @@ -49,7 +49,7 @@ public class AlsaCardsParser { public AlsaCardRecord() {} - public boolean parse(String line, int lineIndex) { + private boolean parse(String line, int lineIndex) { int tokenIndex = 0; int delimIndex = 0; @@ -258,7 +258,7 @@ public class AlsaCardsParser { // // Logging // - public void Log(String heading) { + private void Log(String heading) { if (DEBUG) { Slog.i(TAG, heading); for (AlsaCardRecord cardRec : mCardRecords) { @@ -267,7 +267,7 @@ public class AlsaCardsParser { } } - static public void LogDevices(String caption, ArrayList deviceList) { + static private void LogDevices(String caption, ArrayList deviceList) { Slog.d(TAG, caption + " ----------------"); int listIndex = 0; for (AlsaCardRecord device : deviceList) { diff --git a/core/java/com/android/internal/alsa/AlsaDevicesParser.java b/core/java/com/android/internal/alsa/AlsaDevicesParser.java index 52037235d5abc29442ff00728430caa5516db3e0..7cdd89701d732160e9846a48768aa64561b8b4cb 100644 --- a/core/java/com/android/internal/alsa/AlsaDevicesParser.java +++ b/core/java/com/android/internal/alsa/AlsaDevicesParser.java @@ -155,6 +155,7 @@ public class AlsaDevicesParser { switch (mDeviceType) { case kDeviceType_Unknown: + default: sb.append(" N/A"); break; case kDeviceType_Audio: @@ -170,6 +171,7 @@ public class AlsaDevicesParser { switch (mDeviceDir) { case kDeviceDir_Unknown: + default: sb.append(" N/A"); break; case kDeviceDir_Capture: @@ -282,7 +284,7 @@ public class AlsaDevicesParser { // // Loging // - public void Log(String heading) { + private void Log(String heading) { if (DEBUG) { Slog.i(TAG, heading); for (AlsaDeviceRecord deviceRecord : mDeviceRecords) { diff --git a/core/java/com/android/internal/app/procstats/ProcessState.java b/core/java/com/android/internal/app/procstats/ProcessState.java index 8c2c2362f9941b0569abdece33a01b822f0000d6..94706687f6de486bd89b722e69218cb3ed1d93c2 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 @@ public final class ProcessState { 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 c6b6a7fb999f5facf6efc2cab9d47268a2dfc37a..d2e97897c04212e6cead2aebfb352e04d879554f 100644 --- a/core/java/com/android/internal/content/PackageMonitor.java +++ b/core/java/com/android/internal/content/PackageMonitor.java @@ -65,6 +65,7 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { int mChangeType; int mChangeUserId = UserHandle.USER_NULL; boolean mSomePackagesChanged; + String[] mModifiedComponents; String[] mTempArray = new String[1]; @@ -269,6 +270,18 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { } 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 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { mDisappearingPackages = mAppearingPackages = null; mSomePackagesChanged = false; + mModifiedComponents = null; String action = intent.getAction(); if (Intent.ACTION_PACKAGE_ADDED.equals(action)) { @@ -358,13 +372,13 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { } 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 ef20750cdb19c5c321eb7c7b9b78c32710fa6860..fef85da27f17622300ca27db58ea41e8d3577d8c 100644 --- a/core/java/com/android/internal/notification/SystemNotificationChannels.java +++ b/core/java/com/android/internal/notification/SystemNotificationChannels.java @@ -45,6 +45,7 @@ public class SystemNotificationChannels { 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 @@ public class SystemNotificationChannels { 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 5cb66e501393ea0896e8db9fa0a8a393de6df462..2c97f8bd59718045ab55d348f4dce1186df61a53 100644 --- a/core/java/com/android/internal/util/NotificationColorUtil.java +++ b/core/java/com/android/internal/util/NotificationColorUtil.java @@ -257,7 +257,7 @@ public class NotificationColorUtil { * @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 @@ public class NotificationColorUtil { } /** - * 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 @@ public class NotificationColorUtil { return useDark; } + public static double calculateLuminance(int backgroundColor) { + return ColorUtilsFromCompat.calculateLuminance(backgroundColor); + } + + + public static double calculateContrast(int foregroundColor, int backgroundColor) { + return ColorUtilsFromCompat.calculateContrast(foregroundColor, backgroundColor); + } + /** * Framework copy of functions needed from android.support.v4.graphics.ColorUtils. */ diff --git a/core/java/com/android/internal/widget/MediaNotificationView.java b/core/java/com/android/internal/widget/MediaNotificationView.java index afb2a5efcf958e0ad82e0702fcf2f4806453afcc..bbebcc21f80eef67ceb95cb6baf7529ece71f90b 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.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; -import android.widget.RelativeLayout; import android.widget.RemoteViews; /** @@ -34,8 +33,7 @@ import android.widget.RemoteViews; @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 @@ public class MediaNotificationView extends FrameLayout { @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); + int fullHeight = getMeasuredHeight(); + if (size < fullHeight) { + size = mSmallImageSize; + } else { + size = fullHeight; + } + if (layoutParams.width != size || layoutParams.height != size) { + layoutParams.width = size; + layoutParams.height = size; + mRightIcon.setLayoutParams(layoutParams); + reMeasure = true; + } // lets ensure that the main column doesn't run into the image - ViewGroup.MarginLayoutParams mainParams + ViewGroup.MarginLayoutParams params = (MarginLayoutParams) mMainColumn.getLayoutParams(); int marginEnd = size + imageEndMargin + mNotificationContentMarginEnd; - if (marginEnd != mainParams.getMarginEnd()) { - mainParams.setMarginEnd(marginEnd); - mMainColumn.setLayoutParams(mainParams); + if (marginEnd != params.getMarginEnd()) { + params.setMarginEnd(marginEnd); + mMainColumn.setLayoutParams(params); + reMeasure = true; } - - } - 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); + int headerMarginEnd = size + imageEndMargin; + params = (MarginLayoutParams) mHeader.getLayoutParams(); + if (params.getMarginEnd() != headerMarginEnd) { + params.setMarginEnd(headerMarginEnd); + mHeader.setLayoutParams(params); reMeasure = true; } - if (mHeader.getPaddingEnd() != paddingEnd) { + 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 @@ public class MediaNotificationView extends FrameLayout { 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 ceb3cc8b4ef5a07d2f8bb169cd2706044ebd70aa..77c72eb0e3d19906d4b55df5011e3e4ae4fa9dc4 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -97,6 +97,7 @@ LOCAL_SRC_FILES:= \ 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 8ca479478930a4233fcd069b584f3ef1bbeb2cb9..5529f89855681a48db0c100fda4f9731f560137c 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -160,6 +160,7 @@ extern int register_android_os_MessageQueue(JNIEnv* env); 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 @@ bool AndroidRuntime::parseRuntimeOption(const char* property, /* * 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=". * @@ -601,6 +602,7 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote) { JavaVMInitArgs initArgs; char propBuf[PROPERTY_VALUE_MAX]; + char stackTraceDirBuf[sizeof("-Xstacktracedir:")-1 + PROPERTY_VALUE_MAX]; char stackTraceFileBuf[sizeof("-Xstacktracefile:")-1 + PROPERTY_VALUE_MAX]; char jniOptsBuf[sizeof("-Xjniopts:")-1 + PROPERTY_VALUE_MAX]; char heapstartsizeOptsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX]; @@ -678,7 +680,12 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote) executionMode = kEMJitCompiler; } - parseRuntimeOption("dalvik.vm.stack-trace-file", stackTraceFileBuf, "-Xstacktracefile:"); + // If dalvik.vm.stack-trace-dir is set, it enables the "new" stack trace + // dump scheme and a new file is created for each stack dump. If it isn't set, + // the old scheme is enabled. + if (!parseRuntimeOption("dalvik.vm.stack-trace-dir", stackTraceDirBuf, "-Xstacktracedir:")) { + parseRuntimeOption("dalvik.vm.stack-trace-file", stackTraceFileBuf, "-Xstacktracefile:"); + } strcpy(jniOptsBuf, "-Xjniopts:"); if (parseRuntimeOption("dalvik.vm.jniopts", jniOptsBuf, "-Xjniopts:")) { @@ -773,7 +780,7 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote) "-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 +811,7 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote) "-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 +1311,7 @@ static const RegJNIRec gRegJNI[] = { 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/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index dd5632e49b72a9031c3eb45798e34eefe1280a96..59c786007e5cf2b17d028a442db22b7e4cb2604d 100755 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -751,30 +751,53 @@ static jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors, static bool bitmapCopyTo(SkBitmap* dst, SkColorType dstCT, const SkBitmap& src, SkBitmap::Allocator* alloc) { - // Skia does not support copying from kAlpha8 to types that are not alpha only. - // We will handle this case here. - if (kAlpha_8_SkColorType == src.colorType() && kAlpha_8_SkColorType != dstCT) { - SkPixmap srcPixmap; - if (!src.peekPixels(&srcPixmap)) { - return false; - } + LOG_ALWAYS_FATAL_IF(kIndex_8_SkColorType == dstCT, "Error, cannot copyTo kIndex8."); - SkImageInfo dstInfo = src.info().makeColorType(dstCT); - if (dstCT == kRGBA_F16_SkColorType) { - dstInfo = dstInfo.makeColorSpace(SkColorSpace::MakeSRGBLinear()); - } - if (!dst->setInfo(dstInfo)) { - return false; - } - if (!dst->tryAllocPixels(alloc, nullptr)) { - return false; - } + SkPixmap srcPM; + if (!src.peekPixels(&srcPM)) { + return false; + } + SkImageInfo dstInfo = srcPM.info().makeColorType(dstCT); + switch (dstCT) { + case kRGB_565_SkColorType: + // copyTo() has never been strict on alpha type. Here we set the src to opaque to + // allow the call to readPixels() to succeed and preserve this lenient behavior. + if (kOpaque_SkAlphaType != srcPM.alphaType()) { + srcPM = SkPixmap(srcPM.info().makeAlphaType(kOpaque_SkAlphaType), srcPM.addr(), + srcPM.rowBytes(), srcPM.ctable()); + dstInfo = dstInfo.makeAlphaType(kOpaque_SkAlphaType); + } + break; + case kRGBA_F16_SkColorType: + // The caller does not have an opportunity to pass a dst color space. Assume that + // they want linear sRGB. + dstInfo = dstInfo.makeColorSpace(SkColorSpace::MakeSRGBLinear()); + + if (!srcPM.colorSpace()) { + // Skia needs a color space to convert to F16. nullptr should be treated as sRGB. + srcPM.setColorSpace(SkColorSpace::MakeSRGB()); + } + break; + default: + break; + } + + if (!dst->setInfo(dstInfo)) { + return false; + } + if (!dst->tryAllocPixels(alloc, nullptr)) { + return false; + } + + // Skia does not support copying from kAlpha8 to types that are not alpha only. + // We will handle this case here. + if (kAlpha_8_SkColorType == srcPM.colorType() && kAlpha_8_SkColorType != dstCT) { switch (dstCT) { case kRGBA_8888_SkColorType: case kBGRA_8888_SkColorType: { for (int y = 0; y < src.height(); y++) { - const uint8_t* srcRow = srcPixmap.addr8(0, y); + const uint8_t* srcRow = srcPM.addr8(0, y); uint32_t* dstRow = dst->getAddr32(0, y); ToColor_SA8(dstRow, srcRow, src.width(), nullptr); } @@ -789,7 +812,7 @@ static bool bitmapCopyTo(SkBitmap* dst, SkColorType dstCT, const SkBitmap& src, } case kRGBA_F16_SkColorType: { for (int y = 0; y < src.height(); y++) { - const uint8_t* srcRow = srcPixmap.addr8(0, y); + const uint8_t* srcRow = srcPM.addr8(0, y); void* dstRow = dst->getAddr(0, y); ToF16_SA8(dstRow, srcRow, src.width()); } @@ -800,7 +823,25 @@ static bool bitmapCopyTo(SkBitmap* dst, SkColorType dstCT, const SkBitmap& src, } } - return src.copyTo(dst, dstCT, alloc); + SkPixmap dstPM; + if (!dst->peekPixels(&dstPM)) { + return false; + } + + // Skia needs a color space to convert from F16. nullptr should be treated as sRGB. + if (kRGBA_F16_SkColorType == srcPM.colorType() && !dstPM.colorSpace()) { + dstPM.setColorSpace(SkColorSpace::MakeSRGB()); + } + + // readPixels does not support color spaces with parametric transfer functions. This + // works around that restriction when the color spaces are equal. + if (kRGBA_F16_SkColorType != dstCT && kRGBA_F16_SkColorType != srcPM.colorType() && + dstPM.colorSpace() == srcPM.colorSpace()) { + dstPM.setColorSpace(nullptr); + srcPM.setColorSpace(nullptr); + } + + return srcPM.readPixels(dstPM); } static jobject Bitmap_copy(JNIEnv* env, jobject, jlong srcHandle, @@ -1550,7 +1591,7 @@ static jobject Bitmap_copyPreserveInternalConfig(JNIEnv* env, jobject, jlong bit SkBitmap result; HeapAllocator allocator; - if (!src.copyTo(&result, hwuiBitmap.info().colorType(), &allocator)) { + if (!bitmapCopyTo(&result, hwuiBitmap.info().colorType(), src, &allocator)) { doThrowRE(env, "Could not copy a hardware bitmap."); return NULL; } diff --git a/core/jni/android/graphics/Path.cpp b/core/jni/android/graphics/Path.cpp index 292454bd0875fdc1ab9986a5666dc3779e0ea03b..d3d68826affed0b481089e636d1724441c0f0152 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 #include @@ -355,8 +356,9 @@ public: } } - static void createVerbSegments(SkPath::Verb verb, const SkPoint* points, - std::vector& segmentPoints, std::vector& lengths, float errorSquared) { + static void createVerbSegments(const SkPath::Iter& pathIter, SkPath::Verb verb, + const SkPoint* points, std::vector& segmentPoints, + std::vector& lengths, float errorSquared, float errorConic) { switch (verb) { case SkPath::kMove_Verb: addMove(segmentPoints, lengths, points[0]); @@ -375,8 +377,27 @@ public: 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 @@ public: std::vector segmentPoints; std::vector lengths; float errorSquared = acceptableError * acceptableError; + float errorConic = acceptableError / 2; // somewhat arbitrary while ((verb = pathIter.next(points, false)) != SkPath::kDone_Verb) { - createVerbSegments(verb, points, segmentPoints, lengths, errorSquared); + createVerbSegments(pathIter, verb, points, segmentPoints, lengths, + errorSquared, errorConic); } if (segmentPoints.empty()) { diff --git a/core/jni/android_hardware_HardwareBuffer.cpp b/core/jni/android_hardware_HardwareBuffer.cpp index 4b31c91c708c4ba6597d2936ff9ed010caf23991..ba2345083661056122f44e264c0c79a843bafa3c 100644 --- a/core/jni/android_hardware_HardwareBuffer.cpp +++ b/core/jni/android_hardware_HardwareBuffer.cpp @@ -80,14 +80,10 @@ static jlong android_hardware_HardwareBuffer_create(JNIEnv* env, jobject clazz, } 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 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 jint android_hardware_HardwareBuffer_getLayers(JNIEnv* env, 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 @@ uint32_t android_hardware_HardwareBuffer_convertToPixelFormat(uint32_t format) { 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_VintfRuntimeInfo.cpp b/core/jni/android_os_VintfRuntimeInfo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ecb685435a97bbad1133763900cdab66adc50ca6 --- /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 +#include +#include +#include + +#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(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/com_google_android_gles_jni_EGLImpl.cpp b/core/jni/com_google_android_gles_jni_EGLImpl.cpp index d0ce1927b10800dfd8c6b37de601d3d72635222c..c00d698770b356d9bfd4c0bfbb5c582d54dcdf02 100644 --- a/core/jni/com_google_android_gles_jni_EGLImpl.cpp +++ b/core/jni/com_google_android_gles_jni_EGLImpl.cpp @@ -45,7 +45,6 @@ static jmethodID gConfig_ctorID; static jfieldID gDisplay_EGLDisplayFieldID; static jfieldID gContext_EGLContextFieldID; static jfieldID gSurface_EGLSurfaceFieldID; -static jfieldID gSurface_NativePixelRefFieldID; static jfieldID gConfig_EGLConfigFieldID; static inline EGLDisplay getDisplay(JNIEnv* env, jobject o) { @@ -84,7 +83,6 @@ static void nativeClassInit(JNIEnv *_env, jclass eglImplClass) jclass surface_class = _env->FindClass("com/google/android/gles_jni/EGLSurfaceImpl"); gSurface_EGLSurfaceFieldID = _env->GetFieldID(surface_class, "mEGLSurface", "J"); - gSurface_NativePixelRefFieldID = _env->GetFieldID(surface_class, "mNativePixelRef", "J"); } static const jint gNull_attrib_base[] = {EGL_NONE}; @@ -398,14 +396,6 @@ static jboolean jni_eglDestroySurface(JNIEnv *_env, jobject _this, jobject displ } EGLDisplay dpy = getDisplay(_env, display); EGLSurface sur = getSurface(_env, surface); - - if (sur) { - SkPixelRef* ref = (SkPixelRef*)(_env->GetLongField(surface, - gSurface_NativePixelRefFieldID)); - if (ref) { - SkSafeUnref(ref); - } - } return EglBoolToJBool(eglDestroySurface(dpy, sur)); } diff --git a/core/jni/include/android_runtime/android_hardware_HardwareBuffer.h b/core/jni/include/android_runtime/android_hardware_HardwareBuffer.h index 3545c565fb12b5dba4e058c816554dcf0d3e2d9c..c452b74c802bcfbfdb432cb10dd5ff87beba183e 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 @@ extern jobject android_hardware_HardwareBuffer_createFromAHardwareBuffer( 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); - -/* 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); +extern uint64_t android_hardware_HardwareBuffer_convertToGrallocUsageBits(uint64_t usage); + +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 2151d757290e80cf9d497c9679e28ceb21ee1aa2..5e34e0559f7941238575126aad365222e30765d7 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -377,8 +377,6 @@ - - @@ -446,6 +444,8 @@ + + @@ -827,16 +827,6 @@ android:description="@string/permdesc_callPhone" android:protectionLevel="dangerous" /> - - - + @@ -1713,7 +1713,8 @@ - - - + + + + + + + @@ -3355,6 +3374,8 @@ android:protectionLevel="signature" /> 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 e2dda336f8f741c7d447d85886c3f16f4a7746d1..0000000000000000000000000000000000000000 --- a/core/res/res/drawable/ic_picture_in_picture.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - \ 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 2f7ad3a61406da9a1e10af9849137b1c05e1bc7b..60df492e451aaa288dcac0fae4f28a82536a851d 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 @@ + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:orientation="vertical"> - - + android:orientation="horizontal"> + + + + + + + + - - + android:layout_marginTop="4dp" + android:visibility="gone"> + - - - @@ -94,6 +104,7 @@ android:layout_height="wrap_content" style="@style/Widget.Material.Button.Colored" android:text="@string/autofill_save_yes"> + 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 6de6a3e00ed52c9f21f2413d759f4c076244bf90..c0ee16f8d5cef09e22adfcba047e3ae9e53d2e7c 100644 --- a/core/res/res/layout/notification_template_material_big_media.xml +++ b/core/res/res/layout/notification_template_material_big_media.xml @@ -24,6 +24,13 @@ android:background="#00000000" android:tag="bigMediaNarrow" > + + - - diff --git a/core/res/res/layout/notification_template_material_media.xml b/core/res/res/layout/notification_template_material_media.xml index 0150b140bcd48ed7c5b86ba906d23e9f91564489..153265f3fa85e5906260f6a14b6327880bfc6a32 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" > + @@ -61,5 +68,4 @@ - diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 2155c8f4061da50c096b4a1511e2256bfb6116b7..4524b6e6c181e429bdfad45ca97a1086dbfd805c 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -99,6 +99,13 @@ "Jou diensverskaffer het tydelik stem- en noodoproepe by hierdie ligging opgeskort" "Kan netwerk nie bereik nie" "Om die opvangs te verbeter, probeer die tipe verander wat gekies is by Stelsel > Netwerk en internet > Mobiele netwerke > Voorkeurnetwerktipe." + "Opletberigte" + "Oproepaanstuur" + "Noodterugbel-modus" + "Opletberigte oor mobiele data" + "SMS-boodskappe" + "Stemboodskappe" + "Wi-Fi-oproepe" "Ander party het TTY-modus VOL versoek" "Ander party het TTY-modus GOD versoek" "Ander party het TTY-modus SOD versoek" @@ -258,6 +265,16 @@ "Opletberigte" "Kleinhandeldemonstrasie" "USB-verbinding" + + + + + + + + + + "Veiligmodus" "Android-stelsel" "Skakel oor na persoonlik" @@ -280,15 +297,13 @@ "foonoproepe te maak en te bestuur" "Liggaamsensors" "toegang te verkry tot sensordata oor jou lewenstekens" - "Haal venster-inhoud op" + "Venster-inhoud ophaal" "Ondersoek die inhoud van \'n venster waarmee jy interaksie het." - "Skakel Verken deur raak aan" + "Verken deur raak aanskakel" "Items waarop getik word, sal hardop gesê word en die skerm kan met behulp van gebare verken word." - "Skakel verbeterde webtoeganklikheid aan" - "Skripte kan geïnstalleer word om program-inhoud meer toeganklik te maak." - "Neem teks wat jy tik waar" + "Teks wat jy tik waarneem" "Sluit persoonlike data soos kredietkaartnommers en wagwoorde in." - "Beheer vertoonskermvergroting" + "Vertoonskermvergroting beheer" "Beheer die vertoonskerm se zoemvlak en posisionering." "Voer gebare uit" "Kan tik, swiep, knyp en ander gebare uitvoer." @@ -1732,11 +1747,12 @@ "Skakel oor na teksmodus vir die tydinvoer." "Skakel oor na horlosiemodus vir die tydinvoer." "Outovulopsies" + "Stoor vir outovul" "Inhoud kan nie outomaties ingevul word nie" - "Stoor na %1$s?" - "Stoor %1$s na %2$s?" - "Stoor %1$s, %2$s in %3$s?" - "Stoor %1$s, %2$s, %3$s in %4$s?" + "Stoor in <b>%1$s</b>?" + "Stoor %1$s in <b>%2$s</b>?" + "Stoor %1$s en %2$s in <b>%3$s</b>?" + "Stoor %1$s, %2$s en %3$s in <b>%4$s</b>?" "Stoor" "Nee, dankie" "wagwoord" diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 41a0153c129a952716fca4546976feeac88ab4dc..a3ebecbd2ebc20e2e69d9758d822e329590310dc 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -99,6 +99,13 @@ "የእርስዎ አገልግሎት አቅራቢ ከዚህ መገኛ አካባቢ ላይ ለጊዜው የድምፅ እና የድንገተኛ አደጋ ጥሪዎችን አግዷል" "አውታረ መረብ ላይ መድረስ አይቻልም" "ቅበላን ለማሻሻል የተመረጠውን ዓይነት በሥርዓት > አውታረ መረቦች እና በይነመረብ > የተንቀሳቃሽ ስልክ አውታረ መረቦች > ተመራጭ የአውታረ መረብ ዓይነት ላይ ለመለወጥ ይሞክሩ።" + "ማንቂያዎች" + "ጥሪ ማስተላለፍ" + "የአደጋ ጊዜ ጥሪ ሁነታ" + "የተንቀሳቃሽ ስልክ ውሂብ ማንቂያዎች" + "የኤስኤምኤስ መልዕክቶች" + "የድምጽ መልዕክቶች" + "የWi-Fi ጥሪ" "ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ FULL ጠይቋል" "ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ HCO ጠይቋል" "ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ VCO ጠይቋል" @@ -258,6 +265,16 @@ "ማንቂያዎች" "የችርቻሮ ማሳያ" "የዩኤስቢ ግንኙነት" + + + + + + + + + + "የሚያስተማምን ሁነታ" "Android ስርዓት" "ወደ የግል ቀይር" @@ -284,8 +301,6 @@ "መስተጋበር የሚፈጥሩት የመስኮት ይዘት ይመርምሩ።" "በመንካት ያስሱን ያብሩ" "መታ የተደረጉ ንጥሎች ጮክ ተብለው ይነገሩና የጣት ምልክቶችን በመጠቀም ማያ ገጹ ሊታሰስ ይችላል።" - "የተሻሻለ የድር ተደራሽነት ያብሩ" - "የመተግበሪያ ይዘት ይበልጥ የሚገኙ ለማድረግ ስክሪፕቶች ሊጫኑ ይችላሉ።" "የሚተይቡት ጽሑፍ ይመልከቱ" "እንደ የክሬዲት ካርድ ቁጥሮች እና የይለፍ ቃላት ያሉ የግል ውሂብ ያካትታል።" "የመቆጣጠሪያ ማሳያ እንዲጎላ አደራረግ" @@ -1732,11 +1747,12 @@ "ለጊዜ ግቤቱ ወደ የጽሑፍ ግቤት ሁነታ ቀይር።" "ለጊዜ ግቤቱ ወደ የሰዓት ሁነታ ቀይር።" "የራስ-ሙላ አማራጮች" + "ለራስ-ሙላ አስቀምጥ" "ይዘቶች በራስ-ሰር ሊሞሉ አይችሉም" - "ወደ %1$s ይቀመጥ?" - "%1$s ወደ %2$s ይቀመጥ?" - "%1$s%2$s ወደ %3$s ይቀመጡ?" - "%1$s%2$s%3$s ወደ %4$s ይቀመጡ?" + "ወደ <b>%1$s</b> ይቀመጥ?" + "%1$s ወደ <b>%2$s</b> ይቀመጥ?" + "%1$s እና %2$s ወደ <b>%3$s</b> ይቀመጡ?" + "%1$s%2$s እና %3$s ወደ <b>%4$s</b> ይቀመጡ?" "አስቀምጥ" "አይ፣ አመሰግናለሁ" "የይለፍ ቃል" diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 570e3c40966b564f81df6d7b36d78ea0eb5b2232..d1b9dcb5af2be7754b8ac1f6a00c30cfb12ed237 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -103,6 +103,13 @@ "علّق مشغّل شبكة الجوّال الصوت ومكالمات الطوارئ مؤقتًا في هذا الموقع الجغرافي" "يتعذر الوصول إلى الشبكة" "‏لتحسين الاستقبال، يمكنك تجربة تغيير النوع المحدّد في النظام > الشبكة والإنترنت > شبكات الجوّال > نوع الشبكة المفضّل." + "التنبيهات" + "اعادة توجيه المكالمة" + "وضع معاودة الاتصال بالطوارئ" + "تنبيهات بيانات الجوّال" + "‏الرسائل القصيرة SMS" + "رسائل البريد الصوتي" + "‏الاتصال عبر Wi-Fi" "‏طلب النظير وضع TTY الكامل" "‏طلب النظير وضع TTY على HCO" "‏طلب النظير وضع TTY على VCO" @@ -270,6 +277,16 @@ "التنبيهات" "عرض توضيحي لبائع التجزئة" "‏اتصال USB" + + + + + + + + + + "الوضع الآمن" "‏نظام Android" "التبديل إلى الشخصي" @@ -296,8 +313,6 @@ "فحص محتوى نافذة يتم التفاعل معها." "تشغيل الاستكشاف باللمس" "سيتم نطق العناصر التي تم النقر عليها بصوت عال ويمكن استكشاف الشاشة باستخدام الإيماءات." - "تشغيل إمكانية الدخول المحسّن عبر الويب" - "قد يتم تثبيت النصوص البرمجية لتسهيل الدخول إلى المحتوى." "ملاحظة النص الذي تكتبه" "يتضمن بيانات شخصية مثل أرقام بطاقات الائتمان وكلمات المرور." "التحكم في تكبير الشاشة" @@ -591,7 +606,7 @@ "المنزل" "الجوال" - "عمل" + "العمل" "فاكس العمل" "فاكس المنزل" "جهاز نداء" @@ -634,7 +649,7 @@ "مخصص" "المنزل" "الجوال" - "عمل" + "العمل" "فاكس العمل" "فاكس المنزل" "جهاز نداء" @@ -1856,11 +1871,12 @@ "يُرجى التبديل إلى وضع إدخال النص لإدخال الوقت." "يُرجى التبديل إلى وضع الساعة لإدخال الوقت." "خيارات الملء التلقائي" + "حفظ المعلومات للملء التلقائي لاحقًا" "يتعذر إجراء ملء تلقائي للمحتويات" - "هل تريد الحفظ في %1$s؟" - "هل تريد حفظ %1$s في %2$s؟" - "هل تريد حفظ %1$s و%2$s في %3$s؟" - "هل تريد حفظ %1$s و%2$s و%3$s في %4$s؟" + "‏هل تريد الحفظ في <b>%1$s</b>؟" + "‏هل تريد حفظ %1$s في <b>%2$s</b>؟" + "‏هل تريد حفظ %1$s و%2$s في <b>%3$s</b>؟" + "‏هل تريد حفظ %1$s و%2$s و%3$s في <b>%4$s</b>؟" "حفظ" "لا، شكرًا" "كلمة مرور" diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 6da988aaa15a172552f66af9e643954f5b60acc1..552c4e30c7cf78da458315202aa67b0313233afd 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -99,6 +99,13 @@ "Operator müvəqqəti olaraq bu məkanda səsli və təcili zəngləri dayandırıb" "Şəbəkəyə daxil olmaq mümkün deyil" "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." + "Siqnallar" + "Zəng yönləndirmə" + "Təcili geriyə zəng rejimi" + "Mobil data siqnalları" + "SMS mesajları" + "Səsli e-poçt mesajları" + "Wi-Fi zəngi" "Eskpert TTY Rejimi FULL-u sorğuladı" "Ekspert TTY Rejimi HCO-nu sorğuladı" "Ekspert TTY Rejimi VCO-nu sorğuladı" @@ -258,6 +265,16 @@ "Siqnallar" "Pərakəndə demo" "USB əlaqə" + + + + + + + + + + "Təhlükəsiz rejim" "Android sistemi" "Şəxsi profilə keçirin" @@ -284,8 +301,6 @@ "Əlaqədə olduğunuz pəncərənin məzmununu nəzərdən keçirin." "Toxunaraq Kəşf et funksiyasını yandırın" "Tıklanan hissələr səsləndiriləcək və ekran jestlərlə idarə oluna biləcək." - "İnkişaf etmiş veb əlçatımlılığı yandırın" - "Skriptlər tətbiq məzmununun daha əlçatımlı olması üçün quraşdırıla bilər." "Yazdığınız mətni izləyin" "Kredit kartı nömrələri və parollar kimi şəxsi məlumatlar daxildir." "Ekran böyütməsinə nəzarət edin" @@ -1021,7 +1036,7 @@ "%1$s dayandırılması davam edir" "%1$s dayandırılması davam edir" "Tətbiqi yenidən açın" - "Geri əlaqə göndərin" + "Rəyinizi bildirin" "Bağla" "Cihaz yeniden başladılana kimi səssiz edin" "Gözləyin" @@ -1732,11 +1747,12 @@ "Zamanı daxil etmək üçün mətnlə daxiletmə rejiminə keçin" "Zamanı daxil etmək üçün saat rejiminə keçin" "Avtodoldurma seçimləri" + "Avtodoldurma üçün yadda saxlayın" "Kontentlər avtomatik olaraq doldurula bilməz" - "%1$s etiketində yadda saxlanılsın?" - "%1$s %2$s etiketində yadda saxlanılsın?" - "%1$s, %2$s %3$s etiketində yadda saxlanılsın?" - "%1$s, %2$s, %3$s %4$s etiketində yadda saxlanılsın?" + "<b>%1$s</b> etiketində yadda saxlansın?" + "%1$s <b>%2$s<b> etiketində yadda saxlansın?" + "%1$s%2$s <b>%3$s</b> etiketində yadda saxlansın?" + "%1$s, %2$s%3$s <b>%4$s</b> etiketində yadda saxlansın?" "Yadda saxlayın" "Xeyr, çox sağ olun" "parol" diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index b66167ee8da86defe5a56b3f5fcf3422dc0799ab..9fc3a28c507be9cf22e4f44e11433d900d2029ac 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 @@ "Mobilni operater je privremeno suspendovao glasovne i hitne pozive na ovoj lokaciji" "Povezivanje sa mrežom nije uspelo" "Da biste poboljšali prijem, probajte da promenite izabrani tip u odeljku Sistem > Mreža i internet > Mobilne mreže > Željeni tip mreže." + "Obaveštenja" + "Preusmeravanje poziva" + "Režim za hitan povratni poziv" + "Obaveštenja za mobilne podatke" + "SMS-ovi" + "Poruke govorne pošte" + "Pozivanje preko Wi-Fi mreže" "Korisnik zahteva POTPUN režim TTY" "Korisnik zahteva PRENOS ZVUKA za režim TTY" "Korisnik zahteva PRENOS GLASA za režim TTY" @@ -261,6 +268,16 @@ "Obaveštenja" "Režim demonstracije za maloprodajne objekte" "USB veza" + + + + + + + + + + "Bezbedni režim" "Android sistem" "Pređi na Lični profil" @@ -287,8 +304,6 @@ "Proverava sadržaj prozora sa kojim ostvarujete interakciju." "Uključi Istraživanja dodirom" "Stavke koje dodirnete će biti izgovorene naglas, a možete da se krećete po ekranu pokretima." - "Uključi poboljšanu pristupačnost veba" - "Mogu da se instaliraju skripte da bi sadržaj aplikacija bio pristupačniji." "Prati tekst koji unosite" "Obuhvata lične podatke kao što su brojevi kreditnih kartica i lozinke." "Upravljaj uvećanjem prikaza" @@ -1625,7 +1640,7 @@ "Instalirao je administrator" "Ažurirao je administrator" "Izbrisao je administrator" - "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." + "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." "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." "Uključiti Uštedu podataka?" "Uključi" @@ -1763,11 +1778,12 @@ "Pređite u režim unosa teksta radi unosa vremena." "Pređite u režim sata radi unosa vremena." "Opcije automatskog popunjavanja" + "Sačuvajte za automatsko popunjavanje" "Sadržaj ne može automatski da se popuni" - "Želite li da sačuvate u: %1$s?" - "Želite li da sačuvate stavku %1$s u: %2$s?" - "Želite li da sačuvate stavke %1$s i %2$s u %3$s?" - "Želite li da sačuvate stavke %1$s, %2$s i %3$s u %4$s?" + "Želite li da sačuvate u: <b>%1$s</b>?" + "Želite li da sačuvate stavku %1$s u: <b>%2$s</b>?" + "Želite li da sačuvate stavke %1$s i %2$s u: <b>%3$s</b>?" + "Želite li da sačuvate stavke %1$s, %2$s i %3$s u: <b>%4$s</b>?" "Sačuvaj" "Ne, hvala" "lozinka" diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 2702b13886d363b81e4d5a715dbc5321341106ff..fdd15d3cf95c959469824aaea7562d9875d2d509 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -20,7 +20,7 @@ - "B" + "б" "КБ" "Мб" "ГБ" @@ -101,6 +101,13 @@ "Ваш аператар часова прыпыніў працу сэрвісу галасавых і экстранных выклікаў у гэтым месцы" "Немагчыма падключыцца да сеткі" "Каб палепшыць якасць прыёму, паспрабуйце змяніць тып, выбраны ў меню \"Сістэма > Сетка і інтэрнэт > Мабільныя сеткі > Прыярытэтны тып сеткі\"." + "Абвесткі" + "Пераадрасацыя выкліку" + "Рэжым экстраннага зваротнага выкліку" + "Абвесткі пра мабільныя даныя" + "SMS-паведамленні" + "Паведамленні галасавой пошты" + "Wi-Fi-тэлефанія" "Аднарангавая прылада запытала рэжым TTY FULL" "Аднарангавая прылада запытала рэжым TTY НСО" "Аднарангавая прылада запытала рэжым TTY VCO" @@ -240,7 +247,7 @@ "Бязгучны рэжым" "Гук выкл." "Гук уключаны" - "Рэжым \"У самалёце\"" + "Рэжым палёту" "Уключаны рэжым \"У самалёце\"" "Рэжым \"У самалёце\" адключаны" "Налады" @@ -264,6 +271,16 @@ "Абвесткi" "Дэманстрацыйны рэжым для пунктаў продажу" "Падключэнне USB" + + + + + + + + + + "Бяспечны рэжым" "Сістэма Android" "Пераключыцца на асабісты" @@ -286,14 +303,12 @@ "рабіць тэлефонныя выклікі і кіраваць імі" "Датчыкі цела" "атрымліваць з датчыка даныя асноўных фізіялагічных паказчыкаў" - "Атрымайце змесцiва акна" - "Вывучыце змесцiва акна, з якiм вы працуеце." - "Уключыце Explore by Touch" + "Атрымліваць змесціва вакна" + "Аналізаваць змесціва актыўнага вакна." + "Уключаць Азнаямленне дотыкам" "Элементы, да якіх дакрануліся, будуць агучаны, а экранам можна даследаваць пры дапамозе жэстаў." - "Уключыце паляпшэнне вэб-даступнасці" - "Сцэнарыi могуць быць усталяваны, каб зрабіць змесцiва прыкладання больш даступным." - "Глядзiце, што набiраеце" - "Уключае ў сябе асабістыя дадзеныя, такія як нумары крэдытных карт і паролі." + "Праглядаць тэкст, які вы набіраеце" + "У тым ліку асабістыя даныя, такія як нумары крэдытных карт і паролі." "Кіраваць павелічэннем дысплэя" "Кіраваць маштабам дысплэя і пазіцыянаваннем." "Выконваць жэсты" @@ -1786,7 +1801,7 @@ "Прадукцыйнасць" "Сховішча на прыладзе" "Адладка USB" - "гадзіна" + "гадз" "хвіліна" "Задаць час" "Увядзіце дапушчальны час" @@ -1794,11 +1809,12 @@ "Пераключыцца на рэжым тэксту пры ўводзе часу." "Пераключыцца на рэжым гадзінніка пры ўводзе часу." "Параметры аўтазапаўнення" + "Захаваць для аўтазапаўнення" "Для гэтага змесціва аўтазапаўненне немагчымае" - "Захаваць у %1$s?" - "Захаваць наступнае: %1$s у %2$s?" - "Захаваць %1$s, %2$s у %3$s?" - "Захаваць %1$s, %2$s, %3$s у %4$s?" + "Захаваць у <b>%1$s</b>?" + "Захаваць %1$s у <b>%2$s</b>?" + "Захаваць %1$s і %2$s у <b>%3$s</b>?" + "Захаваць %1$s, %2$s і %3$s у <b>%4$s</b>?" "Захаваць" "Не, дзякуй" "пароль" diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index cfb81771683f0d0815d440071f9801e4b28def55..b03e09e73dafa24f9f5128b69f1c6dad6dd3a1f3 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -99,6 +99,13 @@ "Операторът ви временно е спрял гласовите и спешните обаждания в това местоположение" "Не може да се установи връзка с мрежата" "За да подобрите сигнала, променете избрания тип мрежа от „Система“ > „Мрежа и интернет“ > „Мобилни мрежи“ > „Предпочитан тип мрежа“." + "Сигнали" + "Пренасочване на обаждания" + "Режим на обратно обаждане при спешност" + "Сигнали за мобилните данни" + "SMS съобщения" + "Съобщения в гласовата поща" + "Обаждания през Wi-Fi" "Отсрещният потребител заяви пълен TTY режим (FULL)" "Отсрещният потребител заяви TTY режим с пренос на слух (HCO)" "Отсрещният потребител заяви TTY режим с пренос на глас (VCО)" @@ -258,8 +265,18 @@ "Сигнали" "Демонстрационен режим за магазини" "USB връзка" + + + + + + + + + + "Безопасен режим" - "Системно от Android" + "Система Android" "Превключване към личния потребителски профил" "Превключване към служебния пoтребителски профил" "Контакти" @@ -284,8 +301,6 @@ "Инспектиране на съдържанието на прозорец, с който взаимодействате." "Включване на изследването чрез докосване" "Докосваните елементи ще бъдат изговаряни на глас и екранът може да бъде изследван посредством жестове." - "Включване на подобрената достъпност в мрежата" - "Скриптовете може да бъдат инсталирани, за да направят съдържанието от приложенията по-достъпно." "Наблюдение на въвеждания от вас текст" "Включва лични данни, като например номера на кредитни карти и пароли." "Управление на увеличението на дисплея" @@ -1471,7 +1486,7 @@ "Текущ потребител %1$s." "Превключва се към %1$s…" "%1$s излиза…" - "Собственик" + "собственик" "Грешка" "Тази промяна не е разрешена от администратора ви" "Няма намерено приложение за извършване на това действие" @@ -1732,11 +1747,12 @@ "Превключете към режима за въвеждане на текст, за да въведете часа." "Превключете към режима за часовник, за да въведете часа." "Опции за автоматично попълване" + "Запазване за автоматично попълване" "Съдържанието не може да бъде попълнено автоматично" - "Да се запази ли в/ъв „%1$s“?" - "%1$s да се запази ли в/ъв „%2$s“?" - "Искате ли да запазите %1$s и %2$s в/ъв „%3$s“?" - "Искате ли да запазите %1$s, %2$s и %3$s в/ъв „%4$s“?" + "Да се запази ли в/ъв <b>%1$s</b>?" + "%1$s да се запази ли в/ъв <b>%2$s</b>?" + "%1$s и %2$s да се запазят ли в/ъв <b>%3$s</b>?" + "%1$s, %2$s и %3$s да се запазят ли в/ъв <b>%4$s</b>?" "Запазване" "Не, благодаря" "Паролата" diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 754e04f3fda9550a50f69bca872b3f1291c4ad9a..b574890b5cc96e3d982cf52e6a03180bc5b9619e 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -99,6 +99,13 @@ "আপনার পরিষেবা প্রদানকারী এই অবস্থানে ভয়েস এবং জরুরি কল সাময়িকভাবে সাসপেন্ড করেছে" "নেটওয়ার্কের সিগন্যাল নেই" "রিসেপশন উন্নত করতে সিস্টেম > নেটওয়ার্ক এবং ইন্টারনেট > মোবাইল নেটওয়ার্ক > পছন্দের নেটওয়ার্কের ধরণ এ গিয়ে নির্বাচিত নেটওয়ার্কের ধরণ পরিবর্তন করে দেখুন।" + "সতর্কবার্তা" + "কল ফরওয়ার্ড করা" + "জরুরি কলব্যাক মোড" + "মোবাইল ডেটার সতর্কবার্তা" + "এসএমএস বার্তা" + "ভয়েসমেল বার্তা" + "ওয়াই-ফাই কলিং" "পির TTY মোড FULL অনুরোধ করেছে" "পির TTY মোড HCO অনুরোধ করেছে" "পির TTY মোড VCO অনুরোধ করেছে" @@ -258,6 +265,16 @@ "সতর্কতাগুলি" "খুচরা বিক্রয়ের ডেমো" "USB সংযোগ" + + + + + + + + + + "নিরাপদ মোড" "Android সিস্টেম" "ব্যক্তিগততে পাল্টান" @@ -284,8 +301,6 @@ "আপনি ইন্টারঅ্যাক্ট করছেন এমন একটি উইন্ডোর সামগ্রীকে সযত্নে নিরীক্ষণ করে৷" "স্পর্শের মাধ্যমে অন্বেষণ করা চালু করুন" "যে আইটেমগুলিতে আলতো চেপেছেন সেগুলি সশব্দে বলবে এবং ইঙ্গিতগুলি ব্যবহার করে স্ক্রীন অন্বেষণ করা যাবে৷" - "উন্নত ওয়েব অ্যাক্সেসযোগ্যতা চালু করুন" - "অ্যাপ্লিকেশানের সামগ্রীকে আরো অ্যাক্সেসযোগ্য করতে স্ক্রিপ্টগুলি ইনস্টল করা হতে পারে৷" "আপনার লেখা পাঠ্যকে নিরীক্ষণ করে" "ক্রেডিট কার্ডের নম্বর ও পাসওয়ার্ডগুলির মতো ব্যক্তিগত তথ্য অন্তর্ভুক্ত করে৷" "প্রদর্শনের বৃহত্তরীকরণ ব্যবস্থা নিয়ন্ত্রণ করুন" @@ -1101,7 +1116,7 @@ "মোবাইল ডেটা" "Wi-Fi" - "Bluetooth" + "ব্লুটুথ" "ইথারনেট" "VPN" @@ -1604,7 +1619,7 @@ "আপনার প্রশাসক ইনস্টল করেছেন" "আপনার প্রশাসক আপডেট করেছেন" "আপনার প্রশাসক মুছে দিয়েছেন" - "ব্যাটরির লাইফ উন্নত করতে সহায়তা করতে, ব্যাটারি সাশ্রয়কারী আপনার ডিভাইসের কার্যসম্পাদনা হ্রাস করে এবং কম্পন, অবস্থান পরিষেবাসমূহ এবং অধিকাংশ ব্যাকগ্রাউন্ড ডেটা সীমিত করে৷ ইমেল, বার্তাপ্রেরণ এবং অন্যান্য অ্যাপ্লিকেশানগুলিকে যেগুলি সিঙ্কের উপর নির্ভর করে সেগুলিকে আপনি না খোলা পর্যন্ত নাও আপডেট হতে পারে৷\n\nআপনার ডিভাইসটিকে যখন চার্জ করা হয় তখন ব্যাটারি সাশ্রয়কারী স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়৷" + "ব্যাটরির লাইফ উন্নত করতে সহায়তা করতে, ব্যাটারি সাশ্রয়কারী আপনার ডিভাইসের কার্যসম্পাদনা হ্রাস করে এবং কম্পন, অবস্থান পরিষেবাগুলি এবং অধিকাংশ ব্যাকগ্রাউন্ড ডেটা সীমিত করে৷ ইমেল, বার্তাপ্রেরণ এবং অন্যান্য অ্যাপ্লিকেশানগুলিকে যেগুলি সিঙ্কের উপর নির্ভর করে সেগুলিকে আপনি না খোলা পর্যন্ত নাও আপডেট হতে পারে৷\n\nআপনার ডিভাইসটিকে যখন চার্জ করা হয় তখন ব্যাটারি সাশ্রয়কারী স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়৷" "ডেটার ব্যবহার কমাতে সহায়তা করার জন্য, ডেটা সেভার পটভূমিতে কিছু অ্যাপ্লিকেশানকে ডেটা পাঠাতে বা গ্রহণ করতে বাধা দেয়৷ আপনি বর্তমানে এমন একটি অ্যাপ্লিকেশান ব্যবহার করছেন যেটি ডেটা অ্যাক্সেস করতে পারে, তবে সেটি কমই করে৷ এর ফলে যা হতে পারে, উদাহরণস্বরূপ, আপনি ছবিগুলিতে আলতো চাপ না দেওয়া পর্যন্ত সেগুলি প্রদর্শিত হবে না৷" "ডেটা সেভার চালু করবেন?" "চালু করুন" @@ -1733,11 +1748,12 @@ "সময় ইনপুট দেওয়ার জন্য পাঠ্য ইনপুট মোডে যান।" "সময় ইনপুট দেওয়ার জন্য ঘড়ি মোডে যান।" "আপনাআপনি পূরণ করার বিকল্পগুলি" + "স্বতঃপূর্ণর জন্য সংরক্ষণ করুন" "বিষয়বস্তুগুলি অটো-ফিল করা যাবে না" - "%1$s এ সংরক্ষণ করবেন?" - "%2$s%1$s সংরক্ষণ করবেন?" - "%1$s, %2$s %3$s এ সংরক্ষণ করবেন?" - "%1$s, %2$s, %3$s %4$s এ সংরক্ষণ করবেন?" + "<b>%1$s</b> এ সংরক্ষণ করবেন?" + "%1$s কে <b>%2$s</b>এ সংরক্ষণ করবেন?" + "%1$s এবং %2$s কে <b>%3$s</b> এ সংরক্ষণ করবেন?" + "%1$s, %2$s, এবং %3$s কে <b>%4$s</b> এ সংরক্ষণ করবেন?" "সংরক্ষণ করুন" "না থাক" "পাসওয়ার্ড" diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 6b8fa7878877c933e818e32108f7dd815b1f4f41..37fa55fc3b709a030f2521c79ad385d70a9eb7ea 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -100,6 +100,13 @@ "Vaš operater je na ovoj lokaciji privremeno obustavio govorne i hitne pozive." "Nije moguće dosegnuti mrežu" "Za poboljšanje prijema, pokušajte promijeniti tip odabran u meniju Sistem > Mreža i internet > Mobilne mreže > Preferirani tip mreže." + "Upozorenja" + "Preusmjeravanje poziva" + "Način rada za hitni povratni poziv" + "Upozorenja za mobilne podatke" + "SMS poruke" + "Poruke govorne pošte" + "Wi-Fi pozivanje" "Ravnopravni uređaj zatražio TTY PUNI način rada" "Ravnopravni uređaj zatražio TTY HCO način rada" "Ravnopravni uređaj zatražio TTY VCO način rada" @@ -261,6 +268,16 @@ "Upozorenja" "Promotivna demonstracija u maloprodaji" "USB veza" + + + + + + + + + + "Siguran način rada" "Android sistem" "Prebacite se na lični" @@ -283,15 +300,13 @@ "poziva i upravlja pozivima" "Tjelesni senzori" "pristupa podacima senzora o vašim vitalnim funkcijama" - "Ponovo prikaži sadržaj prozora" - "Istražite sadržaj prozora koji trenutno koristite." - "Uključite Istraživanje dodirom" + "Preuzima sadržaj prozora" + "Pregleda sadržaj prozora koji trenutno koristite." + "Uključi opciju Istraživanje dodirom" "Stavke koje dodirnete bit će izgovorene naglas, a ekran možete istraživati koristeći pokrete." - "Uključite poboljšanu web pristupačnost" - "Možda će biti instalirana skripta kako bi sadržaj aplikacije bio dostupniji." - "Obratite pažnju na tekst koji tipkate" - "Uključuje lične podatke kao što su brojevi kreditnih kartica i lozinke." - "Kontroliranje uvećanja prikaza na ekranu" + "Prati tekst koji unosite" + "Obuhvata lične podatke kao što su brojevi kreditnih kartica i lozinke." + "Kontrolira uvećanje prikaza na ekranu" "Kontrolira stepen uvećanja prikaza na ekranu i podešavanje položaja." "Praviti pokrete" "Može dodirivati, prevlačiti, hvatati prstima i praviti druge pokrete." @@ -641,14 +656,14 @@ "TTY TDD" "Poslovni mobilni" "Poslovni pejdžer" - "Pomoćnik" + "Asistent" "MMS" "Prilagođeno" "Rođendan" "Godišnjica" "Ostalo" "Prilagođeno" - "Kućni" + "Privatna" "Posao" "Ostalo" "Mobilni" @@ -674,7 +689,7 @@ "Ostalo" "Prilagođeno" "Prilagođeno" - "Pomoćnik" + "Asistent" "Brat" "Dijete" "Nevjenčani partner" @@ -849,9 +864,9 @@ "razmak" "potvrdi" "izbriši" - "Traži" + "Pretraži" "Pretraži..." - "Traži" + "Pretraživanje" "Upit za pretragu" "Obriši upit" "Potvrditi upit" @@ -878,7 +893,7 @@ "minuta" "minute" "sekunda" - "sekunde" + "s" "sedmica" "sedmice" "godina" @@ -993,7 +1008,7 @@ "Način unosa" "Akcije za tekst" "E-pošta" - "Telefon" + "Pozovi" "Mapa" "Pretraži" "Ponestaje prostora za pohranu" @@ -1091,7 +1106,7 @@ "Proces %1$s je premašio ograničenje procesne memorije od %2$s. 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." "Biranje akcije za tekst" "Jačina zvuka zvona" - "Jačina zvuka za medijske sadržaje" + "Jačina zvuka medija" "Medijski sadržaj se reproducira preko Bluetooth veze" "Postavljena nečujna melodija zvona" "Jačina zvuka tokom poziva" @@ -1102,7 +1117,7 @@ "Jačina zvuka za Bluetooth vezu" "Jačina zvuka melodije" "Jačina zvuka tokom poziva" - "Jačina zvuka za medijske sadržaje" + "Jačina zvuka medija" "Jačina zvuka za obavještenja" "Zadana melodija zvona" "Zadano (%1$s)" @@ -1112,7 +1127,7 @@ "Zvuci obavještenja" "Nepoznato" "Prijavljivanje na Wi-Fi mrežu" - "Prijavite se na mrežu" + "Prijava na mrežu" "Wi-Fi nema pristup Internetu" @@ -1143,7 +1158,7 @@ "Pozivnica poslana" "Poziv za povezivanje" "Pošiljalac:" - "Primalac:" + "Prima:" "Unesite potrebni PIN:" "PIN:" "Tablet će privremeno prekinuti Wi-Fi vezu dok bude povezan s uređajem %1$s" @@ -1179,7 +1194,7 @@ "Postavljanje vremena" "Postavljanje datuma" "Postaviti" - "Završeno" + "Gotovo" "NOVO: " "Aplikacija %1$s omogućava." "Nisu potrebne dozvole" @@ -1204,7 +1219,7 @@ "ODBACI" "Promijeni tastaturu" "Prikaži na ekranu dok je fizička tastatura aktivna" - "Prikaži virtualnu tastaturu" + "Prikaži virtuelnu tastaturu" "Konfiguriraj fizičku tastaturu" "Dodirnite za odabir jezika i rasporeda" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -1265,7 +1280,7 @@ "Dodirnite dvaput za kontrolu uvećanja" "Dodavanje vidžeta nije uspjelo." "Počni" - "Traži" + "Pretraži" "Poslati" "Naprijed" "Gotovo" @@ -1302,7 +1317,7 @@ "Dodirnite za postavke" "Odabir fajla" "Nije izabran nijedan fajl" - "Ponovno pokretanje" + "Vrati na zadano" "Potvrdi" "Način rada u autu omogućen" "Dodirnite za izlaz iz načina rada u automobilu" @@ -1337,7 +1352,7 @@ "Poništiti brisanje" "Ne radi ništa za sada" "Odaberite račun" - "Dodajte račun" + "Dodaj račun" "Dodajte račun" "Povećaj" "Smanji" @@ -1431,7 +1446,7 @@ "Bežični prikaz" "Prebacuj" "Poveži na uređaj" - "Prebaci ekran na uređaj" + "Emitiranje ekrana na uređaj" "Traženje uređajā…" "Postavke" "Prekini vezu" @@ -1609,8 +1624,8 @@ "Pokušajte ponovo kasnije." "Prikazuje se cijeli ekran" "Da izađete, prevucite nadolje odozgo." - "Jasno mi je" - "Završeno" + "Razumijem" + "Gotovo" "Kružni klizač za odabir sata" "Kružni klizač za minute" "Odaberite sat" @@ -1631,7 +1646,7 @@ "Instalirao je vaš administrator" "Ažurirao je vaš administrator" "Izbrisao je vaš administrator" - "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." + "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." "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." "Uključiti Uštedu podataka?" "Uključi" @@ -1763,17 +1778,18 @@ "Otklanjanje grešaka putem uređaja spojenog na USB" "sat" "minuta" - "Postavite vrijeme" + "Postavljanje vremena" "Unesite ispravno vrijeme" "Upišite vrijeme" "Prebacite u način unosa teksta za unos vremena." "Prebacite u način rada kao sat za unos vremena." "Opcije za automatsko popunjavanje" + "Sačuvaj za automatsko popunjavanje" "Sadržaje nije moguće automatski popuniti" - "Želite li sačuvati u: %1$s?" - "Želite li sačuvati stavku %1$s u: %2$s?" - "Želite li %1$s, %2$s sačuvati u %3$s?" - "Želite li %1$s, %2$s, %3$s sačuvati u %4$s?" + "Želite li sačuvati u <b>%1$s</b>?" + "Želite li da se %1$s sačuva u <b>%2$s</b>?" + "Želite li da se %1$s i %2$s sačuvaju u <b>%3$s</b>?" + "Želite li da se %1$s, %2$s, i %3$s sačuvaju <b>%4$s</b>?" "Sačuvaj" "Ne, hvala" "lozinka" diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index b0ea791dc44d0e44b17e693cb6d9441a18c55b6e..0b77c82fae42b647e56b9d2e9ff5d71ad0a143f1 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -99,6 +99,13 @@ "El teu operador de telefonia mòbil ha suspès temporalment les trucades de veu i d\'emergència en aquesta ubicació" "No es pot accedir a la xarxa" "Per millorar la recepció, prova de canviar-ne el tipus a Sistema > Xarxa i Internet > Xarxes de telefonia mòbil > Tipus de xarxa preferit." + "Alertes" + "Desviació de trucades" + "Mode de devolució de trucada d\'emergència" + "Alertes de dades mòbils" + "Missatges SMS" + "Missatges de veu" + "Trucades per Wi-Fi" "L\'altre dispositiu ha sol·licitat el mode TTY COMPLET." "L\'altre dispositiu ha sol·licitat el mode TTY HCO." "L\'altre dispositiu ha sol·licitat el mode TTY VCO." @@ -136,7 +143,7 @@ "%s" "Trucada de Wi-Fi de: %s" - "Desactivades" + "Desactivat" "Preferència per la Wi-Fi" "Preferència per a dades mòbils" "Només Wi-Fi" @@ -258,6 +265,16 @@ "Alertes" "Demostració comercial" "Connexió USB" + + + + + + + + + + "Mode segur" "Sistema Android" "Canvia al perfil personal" @@ -284,14 +301,12 @@ "Inspecciona el contingut d\'una finestra amb què estàs interaccionant." "Activar Exploració tàctil" "Els elements que toquis es diran en veu alta, i podràs explorar la pantalla amb gestos." - "Activar l\'accessibilitat web millorada" - "És possible que s\'instal·lin scripts perquè el contingut de les aplicacions sigui més accessible." "Observar el text que escrius" "Inclou dades personals com ara números de targetes de crèdit i contrasenyes." - "Controla l\'ampliació de la pantalla" - "Controla el nivell i el posicionament del zoom de la pantalla." + "Controlar l\'ampliació de la pantalla" + "Controla el nivell i la posició del zoom de la pantalla." "Utilitza gestos" - "Pot tocar, lliscar, pessigar i utilitzar altres gestos." + "Permet tocar, lliscar, pinçar i fer altres gestos." "Gestos al sensor d\'empremtes digitals" "Captura gestos realitzats en el sensor d\'empremtes digitals del dispositiu." "desactivar o modificar la barra d\'estat" @@ -1603,7 +1618,7 @@ "Instal·lat per l\'administrador" "Actualitzat per l\'administrador" "Suprimit per l\'administrador" - "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." + "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." "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." "Activar Economitzador de dades?" "Activa" @@ -1691,7 +1706,7 @@ "S\'activarà el teu perfil professional, incloses les aplicacions, la sincronització en segon pla i les funcions relacionades" "Activa" "Tens missatges nous" - "Obre l\'aplicació de SMS per veure\'ls" + "Obre l\'aplicació d\'SMS per veure\'ls" "Algunes funcions es limitaran" "Toca per desbloquejar" "Dades d\'usuari bloquejades" @@ -1732,11 +1747,12 @@ "Canvia al mode d\'introducció de text per introduir l\'hora." "Canvia al mode de rellotge per introduir l\'hora." "Opcions d\'emplenament automàtic" + "Desa per a emplenament automàtic" "El contingut no es pot emplenar automàticament" - "Vols desar-ho a %1$s?" - "Vols desar la informació del camp %1$s a %2$s?" - "Vols desar %1$s i %2$s a %3$s?" - "Vols desar %1$s, %2$s i %3$s a %4$s?" + "Vols desar-ho a %1$s?" + "Vols desar %1$s a %2$s?" + "Vols desar %1$s i %2$s a %3$s?" + "Vols desar %1$s, %2$s i %3$s a %4$s?" "Desa" "No, gràcies" "contrasenya" diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 0b9b95dde2789f49c6484bcb306188102e7856a4..31f08268ed6893f6545cdce1cf7574a195e85413 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -101,6 +101,13 @@ "Váš operátor v této oblasti dočasně blokuje hlasová i tísňová volání" "K síti se nelze připojit" "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ě." + "Upozornění" + "Přesměrování hovorů" + "Režim tísňového zpětného volání" + "Upozornění na mobilní data" + "Zprávy SMS" + "Hlasové zprávy" + "Volání přes Wi-Fi" "Partner požádal o přechod na režim TTY FULL" "Partner požádal o přechod na režim TTY HCO" "Partner požádal o přechod na režim TTY VCO" @@ -264,6 +271,16 @@ "Upozornění" "Prodejní ukázka" "Připojení USB" + + + + + + + + + + "Nouzový režim" "Systém Android" "Přepnout na osobní profil" @@ -290,8 +307,6 @@ "Může prozkoumávat obsah oken, se kterými pracujete." "Zapnout funkci Prozkoumání dotykem" "Položky, na které klepnete, budou přečteny nahlas a obrazovku bude možné procházet pomocí gest." - "Zapnout vylepšené usnadnění přístupu k webu" - "Za účelem usnadnění přístupu k obsahu aplikací mohou být nainstalovány skripty." "Sledovat zadávaný text" "Sledování zahrnuje osobní údaje, jako jsou například čísla kreditních karet a hesla." "Nastavení zvětšení obsahu obrazovky" @@ -1647,7 +1662,7 @@ "Nainstalováno administrátorem" "Aktualizováno administrátorem" "Smazáno administrátorem" - "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." + "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." "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." "Chcete zapnout Spořič dat?" "Zapnout" @@ -1794,11 +1809,12 @@ "Chcete-li zadat čas, přepněte na režim textu." "Chcete-li zadat čas, přepněte na režim hodin." "Možnosti automatického vyplňování" + "Uložit do Automatického vyplňování" "Obsah nelze automaticky vyplnit" - "Uložit do služby %1$s?" - "Uložit položku %1$s do služby %2$s?" - "Má se %1$s%2$s uložit do služby %3$s?" - "Má se %1$s, %2$s%3$s uložit do služby %4$s?" + "Uložit do služby <b>%1$s</b>?" + "Uložit položku %1$s do služby <b>%2$s</b>?" + "Uložit položky %1$s%2$s do služby <b>%3$s</b>?" + "Uložit položky %1$s, %2$s%3$s do služby <b>%4$s</b>?" "Uložit" "Ne, děkuji" "heslo" diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 1708834ce4160b3530a4cfb567104f8507722c44..a258f082fdfacd563a5a40bfce6dc295f6659e3c 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -99,6 +99,13 @@ "Dit mobilselskab har midlertidigt suspenderet tale- og nødopkald på dette sted" "Der er ingen forbindelse til netværket" "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." + "Underretninger" + "Viderestilling af opkald" + "Nødtilbagekaldstilstand" + "Underretninger om mobildata" + "Sms-beskeder" + "Talebeskeder" + "Wi-Fi-opkald" "Den anden enhed har skiftet til FULD TTY-tilstand" "Den anden enhed har skiftet til TTY-tilstanden HCO" "Den anden enhed har skiftet til TTY-tilstanden VCO" @@ -258,6 +265,16 @@ "Underretninger" "Demo til udstilling i butik" "USB-forbindelse" + + + + + + + + + + "Sikker tilstand" "Android-system" "Skift til Tilpasset" @@ -284,11 +301,9 @@ "undersøge indholdet i et vindue, du interagerer med." "aktivere Udforsk ved berøring" "De elementer, der trykkes på, læses højt, og skærmen kan udforskes ved hjælp af bevægelser." - "Aktivér udvidede webhjælpefunktioner" - "Der installeres muligvis scripts for at gøre appindhold mere tilgængeligt." "observere tekst, du skriver" "Dette omfatter personlige data såsom kreditkortnumre og adgangskoder." - "Kontrollér skærmforstørrelsen" + "administrere skærmforstørrelsen" "Kontrollér skærmens zoomniveau og position." "Udfør bevægelser" "Kan trykke, stryge, knibe sammen og udføre andre bevægelser." @@ -312,8 +327,8 @@ "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." "modtage tekstbeskeder (mms)" "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." - "læse Cell Broadcast-beskeder" - "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." + "læse Cell Broadcast-meddelelser" + "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." "læse feeds, jeg abonnerer på" "Tillader, at appen kan hente oplysninger om de feeds, der synkroniseres." "Send og se sms-beskeder" @@ -1069,19 +1084,19 @@ "Processen %1$s har overskredet sin proceshukommelsesgrænse på %2$s. 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." "Vælg en handling for teksten" "Lydstyrke for opkald" - "Medielydstyrke" + "Lydstyrke for medier" "Afspilning via Bluetooth" "Lydløs ringetone er angivet" "Lydstyrke for opkald" "Lydstyrke for Bluetooth under opkald" "Lydstyrke for alarm" - "Lydstyrke for meddelelser" + "Lydstyrke for underretninger" "Lydstyrke" "Lydstyrke for bluetooth" "Lydstyrke for ringetone" "Lydstyrke for opkald" - "Medielydstyrke" - "Lydstyrke for meddelelser" + "Lydstyrke for medier" + "Lydstyrke for underretninger" "Standardringetone" "Standard (%1$s)" "Ingen" @@ -1562,7 +1577,7 @@ "Annulleret" "Fejl ved skrivning af indhold" "ukendt" - "Udskriftstjenesten er ikke aktiveret" + "Udskrivningstjenesten er ikke aktiveret" "Tjenesten %s er installeret" "Tryk for at aktivere" "Indtast administratorpinkoden" @@ -1604,7 +1619,7 @@ "Opdateret af din administrator" "Slettet af din administrator" "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." - "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." + "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." "Vil du slå Datasparefunktion til?" "Slå til" @@ -1726,17 +1741,18 @@ "USB-fejlretning" "time" "minut" - "Indstil klokkeslæt" + "Angiv klokkeslæt" "Angiv et gyldigt klokkeslæt" "Angiv klokkeslæt" "Skift til teksttilstand for at angive klokkeslæt." "Skift til urtilstand for at angive klokkeslæt." "Valgmuligheder for AutoFyld" + "Gem i AutoFyld" "Indhold kan ikke udfyldes automatisk" - "Skal indholdet gemmes i %1$s?" - "Skal %1$s gemmes i %2$s?" - "Vil du gemme %1$s, %2$s til %3$s?" - "Vil du gemme %1$s, %2$s, %3$s til %4$s?" + "Vil du gemme i <b>%1$s</b>?" + "Vil du gemme %1$s i <b>%2$s</b>?" + "Vil du gemme %1$s og %2$s i <b>%3$s</b>?" + "Vil du gemme %1$s, %2$s og %3$s i <b>%4$s</b>?" "Gem" "Nej tak" "adgangskode" diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index e283c3d846f21bb1fabcf43698f60832b6f59328..5a70d9b1ab2a5bf40aed50063da7e18049fe0833 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -82,7 +82,7 @@ "Dreierkonferenz" "Ablehnung unerwünschter Anrufe" "Rufnummernübermittlung" - "Bitte nicht stören" + "Nicht stören" "Anrufer-ID ist standardmäßig beschränkt. Nächster Anruf: Beschränkt" "Anrufer-ID ist standardmäßig beschränkt. Nächster Anruf: Nicht beschränkt" "Anrufer-ID ist standardmäßig nicht beschränkt. Nächster Anruf: Beschränkt" @@ -99,6 +99,13 @@ "Dein Anbieter hat Anrufe und Notrufe an diesem Standort vorübergehend ausgesetzt" "Netzwerk nicht erreichbar" "Der Empfang lässt sich möglicherweise verbessern, indem du unter \"System\" > \"Netzwerk\" & \"Internet\" > \"Mobilfunknetze\" > \"Bevorzugter Netzwerktyp\" einen anderen Typ auswählst." + "Warnmeldungen" + "Anrufweiterleitung" + "Notfallrückrufmodus" + "Warnmeldungen für mobile Daten" + "SMS" + "Mailboxnachrichten" + "Anrufe über WLAN" "Peer hat TTY-Modus \"Vollständig\" angefordert." "Peer hat TTY-Modus \"HCO\" angefordert." "Peer hat TTY-Modus \"VC\" angefordert." @@ -258,6 +265,16 @@ "Warnmeldungen" "Demo für Einzelhandel" "USB-Verbindung" + + + + + + + + + + "Abgesicherter Modus" "Android-System" "Zu \"Privat\" wechseln" @@ -265,7 +282,7 @@ "Kontakte" "auf deine Kontakte zugreifen" "Standort" - "auf den Standort deines Geräts zuzugreifen" + "auf den Standort deines Geräts zugreifen" "Kalender" "auf deinen Kalender zugreifen" "SMS" @@ -284,8 +301,6 @@ "Die Inhalte eines Fensters, mit dem du interagierst, werden abgerufen." "\"Tippen & Entdecken\" aktivieren" "Berührte Elemente werden laut vorgelesen und der Bildschirm kann über Gesten erkundet werden." - "Verbesserte Web-Bedienung aktivieren" - "Skripts können installiert werden, um den Zugriff auf App-Inhalte zu erleichtern." "Text bei der Eingabe beobachten" "Einschließlich personenbezogener Daten wie Kreditkartennummern und Passwörter." "Displayvergrößerung festlegen" @@ -441,7 +456,7 @@ "WLAN-Verbindungen abrufen" "Ermöglicht der App, Informationen zu WLANs abzurufen, etwa ob ein WLAN aktiviert ist, und den Namen verbundener WLAN-Geräte." "WLAN-Verbindungen herstellen und trennen" - "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." + "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." "WLAN-Multicast-Empfang zulassen" "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." "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." @@ -1402,7 +1417,7 @@ "System" "Bluetooth-Audio" "Kabellose Übertragung (WiDi)" - "Übertragen" + "Streamen" "Mit Gerät verbinden" "Bildschirm auf Gerät übertragen" "Geräte werden gesucht…" @@ -1603,7 +1618,7 @@ "Von deinem Administrator installiert" "Von deinem Administrator aktualisiert" "Von deinem Administrator gelöscht" - "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." + "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." "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." "Datensparmodus aktivieren?" "Aktivieren" @@ -1641,7 +1656,7 @@ "Bis %1$s" "Bis %1$s (nächste Weckzeit)" - "Bis zur Deaktivierung von \"Bitte nicht stören\"" + "Bis zur Deaktivierung von \"Nicht stören\"" "Bis zur Deaktivierung von \"Nicht stören\"" "%1$s/%2$s" "Minimieren" @@ -1732,11 +1747,12 @@ "In den Texteingabemodus wechseln, um die Uhrzeit einzugeben." "In den Uhrzeitmodus wechseln, um die Uhrzeit einzugeben." "AutoFill-Optionen" + "Für AutoFill speichern" "Inhalte können nicht automatisch ausgefüllt werden" - "In %1$s speichern?" - "%1$s in %2$s speichern?" - "\"%1$s\" und \"%2$s\" in \"%3$s\" speichern?" - "\"%1$s\", \"%2$s\" und \"%3$s\" in \"%4$s\" speichern?" + "In <b>%1$s</b> speichern?" + "%1$s in <b>%2$s</b> speichern?" + "%1$s und %2$s in <b>%3$s</b> speichern?" + "%1$s, %2$s und %3$s in <b>%4$s</b> speichern?" "Speichern" "Nein danke" "Passwort" diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 99fa2e56a5254f87ac583ede989a397f2268e687..0cc6dc6025468073eb165987f1e5c84e9ab7bd85 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -99,6 +99,13 @@ "Οι φωνητικές κλήσεις και οι κλήσεις έκτακτης ανάγκης έχουν τεθεί προσωρινά σε αναστολή από την εταιρεία κινητής τηλεφωνίας σας σε αυτήν την περιοχή" "Δεν είναι δυνατή η σύνδεση στο δίκτυο" "Για να βελτιώσετε τη λήψη, δοκιμάστε να αλλάξετε τον επιλεγμένο τύπο από το Σύστημα > Δίκτυο και διαδίκτυο > Δίκτυα κινητής τηλεφωνίας > Προτιμώμενος τύπος δικτύου." + "Ειδοποιήσεις" + "Προώθηση κλήσης" + "Λειτουργία επιστροφής κλήσης έκτακτης ανάγκης" + "Ειδοποιήσεις δεδομένων κινητής τηλεφωνίας" + "Μηνύματα SMS" + "Μηνύματα αυτόματου τηλεφωνητή" + "Κλήση Wi-Fi" "Αίτημα peer για TTY ΠΛΗΡΗΣ Λειτουργία" "Αίτημα peer για TTY Λειτουργία HCO" "Αίτημα peer για TTY Λειτουργία VCO" @@ -258,6 +265,16 @@ "Ειδοποιήσεις" "Επίδειξη λιανικής" "Σύνδεση USB" + + + + + + + + + + "Ασφαλής λειτουργία" "Σύστημα Android" "Μετάβαση σε προσωπικό προφίλ" @@ -284,8 +301,6 @@ "Έλεγχος του περιεχομένου ενός παραθύρου με το οποίο αλληλεπιδράτε." "Ενεργοποίηση της \"Εξερεύνησης με άγγιγμα\"" "Τα στοιχεία που πατάτε θα εκφωνούνται και η εξερεύνηση της οθόνης μπορεί να γίνει με κινήσεις." - "Ενεργοποίηση της βελτιωμένης προσβασιμότητας ιστού" - "Ενδέχεται να εγκατασταθούν σενάρια για τη βελτίωση της πρόσβασης στο περιεχόμενο της εφαρμογής." "Παρακολούθηση του κειμένου που πληκτρολογείτε" "Περιλαμβάνει προσωπικά δεδομένα, όπως είναι οι αριθμοί πιστωτικών καρτών και οι κωδικοί πρόσβασης." "Ελέγξτε τη μεγέθυνση της οθόνης" @@ -1603,7 +1618,7 @@ "Εγκαταστάθηκε από τον διαχειριστή σας" "Ενημερώθηκε από τον διαχειριστή σας" "Διαγράφηκε από τον διαχειριστή σας" - "Προκειμένου να βελτιώσει τη διάρκεια ζωής της μπαταρίας σας, η Εξοικονόμηση μπαταρίας μειώνει την απόδοση της συσκευής σας και περιορίζει λειτουργίες όπως η δόνηση, οι υπηρεσίες τοποθεσίας και τα περισσότερα δεδομένα παρασκηνίου. Το ηλεκτρονικό ταχυδρομείο, η ανταλλαγή μηνυμάτων και άλλες εφαρμογές που βασίζονται στο συγχρονισμό ενδέχεται να μην ενημερώνονται έως ότου τις ανοίξετε.\n\nΗ Εξοικονόμηση μπαταρίας απενεργοποιείται αυτόματα όταν η συσκευή σας φορτίζει." + "Προκειμένου να βελτιώσει τη διάρκεια ζωής της μπαταρίας σας, η Εξοικονόμηση μπαταρίας μειώνει την απόδοση της συσκευής σας και περιορίζει λειτουργίες όπως η δόνηση, οι υπηρεσίες τοποθεσίας και τα περισσότερα δεδομένα παρασκηνίου. Το ηλεκτρονικό ταχυδρομείο, η ανταλλαγή μηνυμάτων και άλλες εφαρμογές που βασίζονται στο συγχρονισμό ενδέχεται να μην ενημερώνονται μέχρι να τις ανοίξετε.\n\nΗ Εξοικονόμηση μπαταρίας απενεργοποιείται αυτόματα όταν η συσκευή σας φορτίζει." "Προκειμένου να μειωθεί η χρήση δεδομένων, η Εξοικονόμηση δεδομένων αποτρέπει την αποστολή ή λήψη δεδομένων από ορισμένες εφαρμογές στο παρασκήνιο. Μια εφαρμογή που χρησιμοποιείτε αυτήν τη στιγμή μπορεί να χρησιμοποιήσει δεδομένα αλλά με μικρότερη συχνότητα. Για παράδειγμα, οι εικόνες μπορεί να μην εμφανίζονται μέχρι να τις πατήσετε." "Ενεργ.Εξοικονόμησης δεδομένων;" "Ενεργοποίηση" @@ -1641,8 +1656,8 @@ "Έως τις %1$s" "Μέχρι τις %1$s (επόμενο ξυπνητήρι)" - "Μέχρι να απενεργοποιήσετε τη ρύθμιση \"Μην ενοχλείτε\"" - "Μέχρι να απενεργοποιήσετε τη ρύθμιση \"Μην ενοχλείτε\"" + "Μέχρι να απενεργοποιήσετε \"Μην ενοχλείτε\"" + "Μέχρι να απενεργοποιήσετε \"Μην ενοχλείτε\"" "%1$s / %2$s" "Σύμπτυξη" "Μην ενοχλείτε" @@ -1732,11 +1747,12 @@ "Κάντε εναλλαγή στη λειτουργία εισαγωγής κειμένου, για την εισαγωγή της ώρας." "Κάντε εναλλαγή στη λειτουργία ρολογιού, για την εισαγωγή της ώρας." "Επιλογές αυτόματης συμπλήρωσης" + "Αποθήκευση για Αυτόματη Συμπλήρωση" "Δεν είναι δυνατή η αυτόματη συμπλήρωση των περιεχομένων" - "Αποθήκευση σε %1$s;" - "Αποθήκευση %1$s σε %2$s;" - "Αποθήκευση %1$s, %2$s σε %3$s;" - "Αποθήκευση %1$s, %2$s, %3$s σε %4$s;" + "Αποθήκευση σε <b>%1$s</b>;" + "Αποθήκευση %1$s σε <b>%2$s</b>;" + "Αποθήκευση %1$s και %2$s σε <b>%3$s</b>;" + "Αποθήκευση %1$s, %2$s και %3$s σε <b>%4$s</b>;" "Αποθήκευση" "Όχι, ευχαριστώ" "κωδικός πρόσβασης" diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 0a6a7d5554bfa4740547a4ec67cda25416213ae6..4976b037e7cde1c3ad7c4b2c92fade95f2ee263a 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -99,6 +99,13 @@ "Your operator has temporarily suspended voice and emergency calls at this location" "Can’t find network" "To improve reception, try changing the type selected at System > Network & Internet > Mobile networks > Preferred network type." + "Alerts" + "Call forwarding" + "Emergency callback mode" + "Mobile data alerts" + "SMS messages" + "Voicemail messages" + "Wi-Fi Calling" "Peer requested TTY Mode FULL" "Peer requested TTY Mode HCO" "Peer requested TTY Mode VCO" @@ -258,8 +265,18 @@ "Alerts" "Retail demo" "USB connection" + + + + + + + + + + "Safe mode" - "Android System" + "Android system" "Switch to Personal" "Switch to Work" "Contacts" @@ -278,14 +295,12 @@ "take pictures and record video" "Telephone" "make and manage phone calls" - "Body Sensors" + "Body sensors" "access sensor data about your vital signs" "Retrieve window content" "Inspect the content of a window that you\'re interacting with." "Turn on Explore by Touch" "Tapped items will be spoken aloud and the screen can be explored using gestures." - "Turn on enhanced web accessibility" - "Scripts may be installed to make app content more accessible." "Observe text that you type" "Includes personal data such as credit card numbers and passwords." "Control display magnification" @@ -580,8 +595,8 @@ "Home" "Mobile" "Work" - "Work Fax" - "Home Fax" + "Work fax" + "Home fax" "Pager" "Other" "Custom" @@ -624,7 +639,7 @@ "Mobile" "Work" "Work Fax" - "Home Fax" + "Home fax" "Pager" "Other" "Callback" @@ -1603,7 +1618,7 @@ "Installed by your admin" "Updated by your admin" "Deleted by your admin" - "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." + "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." "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." "Turn on Data Saver?" "Turn on" @@ -1641,8 +1656,8 @@ "Until %1$s" "Until %1$s (next alarm)" - "Until you turn off Do Not Disturb" - "Until you turn off Do Not Disturb" + "Until you turn off Do not disturb" + "Until you turn off Do not disturb" "%1$s / %2$s" "Collapse" "Do not disturb" @@ -1732,11 +1747,12 @@ "Switch to text input mode for the time input." "Switch to clock mode for the time input." "Auto-fill options" + "Save for AutoFill" "Contents can’t be auto-filled" - "Save to %1$s?" - "Save %1$s to %2$s?" - "Save %1$s, %2$s to %3$s?" - "Save %1$s, %2$s, %3$s to %4$s?" + "Save to <b>%1$s</b>?" + "Save %1$s to <b>%2$s</b>?" + "Save %1$s and %2$s to <b>%3$s</b>?" + "Save %1$s, %2$s, and %3$s to <b>%4$s</b>?" "Save" "No thanks" "password" diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 0a6a7d5554bfa4740547a4ec67cda25416213ae6..4976b037e7cde1c3ad7c4b2c92fade95f2ee263a 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -99,6 +99,13 @@ "Your operator has temporarily suspended voice and emergency calls at this location" "Can’t find network" "To improve reception, try changing the type selected at System > Network & Internet > Mobile networks > Preferred network type." + "Alerts" + "Call forwarding" + "Emergency callback mode" + "Mobile data alerts" + "SMS messages" + "Voicemail messages" + "Wi-Fi Calling" "Peer requested TTY Mode FULL" "Peer requested TTY Mode HCO" "Peer requested TTY Mode VCO" @@ -258,8 +265,18 @@ "Alerts" "Retail demo" "USB connection" + + + + + + + + + + "Safe mode" - "Android System" + "Android system" "Switch to Personal" "Switch to Work" "Contacts" @@ -278,14 +295,12 @@ "take pictures and record video" "Telephone" "make and manage phone calls" - "Body Sensors" + "Body sensors" "access sensor data about your vital signs" "Retrieve window content" "Inspect the content of a window that you\'re interacting with." "Turn on Explore by Touch" "Tapped items will be spoken aloud and the screen can be explored using gestures." - "Turn on enhanced web accessibility" - "Scripts may be installed to make app content more accessible." "Observe text that you type" "Includes personal data such as credit card numbers and passwords." "Control display magnification" @@ -580,8 +595,8 @@ "Home" "Mobile" "Work" - "Work Fax" - "Home Fax" + "Work fax" + "Home fax" "Pager" "Other" "Custom" @@ -624,7 +639,7 @@ "Mobile" "Work" "Work Fax" - "Home Fax" + "Home fax" "Pager" "Other" "Callback" @@ -1603,7 +1618,7 @@ "Installed by your admin" "Updated by your admin" "Deleted by your admin" - "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." + "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." "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." "Turn on Data Saver?" "Turn on" @@ -1641,8 +1656,8 @@ "Until %1$s" "Until %1$s (next alarm)" - "Until you turn off Do Not Disturb" - "Until you turn off Do Not Disturb" + "Until you turn off Do not disturb" + "Until you turn off Do not disturb" "%1$s / %2$s" "Collapse" "Do not disturb" @@ -1732,11 +1747,12 @@ "Switch to text input mode for the time input." "Switch to clock mode for the time input." "Auto-fill options" + "Save for AutoFill" "Contents can’t be auto-filled" - "Save to %1$s?" - "Save %1$s to %2$s?" - "Save %1$s, %2$s to %3$s?" - "Save %1$s, %2$s, %3$s to %4$s?" + "Save to <b>%1$s</b>?" + "Save %1$s to <b>%2$s</b>?" + "Save %1$s and %2$s to <b>%3$s</b>?" + "Save %1$s, %2$s, and %3$s to <b>%4$s</b>?" "Save" "No thanks" "password" diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 0a6a7d5554bfa4740547a4ec67cda25416213ae6..4976b037e7cde1c3ad7c4b2c92fade95f2ee263a 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -99,6 +99,13 @@ "Your operator has temporarily suspended voice and emergency calls at this location" "Can’t find network" "To improve reception, try changing the type selected at System > Network & Internet > Mobile networks > Preferred network type." + "Alerts" + "Call forwarding" + "Emergency callback mode" + "Mobile data alerts" + "SMS messages" + "Voicemail messages" + "Wi-Fi Calling" "Peer requested TTY Mode FULL" "Peer requested TTY Mode HCO" "Peer requested TTY Mode VCO" @@ -258,8 +265,18 @@ "Alerts" "Retail demo" "USB connection" + + + + + + + + + + "Safe mode" - "Android System" + "Android system" "Switch to Personal" "Switch to Work" "Contacts" @@ -278,14 +295,12 @@ "take pictures and record video" "Telephone" "make and manage phone calls" - "Body Sensors" + "Body sensors" "access sensor data about your vital signs" "Retrieve window content" "Inspect the content of a window that you\'re interacting with." "Turn on Explore by Touch" "Tapped items will be spoken aloud and the screen can be explored using gestures." - "Turn on enhanced web accessibility" - "Scripts may be installed to make app content more accessible." "Observe text that you type" "Includes personal data such as credit card numbers and passwords." "Control display magnification" @@ -580,8 +595,8 @@ "Home" "Mobile" "Work" - "Work Fax" - "Home Fax" + "Work fax" + "Home fax" "Pager" "Other" "Custom" @@ -624,7 +639,7 @@ "Mobile" "Work" "Work Fax" - "Home Fax" + "Home fax" "Pager" "Other" "Callback" @@ -1603,7 +1618,7 @@ "Installed by your admin" "Updated by your admin" "Deleted by your admin" - "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." + "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." "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." "Turn on Data Saver?" "Turn on" @@ -1641,8 +1656,8 @@ "Until %1$s" "Until %1$s (next alarm)" - "Until you turn off Do Not Disturb" - "Until you turn off Do Not Disturb" + "Until you turn off Do not disturb" + "Until you turn off Do not disturb" "%1$s / %2$s" "Collapse" "Do not disturb" @@ -1732,11 +1747,12 @@ "Switch to text input mode for the time input." "Switch to clock mode for the time input." "Auto-fill options" + "Save for AutoFill" "Contents can’t be auto-filled" - "Save to %1$s?" - "Save %1$s to %2$s?" - "Save %1$s, %2$s to %3$s?" - "Save %1$s, %2$s, %3$s to %4$s?" + "Save to <b>%1$s</b>?" + "Save %1$s to <b>%2$s</b>?" + "Save %1$s and %2$s to <b>%3$s</b>?" + "Save %1$s, %2$s, and %3$s to <b>%4$s</b>?" "Save" "No thanks" "password" diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index df55b6cac14283019e2a21bf9ae90ce5f0209361..5515ae19a99666383460d6d32492516b49ca87bf 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -99,6 +99,13 @@ "Tu proveedor suspendió temporalmente las llamadas de emergencia y de voz en esta ubicación" "No se puede establecer conexión con la red" "Para mejorar la recepción, cambia el tipo de red. Selecciona Sistema > Internet y red > Redes móviles > Tipo de red preferido." + "Alertas" + "Desvío de llamada" + "Modo de devolución de llamada de emergencia" + "Alertas de datos móviles" + "Mensajes SMS" + "Mensajes del buzón de voz" + "Llamada con Wi-Fi" "El dispositivo del mismo nivel solicitó el modo TTY FULL." "El dispositivo del mismo nivel solicitó el modo TTY HCO." "El dispositivo del mismo nivel solicitó el modo TTY VCO." @@ -258,6 +265,16 @@ "Alertas" "Demo para punto de venta" "Conexión USB" + + + + + + + + + + "Modo seguro" "Sistema Android" "Cambiar al perfil personal" @@ -284,8 +301,6 @@ "Inspecciona el contenido de la ventana con la que estés interactuando." "Activar la Exploración táctil" "Los elementos que presiones se dirán en voz alta y podrás explorar la pantalla mediante gestos." - "Activar la accesibilidad web mejorada" - "Es posible que se instalen secuencias de comandos para que el contenido de las aplicaciones sea más accesible." "Observar el texto que escribes" "Incluye datos personales, como números de tarjeta de crédito y contraseñas." "Controlar la ampliación de pantalla" @@ -1099,7 +1114,7 @@ "El dispositivo usa %1$s cuando %2$s no tiene acceso a Internet. Es posible que se apliquen cargos." "Se cambió de %1$s a %2$s" - "datos móviles" + "Datos móviles" "Wi-Fi" "Bluetooth" "Ethernet" @@ -1426,7 +1441,7 @@ "Dibuja tu patrón." "Ingresa el PIN de la tarjeta SIM." "Ingresa el PIN." - "Ingresa tu contraseña." + "Escribe la contraseña." "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." "Ingresa el código PIN deseado" "Confirmar código PIN deseado" @@ -1641,7 +1656,7 @@ "Hasta la(s) %1$s" "Hasta la hora %1$s (próxima alarma)" - "Hasta que desactives No interrumpir" + "Hasta que desactives No molestar" "Hasta que desactives No molestar" "%1$s/%2$s" "Contraer" @@ -1701,7 +1716,7 @@ "Presiona para ver archivos" "Fijar" "No fijar" - "Información de la app" + "Información de apps" "−%1$s" "¿Deseas restablecer el dispositivo?" "Presiona para restablecer el dispositivo" @@ -1732,11 +1747,12 @@ "Cambia al modo de entrada de texto para ingresar la hora." "Cambia al modo de reloj para ingresar la hora." "Opciones de autocompletar" + "Guardar para Autocompletar" "El contenido no puede autocompletarse" - "¿Quieres guardar el contenido en %1$s?" - "¿Quieres guardar el contenido de %1$s en %2$s?" - "¿Guardar %1$s y %2$s en %3$s?" - "¿Guardar %1$s, %2$s y %3$s en %4$s?" + "¿Quieres guardar el contenido en <b>%1$s</b>?" + "¿Quieres guardar tu %1$s en <b>%2$s</b>?" + "¿Quieres guardar tu %1$s y %2$s en <b>%3$s</b>?" + "¿Quieres guardar tu %1$s, %2$s y %3$s en <b>%4$s</b>?" "Guardar" "No, gracias" "contraseña" diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 08bff7dacb30699e30a20fcc904e1ec34158fa96..33c0e5ca2aee1a92c9b17e91b64d820760ec0986 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -98,7 +98,14 @@ "Tu operador ha suspendido temporalmente las llamadas de voz en esta ubicación" "Tu operador ha suspendido temporalmente las llamadas de emergencia y de voz en esta ubicación" "No se puede establecer conexión con la red" - "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." + "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." + "Alertas" + "Desvío de llamada" + "Modo de devolución de llamada de emergencia" + "Alertas de datos móviles" + "Mensajes SMS" + "Mensajes de voz" + "Llamada por Wi-Fi" "Un dispositivo ha solicitado el modo TTY FULL" "Un dispositivo ha solicitado el modo TTY HCO" "Un dispositivo ha solicitado el modo TTY VCO" @@ -136,7 +143,7 @@ "%s" "Llamada Wi-Fi de %s" - "No" + "Desactivado" "Preferir Wi-Fi" "Preferencia a datos móviles" "Solo conexión Wi-Fi" @@ -258,6 +265,16 @@ "Alertas" "Demo para tiendas" "Conexión USB" + + + + + + + + + + "Modo seguro" "Sistema Android" "Cambiar a perfil personal" @@ -284,8 +301,6 @@ "Inspecciona el contenido de una ventana con la que estés interactuando." "Activar la exploración táctil" "Los elementos que tocas se dicen en voz alta y se puede explorar la pantalla mediante gestos." - "Activar la accesibilidad web mejorada" - "Es posible que se instalen secuencias de comandos para que el contenido de las aplicaciones sea más accesible." "Observar el texto que escribes" "Incluye datos personales como números de tarjetas de crédito y contraseñas." "Controla la ampliación de la pantalla" @@ -987,8 +1002,8 @@ "Cancelar" "Atención" "Cargando..." - "SÍ" - "NO" + "ACTIVADO" + "DESACTIVADO" "Completar acción utilizando" "Completar acción con %1$s" "Completar acción" @@ -1069,7 +1084,7 @@ "El proceso %1$s ha superado su límite de memoria de %2$s. 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)." "Selecciona una acción para el texto" "Volumen del timbre" - "Volumen multimedia" + "Volumen de multimedia" "Reproduciendo a través de Bluetooth" "Tono de silencio establecido" "Volumen de la llamada" @@ -1080,7 +1095,7 @@ "Volumen de Bluetooth" "Volumen del tono" "Volumen de llamada" - "Volumen multimedia" + "Volumen de multimedia" "Volumen de notificaciones" "Tono por defecto" "Predeterminado (%1$s)" @@ -1467,7 +1482,7 @@ "El acceso directo a accesibilidad ha desactivado %1$s" "Selecciona la función que se utilizará cuando toques el botón Accesibilidad:" "Para cambiar las funciones, mantén pulsado el botón Accesibilidad." - "Ampliación" + "Ampliar" "Usuario actual: %1$s" "Cambiando a %1$s…" "Cerrando la sesión de %1$s…" @@ -1603,7 +1618,7 @@ "Instalado por el administrador" "Actualizado por el administrador" "Eliminado por el administrador" - "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." + "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." "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." "¿Activar ahorro de datos?" "Activar" @@ -1732,11 +1747,12 @@ "Cambia al modo de introducción de texto para escribir la hora." "Cambia al modo de reloj para escribir la hora." "Opciones de Autocompletar" + "Guardar en la función Autocompletar" "El contenido no se puede autocompletar" - "¿Guardar en %1$s?" - "¿Guardar %1$s en %2$s?" - "¿Guardar %1$s y %2$s en %3$s?" - "¿Guardar %1$s, %2$s y %3$s en %4$s?" + "¿Guardar en <b>%1$s</b>?" + "¿Guardar %1$s en <b>%2$s</b>?" + "¿Guardar %1$s y %2$s en <b>%3$s</b>?" + "¿Guardar %1$s, %2$s y %3$s en <b>%4$s</b>?" "Guardar" "No, gracias" "contraseña" diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 4bd9ef8796e85603e77f2332938a186f0ab7b242..1c76b3f748d6351528c35eb083490659fccd3d67 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -99,6 +99,13 @@ "Teie operaator on hääl- ja hädaabikõned selles asukohas ajutiselt peatanud" "Võrguga ei saa ühendust" "Vastuvõtu parandamiseks muutke valitud tüüpi jaotises Süsteem > Võrk ja Internet > Mobiilsidevõrgud > Eelistatud võrgutüüp." + "Teatised" + "Kõnede suunamine" + "Hädaolukorra tagasihelistusrežiim" + "Mobiilse andmeside teatised" + "SMS-sõnumid" + "Kõnepostisõnumid" + "WiFi-kõned" "Partner taotles TTY-režiimi TÄIELIK" "Partner taotles TTY-režiimi HCO" "Partner taotles TTY-režiimi VCO" @@ -258,6 +265,16 @@ "Teatised" "Poedemo" "USB-ühendus" + + + + + + + + + + "Turvarežiim" "Android-süsteem" "Lülita isiklikule profiilile" @@ -281,15 +298,13 @@ "Kehaandurid" "juurdepääs anduri andmetele teie eluliste näitajate kohta" "Akna sisu toomine" - "Tutvuge kasutatava akna sisuga." + "Kasutatava akna sisu kontrollimine." "Puudutusega sirvimise sisselülitamine" "Puudutatud üksuste nimed esitatakse häälega ja ekraani saab sirvida puudutustega." - "Veebi täiustatud juurdepääsu sisselülitamine" - "Rakenduse sisu kättesaadavamaks muutmiseks võidakse installida skripte." "Sisestatud teksti jälgimine" "Sisaldab isiklikke andmeid, nt krediitkaardi numbreid ja paroole." "Ekraani suurenduse juhtimine" - "Saate juhtida ekraani suumitaset ja asendit." + "Ekraani suumitaseme ja asendi juhtimine." "Liigutuste tegemine" "Saate puudutada, pühkida, sõrmi kokku-lahku liigutada ja teisi liigutusi teha." "Sõrmejälje liigutused" @@ -1603,7 +1618,7 @@ "Administraator on selle installinud" "Administraator on seda värskendanud" "Administraator on selle kustutanud" - "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." + "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." "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." "Lül. andmemahu säästja sisse?" "Lülita sisse" @@ -1732,11 +1747,12 @@ "Aktiveerige kellaaja sisestamiseks tekstisisestusrežiim." "Aktiveerige kellaaja sisestamiseks kellarežiim." "Automaatse täitmise valikud" + "Automaattäitesse salvestamine" "Sisu ei saa automaatselt täita" - "Kas salvestada sildiga %1$s?" - "Kas salvestada %1$s sildiga %2$s?" - "Kas salvestada %1$s ja %2$s teenusesse %3$s?" - "Kas salvestada %1$s, %2$s ja %3$s teenusesse %4$s?" + "Kas salvestada teenusesse <b>%1$s</b>?" + "Kas salvestada üksus %1$s teenusesse <b>%2$s</b>?" + "Kas salvestada üksused %1$s ja %2$s teenusesse <b>%3$s</b>?" + "Kas salvestada üksused %1$s, %2$s ja %3$s teenusesse <b>%4$s</b>?" "Salvesta" "Tänan, ei" "parool" diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 5c1b423ca7215d9d47e763f2ece5dd374645620e..78aed2310781bc0d49d0ff918c12b950c6c813e2 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -99,6 +99,13 @@ "Operadoreak aldi baterako eten ditu ahots- eta larrialdi-deiak kokapen honetan" "Ezin da konektatu sarera" "Seinalea hobea izan dadin, aldatu hautatutako sare mota Sistema > Sareak eta Internet > Sare mugikorrak > Sare mota hobetsia atalean." + "Abisuak" + "Dei-desbideratzea" + "Larrialdi-deiak soilik jasotzeko modua" + "Datu mugikorren abisuak" + "SMS mezuak" + "Erantzungailuko mezuak" + "Wi-Fi bidezko deiak" "Beste gailuak TTY osagarria FULL moduan erabiltzea eskatu du" "Beste gailuak TTY osagarria HCO moduan erabiltzea eskatu du" "Beste gailuak TTY osagarria VCO moduan erabiltzea eskatu du" @@ -219,7 +226,7 @@ "Telefonoaren aukerak" "Pantailaren blokeoa" "Itzali" - "Larrialdiak" + "Larrialdi-deiak" "Akatsen txostena" "Sortu akatsen txostena" "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." @@ -258,6 +265,16 @@ "Abisuak" "Saltzaileentzako demoa" "USB konexioa" + + + + + + + + + + "Modu segurua" "Android sistema" "Aldatu profil pertsonalera" @@ -282,10 +299,8 @@ "atzitu bizi-konstanteei buruzko sentsore-datuak" "Eskuratu leihoko edukia" "Arakatu irekita daukazun leihoko edukia." - "Aktibatu ukipen bidez arakatzeko eginbidea" + "Aktibatu \"Arakatu ukituta\"" "Sakatutako elementuak ozen esango dira eta pantaila keinu bidez arakatu ahal izango da." - "Aktibatu web-erabilerraztasun hobetua" - "Scriptak instala daitezke aplikazioaren edukia erabilerrazagoa egiteko." "Behatu idazten duzun testua" "Ez da salbuespenik egiten datu pertsonalekin, hala nola, kreditu-txartelen zenbakiekin eta pasahitzekin." "Kontrolatu pantailaren zoom-maila" @@ -705,7 +720,7 @@ "Desblokeatzeko edo larrialdi-deia egiteko, sakatu Menua." "Desblokeatzeko, sakatu Menua." "Desblokeatzeko, marraztu eredua" - "Larrialdiak" + "Larrialdi-deiak" "Itzuli deira" "Eredua zuzena da!" "Saiatu berriro" @@ -1472,7 +1487,7 @@ "Uneko erabiltzailea: %1$s." "%1$s erabiltzailera aldatzen…" "%1$s erabiltzailearen saioa amaitzen…" - "jabea" + "Jabea" "Errorea" "Administratzaileak ez du eman aldaketa egiteko baimena" "Ez da ekintza gauza dezakeen aplikaziorik aurkitu" @@ -1604,7 +1619,7 @@ "Administratzaileak instalatu du" "Administratzaileak eguneratu du" "Administratzaileak ezabatu du" - "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." + "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." "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." "Datu-aurrezlea aktibatu?" "Aktibatu" @@ -1733,11 +1748,12 @@ "Aldatu testu modura ordua zehazteko." "Aldatu erloju modura ordua zehazteko." "Betetze automatikoaren aukerak" + "Gorde betetze automatikoarekin erabiltzeko" "Ezin dira bete automatikoki eremuak" - "%1$s zerbitzuan gorde?" - "%2$s zerbitzuan gorde nahi duzu %1$s?" - "%1$s eta %2$s gorde nahi dituzu %3$s behar denean erabiltzeko?" - "%1$s, %2$s eta %3$s gorde nahi dituzu %4$s behar denean erabiltzeko?" + "<b>%1$s</b> zerbitzuan gorde nahi duzu?" + "%1$s <b>%2$s</b> zerbitzuan gorde nahi duzu?" + "%1$s eta %2$s <b>%3$s</b> zerbitzuan gorde nahi dituzu?" + "%1$s, %2$s eta %3$s <b>%4$s</b> zerbitzuan gorde nahi dituzu?" "Gorde" "Ez, eskerrik asko" "pasahitza" diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 25bdc11c8fc07823eac6043583e1a6de95432564..cd8e7502d7e895d812210ff5c2f17d4c8de5a7f0 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -99,6 +99,13 @@ "شرکت مخابراتی شما موقتاً تماس‌های صوتی و اضطراری را در این مکان به حالت تعلیق درآورده است" "شبکه دردسترس نیست" "برای بهبود دریافت، نوع شبکه‌ای را که انتخاب کرده‌اید در «سیستم» > «شبکه‌ و اینترنت» > «شبکه‌های تلفن همراه» > «نوع شبکه ترجیحی» تغییر دهید." + "هشدارها" + "بازارسال تماس" + "حالت پاسخ تماس اضطراری" + "هشدارهای داده تلفن همراه" + "پیامک‌ها" + "پیام‌های پست صوتی" + "‏تماس ازطریق Wi-Fi" "‏دستگاه مرتبط درخواست TTY حالت FULL کرد" "‏دستگاه مرتبط درخواست TTY حالت HCO کرد" "‏دستگاه مرتبط درخواست TTY حالت VCO کرد" @@ -258,6 +265,16 @@ "هشدارها" "نمونه برای خرده‌فروشان" "‏اتصال USB" + + + + + + + + + + "حالت ایمن" "‏سیستم Android" "رفتن به نمایه شخصی" @@ -284,8 +301,6 @@ "محتوای پنجره‌ای را که درحال تعامل با آن هستید بررسی می‌کند." "فعال‌سازی کاوش لمسی" "موارد ضربه‌ زده‌شده با صدای بلند خوانده می‌شوند و با استفاده از حرکات اشاره می‌توانید صفحه را کاوش کنید." - "فعال‌سازی دسترس‌پذیری پیشرفته برای وب" - "ممکن است جهت افزایش دسترس‌پذیری به محتوای برنامه، اسکریپت‌هایی نصب شود." "نوشتاری را که تایپ می‌کنید مشاهده کند" "اطلاعات شخصی مانند شماره کارت اعتباری و گذرواژه‌ها را لحاظ می‌کند." "کنترل درشت‌نمایی نمایشگر" @@ -1471,7 +1486,7 @@ "کاربر کنونی %1$s." "در حالت تغییر به %1$s…" "در حال خروج از سیستم %1$s…" - "دارنده" + "مالک" "خطا" "سرپرست سیستم شما این تغییر را مجاز نمی‌داند" "برنامه‌ای برای انجام این عملکرد موجود نیست" @@ -1732,11 +1747,12 @@ "برای وارد کردن زمان، به حالت وارد کردن نوشتار تغییر وضعیت دهید." "برای وارد کردن زمان، به حالت ساعت تغییر وضعیت دهید." "گزینه‌های تکمیل خودکار" + "ذخیره کردن برای تکمیل خودکار" "تکمیل خودکار محتوا ممکن نیست" - "در %1$s ذخیره شود؟" - "%1$s در %2$s ذخیره شود؟" - "%1$s، %2$s در %3$s ذخیره شود؟" - "%1$s، %2$s، %3$s در %4$s ذخیره شود؟" + "‏در <b>%1$s</b> ذخیره شود؟" + "‏%1$s در <b>%2$s</b> ذخیره شود؟" + "‏%1$s و %2$s در <b>%3$s</b> ذخیره شوند؟" + "‏%1$s، %2$s و %3$s در <b>%4$s</b> ذخیره شوند؟" "ذخیره" "نه سپاسگزارم" "گذرواژه" diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 5d12753967a9c14109f8ea27a717738a3cd5f447..56906696654b20a4423885cef9c119d9e4213bc8 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -99,6 +99,13 @@ "Operaattorisi on väliaikaisesti keskeyttänyt ääni- ja hätäpuhelut tästä sijainnista." "Ei yhteyttä verkkoon" "Voit yrittää parantaa kuuluvuutta vaihtamalla tyypin asetusta. Valitse Järjestelmä > Verkko > Internet > Mobiiliverkot > Ensisijainen verkko." + "Ilmoitukset" + "Soitonsiirto" + "Hätäpuhelujen takaisinsoittotila" + "Mobiilidatailmoitukset" + "Tekstiviestit" + "Vastaajaviestit" + "Wi-Fi-puhelut" "Toinen käyttäjä vaihtoi TTY-tilaksi TÄYSI" "Toinen käyttäjä vaihtoi TTY-tilaksi HCO" "Toinen käyttäjä vaihtoi TTY-tilaksi VCO" @@ -258,6 +265,16 @@ "Ilmoitukset" "Esittelytila" "USB-yhteys" + + + + + + + + + + "Suojattu tila" "Android-järjestelmä" "Siirry henkilökohtaiseen profiiliin" @@ -284,8 +301,6 @@ "Tarkistaa käyttämäsi ikkunan sisältö." "Ottaa kosketuksella tutkimisen käyttöön" "Kosketetut kohteet sanotaan ääneen, ja ruudulla voi liikkua eleiden avulla." - "Ottaa verkon paremman esteettömyyden käyttöön" - "Sovellus voi asentaa ohjelmia tehdäkseen sisällöstään esteettömämmän." "Tarkkailla kirjoittamaasi tekstiä" "Sisältää henkilökohtaisia tietoja, kuten luottokortin numeroita ja salasanoja." "Näytön suurentamisen hallinnointi" @@ -1732,11 +1747,12 @@ "Vaihda ajan syöttämiseen tekstitilassa." "Vaihda ajan syöttämiseen kellotilassa." "Automaattisen täytön asetukset" + "Tallenna automaattista täyttöä varten" "Sisältöä ei voi täyttää automaattisesti." - "Tallennetaanko kohteeseen %1$s?" - "Tallennetaanko %1$s kohteeseen %2$s?" - "Tallennetaanko %1$s ja %2$s palveluun %3$s?" - "Tallennetaanko %1$s, %2$s ja %3$s palveluun %4$s?" + "Tallennetaanko tämä palveluun <b>%1$s</b>?" + "Tallennetaanko %1$s palveluun <b>%2$s</b>?" + "Tallennetaanko %1$s ja %2$s palveluun <b>%3$s</b>?" + "Tallennetaanko %1$s, %2$s ja %3$s palveluun <b>%4$s</b>?" "Tallenna" "Ei kiitos" "salasana" diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 6bcc8ae0437e35742531174f80f8188af767de0b..77972741e960515ca3c50e43da297e6511bc1de7 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -99,6 +99,13 @@ "Votre fournisseur de services a momentanément suspendu les appels vocaux et d\'urgence pour ce lieu" "Impossible de joindre le réseau" "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é." + "Alertes" + "Transfert d\'appel" + "Mode de rappel d\'urgence" + "Alertes de données cellulaires" + "Messages texte" + "Messages vocaux" + "Appels Wi-Fi" "Mode TTY COMPLET demandé par un pair" "Mode TTY HCO demandé par un pair" "Mode TTY VCO demandé par un pair" @@ -258,6 +265,16 @@ "Alertes" "Démo en magasin" "Connexion USB" + + + + + + + + + + "Mode sécurisé" "Système Android" "Passer au profil personnel" @@ -284,8 +301,6 @@ "Inspecter le contenu d\'une fenêtre avec laquelle vous interagissez." "Activer la fonctionnalité Explorer au toucher" "Les éléments sélectionnés sont énoncés à voix haute. Vous pouvez explorer l\'écran à l\'aide de gestes." - "Activer l\'accessibilité Web améliorée" - "Vous pouvez installer des scripts pour rendre le contenu des applications plus accessible." "Observer le texte que vous saisissez" "Inclut des données personnelles telles que les numéros de cartes de paiement et les mots de passe." "Contrôler l\'agrandissement de l\'écran" @@ -1603,7 +1618,7 @@ "Installé par votre administrateur" "Mise à jour par votre administrateur" "Supprimé par votre administrateur" - "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." + "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." "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." "Activer l\'Économiseur de données?" "Activer" @@ -1641,7 +1656,7 @@ "Jusqu\'à %1$s" "Jusqu\'à %1$s (alarme suivante)" - "Jusqu\'à ce que vous désactiviez le mode « Ne pas déranger »" + "Jusqu\'à ce que vous désactiviez ce mode" "Jusqu\'à ce que vous désactiviez le mode « Ne pas déranger »" "%1$s / %2$s" "Réduire" @@ -1732,11 +1747,12 @@ "Passer au mode Entrée de texte pour entrer l\'heure." "Passer au mode Horloge pour entrer l\'heure." "Options de remplissage automatique" + "Enregistrer pour le remplissage automatique" "Le contenu ne peut pas être entré automatiquement" - "Enregistrer sous %1$s?" - "Enregistrer %1$s sous %2$s?" - "Enregistrer %1$s, %2$s sous %3$s?" - "Enregistrer %1$s, %2$s, %3$s sous %4$s?" + "Enregistrer dans <b>%1$s</b>?" + "Enregistrer %1$s dans <b>%2$s</b>?" + "Enregistrer %1$s et %2$s dans <b>%3$s</b>?" + "Enregistrer %1$s, %2$s et %3$s dans <b>%4$s</b>?" "Enregistrer" "Non, merci" "mot de passe" diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 5b7b377957435829069365e309287fdececfc17a..761947e3e0c730f371fcfae547487b3468b55ee8 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -20,7 +20,7 @@ - "o" + "octet(s)" "Ko" "Mo" "Go" @@ -99,6 +99,13 @@ "Votre opérateur a momentanément suspendu les appels vocaux et d\'urgence pour ce lieu" "Impossible d\'accéder au réseau" "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é." + "Alertes" + "Transfert d\'appel" + "Mode de rappel d\'urgence" + "Alertes relatives aux données mobiles" + "SMS" + "Messages vocaux" + "Appels Wi-Fi" "Mode TTY demandé par l\'interlocuteur : COMPLET" "Mode TTY demandé par l\'interlocuteur : HCO" "Mode TTY demandé par l\'interlocuteur : VCO" @@ -258,6 +265,16 @@ "Alertes" "Démonstration en magasin" "Connexion USB" + + + + + + + + + + "Mode sécurisé" "Système Android" "Passer au profil personnel" @@ -265,7 +282,7 @@ "Contacts" "accéder à vos contacts" "Position" - "accéder à la position de cet appareil" + "accéder à la position de l\'appareil" "Agenda" "accéder à votre agenda" "SMS" @@ -284,8 +301,6 @@ "Inspecter le contenu d\'une fenêtre avec laquelle vous interagissez" "Activer la fonctionnalité Explorer au toucher" "Les éléments sélectionnés sont énoncés à voix haute. Vous pouvez explorer l\'écran à l\'aide de gestes." - "Activer l\'accessibilité Web améliorée" - "Vous pouvez installer des scripts pour rendre le contenu des applications plus accessible." "Observer le texte que vous saisissez" "Inclut des données personnelles telles que les numéros de cartes de paiement et les mots de passe." "Contrôler l\'agrandissement de l\'écran" @@ -1732,11 +1747,12 @@ "Passer en mode saisie de texte pour la saisie de l\'heure." "Passer en mode horloge pour la saisie de l\'heure." "Options de saisie automatique" + "Enregistrer pour la saisie automatique" "Le contenu ne peut pas être saisi automatiquement" - "Enregistrer dans \"%1$s\" ?" - "Enregistrer \"%1$s\" dans \"%2$s\" ?" - "Enregistrer %1$s et %2$s sur %3$s ?" - "Enregistrer %1$s, %2$s et %3$s sur %4$s ?" + "Enregistrer dans <b>%1$s</b> ?" + "Enregistrer %1$s dans <b>%2$s</b> ?" + "Enregistrer %1$s et %2$s dans <b>%3$s</b> ?" + "Enregistrer %1$s, %2$s et %3$s dans <b>%4$s</b> ?" "Enregistrer" "Non, merci" "mot de passe" diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index eb220f41b49bbf7c5baef06610f74fdf57b92637..2c58acbad584366c22c211d0eff9052f8043c49b 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -29,10 +29,10 @@ "%1$s %2$s" "%1$d días" "%1$d día %2$d hrs" - "%1$d día %2$d hr" + "%1$d día %2$d h" "%1$d hrs" - "%1$d hr %2$d min" - "%1$d hr %2$d min" + "%1$d h %2$d min" + "%1$d h %2$d min" "%1$d min" "%1$d minuto" "%1$d min %2$d seg" @@ -99,6 +99,13 @@ "O teu operador suspendeu temporalmente as chamadas de emerxencia e de voz nesta localización" "Non se pode conectar coa rede" "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." + "Alertas" + "Desvío de chamadas" + "Modo de devolución de chamadas de emerxencia" + "Alertas de datos móbiles" + "Mensaxes SMS" + "Mensaxes de correo de voz" + "Chamadas por wifi" "Outro dispositivo solicitou o modo TTY COMPLETO" "Outro dispositivo solicitou o modo TTY HCO" "Outro dispositivo solicitou o modo TTY VCO" @@ -258,6 +265,16 @@ "Alertas" "Demostración comercial" "conexión USB" + + + + + + + + + + "Modo seguro" "Sistema Android" "Cambiar ao perfil persoal" @@ -284,12 +301,10 @@ "Inspecciona o contido dunha ventá coa que estás interactuando." "Activar a exploración táctil" "Os elementos que toques pronunciaranse en voz alta e a pantalla poderá explorarse mediante xestos." - "Activar a accesibilidade web mellorada" - "É posible que se instalen scripts para que o contido da aplicación resulte máis accesible." "Observar o texto que escribes" "Inclúe datos persoais como números e contrasinais de tarxetas de crédito." - "Controlar ampliación da pantalla" - "Controlar o nivel do zoom e o posicionamento da pantalla" + "Controlar a ampliación da pantalla" + "Controla o nivel do zoom e o posicionamento da pantalla." "Realizar xestos" "Podes tocar, pasar o dedo, beliscar e realizar outros xestos." "Xestos de impresión dixital" @@ -436,8 +451,8 @@ "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." "cambiar a conectividade de rede" "Permite á aplicación cambiar o estado da conectividade de rede." - "cambiar conectividade de ancoraxe á rede" - "Permite á aplicación cambiar o estado da conectividade de rede ancorada." + "cambiar conectividade de conexión compartida" + "Permite á aplicación cambiar o estado da conectividade da conexión compartida." "ver conexións wifi" "Permite á aplicación ver información acerca das redes wifi, como se a wifi está activada e o nome dos dispositivos wifi conectados." "conectar e desconectar da wifi" @@ -539,8 +554,8 @@ "Permite a esta aplicación recibir información acerca das transferencias actuais de Android Beam" "eliminar certificados DRM" "Permite a unha aplicación eliminar os certificados DRM. As aplicacións normais non o deberían precisar nunca." - "vincular a un servizo de mensaxería" - "Permite ao propietario vincularse á interface de nivel superior dun servizo de mensaxería. As aplicacións normais non deberían necesitar este permiso." + "vincular a un servizo de mensaxaría" + "Permite ao propietario vincularse á interface de nivel superior dun servizo de mensaxaría. As aplicacións normais non deberían necesitar este permiso." "vincular aos servizos do operador" "Permite ao titular vincularse aos servizos do operador. As aplicacións normais non deberían necesitar este permiso." "acceso ao modo Non molestar" @@ -593,9 +608,9 @@ "Personalizado" - "Particular" + "Casa" "Traballo" - "Outros" + "Outro" "Personalizado" @@ -645,9 +660,9 @@ "Aniversario" "Outros" "Personalizado" - "Inicio" + "Particular" "Traballo" - "Outros" + "Outro" "Móbil" "Personalizado" "Particular" @@ -852,7 +867,7 @@ "Consulta de busca" "Borrar consulta" "Enviar consulta" - "Busca de voz" + "Busca por voz" "Activar a exploración táctil?" "%1$s 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." "%1$s 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." @@ -1112,7 +1127,7 @@ "A aplicación %1$s quere conectarse á rede wifi %2$s" "Unha aplicación" "Wi-Fi Direct" - "Inicia Wi-Fi Direct. Esta acción desactivará o cliente e a zona interactiva da wifi." + "Inicia Wi-Fi Direct. Esta acción desactivará a zona ou o cliente wifi." "Non se puido iniciar Wi-Fi Direct." "Wi-Fi Direct está activado" "Toca para acceder á configuración" @@ -1282,7 +1297,7 @@ "Enviar" "Modo de coche activado" "Toca para saír do modo de coche." - "Ancoraxe á rede ou zona Wi-Fi activada" + "Conexión compartida ou zona wifi activada" "Tocar para configurar." "Volver" "Seguinte" @@ -1604,7 +1619,7 @@ "Instalado polo teu administrador" "Actualizado polo teu administrador" "Eliminado polo teu administrador" - "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." + "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." "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." "Queres activar o economizador de datos?" "Activar" @@ -1702,7 +1717,7 @@ "Toca para ver os ficheiros" "Fixar" "Soltar" - "Información da aplicación" + "Información de aplicacións" "−%1$s" "Queres restablecer o dispositivo?" "Toca aquí para restablecer o dispositivo" @@ -1733,11 +1748,12 @@ "Cambia ao modo de entrada de texto para introducir a hora." "Cambiar ao modo de reloxo para introducir a hora." "Opcións de autocompletar" + "Garda a información no servizo Autocompletar" "Os contidos non se poden autocompletar" - "Queres gardar o contido en: %1$s?" - "Queres gardar o contido (%1$s) en: %2$s?" - "Queres gardar %1$s e %2$s en: %3$s?" - "Queres gardar %1$s, %2$s e %3$s en: %4$s?" + "Queres gardar o contido en: <b>%1$s</b>?" + "Queres gardar %1$s en: <b>%2$s</b>?" + "Queres gardar %1$s e %2$s en: <b>%3$s</b>?" + "Queres gardar %1$s, %2$s e %3$s en: <b>%4$s</b>?" "Gardar" "Non, grazas" "contrasinal" diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 58adbca521a3caa93688efdfd25d970cedba0820..77f7212e15d1491a039980045d025339a2e45d12 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -99,6 +99,13 @@ "તમારા કૅરિઅરે આ સ્થાને વૉઇસ અને કટોકટીના કૉલ અસ્થાયી રૂપે સસ્પેન્ડ કર્યા છે" "નેટવર્ક પર પહોંચી શકાતું નથી" "રિસેપ્શનને બહેતર બનાવવા માટે, સિસ્ટમ > નેટવર્ક અને ઇન્ટરનેટ > મોબાઇલ નેટવર્ક > પસંદગીનો નેટવર્ક પ્રકારમાં પસંદ કરેલો પ્રકાર બદલવાનો પ્રયાસ કરો." + "ચેતવણીઓ" + "કૉલ ફૉર્વર્ડિંગ" + "કટોકટી કૉલબૅક મોડ" + "મોબાઇલ ડેટા ચેતવણીઓ" + "SMS સંદેશા" + "વૉઇસમેઇલ સંદેશા" + "Wi-Fi કૉલિંગ" "પીઅરે TTY મોડ પૂર્ણની વિનંતી કરી" "પીઅરે TTY મોડ HCO ની વિનંતી કરી" "પીઅરે TTY મોડ VCO ની વિનંતી કરી" @@ -258,6 +265,16 @@ "ચેતવણીઓ" "રિટેલ ડેમો" "USB કનેક્શન" + + + + + + + + + + "સુરક્ષિત મોડ" "Android સિસ્ટમ" "વ્યક્તિગત પર સ્વિચ કરો" @@ -284,8 +301,6 @@ "તમે જેની સાથે ક્રિયાપ્રતિક્રિયા કરી રહ્યાં છો તે વિંડોની સામગ્રીની તપાસ કરો." "ટચ કરીને અન્વેષણ કરો સક્ષમ કરો" "ટૅપ કરેલ આઇટમ્સ મોટેથી બોલવામાં આવશે અને હાવભાવની મદદથી સ્ક્રીનનું અન્વેષણ કરી શકાય છે." - "વિસ્તૃત વેબ ઍક્સેસિબિલિટી ચાલુ કરો" - "ઍપ્લિકેશન સામગ્રીને વધુ ઍક્સેસિબલ બનાવવા માટે સ્ક્રિપ્ટ્સ ઇન્સ્ટોલ કરી શકાય છે." "તમે લખો તે ટેક્સ્ટનું અવલોકન કરો" "ક્રેડિટ કાર્ડ નંબર્સ અને પાસવર્ડ્સ જેવો વ્યક્તિગત ડેટા શામેલ છે." "પ્રદર્શન વિસ્તૃતિકરણ નિયંત્રિત કરો" @@ -1700,7 +1715,7 @@ "કાર્ય પ્રોફાઇલ અનલૉક કરવા ટૅપ કરો" "%1$s થી કનેક્ટ કરેલું છે" "ફાઇલો જોવા માટે ટૅપ કરો" - "પિન કરો" + "પિન" "અનપિન કરો" "ઍપ્લિકેશન માહિતી" "−%1$s" @@ -1733,11 +1748,12 @@ "સમય દાખલ કરવા માટે ટેક્સ્ટ ઇનપુટ મોડમાં સ્વિચ કરો." "સમય દાખલ કરવા માટે ઘડિયાળ મોડમાં સ્વિચ કરો." "સ્વતઃભરણના વિકલ્પો" + "સ્વતઃભરણ માટે સાચવો" "કન્ટેન્ટ સ્વતઃ ભરી શકાતું નથી" - "%1$s માં સાચવીએ?" - "%1$s ને %2$s માં સાચવીએ?" - "%3$sમાં %1$s, %2$s સાચવીએ?" - "%4$sમાં %1$s, %2$s, %3$s સાચવીએ?" + "<b>%1$s</b>માં સાચવીએ?" + "%1$sને <b>%2$s</b>માં સાચવીએ?" + "%1$s અને %2$sને <b>%3$s</b>માં સાચવીએ?" + "%1$s, %2$s અને %3$sને <b>%4$s</b>માં સાચવીએ?" "સાચવો" "નહીં આભાર" "પાસવર્ડ" diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 5e7edfad64dbe2d7c26ad483145a8483c35ea683..0a672ca7bd9f65ec4056eb26061bbe84e200eb3e 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -99,6 +99,13 @@ "आपके वाहक ने इस स्थान पर वॉइस और आपातकालीन कॉल कुछ समय के लिए बंद कर दिए हैं" "नेटवर्क तक नहीं पहुंच पा रहे हैं" "रिसेप्शन बेहतर करने के लिए, सिस्टम > नेटवर्क और इंटरनेट > मोबाइल नेटवर्क > पसंदीदा नेटवर्क प्रकार पर जाकर, चुना गया प्रकार बदलकर देखें." + "सूचनाएं" + "कॉल अग्रेषण" + "आपातकालीन कॉलबैक मोड" + "मोबाइल डेटा सूचनाएं" + "SMS संदेश" + "वॉइसमेल संदेश" + "वाई-फ़ाई कॉलिंग" "पीयर ने TTY मोड पूर्ण का अनुरोध किया" "पीयर ने TTY मोड HCO का अनुरोध किया" "पीयर ने TTY मोड VCO का अनुरोध किया" @@ -258,6 +265,16 @@ "सूचनाएं" "खुदरा डेमो" "USB कनेक्शन" + + + + + + + + + + "सुरक्षित मोड" "Android सिस्‍टम" "व्यक्तिगत प्रोफ़ाइल में स्विच करें" @@ -284,8 +301,6 @@ "उस विंडो की सामग्री का निरीक्षण करें जिससे आप सहभागिता कर रहे हैं." "स्पर्श द्वारा एक्सप्लोर करें को चालू करें" "टैप किए गए आइटम ज़ोर से बोले जाएंगे और स्क्रीन को हावभाव के उपयोग से एक्सप्लोर किया जा सकेगा." - "एन्हांस की गई वेब आसान तरीका चालू करें" - "ऐप्स सामग्री को अधिक पहुंच-योग्य बनाने के लिए स्क्रिप्ट इंस्टॉल किए जा सकते हैं." "आपके द्वारा लिखे हुए लेख को ध्यान से देखें" "क्रेडिट कार्ड नंबर और पासवर्ड जैसा व्यक्तिगत डेटा शामिल होता है." "प्रदर्शन आवर्धन नियंत्रित करें" @@ -1603,7 +1618,7 @@ "आपके व्यवस्थापक ने इंस्टॉल किया है" "आपके व्यवस्थापक ने अपडेट किया है" "आपके व्यवस्थापक ने हटा दिया है" - "बैटरी जीवन काल को बेहतर बनाने में सहायता के लिए, बैटरी सेवर आपके डिवाइस के प्रदर्शन को कम कर देता है और कंपन, स्‍थान सेवाओं और अधिकांश पृष्‍ठभूमि डेटा को सीमित कर देता है. हो सकता है कि ईमेल, संदेश सेवा तथा समन्‍वयन पर आधारित अन्‍य ऐप्‍स तब तक ना खुलें जब तक कि आप उन्‍हें नहीं खोलते.\n\nजब आपका डिवाइस चार्ज हो रहा होता है तो बैटरी सेवर अपने आप बंद हो जाता है." + "बैटरी लाइफ़ बेहतर बनाने में सहायता के लिए, बैटरी सेवर आपके डिवाइस के प्रदर्शन को कम कर देता है और कंपन, स्‍थान सेवाओं और अधिकांश पृष्‍ठभूमि डेटा को सीमित कर देता है. हो सकता है कि ईमेल, संदेश सेवा और सिंक पर आधारित अन्‍य ऐप्‍स तब तक ना खुलें जब तक कि आप उन्‍हें नहीं खोलते.\n\nजब आपका डिवाइस चार्ज हो रहा होता है तो बैटरी सेवर अपने आप बंद हो जाता है." "डेटा उपयोग कम करने में सहायता के लिए, डेटा बचतकर्ता कुछ ऐप्लिकेशन को पृष्ठभूमि में डेटा भेजने या प्राप्त करने से रोकता है. आपके द्वारा वर्तमान में उपयोग किया जा रहा एक ऐप्लिकेशन डेटा एक्सेस कर सकता है, लेकिन वह ऐसा कभी-कभी ही करेगा. उदाहरण के लिए, इसका अर्थ यह हो सकता है कि चित्र तब तक दिखाई नहीं देंगे जब तक कि आप उन्हें टैप नहीं करते." "डेटा बचतकर्ता चालू करें?" "चालू करें" @@ -1732,11 +1747,12 @@ "समय इनपुट के लिए लेख इनपुट मोड पर जाएं." "समय इनपुट के लिए घड़ी मोड पर जाएं." "ऑटोमैटिक भरने के विकल्प" + "ऑटोमैटिक भरने के लिए सहेजें" "सामग्रियां ऑटोमैटिक रूप से भरी जा सकती हैं" - "%1$s में सहेजें?" - "%1$s को %2$s में सहेजें?" - "%1$s, %2$s को %3$s में सहेजें?" - "%1$s, %2$s, %3$s को %4$s में सहेजें?" + "<b>%1$s</b> में सहेजें?" + "%1$s को <b>%2$s</b> में सहेजें?" + "%1$s और %2$s को <b>%3$s</b> में सहेजें?" + "%1$s, %2$s और %3$s को <b>%4$s</b> में सहेजें?" "सहेजें" "नहीं, धन्यवाद" "पासवर्ड" diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index d95f8c884f8aadbd81fd1125364b5de474142bb0..48f4cf7b221d5a4f5dcec8066dd672a0e5f7df65 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -100,6 +100,13 @@ "Vaš je mobilni operater privremeno obustavio glasovne i hitne pozive na ovoj lokaciji" "Pristup mreži nije moguć" "Za bolji prijem pokušajte odabrati drugu vrstu mreže u odjeljku Sustav > Mreža i internet > Mobilne mreže > Željena vrsta mreže." + "Upozorenja" + "Preusmjeravanje poziva" + "Način hitnog povratnog poziva" + "Upozorenja o mobilnim podacima" + "SMS poruke" + "Poruke govorne pošte" + "Wi-Fi pozivi" "Način TTY FULL koji zahtijeva paralelni uređaj" "Način TTY HCO koji zahtijeva paralelni uređaj" "Način TTY VCO koji zahtijeva paralelni uređaj" @@ -261,6 +268,16 @@ "Upozorenja" "Prodajni demo-način" "USB veza" + + + + + + + + + + "Siguran način rada" "Sustav Android" "Prijeđite na osobni" @@ -268,7 +285,7 @@ "Kontakti" "pristupati vašim kontaktima" "Lokacija" - "pristupiti lokaciji ovog uređaja" + "pristup lokaciji ovog uređaja" "Kalendar" "pristupati kalendaru" "SMS" @@ -284,15 +301,13 @@ "Biometrijski senzori" "pristupiti podacima senzora o vašim vitalnim znakovima" "Dohvaćati sadržaj prozora" - "Istražite sadržaj prozora koji upotrebljavate." + "Pregledat će sadržaj prozora koji upotrebljavate." "Uključiti značajku Istraži dodirom" "Dodirnute stavke izgovorit će se naglas, a zaslon se može istraživati pokretima." - "Uključiti poboljšanu pristupačnost weba" - "Kako bi sadržaj aplikacije bio pristupačniji, mogu se instalirati skripte." "Pratiti tekst koji pišete" "Uključuje osobne podatke kao što su brojevi kreditnih kartica i zaporke." - "Kontrola uvećanja zaslona" - "Kontrolira razinu zumiranja i položaj zaslona." + "Kontrolirati uvećanje zaslona" + "Kontrolirat će stupanj i mjesto zumiranja." "Izvođenje pokreta" "Može dodirnuti, prijeći prstom, spojiti prste i izvoditi druge pokrete." "Pokreti za otisak prsta" @@ -1488,7 +1503,7 @@ "Prečac pristupačnosti isključio je uslugu %1$s" "Odaberite značajku koju ćete upotrebljavati kada dodirnete gumb Pristupačnost:" "Da biste promijenili značajke, dodirnite i zadržite gumb Pristupačnost." - "Povećanje" + "Povećavanje" "Trenutačni korisnik %1$s." "Prebacivanje na korisnika %1$s…" "Odjavljivanje korisnika %1$s…" @@ -1625,7 +1640,7 @@ "Instalirao administrator" "Ažurirao administrator" "Izbrisao administrator" - "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." + "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." "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." "Uključiti Uštedu podataka?" "Uključi" @@ -1763,11 +1778,12 @@ "Prijeđite na način unosa teksta da biste unijeli vrijeme." "Prijeđite na način rada sata da biste unijeli vrijeme." "Opcije automatskog popunjavanja" + "Spremanje za Automatsko popunjavanje" "Sadržaj se ne može automatski popuniti" - "Želi te li to spremiti u aplikaciju %1$s?" - "Želite li spremiti %1$s u aplikaciju %2$s?" - "Želite li spremiti %1$s, %2$s u %3$s?" - "Želite li spremiti %1$s, %2$s, %3$s u %4$s?" + "Želite li spremiti na uslugu <b>%1$s</b>?" + "Želite li da se podatak (%1$s) spremi na uslugu <b>%2$s</b>?" + "Želite li da se %1$s i %2$s spreme na uslugu <b>%3$s</b>?" + "Želite li da se %1$s, %2$s i %3$s spreme na uslugu <b>%4$s</b>?" "Spremi" "Ne, hvala" "zaporku" diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 9e5c53e289a8066de6e67e094ce290e05efa55a3..8af3ff5575f225a41278d9e6cefbae716c27c370 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -99,6 +99,13 @@ "Szolgáltatója ezen a helyen átmenetileg felfüggesztette a hang- és segélyhívásokat" "A hálózat nem érhető el" "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." + "Értesítések" + "Hívásátirányítás" + "Sürgősségi visszahívás mód" + "Mobiladat-forgalommal kapcsolatos értesítések" + "SMS-ek" + "Hangpostaüzenetek" + "Wi-Fi-hívás" "Partner által kért TTY-mód: FULL" "Partner által kért TTY-mód: HCO" "Partner által kért TTY-mód: VCO" @@ -258,6 +265,16 @@ "Értesítések" "Kiskereskedelmi bemutató" "USB-kapcsolat" + + + + + + + + + + "Biztonsági üzemmód" "Android rendszer" "Átváltás személyes profilra" @@ -284,8 +301,6 @@ "A használt ablak tartalmának vizsgálata." "Felfedezés érintéssel bekapcsolása" "A megérintett elemeket a rendszer hangosan kimondja, a képernyő pedig felfedezhető kézmozdulatok használatával." - "Internetes kisegítő lehetőségek bővítése" - "Szkripteket lehet telepíteni, hogy könnyebb legyen hozzáférni az alkalmazások tartalmához." "A gépelt szöveg figyelése" "Beleértve a személyes adatokat, például a hitelkártyaszámokat és jelszavakat." "A kijelző nagyításának vezérlése" @@ -1732,11 +1747,12 @@ "Időbevitelhez váltson szövegbeviteli módba." "Időbevitelhez váltson óramódba." "Az automatikus kitöltés beállítási lehetőségei" + "Mentés az Automatikus kitöltéshez" "A tartalmakat nem lehet automatikusan kitölteni" - "Menti ide: %1$s?" - "%1$s mentése ide: %2$s?" - "Menti a(z) %3$s szolgáltatásba a következőket: %1$s és %2$s?" - "Menti a(z) %4$s szolgáltatásba a következőket: %1$s, %2$s és %3$s?" + "Menti ide: <b>%1$s</b>?" + "Menti a következőt: %1$s ide: <b>%2$s</b>?" + "Menti a következőket: %1$s és %2$s ide: <b>%3$s</b>?" + "Menti a következőket: %1$s, %2$s és %3$s ide: <b>%4$s</b>?" "Mentés" "Nem, köszönöm" "jelszó" diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index d6a75d570459a41a119f833197dce6e3e175c53d..2ca708d6653c104e0f40aae028d88a195dfe4657 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -82,7 +82,7 @@ "Երեք կողմով զանգ" "Անցանկալի վրդովեցնող զանգերի մերժում" "Զանգող համարի առաքում" - "Չխանգարել" + "Չանհանգստացնել" "Զանգողի ID-ն լռելյայն սահմանափակված է: Հաջորդ զանգը` սահմանափակված" "Զանգողի ID-ն լռելյայն սահմանափակված է: Հաջորդ զանգը` չսահմանափակված" "Զանգողի ID-ն լռելյայն չսահմանափակված է: Հաջորդ զանգը` Սահմանափակված" @@ -99,6 +99,13 @@ "Ձեր օպերատորն այս վայրում ժամանակավորապես կասեցրել է ձայնային և շտապ կանչերը" "Ցանցն անհասանելի է" "Ազդանշանի ընդունման որակը բարելավելու համար փոխեք ցանցի տեսակը՝ անցնելով Համակարգ > Ցանց և ինտերնետ > Բջջային ցանցեր > Ցանկալի ցանցի տեսակը։" + "Ծանուցումներ" + "Զանգի վերահասցեավորում" + "Շտապ հետկանչի ռեժիմ" + "Բջջային տվյալների ծանուցումներ" + "SMS հաղորդագրություններ" + "Ձայնային փոստի հաղորդագրություններ" + "Զանգեր Wi-Fi-ի միջոցով" "Բաժանորդի սարքում ընտրված է հեռատիպի ԲՈԼՈՐԸ ռեժիմը" "Բաժանորդի սարքում ընտրված է հեռատիպի HCO ռեժիմը" "Բաժանորդի սարքում ընտրված է հեռատիպի VCO ռեժիմը" @@ -258,38 +265,46 @@ "Ծանուցումներ" "Խանութի ցուցադրական ռեժիմ" "USB կապակցում" + + + + + + + + + + "Անվտանգ ռեժիմ" "Android համակարգ" "Անցնել անհատական պրոֆիլին" "Անցնել աշխատանքային պրոֆիլին" "Կոնտակտներ" "օգտագործել ձեր կոնտակտները" - "Տեղադրություն" - "օգտագործել այս սարքի տեղադրությունը" + "Տեղորոշում" + "տեղորոշել այս սարքը" "Օրացույց" "օգտագործել օրացույցը" - "Կարճ հաղորդագրություն" + "SMS" "ուղարկել և դիտել SMS-ները" - "Պահոց" + "Հիշողություն" "օգտագործել լուսանկարները, մեդիա ֆայլերը և ձեր սարքում պահվող մյուս ֆայլերը" - "Բարձրախոս" + "Խոսափող" "ձայնագրել" - "Ֆոտոխցիկ" + "Տեսախցիկ" "լուսանկարել և տեսագրել" "Հեռախոս" "կատարել զանգեր և կառավարել զանգերը" "Մարմնի սենսորներ" "օգտագործել սենսորների տվյալները ձեր օրգանիզմի վիճակի մասին" "Առբերել պատուհանի բովանդակությունը" - "Ստուգեք պատուհանի բովանդակությունը, որի հետ փոխգործակցում եք:" + "Վերլուծել գործող պատուհանի բովանդակությունը" "Միացնել Հպման միջոցով հետազոտումը" - "Ուսումնաիրեք էկրանը այն շոշափելով։ Այս կամ այն տարրին հպելուց հետո դրանք բարձրաձայն կնկարագրվեն։" - "Միացնել ընդլայնված վեբ մատչելիությունը" - "Հնարավոր է սկրիպտներ տեղադրվեն` ծրագրի բովանդակությունն ավելի մատչելի դարձնելու համար:" - "Զննել ձեր մուտքագրած տեքստը" - "Ներառում է անձնական տվյալներ, ինչպիսիք են վարկային քարտերի համարները և գաղտնաբառերը:" - "Ցուցասարքի խոշորացման կառավարում" - "Ցուցասարքի մասշտաբավորման և դիրքավորման կառավարում:" + "Հնչեցնել սեղմվող տարրերը և թույլատրել սարքի կառավարումը ժեստերի միջոցով" + "Մշակել մուտքագրվող տեքստը" + "Այդ թվում անձնական տվյալներ, օրինակ վարկային քարտերի համարներն ու գաղտնաբառերը" + "Կառավարել պատկերի մասշտաբը" + "Կառավարել պատկերի մասշտաբն ու դիրքը" "Կատարել ժեստեր" "Կարող է հպել, թերթել, պտղունցել և կատարել այլ ժեստեր:" "Մատնահետքերի սկաների ժեստեր" @@ -337,7 +352,7 @@ "Այս հավելվածը կարող է ցուցադրվել այլ հավելվածների վերևում" "Այս հավելվածը կարող է ցուցադրվել այլ հավելվածների կամ էկրանի այլ հատվածների վերևում: Դա կարող է խոչընդոտել հավելվածի նորմալ օգտագործմանը և փոխել այլ հավելվածների տեսքը:" "աշխատել ֆոնում" - "Այս հավելվածը կարող է աշխատել ֆոնում և ավելի արագ սպառել մարտկոցի լիցքը։" + "Այս հավելվածը կարող է աշխատել ֆոնային ռեժիմում և ավելի արագ սպառել մարտկոցի լիցքը։" "տվյալներ օգտագործել ֆոնում" "Այս հավելվածը կարող է տվյալներ օգտագործել ֆոնում և ավելացնել տվյալների օգտագործման ծավալը։" "միշտ աշխատեցնել հավելվածը" @@ -458,7 +473,7 @@ "Թույլ է տալիս հավելվածին հեռախոսը միացնել WiMAX ցանցին և անջատել այդ ցանցից:" "զուգակցվել Bluetooth սարքերի հետ" "Թույլ է տալիս հավելվածին տեսնել Bluetooth-ի կարգավորումը պլանշետի վրա և կապվել ու կապեր ընդունել զուգակցված սարքերի հետ:" - "Թույլ է տալիս հավելվածին տեսնել Bluetooth-ի կազմաձևումը հեռուստացույցի վրա և կապակցվել ու թույլ տալ կապակցումները զուգավորված սարքերի հետ:" + "Թույլ է տալիս հավելվածին տեսնել Bluetooth-ի կազմաձևումը հեռուստացույցի վրա և կապակցվել ու թույլ տալ կապակցումները զուգակցված սարքերի հետ:" "Թույլ է տալիս հավելվածին տեսնել Bluetooth-ի կարգավորումը հեռախոսի վրա և կապվել ու կապեր ընդունել զուգակցված սարքերի հետ:" "վերահսկել Մոտ Տարածությամբ Հաղորդակցումը" "Թույլ է տալիս հավելվածին հաղորդակցվել Մոտ տարածությամբ հաղորդակցման (NFC) պիտակների, քարտերի և ընթերցիչների հետ:" @@ -773,7 +788,7 @@ "%1$s վիջեթ:" "Օգտատիրոջ ընտրիչ" "Կարգավիճակ" - "Ֆոտոխցիկ" + "Տեսախցիկ" "Մեդիա կարգավորումներ" "Վիջեթների վերադասավորումը մեկնարկել է:" "Վիջեթի վերադասավորումն ավարտվեց:" @@ -976,8 +991,8 @@ "Հեռախոս" "Քարտեզ" "Բացել" - "Պահոցային տարածքը սպառվում է" - "Համակարգի որոշ գործառույթներ հնարավոր է չաշխատեն" + "Հիշողությունը սպառվում է" + "Որոշ գործառույթներ կարող են չաշխատել" "Համակարգի համար բավարար հիշողություն չկա: Համոզվեք, որ ունեք 250ՄԲ ազատ տարածություն և վերագործարկեք:" "%1$s-ն աշխատեցվում է" "Հպեք` լրացուցիչ տեղեկություններ ստանալու կամ հավելվածն անջատելու համար:" @@ -1178,7 +1193,7 @@ "ՏՐԱՄԱԴՐԵԼ" "ՄԵՐԺԵԼ" "Փոխել ստեղնաշարը" - "Պահել էկրանին մինչդեռ ֆիզիկական ստեղնաշարն ակտիվ է" + "Պահել էկրանին, երբ ֆիզիկական ստեղնաշարն ակտիվ է" "Ցույց տալ վիրտուալ ստեղնաշարը" "Կազմաձևեք ֆիզիկական ստեղնաշարը" "Հպեք՝ լեզուն և դասավորությունն ընտրելու համար" @@ -1357,7 +1372,7 @@ "USB կրիչ" "Խմբագրել" "Տվյալների օգտագործման զգուշացում" - "Հպեք և տեսեք օգտագործումը և կարգավորումները:" + "Հպեք՝ թրաֆիկն ու կարգավորումները տեսնելու համար" "2G-3G տվյալների սահմանաչափը սպառվել է" "4G տվյալների սահմանաչափը սպառվել է" "Բջջային ինտերնետի սահմանաչափը լրացել է" @@ -1562,7 +1577,7 @@ "Չեղարկված է" "Բովանդակության գրելու սխալ" "անհայտ" - "Տպելու ծառայությունն ակտիվացված չէ" + "Տպման ծառայությունն ակտիվացված չէ" "%s ծառայությունը տեղադրվել է" "Հպեք` միացնելու համար" "Մուտքագրեք ադմինիստրատորի PIN կոդը" @@ -1603,7 +1618,7 @@ "Տեղադրվել է ձեր ադմինիստրատորի կողմից" "Թարմացվել է ձեր ադմինիստրատորի կողմից" "Ջնջվել է ձեր ադմինիստրատորի կողմից" - "Մարտկոցի աշխատանքի ժամկետը երկարացնելու նպատակով, մարտկոցի էներգիայի խնայման գործառույթը սահմանափակում է սարքի աշխատանքը, թրթռոցը, տեղադրության ծառայությունները և հետնաշերտում աշխատող շատ գործընթացներ: Էլփոստը, հաղորդագրությունների փոխանակումը և տվյալների համաժամեցումից կախված այլ հավելվածները կարող են չթարմացվել, եթե դուք դրանք չգործարկեք:\n\nԵրբ ձեր սարքը լիցքավորվում է, մարտկոցի էներգիայի խնայման գործառույթն ինքնաշխատորեն անջատվում է:" + "Մարտկոցի աշխատանքի ժամկետը երկարացնելու համար տնտեսման ռեժիմում սահմանափակվում են սարքի արտադրողականությունը, թրթռոցը, տեղորոշման ծառայությունները և տվյալների ֆոնային փոխանցումը: Տվյալների համաժամեցումից կախված հավելվածները կարող են չթարմացվել, եթե դուք դրանք չգործարկեք:\n\n Մարտկոցի տնտեսման գործառույթն ավտոմատ կերպով անջատվում է սարքի լիցքավորման ժամանակ։" "Տվյալների օգտագործումը նվազեցնելու նպատակով «Թրաֆիկի խնայումը» որոշ հավելվածներին թույլ չի տալիս ուղարկել կամ ստանալ տվյալներ ֆոնային ռեժիմում: Արդեն իսկ գործարկված հավելվածը կարող է օգտագործել տվյալները, սակայն ոչ այնքան հաճախ: Օրինակ՝ պատկերները կցուցադրվեն միայն դրանք հպելուց հետո:" "Միացնե՞լ թրաֆիկի խնայումը:" "Միացնել" @@ -1726,17 +1741,18 @@ "USB վրիպազերծում" "ժամ" "րոպե" - "Կարգավորել ժամը" + "Ժամը" "Մուտքագրեք վավեր ժամ" "Մուտքագրեք ժամը" "Ժամը մուտքագրելու համար միացրեք տեքստի մուտքագրման ռեժիմը:" "Ժամը մուտքագրելու համար միացրեք ժամացույցի ռեժիմը:" "Ինքնալրացման ընտրանքները" + "Պահել ինքնալրացման համար" "Բովանդակության ինքնալրացումը հնարավոր չէ" - "Պահե՞լ %1$s-ում։" - "Պահե՞լ %1$s %2$s-ում։" - "Պահե՞լ %1$s, %2$s տվյալները %3$s-ում։" - "Պահե՞լ %1$s, %2$s, %3$s տվյալները %4$s-ում։" + "Պահե՞լ <b>%1$s</b>-ում:" + "Պահե՞լ %1$s-ը <b>%2$s</b>-ում:" + "Պահե՞լ %1$s-ը և %2$s-ը <b>%3$s</b>-ում:" + "Պահե՞լ %1$s-ը, %2$s-ը և %3$s-ը <b>%4$s</b>-ում:" "Պահել" "Ոչ" "գաղտնաբառ" diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index cd4e63ef2c3c6427cfb64765d6d77bd6f438e360..aa325acce3baf0d891aba7b8f4316895b4c0aee4 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -99,6 +99,13 @@ "Operator menangguhkan panggilan suara dan darurat di lokasi ini untuk sementara" "Tidak dapat menjangkau jaringan" "Untuk meningkatkan penerimaan sinyal, coba ubah jenis yang dipilih di Sistem > Jaringan & Internet > Jaringan seluler > Jenis jaringan pilihan." + "Notifikasi" + "Penerusan panggilan" + "Mode panggilan balik darurat" + "Notifikasi data seluler" + "Pesan SMS" + "Notifikasi pesan suara" + "Panggilan Wi-Fi" "Rekan meminta Mode TTY PENUH" "Rekan meminta Mode TTY HCO" "Rekan meminta Mode TTY VCO" @@ -258,6 +265,16 @@ "Notifikasi" "Demo promo" "Sambungan USB" + + + + + + + + + + "Mode aman" "Sistem Android" "Beralih ke Pribadi" @@ -284,8 +301,6 @@ "Memeriksa konten jendela tempat Anda berinteraksi." "Mengaktifkan Jelajahi dengan Sentuhan" "Item yang diketuk akan diucapkan dengan jelas dan layar dapat dijelajahi menggunakan isyarat." - "Mengaktifkan aksesibilitas web yang disempurnakan" - "Skrip mungkin dipasang agar konten aplikasi lebih dapat diakses." "Mengamati teks yang Anda ketik" "Meliputi data pribadi seperti nomor kartu kredit dan sandi." "Mengontrol perbesaran layar" @@ -1732,11 +1747,12 @@ "Beralih ke mode masukan teks untuk masukan waktu." "Beralih ke mode jam untuk masukan waktu." "Opsi Isiotomatis" + "Simpan untuk Isiotomatis" "Konten tidak dapat diisi otomatis" - "Simpan ke %1$s?" - "Simpan %1$s ke %2$s?" - "Simpan %1$s, %2$s ke %3$s?" - "Simpan %1$s, %2$s, %3$s ke %4$s?" + "Simpan ke <b>%1$s</b>?" + "Simpan %1$s ke <b>%2$s</b>?" + "Simpan %1$s dan %2$s ke <b>%3$s</b>?" + "Simpan %1$s, %2$s, dan %3$s ke <b>%4$s</b>?" "Simpan" "Lain kali" "sandi" diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index d87725e14d518453979604e99ffd7ba1d63a6edd..e37862bd267976929f1445977319a4550145988f 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -99,6 +99,13 @@ "Símafyrirtækið þitt hefur tímabundið lokað fyrir símtöl og neyðarsímtöl á þessum stað" "Ekki næst samband við símkerfi" "Reyndu að breyta valinni gerð í Kerfi > Netkerfi og internet > Farsímakerfi > Valin símkerfistegund til að bæta móttökuskilyrðin." + "Tilkynningar" + "Símtalsflutningur" + "Stilling fyrir svarhringingu neyðarsímtala" + "Tilkynningar fyrir farsímagögn" + "SMS-skilaboð" + "Talhólfsskilaboð" + "Wi-Fi símtöl" "Jafningi bað um FULLA stillingu fjarrita" "Jafningi bað um HCO-stillingu fjarrita" "Jafningi bað um VCO-stillingu fjarrita" @@ -258,6 +265,16 @@ "Tilkynningar" "Kynningarútgáfa fyrir verslanir" "USB-tenging" + + + + + + + + + + "Örugg stilling" "Android kerfið" "Skipta yfir í persónulegt snið" @@ -284,8 +301,6 @@ "Kanna innihald glugga sem þú ert að nota." "Kveikja á snertikönnun" "Snert atriði verða lesin upphátt og hægt er að kanna skjáinn með bendingum." - "Kveikja á auknu vefaðgengi" - "Hægt er að setja upp skriftur til að bæta aðgengi að efni forrits." "Fylgjast með texta sem þú slærð inn" "Felur í sér persónuleg gögn á borð við kreditkortanúmer og aðgangsorð." "Stilla skjástærð" @@ -1725,7 +1740,7 @@ "Aðstoð" "Geymslurými tækis" "USB-villuleit" - "klukkustund" + "klst." "mínúta" "Stilla tíma" "Færðu inn gildan tíma" @@ -1733,11 +1748,12 @@ "Skipta yfir í textastillingu til að færa inn tíma." "Skipta yfir í klukkustillingu til að færa inn tíma." "Valkostir sjálfvirkrar útfyllingar" + "Vista fyrir sjálfvirka útfyllingu" "Ekki er hægt að fylla innihald út sjálfkrafa" - "Vista í %1$s?" - "Vista %1$s í %2$s?" - "Vista %1$s, %2$s á %3$s?" - "Vista %1$s, %2$s, %3$s á %4$s?" + "Vista á <b>%1$s</b>?" + "Vista %1$s á <b>%2$s</b>?" + "Vista %1$s og %2$s á <b>%3$s</b>?" + "Vista %1$s, %2$s og %3$s á <b>%4$s</b>?" "Vista" "Nei, takk" "aðgangsorð" diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 06850c849095b60d99c3392e98bd5f40f0e0db05..8057a06445ab15c8afda8e7007effddeae49a046 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -99,6 +99,13 @@ "Il tuo operatore ha sospeso temporaneamente le telefonate e le chiamate di emergenza per questa località" "Impossibile raggiungere la rete" "Per migliorare la ricezione, prova a modificare il tipo selezionato in Sistema > Rete e Internet > Reti mobili > Tipo di rete preferito." + "Avvisi" + "Deviazione chiamate" + "Modalità di richiamata di emergenza" + "Avvisi relativi ai dati mobili" + "SMS" + "Messaggi vocali" + "Chiamate Wi-Fi" "Peer ha richiesto la modalità TTY FULL" "Peer ha richiesto la modalità TTY HCO" "Peer ha richiesto la modalità TTY VCO" @@ -258,6 +265,16 @@ "Avvisi" "Demo retail" "Connessione USB" + + + + + + + + + + "Modalità provvisoria" "Sistema Android" "Passa al profilo personale" @@ -284,11 +301,9 @@ "Esaminare i contenuti di una finestra con cui interagisci." "Attivare Esplora al tocco" "Gli elementi toccati verranno pronunciati ad alta voce e sarà possibile esplorare lo schermo utilizzando i gesti." - "Attivare accessibilità web migliorata" - "Potrebbero essere installati script per rendere più accessibili i contenuti delle app." "Osservare il testo digitato" "Sono inclusi dati personali come numeri di carte di credito e password." - "Controlla l\'ingrandimento del display" + "Controllare l\'ingrandimento del display" "Controlla il livello di zoom e la posizione del display." "Esegui gesti" "Consente di toccare, far scorrere, pizzicare ed eseguire altri gesti." @@ -1732,11 +1747,12 @@ "Passa alla modalità di immissione testo per inserire l\'ora." "Passa alla modalità orologio per inserire l\'ora." "Opzioni di compilazione automatica" + "Salva per Compilazione automatica" "Impossibile compilare automaticamente i contenuti" - "Salvare in %1$s?" - "Salvare %1$s in %2$s?" - "Salvare %1$s e %2$s su %3$s?" - "Salvare %1$s, %2$s e %3$s su %4$s?" + "Salvare in <b>%1$s</b>?" + "Salvare %1$s in <b>%2$s</b>?" + "Salvare %1$s e %2$s in <b>%3$s</b>?" + "Salvare %1$s, %2$s e %3$s in <b>%4$s</b>?" "Salva" "No, grazie" "password" diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 846ce5640788b5ae4ab518054dd88d093db0d1ac..504d3ad8d05cc062c709980ac895fdf7b7637a5a 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -54,10 +54,10 @@ "המחיקה בוצעה בהצלחה." "סיסמה שגויה." "‏MMI הושלם." - "‏ה-PIN הישן שהקלדת שגוי." + "קוד הגישה הישן שהקלדת שגוי." "‏ה-PUK שהקלדת שגוי." - "‏קודי ה-PIN שהקלדת לא תואמים." - "‏הקלד PIN שאורכו 4 עד 8 ספרות." + "קודי הגישה שהקלדת לא תואמים." + "הקלד קוד גישה שאורכו 4 עד 8 ספרות." "‏הקלד PUK באורך 8 מספרים או יותר." "‏כרטיס ה-SIM נעול באמצעות PUK. הקלד את קוד PUK כדי לבטל את נעילתו." "‏הקלד PUK2 כדי לבטל את חסימת כרטיס ה-SIM." @@ -78,7 +78,7 @@ "שיחה ממתינה" "חסימת שיחות" "שינוי סיסמה" - "‏שנה את ה-PIN" + "שנה את קוד הגישה" "מספר מתקשר נמצא" "מספר מתקשר חסוי" "שיחה עם שלושה משתתפים" @@ -101,6 +101,13 @@ "הספק שלך השעה באופן זמני את האפשרות לבצע שיחות חירום ושיחות קוליות רגילות ממיקום זה" "לא ניתן להתחבר לרשת" "‏כדי לשפר את הקליטה, נסה לשנות את הסוג הנבחר ב\'מערכת\' > \'רשת ואינטרנט\' > \'רשתות סלולריות\' > \'סוג רשת מועדף\'." + "התראות" + "העברת שיחות" + "מצב \'התקשרות חזרה בחירום\'" + "התראות לגבי חבילת הגלישה" + "‏הודעות SMS" + "הודעות קוליות" + "‏שיחות Wi-Fi" "‏העמית ביקש TTY במצב FULL" "‏העמית ביקש TTY במצב HCO" "‏העמית ביקש TTY במצב VCO" @@ -264,6 +271,16 @@ "התראות" "הדגמה לקמעונאים" "‏חיבור USB" + + + + + + + + + + "מצב בטוח" "‏מערכת Android" "עבור ל\'אישי\'" @@ -290,8 +307,6 @@ "בדוק את התוכן של חלון שאיתו אתה מבצע אינטראקציה." "הפעלה של \'גילוי באמצעות מגע\'" "פריטים שעליהם תקיש יוקראו בקול, ותוכל לנווט במסך באמצעות תנועות." - "הפעלה של גישה משופרת לאינטרנט" - "ייתכן שסקריפטים יותקנו על מנת להקל את הגישה אל תוכן של אפליקציות." "הצגת טקסט בזמן הקלדה" "כולל נתונים אישיים כמו מספרי כרטיס אשראי וסיסמאות." "שליטה בהגדלת התצוגה" @@ -552,7 +567,7 @@ "גישה אל \'נא לא להפריע\'" "מאפשר לאפליקציה לקרוא ולכתוב את התצורה של \'נא לא להפריע\'." "הגדר כללי סיסמה" - "‏קביעת האורך הנדרש והתווים המותרים בסיסמאות ובקודי PIN של מסך הנעילה." + "קביעת האורך הנדרש והתווים המותרים בסיסמאות ובקודי הגישה של מסך הנעילה." "מעקב אחר ניסיונות לביטול של נעילת המסך" "ניהול מעקב אחר מספר הסיסמאות השגויות שמוקלדות בעת ביטול נעילת המסך, וביצוע נעילה של הטאבלט, או מחיקה של כל נתוני הטאבלט, אם מוקלדות יותר מדי סיסמאות שגויות." "מעקב אחר מספר הסיסמאות השגויות שהוזנו בעת נעילת המסך, ונעילת הטלוויזיה או מחיקה של כל נתוני הטלוויזיה אם הוזנו סיסמאות שגויות רבות מדי." @@ -575,7 +590,7 @@ "‏הגדר את שרת ה-Proxy הכללי של המכשיר" "‏הגדרה של שרת ה-proxy הגלובלי שבו ייעשה שימוש כשהמדיניות פועלת. רק הבעלים של המכשיר יכול להגדיר את שרת ה-proxy הגלובלי." "הגדרת תפוגה לסיסמת מסך הנעילה" - "‏שינוי התדירות לדרישת השינוי של הסיסמה, ה-PIN או קו ביטול הנעילה של מסך הנעילה." + "שינוי התדירות לדרישת השינוי של הסיסמה, קוד הגישה או קו ביטול הנעילה של מסך הנעילה." "הגדר הצפנת אחסון" "דרוש שנתוני אפליקציות מאוחסנות יהיו מוצפנים." "השבת מצלמות" @@ -696,14 +711,14 @@ "עבודה" "אחר" "לא נמצאה אפליקציה להצגת התוכן הזה." - "‏הקלד קוד PIN" - "‏הקלד את קוד ה-PUK וקוד ה-PIN החדש" + "הקלד קוד גישה" + "‏הקלד את קוד ה-PUK וקוד הגישה החדש" "‏קוד PUK" - "‏קוד PIN חדש" + "קוד גישה חדש" "הקש כדי להקליד את הסיסמה" "הקלד סיסמה לביטול הנעילה" - "‏הקלד קוד PIN לביטול הנעילה" - "‏קוד PIN שגוי" + "הקלד קוד גישה לביטול הנעילה" + "קוד גישה שגוי" "כדי לבטל את הנעילה, לחץ על \'תפריט\' ולאחר מכן על 0." "מספר חירום" "אין שירות" @@ -741,7 +756,7 @@ "‏מבטל נעילה של כרטיס SIM…" "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. \n\nנסה שוב בעוד %2$d שניות." "הקלדת סיסמה שגויה %1$d פעמים.\n\nנסה שוב בעוד %2$d שניות." - "‏הקלדת קוד PIN שגוי %1$d פעמים.\n\nנסה שוב בעוד %2$d שניות." + "הקלדת קוד גישה שגוי %1$d פעמים.\n\nנסה שוב בעוד %2$d שניות." "‏שרטטת באופן שגוי את קו ביטול הנעילה %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטאבלט באמצעות פרטי הכניסה שלך ל-Google.\n\nנסה שוב בעוד %3$d שניות." "‏שרטטת את קו ביטול הנעילה %1$d פעמים באופן שגוי. לאחר %2$d ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטלוויזיה באמצעות כניסה לחשבון Google שלך.\n\n נסה שוב בעוד %3$d שניות." "‏שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. בעוד %2$d ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטלפון באמצעות פרטי הכניסה שלך ל-Google‏.\n\n נסה שוב בעוד %3$d שניות." @@ -788,7 +803,7 @@ "ביטול נעילה באמצעות הסטה." "ביטול נעילה באמצעות ציור קו." "ביטול נעילה באמצעות זיהוי פנים." - "‏ביטול נעילה באמצעות מספר PIN." + "ביטול נעילה באמצעות קוד גישה." "ביטול נעילה באמצעות סיסמה." "אזור ציור קו." "אזור הסטה." @@ -1004,7 +1019,7 @@ "מחק" "העתק כתובת אתר" "בחר טקסט" - "בטל" + "ביטול" "בצע מחדש" "מילוי אוטומטי" "בחירת טקסט" @@ -1061,7 +1076,7 @@ "האפליקציה %1$s נעצרת שוב ושוב" "האפליקציה %1$s נעצרת שוב ושוב" "פתח שוב את האפליקציה" - "שלח משוב" + "משוב" "סגור" "השתק עד הפעלה מחדש של המכשיר" "המתן" @@ -1162,21 +1177,21 @@ "הזמנה להתחבר" "מאת:" "אל:" - "‏הקלד את קוד ה-PIN הנדרש." - "PIN:" + "הקלד את קוד הגישה הנדרש." + "קוד גישה:" "‏הטאבלט יתנתק מרשת ה-Wi-Fi באופן זמני בשעה שהוא מחובר אל %1$s" "‏הטלוויזיה תנותק באופן זמני מה-Wi-Fi בזמן שהיא מתחברת אל %1$s" "‏הטלפון יתנתק מרשת ה-Wi-Fi באופן זמני בשעה שהוא מחובר אל %1$s" "הוסף תו" "‏שולח הודעות SMS" "‏<b> %1$s </ b> שולח מספר רב של הודעות SMS. האם ברצונך לאפשר לאפליקציה זו להמשיך לשלוח הודעות?" - "אפשר" - "דחה" + "כן, זה בסדר" + "לא, אין מצב" "‏<b>%1$s</b> רוצה לשלוח הודעה אל <b>%2$s</b>." "הדבר ""עלול לגרום לחיובים"" בחשבון המכשיר הנייד שלך." "הדבר יגרום לחיובים בחשבון המכשיר הנייד שלך." "שלח" - "בטל" + "ביטול" "זכור את הבחירה שלי" "‏ניתן לשנות זאת מאוחר יותר ב\'הגדרות\' > \'אפליקציות\'" "אפשר תמיד" @@ -1193,7 +1208,7 @@ "‏ה-SIM החדש הוכנס" "הקש כדי להגדיר" "הגדרת שעה" - "הגדר תאריך" + "הגדרת תאריך" "הגדר" "בוצע" "חדש: " @@ -1216,9 +1231,9 @@ "שיתוף דוח על באג…" "מנהל המערכת ביקש דוח על באג כדי לסייע בפתרון בעיות במכשיר זה. ייתכן שאפליקציות ונתונים ישותפו." "שתף" - "דחה" + "לא, אין מצב" "שינוי מקלדת" - "השאר אותו במסך בזמן שהמקלדת הפיזית פעילה" + "תישאר במסך בזמן שהמקלדת הפיזית פעילה" "הצג מקלדת וירטואלית" "הגדרת מקלדת פיזית" "הקש כדי לבחור שפה ופריסה" @@ -1291,8 +1306,8 @@ "האפליקציות הבאות מבקשות אישור לגשת לחשבונך, כעת ובעתיד." "האם ברצונך לאפשר בקשה זו?" "בקשת גישה" - "אפשר" - "דחה" + "כן, זה בסדר" + "לא, אין מצב" "בקשת הרשאה" "נדרשת הרשאה\nלחשבון %s." "אתה משתמש באפליקציה זו מחוץ לפרופיל העבודה שלך" @@ -1353,13 +1368,13 @@ "בטל את פעולות המחיקה" "אל תעשה דבר כרגע" "בחר חשבון" - "הוסף חשבון" - "הוסף חשבון" + "הוספת חשבון" + "הוספת חשבון" "הוסף" "הפחת" "%s גע והחזק." "הסט למעלה כדי להוסיף ולמטה כדי להפחית." - "הוסף דקה" + "הוספת דקה" "הפחת דקה" "הוסף שעה" "הפחת שעה" @@ -1398,7 +1413,7 @@ "‏כונן USB של %s" "‏אחסון USB" "ערוך" - "התראה לשימוש בנתונים" + "התראה על שימוש בנתונים" "הקש כדי להציג נתוני שימוש והגדרות." "‏הגעת למגבלת הנתונים של 2G-3G" "‏הגעת למגבלת הנתונים של 4G" @@ -1463,30 +1478,30 @@ "שכחת את הקו" "קו ביטול נעילה שגוי" "סיסמה שגויה" - "‏מספר PIN שגוי" + "קוד גישה שגוי" "נסה שוב בעוד %1$d שניות." "שרטט את קו ביטול הנעילה" - "‏הזן מספר PIN ל-SIM" - "‏הזן מספר PIN" + "‏הזן קוד גישה ל-SIM" + "הזן קוד גישה" "הזן את הסיסמה" "‏כרטיס ה-SIM מושבת כעת. הזן קוד PUK כדי להמשיך. פנה אל הספק לפרטים." - "‏הזן את קוד ה-PIN הרצוי" - "‏אשר את קוד ה-PIN הרצוי" + "הזן את קוד הגישה הרצוי" + "אשר את קוד הגישה הרצוי" "‏מבטל נעילה של כרטיס SIM…" - "‏קוד PIN שגוי." - "‏הקלד מספר PIN שאורכו 4 עד 8 ספרות." + "קוד גישה שגוי." + "הקלד קוד גישה שאורכו 4 עד 8 ספרות." "‏קוד PUK צריך להיות בן 8 ספרות." "‏הזן מחדש את קוד PUK הנכון. ניסיונות חוזרים ישביתו לצמיתות את כרטיס ה-SIM." - "‏קודי ה-PIN אינם תואמים" + "קודי הגישה אינם תואמים" "ניסיונות רבים מדי לשרטוט קו ביטול נעילה." "‏כדי לבטל את הנעילה, היכנס באמצעות חשבון Google שלך." "שם משתמש (אימייל)" "סיסמה" - "היכנס" + "כניסה" "שם משתמש או סיסמה לא חוקיים." "‏שכחת את שם המשתמש או הסיסמה?\nהיכנס לכתובת ""google.com/accounts/recovery" "בודק חשבון…" - "‏הקלדת מספר PIN שגוי %1$d פעמים. \n\nנסה שוב בעוד %2$d שניות." + "הקלדת קוד גישה שגוי %1$d פעמים. \n\nנסה שוב בעוד %2$d שניות." "הקלדת סיסמה שגויה %1$d פעמים.\n\nנסה שוב בעוד %2$d שניות." "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. \n\nנסה שוב בעוד %2$d שניות." "ביצעת %1$d ניסיונות שגויים לביטול נעילת הטלפון. לאחר %2$d ניסיונות כושלים נוספים, הטאבלט יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו." @@ -1608,14 +1623,14 @@ "שירות %s מותקן" "הקש כדי להפעיל" "הזן את קוד הגישה של מנהל המכשיר" - "‏הזן מספר PIN" + "הזן קוד גישה" "שגוי" - "‏מספר PIN נוכחי" - "‏מספר PIN חדש" - "‏אשר את מספר ה-PIN החדש" - "‏צור מספר PIN לשינוי הגבלות" - "‏מספרי ה-PIN לא תואמים. נסה שוב." - "‏מספר ה-PIN קצר מדי. חייב להיות באורך 4 ספרות לפחות." + "קוד גישה נוכחי" + "קוד גישה חדש" + "אשר את קוד הגישה החדש" + "צור קוד גישה לשינוי הגבלות" + "קודי הגישה לא תואמים. נסה שוב." + "קוד הגישה קצר מדי. חייב להיות באורך 4 ספרות לפחות." נסה שוב בעוד %d שניות נסה שוב בעוד %d שניות @@ -1641,13 +1656,13 @@ "לא ניתן לבטל את ההצמדה של האפליקציה הזו" "המסך מוצמד" "הצמדת המסך בוטלה" - "‏בקש PIN לפני ביטול הצמדה" + "בקש קוד גישה לפני ביטול הצמדה" "בקש קו ביטול נעילה לפני ביטול הצמדה" "בקש סיסמה לפני ביטול הצמדה" "הותקנה על ידי מנהל המערכת" "עודכנה על ידי מנהל המערכת" "נמחקה על ידי מנהל המערכת" - "כדי לעזור בשיפור חיי הסוללה, תכונת החיסכון בסוללה מצמצמת את פעולות המכשיר ומגבילה רטט, שירותי מיקום ואת רוב נתוני הרקע. אימייל, העברת הודעות ואפליקציות אחרות המסתמכות על סנכרון עשויות שלא להתעדכן, אלא אם תפתח אותן.\n\nתכונת החיסכון בסוללה מושבתת אוטומטית כשהמכשיר בטעינה." + "כדי לעזור בשיפור חיי הסוללה, תכונת החיסכון בסוללה מצמצמת את פעולות המכשיר ומגבילה רטט, שירותי מיקום ואת רוב נתוני הרקע. אימייל, העברת הודעות ואפליקציות אחרות המסתמכות על סנכרון עשויות שלא להתעדכן, אלא אם פותחים אותן.\n\nתכונת החיסכון בסוללה מושבתת אוטומטית כשהמכשיר בטעינה." "‏כדי לסייע בהפחתת השימוש בנתונים, חוסך הנתונים (Data Saver) מונע מאפליקציות מסוימות שליחה או קבלה של נתונים ברקע. אפליקציה שבה אתה משתמש כרגע יכולה לגשת לנתונים, אבל בתדירות נמוכה יותר. משמעות הדבר היא, למשל, שתמונות יוצגו רק לאחר שתקיש עליהן." "‏האם להפעיל את חוסך הנתונים (Data Saver)?" "הפעל" @@ -1771,7 +1786,7 @@ "מאפס את המכשיר…" "האם לאפס את המכשיר?" "תאבד את כל השינויים וההדגמה תתחיל שוב בעוד %1$s שניות…" - "בטל" + "ביטול" "אפס עכשיו" "%1$s הושבת" "שיחת ועידה" @@ -1788,17 +1803,18 @@ "‏ניקוי באגים ב-USB" "שעה" "דקה" - "הגדר שעה" + "הגדרת שעה" "הזן שעה חוקית" - "הקלד את השעה" + "מהי השעה הנכונה" "העבר למצב קלט טקסט לצורך הזנת השעה" "העבר למצב שעון לצורך הזנת השעה" "אפשרויות מילוי אוטומטי" + "שמירה לצורך מילוי אוטומטי" "לא ניתן למלא את התוכן באופן אוטומטי" - "לשמור ב-%1$s?" - "לשמור %1$s ב-%2$s?" - "לשמור את %1$s, %2$s ב-%3$s?" - "לשמור את %1$s, %2$s, %3$s ב-%4$s?" + "‏לשמור בשירות <b>%1$s</b>?" + "‏האם לשמור %1$s בשירות <b>%2$s</b>?" + "‏האם לשמור %1$s ו%2$s בשירות <b>%3$s</b>?" + "‏האם לשמור %1$s, %2$s ו%3$s בשירות <b>%4$s</b>?" "שמור" "לא, תודה" "סיסמה" diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index f627b22ece5f655883ef381b66bde86c605be773..4f18bcb7b08d78b32d51b2d441061af1daea6670 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -99,7 +99,14 @@ "この場所では、携帯通信会社により音声通話と緊急通報が一時的に停止されています" "ネットワークにアクセスできません" "受信状態を改善するには、[システム] > [ネットワークとインターネット] > [モバイル ネットワーク] > [優先ネットワーク タイプ] で選択したタイプを変更してみてください。" - "ピアから、TTYモードをFULLにするようリクエストされました" + "通知" + "電話の転送" + "緊急通報待機モード" + "モバイルデータ通知" + "SMS メッセージ" + "ボイスメール メッセージ" + "Wi-Fi 通話" + "ピアから、TTY モードを FULL にするようリクエストされました" "ピアから、TTYモードをHCOにするようリクエストされました" "ピアから、TTYモードをVCOにするようリクエストされました" "ピアから、TTYモードをOFFにするようリクエストされました" @@ -258,6 +265,16 @@ "通知" "販売店デモ" "USB 接続" + + + + + + + + + + "セーフモード" "Androidシステム" "個人用に切り替える" @@ -284,8 +301,6 @@ "ユーザーがアクセスしているウィンドウのコンテンツを検査します。" "タッチガイドの有効化" "タップしたアイテムが読み上げられ、ジェスチャーで画面のガイドを利用できます。" - "ウェブアクセシビリティ拡張の有効化" - "スクリプトをインストールしてアプリコンテンツにアクセスしやすくできます。" "入力テキストの監視" "クレジットカードの番号やパスワードなどの個人データが含まれます。" "画面の拡大の制御" @@ -1732,11 +1747,12 @@ "時刻をテキストで入力するモードに切り替えます。" "時刻を時計で入力するモードに切り替えます。" "自動入力のオプション" + "保存して自動入力で使用" "コンテンツを自動入力できません" - "%1$s に保存しますか?" - "%1$s%2$s に保存しますか?" - "%1$s%2$s%3$s に保存しますか?" - "%1$s%2$s%3$s%4$s に保存しますか?" + "<b>%1$s</b> に保存しますか?" + "%1$sを <b>%2$s</b> に保存しますか?" + "%1$s%2$sを <b>%3$s</b> に保存しますか?" + "%1$s%2$s%3$sを <b>%4$s</b> に保存しますか?" "はい" "いいえ" "パスワード" diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 6157f6b4588a691f8c07c833c40d09481cda18f0..31cd59b2130bc9f00970ece3505565d80173039d 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -99,6 +99,13 @@ "ხმოვანი და გადაუდებელი ზარები დროებით შეიზღუდა თქვენი ოპერატორის მიერ ამ მდებარეობაზე" "ქსელთან დაკავშირება ვერ ხერხდება" "მიღების გასაუმჯობესებლად ცადეთ არჩეული ტიპის შეცვლა აქ: სისტემა > ქსელი და ინტერნეტი > მობილური ქსელები > ქსელის სასურველი ტიპი." + "გაფრთხილებები" + "ზარის გადამისამართება" + "გადაუდებელი გადმორეკვის რეჟიმი" + "მობილური ინტერნეტის შეტყობინებები" + "SMS შეტყობინებები" + "ხმოვანი ფოსტის შეტყობინებები" + "დარეკვა Wi-Fi-ს მეშვეობით" "მოთხოვნილია კვანძი TTY რეჟიმი FULL" "მოთხოვნილია კვანძი TTY რეჟიმი HCO" "მოთხოვნილია კვანძი TTY რეჟიმი VCO" @@ -258,6 +265,16 @@ "გაფრთხილებები" "დემო-რეჟიმი საცალო მოვაჭრეებისთვის" "USB კავშირი" + + + + + + + + + + "უსაფრთხო რეჟიმი" "Android-ის სისტემა" "პირად პროფილზე გადართვა" @@ -281,11 +298,9 @@ "სხეულის სენსორები" "თქვენი სასიცოცხლო ფუნქციების შესახებ სენსორის მონაცემებზე წვდომა" "ფანჯრის კონტენტის მოძიება" - "შეამოწმეთ იმ ფანჯრის კონტექტი, რომელშიც მუშაობთ." + "იმ ფანჯრის კონტენტის შემოწმება, რომელშიც მუშაობთ." "„შეხებით აღმოჩენის“ ჩართვა" "ერთეულები, რომლებსაც შეეხებით, წაიკითხება ხმამაღლა, ხოლო ეკრანის დათვალიერება ჟესტების მეშვეობით იქნება შესაძლებელი." - "ვებზე გამარტივებული წვდომის დამატებითი შესაძლებლობების ჩართვა" - "შესაძლებელია სკრიპტების ინსტალაცია აპის კონტენტის წვდომადობის უზრუნველსაყოფად." "თქვენ მიერ აკრეფილ ტექსტზე დაკვირვება" "შეიცავს ისეთ პირად მონაცემებს, როგორიცაა საკრედიტო ბარათის ნომრები და პაროლები." "ერანის გადიდების მართვა" @@ -1603,7 +1618,7 @@ "დაინსტალირებულია თქვენი ადმინისტრატორის მიერ" "განახლებულია თქვენი ადმინისტრატორის მიერ" "წაიშალა თქვენი ადმინისტრატორის მიერ" - "ელემენტის მოქმედების ვადის გაუმჯობესებისათვის, ელემენტის დამზოგი ამცირებს თქვენი მოწყობილობის შესრულებას და ზღუდავს ვიბრაციას, ადგილმდებარეობის მომსახურებებს და ძირითად ფონურ მონაცემებს. ელ-ფოსტა, შეტყობინებები და სხვა სინქრონიზაციაზე დაყრდნობილი აპლიკაციების განახლება არ მოხდება მათ გახსნეამდე. \n\n ელემენტის დამზოგველი ავტომატურად გამოირთვება, როდესაც თქვენს მოწყობილობას დამტენთან შეაერთებთ." + "ელემენტის მოქმედების ვადის გაუმჯობესებისათვის, ელემენტის დამზოგი ამცირებს თქვენი მოწყობილობის ფუნქციონალობას და ზღუდავს ვიბრაციას, ადგილმდებარეობის მომსახურებებს და ძირითად ფონურ მონაცემებს. ელფოსტა, შეტყობინებები და სხვა სინქრონიზაციაზე დაყრდნობილი აპების განახლება არ მოხდება მათ გახსნამდე. \n\n ელემენტის დამზოგველი ავტომატურად გამოირთვება, როდესაც თქვენს მოწყობილობას დამტენთან შეაერთებთ." "მობილური ინტერნეტის მოხმარების შემცირების მიზნით, მონაცემთა დამზოგველი ზოგიერთ აპს ფონურ რეჟიმში მონაცემთა გაგზავნასა და მიღებას შეუზღუდავს. თქვენ მიერ ამჟამად გამოყენებული აპი მაინც შეძლებს მობილურ ინტერნეტზე წვდომას, თუმცა ამას ნაკლები სიხშირით განახორციელებს. ეს ნიშნავს, რომ, მაგალითად, სურათები არ გამოჩნდება მანამ, სანამ მათ საგანგებოდ არ შეეხებით." "ჩაირთოს მონაცემთა დამზოგველი?" "ჩართვა" @@ -1732,11 +1747,12 @@ "დროის შეყვანისთვის ტექსტის შეყვანის რეჟიმზე გადართვა." "დროის შეყვანისთვის საათის რეჟიმზე გადართვა." "ავტომატური შევსების ვარიანტები" + "ავტომატური შევსებისთვის შენახვა" "კონტენტის ავტომატური შევსება ვერ მოხერხდება" - "გსურთ „%1$s“-ში შენახვა?" - "გსურთ, შეინახოთ %1$s%2$s“-ში?" - "გსურთ, %3$s-ში შეინახოთ %1$s, %2$s?" - "გსურთ, %4$s-ში შეინახოთ %1$s, %2$s, %3$s?" + "გსურთ, შეინახოთ <b>%1$s-ში</b>?" + "გსურთ, შეინახოთ %1$s <b>%2$s-ში</b>?" + "გსურთ, შეინახოთ %1$s და %2$s <b>%3$s-ში</b>?" + "გსურთ, შეინახოთ %1$s, %2$s, და %3$s <b>%4$s-ში</b>?" "შენახვა" "არა, გმადლობთ" "პაროლი" diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index bf7fdf6ba1c3a7609a7ec561d34f1024e455fa40..c512e43114850ce56260196c52f046aeded2bce0 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -99,6 +99,13 @@ "Оператор осы жерде дауыстық қоңыраулар мен жедел қызметке қоңырауларды уақытша тоқтатты" "Желіге қосылу мүмкін емес" "Қабылдауды жақсарту үшін \"Жүйе > Желі және интернет > Мобильдік желілер > Қалаған желі түрі\" тармағынан түрді өзгертіп көріңіз." + "Дабылдар" + "Қоңырауды басқа нөмірге бағыттау" + "Шұғыл кері қоңырау шалу режимі" + "Мобильдік деректер дабылдары" + "SMS хабарлары" + "Дауыстық пошта хабарлары" + "Wi-Fi қоңыраулары" "Пир TTY режимі ТОЛЫҚ сұрады" "Пир TTY режимінің HCO сұрады" "Пир TTY режимінің VCO сұрады" @@ -258,6 +265,16 @@ "Дабылдар" "Бөлшек саудаға арналған демо нұсқасы" "USB байланысы" + + + + + + + + + + "Қауіпсіз режим" "Android жүйесі" "Жекеге ауысу" @@ -284,8 +301,6 @@ "Ашық тұрған терезе мазмұнын тексеру." "Түртілген элементтерді дыбыстау функциясын қосу" "Түртілген элементтер дауыстап айтылады және экранды қимылдар арқылы зерттеуге болады." - "Ғаламторға кірудің жетілдірілген әдісін қосу" - "Қолданба мазұнына кіруді жеңілдету үшін скрипт орнатылуы мүмкін." "Терілген мәтінді тексеру" "Кредит карта нөмірі және кілтсөздер сияқты жеке деректерді қоса." "Дисплей ұлғайтуды басқару" @@ -1733,11 +1748,12 @@ "Уақытты енгізу үшін мәтін енгізу режиміне өтіңіз." "Уақытты енгізу үшін сағат режиміне өтіңіз." "Автотолтыру опциялары" + "Автотолтыру үшін сақтау" "Мазмұндар автотолтырылмайды" - "%1$s жүйесінде сақталсын ба?" - "%1$s деректері %2$s жүйесінде сақталсын ба?" - "%1$s, %2$s %3$s ішіне сақтау керек пе?" - "%1$s, %2$s, %3$s %4$s ішіне сақтау керек пе?" + "\"%1$s\" қызметінде сақталсын ба?" + "%1$s \"%2$s\" қызметінде сақталсын ба?" + "%1$s және %2$s \"%3$s\" қызметінде сақталсын ба?" + "%1$s, %2$s және %3$s \"%4$s\" қызметінде сақталсын ба?" "Сақтау" "Жоқ, рақмет" "құпия сөз" diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 7e97f956010b7f11063515ce795f840b9df28189..64306fd3e809bcf8fb317a38410e78f611c051f2 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -99,6 +99,13 @@ "ក្រុមហ៊ុន​បម្រើ​សេវា​ទូរសព្ទ​របស់អ្នក​បានផ្អាក​ការហៅ​ដោយ​សំឡេង និង​ការហៅ​បន្ទាន់​ជា​បណ្តោះអាសន្ន​នៅទី​តាំង​នេះ" "មិន​អាច​ភ្ជាប់​ទៅ​បណ្តាញ​បានទេ​" "ដើម្បីកែលម្អការទទួលយក សាកល្បងប្តូរប្រភេទដែលបានជ្រើសរើសនៅ ប្រព័ន្ធ > បណ្តាញ និងអ៊ីនធឺណិត > បណ្តាញទូរសព្ទចល័ត > ប្រភេទបណ្តាញដែលចង់ប្រើ។" + "ការជូនដំណឹង" + "ការបញ្ជូន​ការហៅ​ទូរសព្ទ​បន្ត" + "មុខងារ​ហៅត្រឡប់​វិញ​បន្ទាន់" + "ការជូនដំណឹង​អំពី​ទិន្នន័យ​ទូរសព្ទ​ចល័ត" + "សារ SMS" + "សារ​ជា​សំឡេង" + "ការហៅ​ទូរសព្ទ​តាម Wi-Fi" "ម៉ាស៊ីនកូនបានស្នើ TTY Mode FULL" "ម៉ាស៊ីនកូនបានស្នើ TTY Mode HCO" "ម៉ាស៊ីនកូនបានស្នើ TTY Mode VCO" @@ -258,6 +265,16 @@ "ការ​ជូនដំណឹង" "របៀបដាក់បង្ហាញក្នុងហាង" "ការ​តភ្ជាប់ USB" + + + + + + + + + + "របៀប​​​សុវត្ថិភាព" "ប្រព័ន្ធ​​ Android" "ប្តូរទៅផ្ទាល់ខ្លួន" @@ -274,20 +291,18 @@ "ចូលដំណើការរូបភាព មេឌៀ និងឯកសារនៅលើឧបករណ៍របស់អ្នក" "មីក្រូ​ហ្វូន" "ថតសំឡេង" - "ម៉ាស៊ីន​ថត" + "កាមេរ៉ា" "ថតរូប និងថតវីដេអូ" - "ទូរស័ព្ទ" + "ទូរសព្ទ" "ហៅទូរស័ព្ទ និងគ្រប់គ្រងការហៅទូរស័ព្ទ" "ឧបករណ៍ចាប់សញ្ញារាងកាយ" "ចូលដំណើរការទិន្នន័យឧបករណ៍ចាប់សញ្ញាអំពីស្ថានភាពសុខភាពរបស់អ្នក" - "ទៅ​យក​មាតិកា​បង្អួច" - "ពិនិត្យ​មាតិកា​បង្អួច​ដែល​អ្នក​កំពុង​ទាក់ទង​ជា​មួយ។" + "ទាញយក​មាតិកា​វិនដូ" + "ពិនិត្យ​មាតិកាវិនដូ​ដែល​អ្នក​កំពុង​ទាក់ទង​ជា​មួយ។" "បើក​ការ​រក​មើល​​ដោយ​ប៉ះ" "ធាតុដែលបានប៉ះនឹងត្រូវបានអានឮៗ ហើយអេក្រង់នោះអាចត្រូវបានស្វែងរកដោយប្រើកាយវិការ។" - "បើក​ការ​ចូល​ដំណើរការ​បណ្ដាញ​ដែល​បាន​ធ្វើ​ឲ្យ​ប្រសើរ" - "ស្គ្រីប​អាច​ត្រូវ​បាន​ដំឡើង​ ដើម្បី​ធ្វើ​ឲ្យ​មាតិកា​កម្មវិធី​អាច​ចូល​ដំណើរការ​បាន​កាន់តែ​ច្រើន។" "មើល​អត្ថបទ​ដែល​វាយ" - "រួម​បញ្ចូល​ទិន្នន័យ​ផ្ទាល់​ខ្លួន​ ដូចជា​លេខ​កាត​ឥណទាន និង​ពាក្យ​សម្ងាត់។" + "រួម​បញ្ចូល​ទិន្នន័យ​ផ្ទាល់​ខ្លួន​ ដូចជា​លេខ​បណ្ណ​ឥណទាន និង​ពាក្យ​សម្ងាត់។" "គ្រប់គ្រងការពង្រីកអេក្រង់" "គ្រប់គ្រងការកំណត់ទីតាំង និងកម្រិតពង្រីករបស់អេក្រង់" "ធ្វើកាយវិការ" @@ -1076,7 +1091,7 @@ "កំណត់​សំឡេង​រោទ៍​ស្ងាត់" "កម្រិត​សំឡេង​ហៅ​ចូល" "កម្រិត​សំឡេង​ហៅ​ចូល​តាម​ប៊្លូធូស" - "កម្រិត​សំឡេង​រោទ៍" + "កម្រិត​សំឡេងម៉ោងរោទ៍" "កម្រិត​សំឡេង​ការ​ជូន​ដំណឹង" "កម្រិត​សំឡេង" "កម្រិត​សំឡេង​ប៊្លូធូស" @@ -1397,7 +1412,7 @@ "%1$s មិន​គាំទ្រ​ប្រវត្តិរូប​ការងារ" "កុំព្យូទ័រ​បន្ទះ" "ទូរទស្សន៍" - "ទូរស័ព្ទ" + "ទូរសព្ទ" "កាស" "ភ្ជាប់​អូប៉ាល័រ" "HDMI" @@ -1605,7 +1620,7 @@ "​ដំឡើង​ដោយ​អ្នកគ្រប់គ្រង​របស់​អ្នក" "ធ្វើ​បច្ចុប្បន្នភាព​ដោយ​អ្នកគ្រប់គ្រង​របស់​អ្នក" "លុប​ដោយ​អ្នកគ្រប់គ្រង​របស់​អ្នក" - "ដើម្បីជួយឲ្យថាមពលថ្មប្រសើរឡើង កម្មវិធីសន្សំសំចៃថាមពលថ្មកាត់បន្ថយប្រតិបត្តិការឧបករណ៍របស់អ្នក និងកម្រិតភាពញ័រ សេវាកម្មទីតាំង និងទិន្នន័យផ្ទៃខាងក្រោយស្ទើរតែទាំងអស់។ ការផ្ញើសារអ៊ីម៉ែល និងកម្មវិធីផ្សេងទៀតដែលពឹងផ្អែកលើការធ្វើសមកាលកម្មអាចនឹងមិនធ្វើបច្ចុប្បន្នភាពទេ លុះត្រាតែអ្នកបើកពួកវា។\n\nកម្មវិធីសន្សំសំចៃបិទដោយស្វ័យប្រវត្តិ នៅពេលដែលឧបករណ៍របស់អ្នកកំពុងសាកថ្ម។" + "ដើម្បីជួយឲ្យថាមពលថ្មប្រសើរឡើង កម្មវិធីសន្សំសំចៃថ្មកាត់បន្ថយប្រតិបត្តិការឧបករណ៍របស់អ្នក និងកម្រិតភាពញ័រ សេវាកម្មទីតាំង និងទិន្នន័យផ្ទៃខាងក្រោយស្ទើរតែទាំងអស់។ អ៊ីមែល ការផ្ញើសារ និងកម្មវិធីផ្សេងទៀតដែលពឹងផ្អែកលើការធ្វើសមកាលកម្មអាចនឹងមិនដំឡើងកំណែទេ លុះត្រាតែអ្នកបើកពួកវា។\n\nកម្មវិធីសន្សំសំចៃថ្មបិទដោយស្វ័យប្រវត្តិ នៅពេលដែលឧបករណ៍របស់អ្នកកំពុងសាកថ្ម។" "ដើម្បីជួយកាត់បន្ថយការប្រើប្រាស់ទិន្នន័យ កម្មវិធីសន្សំសំចៃទិន្នន័យរារាំងកម្មវិធីមួយចំនួនមិនឲ្យបញ្ជូន ឬទទួលទិន្នន័យនៅផ្ទៃខាងក្រោយទេ។ កម្មវិធីដែលអ្នកកំពុងប្រើនាពេលបច្ចុប្បន្នអាចចូលប្រើប្រាស់​ទិន្នន័យបាន ប៉ុន្តែអាចនឹងមិនញឹកញាប់ដូចមុនទេ។ ឧទាហរណ៍ រូបភាពមិនបង្ហាញទេ លុះត្រាតែអ្នកប៉ះរូបភាពទាំងនោះ។" "បើកកម្មវិធីសន្សំសំចៃទិន្នន័យឬ?" "បើក" @@ -1685,7 +1700,7 @@ "បន្ថែមភាសា" "ចំណូលចិត្តតំបន់" "វាយបញ្ចូលឈ្មោះភាសា" - "បាន​ស្នើ" + "បាន​ណែនាំ" "ភាសាទាំងអស់" "តំបន់ទាំងអស់" "ស្វែងរក" @@ -1734,11 +1749,12 @@ "ប្តូរ​ទៅ​មុខងារ​បញ្ចូល​អក្សរ​សម្រាប់​ការ​បញ្ចូល​ម៉ោង។" "ប្តូរ​ទៅ​មុខងារ​នាឡិកា​សម្រាប់​ការ​បញ្ចូល​ម៉ោង។" "ជម្រើសបំពេញដោយស្វ័យប្រវត្តិ" + "រក្សាទុក​សម្រាប់​បំពេញ​ដោយ​ស្វ័យប្រវត្តិ" "មិនអាច​បំពេញ​មាតិកា​ដោយស្វ័យប្រវត្តិ​បានទេ" - "រក្សា​ទុក​ទៅ​ក្នុង %1$s?" - "រក្សាទុក %1$s ​ទៅ​ក្នុង %2$s?" - "រក្សាទុក %1$s, %2$s ទៅក្នុង %3$s?" - "រក្សាទុក %1$s, %2$s, %3$s ទៅក្នុង %4$s?" + "រក្សាទុក​ទៅក្នុង <b>%1$s</b>?" + "រក្សាទុក %1$s ទៅក្នុង <b>%2$s</b>?" + "រក្សាទុក %1$s និង %2$s ទៅក្នុង <b>%3$s</b>?" + "រក្សាទុក %1$s, %2$s, និង %3$s ទៅក្នុង <b>%4$s</b>?" "រក្សាទុក" "ទេ អរគុណ" "ពាក្យ​សម្ងាត់" diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 94f4df8b2663df5a0d6baa931da98952b24c504f..aaabd919e6ea375f8b1852c78c0d31616b782d7f 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -99,6 +99,13 @@ "ನಿಮ್ಮ ವಾಹಕವು ಈ ಸ್ಥಳದಲ್ಲಿ ತಾತ್ಕಾಲಿಕವಾಗಿ ಧ್ವನಿ ಮತ್ತು ತುರ್ತು ಕರೆಗಳನ್ನು ಅಮಾನತ್ತುಗೊಳಿಸಿದೆ" "ನೆಟ್‌ವರ್ಕ್ ತಲುಪಲು ಸಾಧ್ಯವಿಲ್ಲ" "ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕ ಪಡೆಯುವುದನ್ನು ಸುಧಾರಿಸಲು, ಆಯ್ಕೆ ಮಾಡಿರುವ ವಿಧವನ್ನು ಸಿಸ್ಟಂ > ನೆಟ್‌ವರ್ಕ್ ಮತ್ತು ಇಂಟರ್ನೆಟ್ > ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳು > ಆದ್ಯತೆಯ ನೆಟ್‌ವರ್ಕ್ ವಿಧದಲ್ಲಿ ಬದಲಿಸಿ ನೋಡಿ." + "ಎಚ್ಚರಿಕೆಗಳು" + "ಕರೆ ಫಾರ್ವರ್ಡ್‌ ಮಾಡುವಿಕೆ" + "ತುರ್ತು ಕಾಲ್‌ಬ್ಯಾಕ್‌ ಮೋಡ್‌" + "ಮೊಬೈಲ್ ಡೇಟಾ ಎಚ್ಚರಿಕೆಗಳು" + "ಎಸ್‌ಎಂಎಸ್ ಸಂದೇಶಗಳು" + "ಧ್ವನಿಮೇಲ್ ಸಂದೇಶಗಳು" + "ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ" "ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ" "ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ HCO" "ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ VCO" @@ -191,7 +198,7 @@ "ಟಿವಿ ಆಯ್ಕೆಗಳು" "ಫೋನ್ ಆಯ್ಕೆಗಳು" "ಶಾಂತ ಮೋಡ್" - "ವೈರ್‌ಲೆಸ್ ಆನ್ ಮಾಡು" + "ವೈರ್‌ಲೆಸ್ ಆನ್‌ ಮಾಡಿ" "ವೈರ್‌ಲೆಸ್ ಆಫ್ ಮಾಡು" "ಸ್ಕ್ರೀನ್ ಲಾಕ್" "ಪವರ್ ಆಫ್ ಮಾಡು" @@ -258,6 +265,16 @@ "ಎಚ್ಚರಿಕೆಗಳು" "ರಿಟೇಲ್ ಡೆಮೋ" "USB ಸಂಪರ್ಕ" + + + + + + + + + + "ಸುರಕ್ಷಿತ ಮೋಡ್" "Android ಸಿಸ್ಟಂ" "ವೈಯಕ್ತಿಕಗೆ ಬದಲಿಸಿ" @@ -280,16 +297,14 @@ "ಫೋನ್ ಕರೆ ಮಾಡಲು ಹಾಗೂ ನಿರ್ವಹಿಸಲು" "ದೇಹ ಸೆನ್ಸರ್‌ಗಳು" "ನಿಮ್ಮ ಮುಖ್ಯ ಲಕ್ಷಣಗಳ ಕುರಿತು ಸೆನ್ಸಾರ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಿ" - "ವಿಂಡೋ ವಿಷಯವನ್ನು ಹಿಂಪಡೆದುಕೊಳ್ಳುತ್ತದೆ" - "ನೀವು ಸಂವಹನ ನಡೆಸುತ್ತಿರುವ ವಿಂಡೋದ ವಿಷಯವನ್ನು ಪರೀಕ್ಷಿಸಿ." - "ಸ್ಪರ್ಶಿಸುವ ಮೂಲಕ ಎಕ್ಸ್‌ಪ್ಲೋರ್ ಆನ್ ಮಾಡಿ" + "ವಿಂಡೋ ವಿಷಯವನ್ನು ಹಿಂಪಡೆಯುತ್ತದೆ" + "ನೀವು ಬಳಸುತ್ತಿರುವ ವಿಂಡೋದ ವಿಷಯ ಪರೀಕ್ಷಿಸುತ್ತದೆ." + "ಸ್ಪರ್ಶ-ಎಕ್ಸ್‌ಪ್ಲೋರ್ ಆನ್ ಮಾಡುತ್ತದೆ" "ಟ್ಯಾಪ್ ಮಾಡಲಾದ ಐಟಂಗಳನ್ನು ಗಟ್ಟಿಯಾಗಿ ಹೇಳಲಾಗುತ್ತದೆ ಮತ್ತು ಗೆಸ್ಚರ್‌ಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಪರದೆಯನ್ನು ಎಕ್ಸ್‌ಪ್ಲೋರ್ ಮಾಡಬಹುದಾಗಿದೆ." - "ವರ್ಧಿತ ವೆಬ್ ಪ್ರವೇಶಿಸುವಿಕೆ ಆನ್ ಆಗುವಿಕೆ" - "ಅಪ್ಲಿಕೇಶನ್ ವಿಷಯ ಇನ್ನಷ್ಟು ಲಭ್ಯವಾಗುವಂತೆ ಮಾಡಲು ಸ್ಕ್ರಿಪ್ಟ್‌ಗಳನ್ನು ಸ್ಥಾಪಿಸಬಹುದಾಗಿದೆ." "ನೀವು ಟೈಪ್ ಮಾಡುವ ಪಠ್ಯವನ್ನು ಗಮನಿಸುತ್ತದೆ" "ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಸಂಖ್ಯೆಗಳು ಮತ್ತು ಪಾಸ್‌ವರ್ಡ್‌ಗಳಂತಹ ವೈಯಕ್ತಿಕ ಡೇಟಾವನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ." - "ಪ್ರದರ್ಶನದ ವರ್ಧಕವನ್ನು ನಿಯಂತ್ರಿಸಿ" - "ಪ್ರದರ್ಶನದ ಝೂಮ್ ಮಟ್ಟ ಮತ್ತು ಸ್ಥಾನ ನಿರ್ಧಾರವನ್ನು ನಿಯಂತ್ರಿಸಿ." + "ಡಿಸ್‌ಪ್ಲೇ ವರ್ಧಕ ನಿಯಂತ್ರಿಸುತ್ತದೆ" + "ಪ್ರದರ್ಶನದ ಝೂಮ್ ಮಟ್ಟ ಮತ್ತು ಸ್ಥಳ ನಿರ್ಧಾರವನ್ನು ನಿಯಂತ್ರಿಸಿ." "ಗೆಸ್ಚರ್‌ಗಳನ್ನು ಮಾಡಿ" "ಟ್ಯಾಪ್ ಮಾಡಬಹುದು, ಸ್ವೈಪ್ ಮಾಡಬಹುದು, ಪಿಂಚ್ ಮಾಡಬಹುದು ಮತ್ತು ಇತರ ಗೆಸ್ಚರ್‌ಗಳನ್ನು ಮಾಡಬಹುದು." "ಫಿಂಗರ್‌ಪ್ರಿಂಟ್‌ ಸೂಚಕಗಳು" @@ -380,8 +395,8 @@ "ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್‌ನಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಲೆಂಡರ್‌ನ ಮಾಲೀಕರಿಂದ ಬಂದಿರಬಹುದಾದ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅವರ ಮಾಲೀಕರಿಗೆ ತಿಳಿಸದಂತೆ ಘಟನೆಗಳು ಬದಲಾಯಿಸುವುದು." "ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಟಿವಿಯಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಲೆಂಡರ್‌ನ ಮಾಲೀಕರಿಂದ ಬಂದಿರಬಹುದಾದ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅವರ ಮಾಲೀಕರಿಗೆ ತಿಳಿಸದಂತೆ ಘಟನೆಗಳು ಬದಲಾಯಿಸುವುದು." "ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಲೆಂಡರ್‌ನ ಮಾಲೀಕರಿಂದ ಬಂದಿರಬಹುದಾದ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅವರ ಮಾಲೀಕರಿಗೆ ತಿಳಿಸದಂತೆ ಘಟನೆಗಳು ಬದಲಾಯಿಸುವುದು." - "ಹೆಚ್ಚುವರಿ ಸ್ಥಾನ ಪೂರೈಕೆದಾರರ ಆದೇಶಗಳನ್ನು ಪ್ರವೇಶಿಸಿ" - "ಹೆಚ್ಚಿನ ಸ್ಥಾನ ಪೂರೈಕೆದಾರ ಆದೇಶಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು GPS ಅಥವಾ ಇತರ ಸ್ಥಾನ ಮೂಲಗಳ ಕಾರ್ಯಾಚರಣೆಯಲ್ಲಿ ಮಧ್ಯ ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅನುಮತಿಸಬಹುದು." + "ಹೆಚ್ಚುವರಿ ಸ್ಥಳ ಪೂರೈಕೆದಾರರ ಆದೇಶಗಳನ್ನು ಪ್ರವೇಶಿಸಿ" + "ಹೆಚ್ಚಿನ ಸ್ಥಳ ಪೂರೈಕೆದಾರ ಆದೇಶಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು GPS ಅಥವಾ ಇತರ ಸ್ಥಳ ಮೂಲಗಳ ಕಾರ್ಯಾಚರಣೆಯಲ್ಲಿ ಮಧ್ಯ ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅನುಮತಿಸಬಹುದು." "ನಿಖರ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ (GPS ಮತ್ತು ನೆಟ್‍ವರ್ಕ್-ಆಧಾರಿತ)" "ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಸೆಲ್ ಟವರ್‌ಗಳು ಮತ್ತು ವೈ-ಫೈ ನೆಟ್‍‍ವರ್ಕ್‌ನಂತಹ GPS ಅಥವಾ ನೆಟ್‍‍ವರ್ಕ್ ಮೂಲಗಳ ಆಧಾರದ ಮೇಲೆ ಪಡೆಯಬಹುದು. ಈ ಸ್ಥಳ ಸೇವೆಗಳನ್ನು ಆನ್ ಮಾಡಿರಬೇಕು ಮತ್ತು ಅವುಗಳನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಸಾಧ್ಯವಾಗುವಂತೆ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್‌ನಲ್ಲಿ ಅವುಗಳು ಲಭ್ಯವಿರಬೇಕು. ಇದು ಬ್ಯಾಟರಿ ಬಳಕೆಯನ್ನು ಹೆಚ್ಚಿಸಬಹುದು." "ಅಂದಾಜು ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ (ನೆಟ್‌ವರ್ಕ್-ಆಧಾರಿತ)" @@ -499,8 +514,8 @@ "ನಿಮ್ಮ SD ಕಾರ್ಡ್‌ನ ವಿಷಯಗಳನ್ನು ಮಾರ್ಪಡಿಸಿ ಅಥವಾ ಅಳಿಸಿ" "USB ಸಂಗ್ರಹಣೆಗೆ ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ." "SD ಕಾರ್ಡ್‌ಗೆ ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ." - "SIP ಕರೆಗಳನ್ನು ಮಾಡಿ/ಸ್ವೀಕರಿಸಿ" - "SIP ಕರೆಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ಸ್ವೀಕರಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ." + "ಎಸ್‌ಐಪಿ ಕರೆಗಳನ್ನು ಮಾಡಿ/ಸ್ವೀಕರಿಸಿ" + "ಎಸ್‌ಐಪಿ ಕರೆಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ಸ್ವೀಕರಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ." "ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಿಮ್‌ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಿ" "ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಿಮ್‌ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಲು ಅನುಮತಿಸುತ್ತದೆ." "ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಿ" @@ -712,7 +727,7 @@ "ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ" "ಎಲ್ಲ ವೈಶಿಷ್ಟ್ಯಗಳು ಮತ್ತು ಡೇಟಾಗೆ ಅನ್‌ಲಾಕ್ ಮಾಡಿ" "ಗರಿಷ್ಠ ಫೇಸ್ ಅನ್‍ಲಾಕ್ ಪ್ರಯತ್ನಗಳು ಮೀರಿವೆ" - "ಯಾವುದೇ ಸಿಮ್‌ ಕಾರ್ಡ್ ಇಲ್ಲ" + "ಸಿಮ್‌ ಕಾರ್ಡ್ ಇಲ್ಲ" "ಟ್ಯಾಬ್ಲೆಟ್‌ನಲ್ಲಿ ಸಿಮ್‌ ಕಾರ್ಡ್ ಇಲ್ಲ." "ಟಿವಿಯಲ್ಲಿ ಯಾವುದೇ ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ." "ಫೋನ್‌ನಲ್ಲಿ ಸಿಮ್‌ ಕಾರ್ಡ್ ಇಲ್ಲ." @@ -724,7 +739,7 @@ "ಮುಂದಿನ ಟ್ರ್ಯಾಕ್" "ವಿರಾಮಗೊಳಿಸು" "ಪ್ಲೇ ಮಾಡು" - "ನಿಲ್ಲಿಸು" + "ನಿಲ್ಲಿಸಿ" "ರಿವೈಂಡ್ ಮಾಡು" "ವೇಗವಾಗಿ ಮುಂದಕ್ಕೆ" "ತುರ್ತು ಕರೆಗಳು ಮಾತ್ರ" @@ -752,7 +767,7 @@ "ಅನ್‍ಲಾಕ್ ಮಾಡಲು, ನಿಮ್ಮ Google ಖಾತೆ ಬಳಸಿಕೊಂಡು ಸೈನ್ ಇನ್ ಮಾಡಿ." "ಬಳಕೆದಾರಹೆಸರು (ಇಮೇಲ್)" "ಪಾಸ್‌ವರ್ಡ್" - "ಸೈನ್ ಇನ್ ಮಾಡು" + "ಸೈನ್‌ ಇನ್‌" "ಅಮಾನ್ಯ ಬಳಕೆದಾರಹೆಸರು ಅಥವಾ ಪಾಸ್‌ವರ್ಡ್." "ನಿಮ್ಮ ಬಳಕೆದಾರಹೆಸರು ಅಥವಾ ಪಾಸ್‍ವರ್ಡ್ ಮರೆತಿರುವಿರಾ?\n""google.com/accounts/recovery"" ಗೆ ಭೇಟಿ ನೀಡಿ." "ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ..." @@ -845,7 +860,7 @@ "ಮೆನು+" "space" "enter" - "ಅಳಿಸು" + "ಅಳಿಸಿ" "ಹುಡುಕಿ" "ಹುಡುಕಿ…" "ಹುಡುಕಿ" @@ -961,7 +976,7 @@ "ಅಂಟಿಸಿ" "ಸರಳ ಪಠ್ಯದಂತೆ ಅಂಟಿಸು" "ಸ್ಥಾನಾಂತರಿಸು..." - "ಅಳಿಸು" + "ಅಳಿಸಿ" "URL ನಕಲಿಸು" "ಪಠ್ಯವನ್ನು ಆಯ್ಕೆಮಾಡಿ" "ರದ್ದುಗೊಳಿಸಿ" @@ -969,7 +984,7 @@ "ಸ್ವಯಂತುಂಬುವಿಕೆ" "ಪಠ್ಯದ ಆಯ್ಕೆ" "ನಿಘಂಟಿಗೆ ಸೇರಿಸಿ" - "ಅಳಿಸು" + "ಅಳಿಸಿ" "ಇನ್‌ಪುಟ್ ವಿಧಾನ" "ಪಠ್ಯದ ಕ್ರಮಗಳು" "ಇಮೇಲ್" @@ -987,7 +1002,7 @@ "ರದ್ದುಮಾಡಿ" "ಗಮನಿಸಿ" "ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..." - "ಆನ್ ಮಾಡು" + "ಆನ್‌ ಮಾಡಿ" "ಆಫ್ ಮಾಡು" "ಇದನ್ನು ಬಳಸಿಕೊಂಡು ಕ್ರಿಯೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಿ" "%1$s ಬಳಸಿಕೊಂಡು ಕ್ರಿಯೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಿ" @@ -1117,7 +1132,7 @@ "ವೈ-ಫೈ ಡೈರೆಕ್ಟ್ ಆನ್ ಆಗಿದೆ" "ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಟ್ಯಾಪ್ ಮಾಡಿ" "ಸ್ವೀಕರಿಸು" - "ನಿರಾಕರಿಸು" + "ನಿರಾಕರಿಸಿ" "ಆಹ್ವಾನವನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ" "ಸಂಪರ್ಕಗೊಳ್ಳಲು ಆಹ್ವಾನ" "ಇಂದ:" @@ -1130,8 +1145,8 @@ "ಅಕ್ಷರವನ್ನು ಸೇರಿಸಿ" "SMS ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ" "<b>%1$s</b> ಹೆಚ್ಚಿನ ಸಂಖ್ಯೆಯ SMS ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸುತ್ತಿದೆ. ಸಂದೇಶಗಳ ಕಳುಹಿಸುವಿಕೆಯನ್ನು ಮುಂದುವರಿಸುವಂತೆ ಈ ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅನುಮತಿಸಲು ನೀವು ಬಯಸುವಿರಾ?" - "ಅನುಮತಿಸು" - "ನಿರಾಕರಿಸು" + "ಅನುಮತಿಸಿ" + "ನಿರಾಕರಿಸಿ" "<b>%2$s</b> ಗೆ ಸಂದೇಶವನ್ನು ಕಳುಹಿಸಲು <b>%1$s</b> ಬಯಸುತ್ತದೆ." "ಇದು ನಿಮ್ಮ ಮೊಬೈಲ್ ಖಾತೆಯಲ್ಲಿ ""ಶುಲ್ಕಗಳನ್ನು ವಿಧಿಸುವುದಕ್ಕೆ ಕಾರಣವಾಗಬಹುದು""." "ಇದು ನಿಮ್ಮ ಮೊಬೈಲ್ ಖಾತೆಯಲ್ಲಿ ಶುಲ್ಕಗಳನ್ನು ವಿಧಿಸುವುದಕ್ಕೆ ಕಾರಣವಾಗುತ್ತದೆ." @@ -1139,7 +1154,7 @@ "ರದ್ದುಮಾಡಿ" "ನನ್ನ ಆಯ್ಕೆಯನ್ನು ನೆನಪಿಡು" "ನೀವು ಇದನ್ನು ನಂತರದಲ್ಲಿ ಸೆಟ್ಟಿಂಗ್‍‍ಗಳು > ಅಪ್ಲಿಕೇಶನ್‍‍ಗಳಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು" - "ಯಾವಾಗಲೂ ಅನುಮತಿಸು" + "ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ" "ಎಂದಿಗೂ ಅನುಮತಿಸದಿರು" "ಸಿಮ್‌ ಕಾರ್ಡ್ ತೆಗೆದುಹಾಕಲಾಗಿದೆ" "ನೀವು ಮಾನ್ಯವಾದ ಸಿಮ್‌ ಕಾರ್ಡ್ ಮರುಪ್ರಾರಂಭಿಸುವವರೆಗೆ ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್ ಲಭ್ಯವಿರುವುದಿಲ್ಲ." @@ -1177,9 +1192,9 @@ "ಬಗ್ ವರದಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತಿದೆ…" "ಈ ಸಾಧನದ ಸಮಸ್ಯೆ ನಿವಾರಿಸುವಲ್ಲಿ ಸಹಾಯ ಮಾಡಲು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಬಗ್ ವರದಿಯನ್ನು ವಿನಂತಿಸಿದ್ದಾರೆ. ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು." "ಹಂಚಿಕೊಳ್ಳಿ" - "ನಿರಾಕರಿಸು" + "ನಿರಾಕರಿಸಿ" "ಕೀಬೋರ್ಡ್ ಬದಲಿಸಿ" - "ಭೌತಿಕ ಕೀಬೋರ್ಡ್ ಸಕ್ರಿಯವಾಗಿರುವಾಗ ಅದನ್ನು ಪರದೆಯ ಮೇಲೆ ಇರಿಸಿಕೊಳ್ಳಿ" + "ಭೌತಿಕ ಕೀಬೋರ್ಡ್ ಸಕ್ರಿಯವಾಗಿರುವಾಗ ಅದನ್ನು ಪರದೆಯ ಮೇಲಿರಿಸಿ" "ವರ್ಚ್ಯುಯಲ್ ಕೀಬೋರ್ಡ್ ತೋರಿಸು" "ಭೌತಿಕ ಕೀಬೋರ್ಡ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಿ" "ಭಾಷೆ ಮತ್ತು ವಿನ್ಯಾಸವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ" @@ -1252,8 +1267,8 @@ "ಇದೀಗ ಮತ್ತು ಭವಿಷ್ಯದಲ್ಲಿ ಈ ಕೆಳಗಿನ ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಪ್ರವೇಶಿಸಲು ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಿವೆ." "ನೀವು ಈ ವಿನಂತಿಗೆ ಅನುಮತಿಸಲು ಬಯಸುವಿರಾ?" "ಪ್ರವೇಶದ ವಿನಂತಿ" - "ಅನುಮತಿಸು" - "ನಿರಾಕರಿಸು" + "ಅನುಮತಿಸಿ" + "ನಿರಾಕರಿಸಿ" "ಅನುಮತಿ ವಿನಂತಿಸಲಾಗಿದೆ" "%s ಖಾತೆಗಾಗಿ\n ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಲಾಗಿದೆ." "ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ನ ಹೊರಗೆ ನೀವು ಈ ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ" @@ -1301,8 +1316,8 @@ "ವೆಬ್ ಹುಡುಕಾಟ" "ಮುಂದಿನದನ್ನು ಹುಡುಕಿ" "ಹಿಂದಿನದನ್ನು ಹುಡುಕಿ" - "%s ಅವರಿಂದ ಸ್ಥಾನ ವಿನಂತಿ" - "ಸ್ಥಾನ ವಿನಂತಿ" + "%s ಅವರಿಂದ ಸ್ಥಳ ವಿನಂತಿ" + "ಸ್ಥಳ ವಿನಂತಿ" "%1$s (%2$s) ಅವರಿಂದ ವಿನಂತಿಸಲಾಗಿದೆ" "ಹೌದು" "ಇಲ್ಲ" @@ -1311,7 +1326,7 @@ "ಐಟಂಗಳನ್ನು ಅಳಿಸಿ" "ಅಳಿಸುವಿಕೆಯನ್ನು ರದ್ದುಗೊಳಿಸಿ" "ಈಗ ಏನೂ ಮಾಡಬೇಡಿ" - "ಖಾತೆಯೊಂದನ್ನು ಆರಿಸು" + "ಖಾತೆ ಆಯ್ಕೆ ಮಾಡಿ" "ಒಂದು ಖಾತೆ ಸೇರಿಸಿ" "ಖಾತೆ ಸೇರಿಸಿ" "ಹೆಚ್ಚಿಸಿ" @@ -1334,7 +1349,7 @@ "ಮುಂದಿನ ತಿಂಗಳು" "Alt" "ರದ್ದುಮಾಡಿ" - "ಅಳಿಸು" + "ಅಳಿಸಿ" "ಮುಗಿದಿದೆ" "ಮೋಡ್ ಬದಲಾವಣೆ" "Shift" @@ -1461,7 +1476,7 @@ "ತೆಗೆದುಹಾಕು" "ವಾಲ್ಯೂಮ್‌ ಅನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾದ ಮಟ್ಟಕ್ಕಿಂತಲೂ ಹೆಚ್ಚು ಮಾಡುವುದೇ?\n\nದೀರ್ಘ ಅವಧಿಯವರೆಗೆ ಹೆಚ್ಚಿನ ವಾಲ್ಯೂಮ್‌ನಲ್ಲಿ ಆಲಿಸುವುದರಿಂದ ನಿಮ್ಮ ಆಲಿಸುವಿಕೆ ಸಾಮರ್ಥ್ಯಕ್ಕೆ ಹಾನಿಯುಂಟು ಮಾಡಬಹುದು." "ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್‌ಕಟ್ ಬಳಸುವುದೇ?" - "ಶಾರ್ಟ್‌ಕಟ್ ಆನ್ ಆಗಿರುವಾಗ, ಎರಡೂ ಧ್ವನಿ ಬಟನ್‌ಗಳನ್ನು 3 ಸೆಕೆಂಡ್‌ಗಳವರೆಗೆ ಒತ್ತಿಹಿಡಿದರೆ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯವು ಪ್ರಾರಂಭವಾಗುತ್ತದೆ.\n\nಪ್ರಸ್ತುತ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯ: \n %1$s\n\n ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ಪ್ರವೇಶಿಸುವಿಕೆಯಲ್ಲಿ ನೀವು ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬದಲಾಯಿಸಬಹುದು." + "ಶಾರ್ಟ್‌ಕಟ್ ಆನ್ ಆಗಿರುವಾಗ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯ ಆನ್ ಮಾಡಲು, ಎರಡೂ ವಾಲ್ಯೂಮ್ ಬಟನ್‌ಗಳನ್ನು ನೀವು 3 ಸೆಕೆಂಡುಗಳ ಕಾಲ ಒತ್ತಬೇಕು.\n\nಪ್ರಸ್ತುತ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯ: \n %1$s\n\n ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ಪ್ರವೇಶಿಸುವಿಕೆಯಲ್ಲಿ ನೀವು ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬದಲಾಯಿಸಬಹುದು." "ಶಾರ್ಟ್‌ಕಟ್‌ ಆಫ್ ಮಾಡಿ" "ಶಾರ್ಟ್‌ಕಟ್ ಬಳಸಿ" "ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್‌ಕಟ್‌, %1$s ಅನ್ನು ಆನ್ ಮಾಡಿದೆ" @@ -1604,10 +1619,10 @@ "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸ್ಥಾಪಿಸಿದ್ದಾರೆ" "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಅಪ್‌ಡೇಟ್ ಮಾಡಿದ್ದಾರೆ" "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಅಳಿಸಿದ್ದಾರೆ" - "ನಿಮ್ಮ ಬ್ಯಾಟರಿಯ ಬಾಳಿಕೆಯನ್ನು ಸುಧಾರಿಸಲು ಸಹಾಯ ಮಾಡಲು, ಬ್ಯಾಟರಿ ಉಳಿಕೆಯು ನಿಮ್ಮ ಸಾಧನದ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ ಮತ್ತು ವೈಬ್ರೇಷನ್, ಸ್ಥಳ ಸೇವೆಗಳು ಹಾಗೂ ಹೆಚ್ಚಿನ ಹಿನ್ನೆಲೆ ಡೇಟಾವನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ. ಸಿಂಕ್ ಮಾಡುವುದನ್ನು ಅವಲಂಬಿಸಿರುವ ಇಮೇಲ್, ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ, ಮತ್ತು ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ನೀವು ತೆರೆಯದ ಹೊರತು ನವೀಕರಣಗೊಳ್ಳುವುದಿಲ್ಲ.\n\nನಿಮ್ಮ ಸಾಧನವು ಚಾರ್ಜ್ ಆಗುತ್ತಿರುವ ಸಮಯದಲ್ಲಿ ಬ್ಯಾಟರಿ ಉಳಿಕೆಯು ಆಫ್ ಆಗುತ್ತದೆ." + "ಬ್ಯಾಟರಿಯ ಬಾಳಿಕೆಯನ್ನು ಸುಧಾರಿಸುವ ನಿಟ್ಟಿನಲ್ಲಿ, ಬ್ಯಾಟರಿ ಉಳಿಕೆಯು ನಿಮ್ಮ ಸಾಧನದ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ ಮತ್ತು ವೈಬ್ರೇಷನ್, ಸ್ಥಳ ಸೇವೆಗಳು ಹಾಗೂ ಹೆಚ್ಚಿನ ಹಿನ್ನೆಲೆ ಡೇಟಾವನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ. ಸಿಂಕ್ ಮಾಡುವಿಕೆಯನ್ನು ಅವಲಂಬಿಸಿರುವ ಇಮೇಲ್, ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ ಮತ್ತು ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ನೀವು ತೆರೆಯದ ಹೊರತು ಅಪ್‌ಡೇಟ್‌ ಆಗುವುದಿಲ್ಲ.\n\nನಿಮ್ಮ ಸಾಧನವು ಚಾರ್ಜ್ ಆಗುತ್ತಿರುವಾಗ ಬ್ಯಾಟರಿ ಉಳಿಕೆಯು ಆಫ್ ಆಗುತ್ತದೆ." "ಡೇಟಾ ಬಳಕೆ ಕಡಿಮೆ ಮಾಡುವ ನಿಟ್ಟಿನಲ್ಲಿ, ಡೇಟಾ ಸೇವರ್ ಕೆಲವು ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೇಟಾ ಕಳುಹಿಸುವುದನ್ನು ಅಥವಾ ಸ್ವೀಕರಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ನೀವು ಪ್ರಸ್ತುತ ಬಳಸುತ್ತಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು ಆದರೆ ಪದೇ ಪದೇ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಇದರರ್ಥ, ಉದಾಹರಣೆಗೆ, ನೀವು ಅವುಗಳನ್ನು ಟ್ಯಾಪ್ ಮಾಡುವವರೆಗೆ ಆ ಚಿತ್ರಗಳು ಕಾಣಿಸಿಕೊಳ್ಳುವುದಿಲ್ಲ." "ಡೇಟಾ ಉಳಿಸುವಿಕೆಯನ್ನು ಆನ್ ಮಾಡುವುದೇ?" - "ಆನ್ ಮಾಡು" + "ಆನ್‌ ಮಾಡಿ" %1$d ನಿಮಿಷಗಳವರೆಗೆ (%2$s ವರೆಗೆ) %1$d ನಿಮಿಷಗಳವರೆಗೆ (%2$s ವರೆಗೆ) @@ -1690,7 +1705,7 @@ "ಹುಡುಕಿ" "ಉದ್ಯೋಗ ಮೋಡ್ ಆನ್ ಮಾಡುವುದೇ?" "ಇದು ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ ಜೊತೆಗೆ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ಹಿನ್ನೆಲೆ ಸಿಂಕ್ ಮತ್ತು ಸಂಬಂಧಿತ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆನ್ ಮಾಡುತ್ತದೆ" - "ಆನ್ ಮಾಡು" + "ಆನ್‌ ಮಾಡಿ" "ನೀವು ಹೊಸ ಸಂದೇಶಗಳನ್ನು ಹೊಂದಿರುವಿರಿ" "ವೀಕ್ಷಿಸಲು SMS ಅಪ್ಲಿಕೇಶನ್ ತೆರೆಯಿರಿ" "ಕೆಲವು ಕಾರ್ಯನಿರ್ವಹಣೆಗಳು ಸೀಮಿತವಾಗಿರಬಹುದು" @@ -1715,7 +1730,7 @@ "%1$s ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" "ಕಾನ್ಫರೆನ್ಸ್ ಕರೆ" "ಟೂಲ್‌ಟಿಪ್" - "ಆಟಗಳು" + "ಗೇಮ್‌ಗಳು" "ಸಂಗೀತ ಮತ್ತು ಆಡಿಯೋ" "ಸಿನಿಮಾಗಳು ಮತ್ತು ವೀಡಿಯೊ" "ಫೋಟೋಗಳು ಮತ್ತು ಚಿತ್ರಗಳು" @@ -1733,11 +1748,12 @@ "ಸಮಯವನ್ನು ನಮೂದಿಸಲು ಪಠ್ಯದ ನಮೂನೆಗೆ ಬದಲಿಸಿ." "ಸಮಯವನ್ನು ನಮೂದಿಸಲು ಗಡಿಯಾರದ ನಮೂನೆಗೆ ಬದಲಿಸಿ." "ಸ್ವಯಂತುಂಬುವಿಕೆ ಆಯ್ಕೆಗಳು" + "ಸ್ವಯಂ ಭರ್ತಿಗಾಗಿ ಉಳಿಸಿ" "ವಿಷಯಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಭರ್ತಿಯಾಗಲು ಸಾಧ್ಯವಿಲ್ಲ" - "%1$s ನಲ್ಲಿ ಉಳಿಸಬೇಕೆ?" - "%1$s ಅನ್ನು %2$s ನಲ್ಲಿ ಉಳಿಸಬೇಕೆ?" - "%1$s, %2$s ಅನ್ನು %3$sಗೆ ಉಳಿಸಬೇಕೆ?" - "%1$s, %2$s, %3$s ಅನ್ನು %4$s ಗೆ ಉಳಿಸಬೇಕೆ?" + "<b>%1$s</b>ನಲ್ಲಿ ಉಳಿಸುವುದೇ?" + "%1$s ಅನ್ನು <b>%2$s</b>ನಲ್ಲಿ ಉಳಿಸುವುದೇ?" + "%1$s ಹಾಗೂ %2$s ಅನ್ನು <b>%3$s</b>ನಲ್ಲಿ ಉಳಿಸುವುದೇ?" + "%1$s, %2$s, ಹಾಗೂ %3$s ಅನ್ನು <b>%4$s</b>ನಲ್ಲಿ ಉಳಿಸುವುದೇ?" "ಉಳಿಸಿ" "ಬೇಡ" "ಪಾಸ್‌ವರ್ಡ್" diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index a24eb0666828d5f0f5d4b3987984237fb198ed52..ab61857150d8218a142972e61ebd476272595671 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -99,6 +99,13 @@ "이동통신사에서 이 위치에서의 음성 및 긴급 통화를 일시적으로 정지했습니다." "네트워크에 연결할 수 없습니다." "수신 상태를 개선하려면 시스템 > 네트워크 및 인터넷 > 모바일 네트워크 > 기본 네트워크 유형에서 선택된 유형을 변경해 보세요." + "알림" + "착신전환" + "긴급 콜백 모드" + "모바일 데이터 알림" + "SMS 메시지" + "음성사서함 메시지" + "Wi-Fi 통화" "피어가 TTY 모드 FULL을 요청했습니다." "피어가 TTY 모드 HCO를 요청했습니다." "피어가 TTY 모드 VCO를 요청했습니다." @@ -258,6 +265,16 @@ "알림" "소매 데모" "USB 연결" + + + + + + + + + + "안전 모드" "Android 시스템" "개인으로 전환" @@ -284,8 +301,6 @@ "상호작용 중인 창의 콘텐츠를 검사합니다." "터치하여 탐색 사용" "항목을 탭하면 소리 내어 알려주며 동작을 사용하여 화면을 탐색할 수 있습니다." - "향상된 웹 접근성 기능 사용" - "스크립트를 설치하여 앱 콘텐츠에 더 간편하게 액세스할 수 있습니다." "입력하는 텍스트 살펴보기" "신용카드 번호와 비밀번호 등의 개인 데이터를 포함합니다." "디스플레이 배율 제어" @@ -1121,7 +1136,7 @@ "초대장을 보냈습니다." "연결하도록 초대" "보낸사람:" - "받는사람:" + "수신:" "필수 PIN 입력:" "PIN:" "%1$s에 연결되어 있는 동안 일시적으로 태블릿의 Wi-Fi 연결이 해제됩니다." @@ -1732,11 +1747,12 @@ "시간 입력을 위해 텍스트 입력 모드로 전환합니다." "시간 입력을 위해 시계 모드로 전환합니다." "자동완성 옵션" + "자동완성에 저장" "콘텐츠를 자동완성할 수 없습니다." - "%1$s에 저장하시겠습니까?" - "%1$s을(를) %2$s에 저장하시겠습니까?" - "%3$s%1$s%2$s을(를) 저장하시겠습니까?" - "%4$s%1$s, %2$s%3$s을(를) 저장하시겠습니까?" + "<b>%1$s</b>에 저장하시겠습니까?" + "%1$s을(를) <b>%2$s</b>에 저장하시겠습니까?" + "%1$s%2$s을(를) <b>%3$s</b>에 저장하시겠습니까?" + "%1$s, %2$s, %3$s을(를) <b>%4$s</b>에 저장하시겠습니까?" "저장" "사용 안함" "비밀번호" diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index f4d15aa1e69f1523fc3a5f4916eb0b43c324d1ff..a24bd7fb21ad5d0ca6a618e8539dcf506e99d25c 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -73,7 +73,7 @@ "Туташкан линия ID-си" "Туташкан линия ID-син Чектөө" "Чалууну багыттоо" - "Чалууну кармоо" + "Чалууну кармап туруу" "Чалууга тыюу салуу" "Сырсөздү өзгөртүү" "PIN өзгөртүү" @@ -99,6 +99,13 @@ "Операторуңуз аудио чалууларды жана өзгөчө кырдаалдагы чалууларды бул аймактан убактылуу токтотуп койду" "Тармакка туташпай жатат" "Кабыл алуу мүмкүнчүлүгүн жакшыртуу үчүн Тутум > Тармак жана Интернет > Мобилдик тармактар > Тандалган тармак бөлүмүнөн тармактын түрүн өзгөртүп көрүңүз." + "Эскертүүлөр" + "Чалууну башка номерге багыттоо" + "Шашылыш кайра чалуу режими" + "Мобилдик Интернеттин эскертүүлөрү" + "SMS билдирүүлөрү" + "Үн почтасынын билдирүүлөрү" + "Wi-Fi аркылуу чалуу" "Peer TTY режимин FULL кылууну суранды" "Peer TTY режимин HCO кылууну суранды" "Peer TTY режимин VCO кылууну суранды" @@ -258,6 +265,16 @@ "Эскертүүлөр" "Чекене соода дүкөнү үчүн демо режим" "USB аркылуу туташуу" + + + + + + + + + + "Коопсуз режим" "Android тутуму" "Жеке профилге которулуу" @@ -265,7 +282,7 @@ "Байланыштар" "байланыштарыңызды көрүүгө" "Жайгашкан жер" - "түзмөктүн жайгашкан жери тууралуу дайындарды көрүүгө" + "түзмөктүн жайгашкан жерин аныктоого" "Күнбарак" "жылнаамаңызды пайдалануу" "SMS" @@ -280,16 +297,14 @@ "телефон чалуу жана аларды башкаруу" "Дене сенсорлору" "организмдин абалына көз салган сенсордун дайындарына мүмкүнчүлүк алуу" - "Терезе мазмунун алуу" - "Сиз иштеп жаткан терезенин мазмунун изилдөө." - "Сыйпалап изилдөөнү жандыруу" - "Тапталган нерселер угузулат жана экранды жаңсап изилдесе болот." - "Жакшыртылган веб жеткиликтүүлүгүн жандыруу" - "Колдонмонун мазмунун жеткиликтүүрөөк кылыш үчүн скрипттер орнотулушу мүмкүн." - "Терип жаткан текстти текшерүү" - "Кредиттик карта номурлары жана сырсөздөр сыяктуу өздүк берилиштерди камтыйт." - "Дисплейди чоңойтууну башкаруу" - "Экрандагы сүрөттүн өлчөмүн өзгөртүү жана жайгаштыруу." + "Терезедеги мазмунду алып турат" + "Учурда ачылып турган терезедеги маалыматты талдайт." + "\"Сыйпалап изилдөө\" мүмкүнчүлүгүн иштетет" + "Басылып жаткан элементтерди айтып турат жана түзмөктү жаңсоолор менен башкаруу мүмкүнчүлүгүн иштетет." + "Терилип жаткан текстти текшерип турат" + "Ошону менен катар, насыя карталарынын номерлери жана сырсөздөр сыяктуу жеке маалыматты да." + "Көрүнүштү чоңойтуп кичирейтет" + "Экрандагы сүрөттү тууралап жайгаштырып, өлчөмүн өзгөртөт." "Жаңсоолорду аткаруу" "Таптап, серпип, чымчып жана башка жаңсоолорду аткара алат." "Манжа изинин жаңсоолору" @@ -699,7 +714,7 @@ "Кулпуну ачуу үчүн PIN кодду териңиз" "PIN-код туура эмес." "Кулпусун ачуу үчүн, Менюна андан соң 0 баскычын басыңыз." - "Шашылыш чалуу номери" + "Өзгөчө кырдаалдар кызматы" "Байланыш жок" "Экран кулпуланды." "Кулпусун ачып же Шашылыш чалуу аткаруу үчүн менюну басыңыз." @@ -712,7 +727,7 @@ "Дагы аракет кылыңыз" "Элементтердин жана дайындардын кулпусун ачуу" "Жүзүнөн таанып ачуу аракеттеринин чегинен аштыңыз" - "SIM-карта жок" + "SIM карта жок" "Планшетте SIM-карта жок." "Сыналгыда SIM-карта жок." "Телефондо SIM-карта жок." @@ -1168,8 +1183,8 @@ "MIDI үчүн USB" "USB аксессуарга байланышты" "Кошумча параметрлерди ачуу үчүн таптап коюңуз." - "USB аркылуу мүчүлүштүктөрдү оңдоо туташтырылган" - "USB арклуу мүчүлштктрдү жоюну өчр үчн тийп коюңуз." + "Мүчүлүштүктөрдү USB аркылуу оңдоо иштетилген" + "Мүчүлштктрдү USB аркл оңдну өчр үчн тийп коюңуз." "Мүчүлүштүк тууралуу кабар алынууда…" @@ -1312,8 +1327,8 @@ "Жок кылынганды кайтаруу" "Азырынча эч нерсе кылбайм" "Каттоо эсебин тандаңыз" - "Эсеп кошуу" - "Эсеп кошуу" + "Каттоо эсебин кошуу" + "Каттоо эсебин кошуу" "Жогорулатуу" "Төмөндөтүү" "%s жолу басып, кармап туруңуз." @@ -1357,7 +1372,7 @@ "%s USB түзмөгү" "USB эстутуму" "Өзгөртүү" - "Дайындарды колдонууну чектөө" + "Трафикти чектөө" "Колдонулушун жана жөндөөлөрүн көрүү үчүн таптаңыз." "2G-3G дайындар чегине жетти" "4G дайындар чегине жетти" @@ -1403,11 +1418,11 @@ "Тутум" "Bluetooth аудио" "Зымсыз дисплей" - "Тандалгандар" + "Тышкы экранга чыгаруу" "Түзмөккө туташуу" "Сырткы экранга чыгаруу" "Түзмөктөр изделүүдө..." - "Тууралоолор" + "Жөндөөлөр" "Ажыратуу" "Скандоодо..." "Туташууда..." @@ -1461,7 +1476,7 @@ "Алып салуу" "Сунушталган деңгээлден да катуулатып уккуңуз келеби?\n\nМузыканы узакка чейин катуу уксаңыз, угууңуз начарлап кетиши мүмкүн." "Атайын мүмкүнчүлүктөр функциясынын кыска жолу колдонулсунбу?" - "Кыска жол функциясы күйгүзүлгөн учурда үн көзөмөлдөөчү баскычтарды басып, 3 секунд кармап турсаңыз, атайын мүмкүнчүлүктөр функциясы иштетилет.\n\n Учурдагы атайын мүмкүнчүлүктөр функциясы:\n %1$s\n\n Функцияны Жөндөөлөр > атайын мүмкүнчүлүктөр бөлүмүнөн өзгөртө аласыз." + "Атайын мүмкүнчүлүктөр функциясын пайдалануу үчүн, анын кыска жолу күйгүзүлгөндө, үндү катуулатуу/акырындатуу баскычын үч секунддай кое бербей басып туруңуз.\n\n Учурдагы атайын мүмкүнчүлүктөрдүн жөндөөлөрү:\n %1$s\n\nЖөндөөлөр > Атайын мүмкүнчүлүктөр бөлүмүнөн өзгөртө аласыз." "Кыска жолду өчүрүү" "Кыска жолду колдонуу" "Атайын мүмкүнчүлүктөр кыска жолу %1$s кызматын күйгүздү" @@ -1604,7 +1619,7 @@ "Администраторуңуз орнотуп койгон" "Администраторуңуз жаңыртып койгон" "Администраторуңуз жок кылып салган" - "Батареянын өмүрүн узартуу үчүн, батареяны үнөмдөгүч түзмөгүңүздүн ишинин майнаптуулугун азайтып, дирилдөө, жайгашкан жерди аныктоо кызматтары жана фондук дайындардын көпчүлүгүн чектеп коёт. Электрондук почта, билдирүү жазышуу жана башка шайкештештирүүгө байланыштуу колдонмолор ачылмайынча жаңыртылбай калышы мүмкүн.\n\nБатарея үнөмдөгүч түзмөгүңүз кубатталып жатканда автоматтык түрдө өчүп калат." + "Батареянын өмүрүн узартуу үчүн, кубатты үнөмдөө режими түзмөгүңүздүн ишин солгундатып, дирилдөө функциясын, жайгашкан жерди аныктоо кызматын жана дайындардын фондо өткөрүлүшүн чектеп коёт. Электрондук почта, билдирүү жазышуу сыяктуу шайкештириле турган дайындар колдонмо ачылганда гана жаңырат.\n\nБатареянын кубатын үнөмдөө режими түзмөгүңүз кубатталып жатканда автоматтык түрдө өчүп калат." "Трафиктин колдонулушун үнөмдөө режиминде айрым колдонмолор дайындарды фондо өткөрө алышпайт. Учурда сиз пайдаланып жаткан колдонмо дайындарды өткөрөт, бирок адаттагыдан азыраак өткөргөндүктөн, анын айрым функциялары башкача иштеши мүмкүн. Мисалы, сүрөттөр басылмайынча жүктөлбөйт." "Дайындарды үнөмдөгүч күйсүнбү?" "Күйгүзүү" @@ -1733,11 +1748,12 @@ "Убакытты текст киргизүү режиминде киргизиңиз." "Убакытты дубал саатынын режиминде киргизиңиз." "Автотолтуруу опциялары" + "Автотолтуруу функциясына сактап коюу" "Мазмундарды автотолтуруу мүмкүн эмес" - "%1$s кызматында сакталсынбы?" - "%1$s %2$s кызматында сакталсынбы?" - "%1$s менен %2$s %3$s кызматында сакталсынбы?" - "%1$s, %2$s жана %3$s %4$s кызматында сакталсынбы?" + "<b>%1$s</b> кызматында сакталсынбы?" + "%1$s <b>%2$s</b> кызматында сакталсынбы?" + "%1$s жана %2$s <b>%3$s</b> кызматында сакталсынбы?" + "%1$s, %2$s жана %3$s <b>%4$s</b> кызматында сакталсынбы?" "Сактоо" "Жок, рахмат" "сырсөз" diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index e57c851477803393c3cc674436c0379f9b5404b3..d162fe027238ede7490cc8cbfe5245012c9d54ca 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -99,6 +99,13 @@ "ຜູ້ໃຫ້ບໍລິການຂອງທ່ານໄດ້ລະງັບການນຳໃຊ້ການໂທສຽງ ແລະ ການໂທສຸກເສີນຢູ່ບ່ອນນີ້ໄວ້ຊົ່ວຄາວ" "Can’t reach network" "ເພື່ອປັບປຸງການຮັບສັນຍານ, ໃຫ້ລອງປ່ຽນປະເພດທີ່ເລືອກໄວ້ທີ່ ລະບົບ > ເຄືອຂ່າຍ ແລະ ອິນເຕີເນັດ > ເຄືອຂ່າຍມືຖື > ປະເພດເຄືອຂ່າຍທີ່ຕ້ອງການ." + "ການເຕືອນ" + "ການໂອນສາຍ" + "ໂໝດໂທກັບສຸກເສີນ" + "ການແຈ້ງເຕືອນອິນເຕີເນັດມືຖື" + "ຂໍ້ຄວາມ SMS" + "ຂໍ້ຄວາມສຽງ" + "ການ​ໂທ Wi-Fi" "ໂໝດ TTY ທີ່​ເພື່ອນ​ຂໍ​ນັ້ນ​ເຕັມ​ແລ້ວ" "ໂໝດ TTY ທີ່​ເພື່ອນ​ຂໍ HCO" "ໂໝດ TTY ທີ່​ເພື່ອນ​ຂໍ VCO" @@ -258,6 +265,16 @@ "ການເຕືອນ" "ເດໂມສຳລັບຮ້ານຂາຍ" "ການເຊື່ອມຕໍ່ USB" + + + + + + + + + + "Safe mode" "ລະບົບ Android" "ສະລັບໄປໂປຣໄຟລ໌ສ່ວນຕົວ" @@ -284,8 +301,6 @@ "ກວດກາເນື້ອຫາຂອງໜ້າຈໍທີ່ທ່ານກຳລັງມີປະຕິສຳພັນນຳ." "ເປີດໃຊ້ \"ການສຳຫຼວດໂດຍສຳພັດ\"" "ລາຍການທີ່ແຕະຈະຖືກເວົ້າອອກມາ ແລະ ສາມາດສຳຫຼວດໜ້າຈໍໄດ້ດ້ວຍທ່າທາງໄດ້." - "ເປີດການເຂົ້າເຖິງເວັບທີ່ມີປະສິດທິພາບຫຼາຍຂຶ້ນ" - "ສະຄຣິບອາດຖືກຕິດຕັ້ງ ເພື່ອເຮັດໃຫ້ເນື້ອຫາແອັບຯເຂົ້າເຖິງໄດ້ຫຼາຍຂຶ້ນ." "ຕິດຕາມ​ເບິ່ງ​ຂໍ້​ຄວາມ​ທີ່​ທ່ານ​ພິມ" "ຮວມທັງຂໍ້ມູນສ່ວນໂຕເຊັ່ນ: ເລກບັດເຄຣດິດ ແລະລະຫັດຜ່ານ." "ຄວບຄຸມການຂະຫຍາຍຈໍສະແດງຜົນ" @@ -1603,7 +1618,7 @@ "ຖືກຕິດຕັ້ງໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ" "ຖືກອັບໂຫລດໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ" "ຖືກລຶບອອກໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ" - "ເພື່ອ​ຊ່ວຍ​ເພີ່ມ​ອາ​ຍຸ​ແບັດ​ເຕີ​ຣີ, ຕົວ​ປະ​ຢັດ​ໄຟ​ແບັດ​ເຕີ​ຣີ​ຫຼຸດ​ປະ​ສິດ​ທິ​ພາບ​ການ​ເຮັດ​ວຽກ​ຂອງ​ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ​ລົງ ແລະ​ຈຳ​ກັດ​ການ​ສັ່ນ, ການ​ບໍ​ລິ​ການ​ຫາທີ່ຕັ້ງ, ແລະ​ຂໍ້​ມູນ​ພື້ນ​ຫຼັງ​ເກືອບ​ທັງ​ໝົດ. ອີ​ເມວ, ການ​ສົ່ງ​ຂໍ້​ຄວາມ, ແລະ​ແອັບອື່ນໆ​ທີ່ອາ​ໄສການ​ຊິງ​ຄ໌​ອາດ​ຈະ​ບໍ່​ອັບ​ເດດ ນອກ​ຈາກວ່າ​ທ່ານ​ເປີດ​ມັນ.\n\nຕົວ​ປະ​ຢັດ​ໄຟ​ແບັດ​ເຕີ​ຣີຈະ​ປິດ​ອັດ​ຕະ​ໂນ​ມັດ ເມື່ອ​ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ​ກຳ​ລັງ​ສາກຢູ່." + "ເພື່ອ​ຊ່ວຍ​ເພີ່ມ​ອາ​ຍຸ​ແບັດ​ເຕີ​ຣີ, ຕົວ​ປະ​ຢັດ​ໄຟ​ແບັດ​ເຕີ​ຣີ​ຫຼຸດ​ປະ​ສິດ​ທິ​ພາບ​ການ​ເຮັດ​ວຽກ​ຂອງ​ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ​ລົງ ແລະ​ຈຳ​ກັດ​ການ​ສັ່ນ, ການ​ບໍ​ລິ​ການ​ຫາທີ່ຕັ້ງ ແລະ ຂໍ້​ມູນ​ພື້ນ​ຫຼັງ​ເກືອບ​ທັງ​ໝົດ. ອີ​ເມວ, ການ​ສົ່ງ​ຂໍ້​ຄວາມ, ແລະ ແອັບອື່ນໆ​ທີ່ອາ​ໄສການ​ຊິ້ງຂໍ້ມູນ​ອາດ​ຈະ​ບໍ່​ອັບ​ເດດ ນອກ​ຈາກວ່າ​ທ່ານ​ເປີດ​ມັນ.\n\nຕົວ​ປະ​ຢັດ​ໄຟ​ແບັດ​ເຕີ​ຣີຈະ​ປິດ​ອັດ​ຕະ​ໂນ​ມັດເມື່ອ​ທ່ານສາກໄຟອຸ​ປະ​ກອນ​." "ເພື່ອຊ່ວຍຫຼຸດຜ່ອນການນຳໃຊ້ຂໍ້ມູນ, ຕົວປະຢັດຂໍ້ມູນຈະປ້ອງກັນບໍ່ໃຫ້ບາງແອັບສົ່ງ ຫຼື ຮັບຂໍ້ມູນໃນພື້ນຫຼັງ. ແອັບໃດໜຶ່ງທີ່ທ່ານກຳລັງໃຊ້ຢູ່ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນໄດ້ ແຕ່ອາດເຂົ້າເຖິງໄດ້ຖີ່ໜ້ອຍລົງ. ນີ້ອາດໝາຍຄວາມວ່າ ຮູບພາບຕ່າງໆອາດບໍ່ສະແດງຈົນກວ່າທ່ານຈະແຕະໃສ່ກ່ອນ." "ເປີດໃຊ້ຕົວປະຢັດຂໍ້ມູນບໍ?" "ເປີດໃຊ້" @@ -1732,11 +1747,12 @@ "ສະຫຼັບໄປໃຊ້ໂໝດປ້ອນຂໍ້ຄວາມສຳລັບການປ້ອນເວລາ." "ສະຫຼັບໄປໃຊ້ໂໝດໂມງສຳລັບການປ້ອນເວລາ." "ຕົວເລືອກການຕື່ມຂໍ້ມູນອັດຕະໂນມັດ" + "ບັນທຶກໄວ້ຕື່ມຂໍ້ມູນອັດຕະໂນມັດ" "ບໍ່ສາມາດຕື່ມຂໍ້ມູນເນື້ອຫາອັດຕະໂນມັດໄດ້" - "ບັນທຶກໄປໃສ່ %1$s ບໍ?" - "ບັນທຶກ %1$s ໄປໃສ່ %2$s ບໍ?" - "ບັນທຶກ %1$s, %2$s ໄປໃສ່ %3$s ບໍ?" - "ບັນທຶກ %1$s, %2$s, %3$s ໄປໃສ່ %4$s ບໍ?" + "ບັນທຶກໃສ່ <b>%1$s</b> ບໍ?" + "ບັນທຶກ %1$s ໃສ່ <b>%2$s</b> ບໍ?" + "ບັນທຶກ %1$s ແລະ %2$s ໃສ່ <b>%3$s</b> ບໍ?" + "ບັນທຶກ %1$s, %2$s ແລະ %3$s ໃສ່ <b>%4$s</b> ບໍ?" "ບັນທຶກ" "ບໍ່, ຂອບໃຈ" "​ລະ​ຫັດ​ຜ່ານ" diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index e98c66cfefc5bbb119721fd965e6e50637e37e15..0a62d62f6d2209aca2d809a9a52377b3342e5f79 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -101,6 +101,13 @@ "Jūsų operatorius laikinai sustabdė balso skambučius ir skambučius pagalbos numeriais šioje vietovėje" "Nepavyko pasiekti tinklo" "Kad pagerintumėte ryšį, pabandykite pakeisti tipą, pasirinktą skiltyje „Nustatymai“ > „Tinklas ir internetas“ > „Mobiliojo ryšio tinklai“ > „Pageidaujamas tinklo tipas“." + "Įspėjimai" + "Skambučio peradresavimas" + "Atskambinimo pagalbos numeriu režimas" + "Mobiliojo ryšio duomenų įspėjimai" + "SMS pranešimai" + "Balso pašto pranešimai" + "„Wi-Fi“ skambinimas" "Lygiavertis naudotojas pateikė užklausą dėl TTY režimo FULL" "Lygiavertis naudotojas pateikė užklausą dėl TTY režimo HCO" "Lygiavertis naudotojas pateikė užklausą dėl TTY režimo VCO" @@ -264,6 +271,16 @@ "Įspėjimai" "Demonstracinė versija mažmenininkams" "USB jungtis" + + + + + + + + + + "Saugos režimas" "„Android“ sistema" "Perjungti į asmeninį režimą" @@ -290,11 +307,9 @@ "Tikrinti lango, su kuriuo sąveikaujate, turinį." "Įjungti „Naršyti paliečiant“" "Paliesti elementai bus ištariami garsiai. Be to, ekrane gali būti naršoma naudojant gestus." - "Įjungti patobulintą žiniatinklio pasiekiamumą" - "Gali būti įdiegti scenarijai, kad būtų lengviau pasiekti programų turinį." "Stebėti jūsų įvedamą tekstą" "Įtraukiami asmeniniai duomenys, pavyzdžiui, kredito kortelių numeriai ir slaptažodžiai." - "Ekrano didinimo valdymas" + "Valdyti ekrano didinimą" "Valdykite ekrano mastelio keitimo lygį ir pozicijos nustatymą." "Veiksmai gestais" "Galima paliesti, perbraukti, suimti ir atlikti kitus veiksmus gestais." @@ -1647,7 +1662,7 @@ "Įdiegė administratorius" "Atnaujino administratorius" "Ištrynė administratorius" - "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." + "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." "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." "Įj. Duomenų taupymo priemonę?" "Įjungti" @@ -1794,11 +1809,12 @@ "Laiko įvestį pateikti perjungus į teksto įvesties režimą." "Laiko įvestį pateikti perjungus į laikrodžio režimą." "Automatinio pildymo parinktys" + "Išsaugoti Automatinio pildymo paslaugoje" "Turinio negalima pildyti automatiškai" - "Išsaugoti skiltyje „%1$s“?" - "Išsaugoti %1$s skiltyje „%2$s“?" - "Išsaugoti %1$s, %2$s sistemoje „%3$s“?" - "Išsaugoti %1$s, %2$s, %3$s sistemoje „%4$s“?" + "Išsaugoti sistemoje <b>%1$s</b>?" + "Išsaugoti %1$s sistemoje <b>%2$s</b>?" + "Išsaugoti %1$s ir %2$s sistemoje <b>%3$s</b>?" + "Išsaugoti %1$s, %2$s ir %3$s sistemoje <b>%4$s</b>?" "Išsaugoti" "Ne, ačiū" "slaptažodį" diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 4251a52b7ba952405193676e106ac548f25e8e25..3bcce6f5319cc63a320f76b61e3e2d34eb6fdcab 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -100,6 +100,13 @@ "Jūsu mobilo sakaru operators uz laiku apturēja balss un ārkārtas izsaukumus šajā atrašanās vietā." "Nevar sasniegt tīklu" "Lai uzlabotu uztveršanu, mainiet atlasīto veidu sadaļā Sistēma > Tīkls un internets > Mobilie tīkli > Ieteicamais tīkla veids." + "Brīdinājumi" + "Zvanu pāradresācija" + "Ārkārtas atzvana režīms" + "Mobilo datu brīdinājumi" + "Īsziņas" + "Balss pasta ziņojumi" + "Wi-Fi zvani" "Vienādranga ierīce pieprasīja teksta tālruņa režīmu FULL" "Vienādranga ierīce pieprasīja teksta tālruņa režīmu HCO" "Vienādranga ierīce pieprasīja teksta tālruņa režīmu VCO" @@ -261,6 +268,16 @@ "Brīdinājumi" "Demonstrācijas versija veikaliem" "USB savienojums" + + + + + + + + + + "Drošais režīms" "Android sistēma" "Pārslēgt personīgo profilu" @@ -287,11 +304,9 @@ "Skatīt tā loga saturu, ar kuru mijiedarbojaties." "Aktivizēt funkciju “Pārlūkot pieskaroties”." "Tiks izrunāti to vienumu nosaukumi, kuriem pieskarsieties, un ekrānu varēsiet pārlūkot ar žestiem." - "Ieslēgt uzlaboto tīmekļa pieejamību." - "Var tikt instalēti skripti, lai padarītu lietotņu saturu pieejamāku." "Skatīt ierakstīto tekstu." "Ietver personas datus, piemēram, kredītkartes numurus un paroles." - "Displeja palielinājuma kontrole" + "Kontrolēt displeja palielinājumu." "Kontrolējiet displeja tālummaiņas līmeni un pozicionēšanu." "Žestu izpilde" "Atbalsta pieskaršanos, vilkšanu, savilkšanu un citus žestus." @@ -1763,11 +1778,12 @@ "Lai ievadītu laiku, ieslēdziet teksta ievades režīmu." "Lai ievadītu laiku, ieslēdziet pulksteņa režīmu." "Automātiskās aizpildes opcijas" + "Saglabāt automātiskajai aizpildei" "Saturu nevar automātiski aizpildīt." - "Vai saglabāt pakalpojumā %1$s?" - "Vai saglabāt %1$s pakalpojumā %2$s?" - "Vai saglabāt informāciju (%1$s, %2$s) iezīmē %3$s?" - "Vai saglabāt informāciju (%1$s, %2$s, %3$s) iezīmē %4$s?" + "Vai saglabāt pakalpojumā <b>%1$s</b>?" + "Vai saglabāt vienumu “%1$s” pakalpojumā <b>%2$s</b>?" + "Vai saglabāt vienumus “%1$s” un “%2$s” pakalpojumā <b>%3$s</b>?" + "Vai saglabāt vienumus “%1$s”, “%2$s” un “%3$s” pakalpojumā <b>%4$s</b>?" "Saglabāt" "Nē, paldies" "paroli" diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 2fb9553a45f8e26250c94af4dfa3207404ad8ee5..b5e8c90b3bd5a6626c6a04f7ba93eef736f7fbff 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -99,6 +99,13 @@ "Вашиот оператор привремено ги суспендираше говорните и итните повици на локацијава" "Не може да се дојде до мрежата" "За подобрување на приемот, обидете се да го промените избраниот тип во: Систем > Мрежа и интернет > Мобилни мрежи > Претпочитан тип мрежа." + "Предупредувања" + "Проследување повик" + "Режим на итен повратен повик" + "Предупредувања за мобилен интернет" + "SMS-пораки" + "Пораки од говорна пошта" + "Повикување преку Wi-Fi" "Рамноправен уред го побара режимот на TTY „FULL“" "Рамноправен уред го побара режимот на TTY „HCO“" "Рамноправен уред го побара режимот на TTY „VCO“" @@ -258,6 +265,16 @@ "Предупредувања" "Демонстрација за малопродажба" "USB-врска" + + + + + + + + + + "Безбеден режим" "Систем Android" "Префрлете на личен профил" @@ -280,16 +297,14 @@ "упатува и управува со телефонски повици" "Телесни сензори" "пристапува до податоците од сензорите за виталните знаци" - "Врати содржина на прозорец" - "Провери ја содржината на прозорецот со кој се комуницира." + "Преземе содржина на прозорец" + "Ја следи содржината на прозорецот со кој се комуницира." "Вклучи „Истражувај со допир“" "Допрените ставки ќе се изговорат на глас и екранот може да се истражува со движења." - "Вклучи подобрена пристапност кон веб" - "За содржината на апликацијата да биде подостапна, може да се инсталираат скрипти." - "Набљудувај го напишаниот текст" + "Го следи напишаниот текст" "Опфаќа лични податоци како што се броеви на кредитни картички и лозинки." - "Контролирајте го зголемувањето на екранот" - "Контролирајте го нивото на зумирање и позиционирање на екранот." + "Го контролира зголемувањето на екранот" + "Го контролира нивото на зумирање и позиционирање на екранот." "Користете движења" "Може да допрете, повлечете, штипнете и да користите други движења." "Движења за отпечатоци" @@ -645,7 +660,7 @@ "Годишнина" "Други" "Приспособени" - "Почетна страница" + "Приватна е-пошта" "Работа" "Други" "Мобилен" @@ -995,9 +1010,9 @@ "Отвори со" "Отвори со %1$s" "Отвори" - "Уреди со" - "Уреди со %1$s" - "Уреди" + "Измени со" + "Измени со %1$s" + "Измени" "Сподели со" "Сподели со %1$s" "Сподели" @@ -1069,7 +1084,7 @@ "Процесот %1$s го надмина ограничувањето на меморијата на својот процес од %2$s. Достапна ви е слика од меморијата да ја споделите со неговиот програмер. Бидете внимателни: сликата од меморијата може да содржи кои било од вашите лични информации до кои апликацијата има пристап." "Избери дејство за текст" "Јачина на звук на ѕвонче" - "Јачина на звук на медиуми" + "Јачина на аудио/видео звук" "Се репродуцира преку Bluetooth" "Поставено ѕвонење на тивко" "Јачина на звук на дојдовен повик" @@ -1080,7 +1095,7 @@ "Јачина на звук на Bluetooth" "Јачина на звук на мелодија" "Јачина на звук на повик" - "Јачина на звук на медиуми" + "Јачина на аудио/видео звук" "Јачина на звук на известување" "Стандардна мелодија" "Стандардна (%1$s)" @@ -1358,7 +1373,7 @@ "УСБ-меморија" "%s УСБ-меморија" "УСБ меморија" - "Уреди" + "Измени" "Известување за потрошен сообраќај" "Допрете за употреба и поставки." "Постигна лимит за 2G-3G податоци" @@ -1735,11 +1750,12 @@ "Префрлете се на режимот за внесување текст за да внесете време." "Префрлете се на режимот за часовник за да внесете време." "Опции за автоматско пополнување" + "Зачувајте за автоматско пополнување" "Содржините не може автоматски да се пополнат" - "Да се зачува во %1$s?" - "Да се зачува %1$s во %2$s?" - "Да се зачуваат %1$s, %2$s во %3$s?" - "Да се зачуваат %1$s, %2$s, %3$s во %4$s?" + "Да се зачува во <b>%1$s</b>?" + "Да се зачува %1$s во <b>%2$s</b>?" + "Да се зачуваат %1$s и %2$s во <b>%3$s</b>?" + "Да се зачуваат %1$s, %2$s и %3$s во <b>%4$s</b>?" "Зачувај" "Не, благодарам" "лозинка" diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 8f80f1ad9c7df318631c8e115954be6d27335d1f..5dbb334526350375afeff244ef9ecfad45f4b565 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -99,6 +99,13 @@ "ഈ ലൊക്കേഷനിൽ നിങ്ങളുടെ കാരിയർ വോയ്സ് കോളുകളും അടിയന്തിര കോളുകളും തൽക്കാലം നിർത്തിവച്ചിരിക്കുകയാണ്" "നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റുചെയ്യാനാവുന്നില്ല" "സ്വീകരണം മെച്ചപ്പെടുത്തുന്നതിന് സിസ്റ്റം > നെറ്റ്‌വർക്കും ഇന്റർനെറ്റും > മൊബൈൽ നെറ്റ്‌വർക്കുകൾ > തിരഞ്ഞെടുത്ത നെറ്റ്‌വർക്ക് തരം എന്നതിൽ തിരഞ്ഞെടുത്തിരിക്കുന്ന തരം മാറ്റിക്കൊണ്ട് ശ്രമിച്ചുനോക്കുക." + "അലേർട്ടുകൾ" + "കോൾ ഫോർവേഡിംഗ്" + "അടിയന്തര കോൾബാക്ക് മോഡ്" + "മൊബൈൽ ഡാറ്റ അലേർട്ടുകൾ" + "SMS സന്ദേശങ്ങൾ" + "വോയ്‌സ്‌മെയിൽ സന്ദേശങ്ങൾ" + "വൈഫൈ കോളിംഗ്" "പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് \'ഫുൾ\'" "പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് HCO" "പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് VCO" @@ -258,6 +265,16 @@ "അലേർട്ടുകൾ" "റീട്ടെയിൽ ഡെമോ" "USB കണക്ഷൻ" + + + + + + + + + + "സുരക്ഷിത മോഡ്" "Android സിസ്റ്റം" "വ്യക്തിഗത പ്രൊഫൈലിലേക്ക് മാറുക" @@ -284,8 +301,6 @@ "നിങ്ങൾ സംവദിക്കുന്ന ഒരു വിൻഡോയുടെ ഉള്ളടക്കം പരിശോധിക്കുക." "സ്‌പർശനം വഴി പര്യവേക്ഷണം ചെയ്യുക ഓൺ ചെയ്യുക" "ടാപ്പുചെയ്ത ഇനങ്ങൾ ഉച്ചത്തിൽ പറയപ്പെടും, ജെസ്റ്ററുകൾ ഉപയോഗിച്ച് സ്‌ക്രീൻ അടുത്തറിയാവുന്നതാണ്." - "മെച്ചപ്പെടുത്തിയ വെബ് ഉപയോഗസഹായി ഓണാക്കുക" - "അപ്ലിക്കേഷൻ ഉള്ളടക്കം കൂടുതൽ ആക്‌സസ്സുചെയ്യാൻ കഴിയുന്നതാക്കാൻ സ്‌ക്രിപ്റ്റുകൾ ഇൻസ്റ്റാളുചെയ്യാനിടയുണ്ട്." "നിങ്ങൾ ടൈപ്പുചെയ്യുന്ന വാചകം നിരീക്ഷിക്കുക" "ക്രെഡിറ്റ് കാർഡ് നമ്പറുകളും പാസ്‌വേഡുകളും പോലുള്ള വ്യക്തിഗത ഡാറ്റ ഉൾപ്പെടുന്നു." "ഡിസ്പ്ലേ മാഗ്നിഫിക്കേഷൻ നിയന്ത്രിക്കുക" @@ -1121,7 +1136,7 @@ "ക്ഷണം അയച്ചു" "കണക്റ്റുചെയ്യാനുള്ള ക്ഷണം" "അയച്ചത്:" - "സ്വീകർത്താവ്:" + "ടു:" "ആവശ്യമായ പിൻ ടൈപ്പുചെയ്യുക:" "പിൻ:" "ടാബ്‌ലെറ്റ് %1$s എന്നതിൽ കണക്റ്റുചെയ്‌തിരിക്കുമ്പോൾ അത് താൽക്കാലികമായി Wi-Fi-യിൽ നിന്നും വിച്ഛേദിക്കപ്പെടും." @@ -1725,7 +1740,7 @@ "ഉല്‍‌പ്പാദനക്ഷമത" "ഉപകരണ സ്റ്റോറേജ്" "USB ഡീബഗ്ഗിംഗ്" - "മണിക്കൂര്‍" + "മണി." "മിനിറ്റ്" "സമയം സജ്ജീകരിക്കുക" "ശരിയായ സമയം ‌നൽകുക" @@ -1733,11 +1748,12 @@ "സമയം നൽകുന്നതിന് ടെക്സ്റ്റ് ഇൻപുട്ട് ‌മോ‌ഡിലേക്ക് ‌മാറുക." "‌സമയം നൽകുന്നതിന് ക്ലോക്ക് മോഡിലേക്ക് ‌മാറുക." "സ്വയമേവ പൂരിപ്പിക്കൽ ഓപ്ഷനുകൾ" + "സ്വയമേവ പൂരിപ്പിക്കാനായി സംരക്ഷിക്കുക" "ഉള്ളടക്കങ്ങൾ സ്വയമേവ പൂരിപ്പിക്കാൻ കഴിയില്ല" - "%1$s എന്നതിലേക്ക് സംരക്ഷിക്കണോ?" - "%1$s %2$s എന്നതിലേക്ക് സംരക്ഷിക്കണോ?" - "%1$s, %2$s എന്നിവ %3$s എന്നതിൽ സംരക്ഷിക്കട്ടെ?" - "%1$s, %2$s, %3$s എന്നിവ %4$s എന്നതിൽ സംരക്ഷിക്കട്ടെ?" + "<b>%1$s</b>എന്നതിലേക്ക് സംരക്ഷിക്കണോ?" + "%1$s എന്നതിനെ <b>%2$s</b>എന്നതിലേക്ക് സംരക്ഷിക്കണോ?" + "%1$s, %2$s എന്നിവ<b>%3$s</b>എന്നതിലേക്ക് സംരക്ഷിക്കണോ?" + "%1$s, %2$s, %3$s എന്നിവ<b>%4$s</b>എന്നതിലേക്ക് സംരക്ഷിക്കണോ?" "സംരക്ഷിക്കുക" "വേണ്ട, നന്ദി" "പാസ്‌വേഡ്" diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 88aacdae5da4ceaa7b6ee06e02d3fec5206a3101..765aa5d286fdd78b22020ef2df19549a2655e8c7 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -99,6 +99,13 @@ "Таны оператор компани энэ байршилд дуу хоолой, яаралтай дуудлагыг түр хаасан байна" "Сүлжээнд холбогдох боломжгүй байна" "Хүлээн авалтыг сайжруулахын тулд систем, сүлжээ, интернэт, мобайл сүлжээнд сонгосон сүлжээний төрлийг өөрчилнө үү." + "Сануулга" + "Дуудлага шилжүүлэх" + "Яаралтай дуудлага хийх горим" + "Мобайл дата сануулга" + "SMS мессеж" + "Дуут шуудангийн мессеж" + "Wi-Fi дуудлага" "Хандлагын цэгт хүсэлт тавьсан TTY Mode FULL" "Хандлагын цэгт хүсэлт тавьсан TTY Mode HCO" "Хандлагын цэгт хүсэлт тавьсан TTY Mode VCO" @@ -190,7 +197,7 @@ "Таблетын сонголтууд" "Телевиз сонголтууд" "Утасны сонголт" - "Чимээгүй горим" + "Дуугүй горим" "Утасгүй холбоог асаах" "Утасгүй сүлжээг унтраах уу" "Дэлгэцний түгжээ" @@ -231,7 +238,7 @@ Алдааны тайлангийн дэлгэцийн зургийг %d секундад авна. Алдааны тайлангийн дэлгэцийн зургийг %d секундад авна. - "Чимээгүй горим" + "Дуугүй горим" "Дуу хаагдсан" "Дуу асав" "Нислэгийн горим" @@ -258,6 +265,16 @@ "Сануулга" "Жижиглэнгийн жишээ" "USB холболт" + + + + + + + + + + "Аюулгүй горим" "Андройд систем" "\"Хувийн\" руу шилжих" @@ -284,8 +301,6 @@ "Таны харилцан үйлчлэх цонхны контентоос шалгах." "Хүрч танихыг асаах" "Товшсон зүйлсийг чангаар хэлэх ба дэлгэцийг дохио ашиглан таних боломжтой." - "Сайжруулсан вэб хандалтыг асаах" - "Апп контентод илүү хялбар хандуулахын тулд скриптыг суулгана." "Бичсэн текстээ ажиглах" "Кредит картын дугаар болон нууц үг зэрэг хувийн датаг агуулж байна." "Дэлгэцийн өсгөлтийг хянах" @@ -1730,11 +1745,12 @@ "Цагийг оруулахын тулд текст оруулах горимд шилжүүлнэ үү." "Цагийг оруулахын тулд цагийн горимд шилжүүлнэ үү." "Автоматаар бөглөх хэсгийн сонголт" + "Автоматаар бөглөх хэсэгт хадгалах" "Агуулгыг автоматаар бөглөх боломжгүй" - "%1$s-д хадгалах уу?" - "%1$s%2$s-д хадгалах уу?" - "%1$s, %2$s%3$s-д хадгалах уу?" - "%1$s, %2$s, %3$s%4$s-д хадгалах уу?" + "<b>%1$s</b>-д хадгалах уу?" + "%1$s-г <b>%2$s</b>-д хадгалах уу?" + "%1$s, %2$s-г <b>%3$s</b>-д хадгалах уу?" + "%1$s, %2$s, %3$s-г <b>%4$s</b>-д хадгалах уу?" "Хадгалах" "Үгүй, баярлалаа" "нууц үг" diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 43c18da7aa7a87dca29ea2a7b8ed3e7a4ad2e39c..41918282c6f56c2e9cb6536c92074335c717e293 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -99,6 +99,13 @@ "आपल्या वाहकाने या स्थानावर व्हॉइस आणि आणीबाणी कॉल तात्पुरते निलंबित केले आहेत" "नेटवर्कवर पोहोचूू शकत नाही" "रिसेप्शन सुधारण्यासाठी प्रणाली > नेटवर्क आणि इंटरनेट > मोबाइल नेटवर्क > प्राधान्य दिलेला नेटवर्क प्रकार येथे निवडलेला प्रकार बदलून पहा." + "अलर्ट" + "कॉल फॉरवर्डिंग" + "इमर्जन्सी कॉलबॅक मोड" + "मोबाइल डेटा अलर्ट" + "SMS संदेश" + "व्हॉइसमेल संदेश" + "Wi-Fi कॉलिंग" "समवयस्क व्यक्तीने TTY मोड पूर्ण ची विनंती केली" "समवयस्क व्यक्तीने TTY मोड HCO ची विनंती केली" "समवयस्क व्यक्तीने TTY मोड VCO ची विनंती केली" @@ -258,6 +265,16 @@ "सूचना" "किरकोळ डेमो" "USB कनेक्‍शन" + + + + + + + + + + "सुरक्षित मोड" "Android सिस्‍टम" "वैयक्तिकवर स्विच करा" @@ -284,8 +301,6 @@ "आपण परस्‍परसंवाद करीत असलेल्‍या विंडोची सामग्री तपासा." "स्पर्श करून अन्वेषण चालू करा" "टॅप केलेले आयटम मोठ्‍याने बोलले जातील आणि जेश्चरचा वापर करून स्क्रीन एक्सप्लोर केली जाऊ शकते." - "वर्धित केलेली वेब प्रवेशयोग्यता चालू करा" - "अ‍ॅप सामग्री अधिक प्रवेशयोग्‍य बनविण्‍यासाठी कदाचित स्‍क्रिप्‍ट स्‍थापित केली जाऊ शकतात." "आपण टाइप करता त्या मजकुराचे निरीक्षण करा" "क्रेडिट कार्ड नंबर आणि संकेतशब्‍द यासारखा वैयक्तिक डेटा समाविष्‍ट करते." "प्रदर्शन विस्तृतीकरण नियंत्रित करा" @@ -443,9 +458,9 @@ "वाय-फाय वरून कनेक्ट करा आणि डिस्कनेक्ट करा" "वाय-फाय प्रवेश बिंदूंवर कनेक्ट करण्यासाठी आणि त्यावरून डिस्कनेक्ट करण्यासाठी आणि वाय-फाय नेटवर्कसाठी डिव्हाइस कॉन्फिगरेशनमध्ये बदल करण्यासाठी अॅप ला अनुमती देते." "वाय-फाय मल्‍टिकास्‍ट रिसेप्‍शनला अनुमती द्या" - "मल्टिकास्ट पत्ते वापरून फक्त आपल्या टॅब्लेटवर नाही, तर वाय-फाय नेटवर्कवरील सर्व डिव्हाइसेसवर पाठविलेले पॅकेट प्राप्त करण्यासाठी अॅप ला अनुमती देते. हे गैर-मल्टिकास्ट मोडपेक्षा अधिक उर्जा वापरते." + "मल्टिकास्ट पत्ते वापरून फक्त आपल्या टॅब्लेटवर नाही, तर वाय-फाय नेटवर्कवरील सर्व डिव्हाइसेसवर पाठविलेले पॅकेट प्राप्त करण्यासाठी अॅप ला अनुमती देते. हे गैर-मल्टिकास्ट मोडपेक्षा अधिक पॉवर वापरते." "केवळ आपला टीव्ही न वापरता, एकाधिक पत्ते वापरून एका वाय-फाय नेटवकवरील सर्व डिव्हाइसवर पाठविलेली पॅकेट प्राप्त करण्यासाठी अॅपला अनुमती देते." - "मल्टिकास्ट पत्ते वापरून फक्त आपल्या फोनवर नाही, तर वाय-फाय नेटवर्कवरील सर्व डिव्हाइसेसवर पाठविलेले पॅकेट प्राप्त करण्यासाठी अॅप ला अनुमती देते. हे गैर-मल्टिकास्ट मोडपेक्षा अधिक उर्जा वापरते." + "मल्टिकास्ट पत्ते वापरून फक्त आपल्या फोनवर नाही, तर वाय-फाय नेटवर्कवरील सर्व डिव्हाइसेसवर पाठविलेले पॅकेट प्राप्त करण्यासाठी अॅप ला अनुमती देते. हे गैर-मल्टिकास्ट मोडपेक्षा अधिक पॉवर वापरते." "ब्लूटुथ सेटिंग्जवर प्रवेश करा" "स्थानिक ब्लूटुथ टॅबलेट कॉन्फिगर करण्याकरिता आणि दूरस्थ डिव्हाइसेस शोधण्यासाठी आणि त्यासह जोडण्यासाठी अॅप ला अनुमती देते." "स्थानिक ब्लूटुथ टीव्ही कॉन्फिगर करण्यासाठी आणि दूरस्थ डिव्हाइसेससह शोधण्यासाठी आणि जोडण्यासाठी अॅपला अनुमती देते." @@ -1604,7 +1619,7 @@ "आपल्या प्रशासकाने स्थापित केले" "आपल्या प्रशासकाने अद्यतनित केले" "आपल्या प्रशासकाने हटवले" - "बॅटरीचे आयुष्य सुधारित करण्‍यात मदत करण्यासाठी, बॅटरी बचतकर्ता आपल्या डिव्हाइसचे कार्यप्रदर्शन कमी करतो आणि कंपन, स्थान सेवा आणि बराच पार्श्वभूमी डेटा मर्यादित करतो. संकालनावर अवलंबून असणारे ईमेल, संदेशन आणि इतर अ‍ॅप्स आपण उघडल्याशिवाय अद्यतनित होऊ शकत नाहीत.\n\nआपले डिव्हाइस चार्ज होत असते तेव्हा बॅटरी बचतकर्ता स्वयंचलितपणे बंद होतो." + "बॅटरी लाइफ सुधारित करण्‍यासाठी, बॅटरी बचतकर्ता आपल्या डिव्हाइसचे कार्यप्रदर्शन कमी करतो आणि कंपन, स्थान सेवा आणि बराच पार्श्वभूमी डेटा मर्यादित करतो. संकालनावर अवलंबून असणारे ईमेल, संदेशन आणि इतर अ‍ॅप्स आपण उघडल्याशिवाय अद्यतनित होऊ शकत नाहीत.\n\nआपले डिव्हाइस चार्ज होत असते तेव्हा बॅटरी बचतकर्ता स्वयंचलितपणे बंद होतो." "डेटा वापर कमी करण्यात मदत करण्यासाठी, डेटा सर्व्हर काही अॅप्सना पार्श्वभूमीमध्ये डेटा पाठविण्यास किंवा प्राप्त करण्यास प्रतिबंधित करतो. आपण सध्या वापरत असलेला अॅप डेटामध्ये प्रवेश करू शकतो परंतु तसे तो खूप कमी वेळा करू शकतो. याचा अर्थ, उदाहरणार्थ, आपण प्रतिमा टॅप करेपर्यंत त्या प्रदर्शित करणार नाहीत असा असू शकतो." "डेटा बचतकर्ता चालू करायचा?" "चालू करा" @@ -1733,11 +1748,12 @@ "वेळ इनपुटसाठी मजकूर इनपुट मोडवर स्विच करा." "वेळ इनपुटसाठी घड्याळ मोडवर स्विच करा." "स्वयं-भरण पर्याय" + "स्वत: भरण्यासाठी सेव्ह करा" "सामग्रींची स्‍वयं-भरणा करता येणार नाही" - "%1$s वर जतन करायचे?" - "%2$s वर %1$s जतन करायचे?" - "%3$s वर %1$s, %2$s जतन करायचे का?" - "%4$s वर %1$s, %2$s, %3$s जतन करायचे का?" + "<b>%1$s</b> मध्ये सेव्ह करायचे का?" + "<b>%2$s</b>मध्ये %1$s सेव्ह करायची?" + "<b>%3$s</b>मध्ये %1$s आणि %2$s सेव्ह करायची?" + "<b>%4$s</b>मध्ये %1$s, %2$s आणि %3$s सेव्ह करायची?" "जतन करा" "नाही धन्यवाद" "संकेतशब्द" diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index e414985cad3573c15e093e7dbf811878d03731de..d4cc2d339862c9e8629edc87b1a5c9802cd1f589 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -99,6 +99,13 @@ "Pembawa anda telah menggantung panggilan suara dan kecemasan di lokasi ini untuk sementara waktu" "Tidak dapat mencapai rangkaian" "Untuk memperbaik penerimaan, cuba tukar jenis rangkaian yang dipilih di Sistem > Rangkaian & Internet > Rangkaian mudah alih > Jenis rangkaian pilihan." + "Makluman" + "Pemajuan panggilan" + "Mod paggil balik kecemasan" + "Makluman data mudah alih" + "Mesej SMS" + "Mesej mel suara" + "Panggilan Wi-Fi" "Rakan meminta Mod TTY PENUH" "Rakan meminta Mod TTY HCO" "Rakan meminta Mod TTY VCO" @@ -258,6 +265,16 @@ "Makluman" "Tunjuk cara runcit" "Sambungan USB" + + + + + + + + + + "Mod selamat" "Sistem Android" "Beralih kepada Peribadi" @@ -284,8 +301,6 @@ "Periksa kandungan tetingkap yang berinteraksi dengan anda." "Hidupkan Jelajah melalui Sentuhan" "Item yang diketik akan dituturkan dengan lantang dan skrin boleh dijelajah menggunakan gerak isyarat." - "Hidupkan kebolehcapaian web dipertingkat" - "Skrip boleh dipasang untuk menjadikan kandungan apl lebih mudah diakses." "Perhatikan teks yang anda taip" "Termasuk data peribadi seperti nombor kad kredit dan kata laluan." "Kawal pembesaran paparan" @@ -1732,11 +1747,12 @@ "Beralih ke mod input teks untuk input masa." "Beralih ke mod jam untuk input masa." "Pilihan autolengkap" + "Simpan untuk Autolengkap" "Kandungan tidak boleh dilengkapkan secara automatik" - "Simpan ke %1$s?" - "Simpan %1$s ke %2$s?" - "Simpan %1$s, %2$s ke %3$s?" - "Simpan %1$s, %2$s, %3$s ke %4$s?" + "Simpan ke <b>%1$s</b>?" + "Simpan %1$s ke <b>%2$s</b>?" + "Simpan %1$s dan %2$s ke <b>%3$s</b>?" + "Simpan %1$s, %2$s dan %3$s ke <b>%4$s</b>?" "Simpan" "Tidak, terima kasih" "kata laluan" diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index dd71d435a8075593b3e61e40f054e2b34f784170..1d89730ba0aa6f960048aca1e5aa33bb9dbd9720 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -21,7 +21,7 @@ "B" - "ကီလိုဘိုက်" + "kB" "MB" "GB" "TB" @@ -99,6 +99,13 @@ "သင်၏ ဝန်ဆောင်မှုပေးသူသည် ဤတည်နေရာအတွက် ဖုန်းခေါ်ဆိုမှု နှင့် အရေးပေါ်ခေါ်ဆိုမှုများကို ခေတ္တရပ်ဆိုင်းထားပါသည်" "ကွန်ရက်ကို ချိတ်ဆက်၍မရပါ" "လိုင်းဖမ်းယူမှု ကောင်းမွန်စေရန် စနစ် > ကွန်ရက်နှင့် အင်တာနက် > မိုဘိုင်းကွန်ရက်များ > အသုံးပြုလိုသည့် ကွန်ရက်အမျိုးအစားတွင် ရွေးချယ်ထားသည့် အမျိုးအစားကို ပြောင်းကြည့်ပါ။" + "သတိပေးချက်များ" + "အဝင်ခေါ်ဆိုမှုအား ထပ်ဆင့်ပို့ခြင်း" + "အရေးပေါ် ပြန်လည်ခေါ်ဆိုနိုင်သောမုဒ်" + "မိုဘိုင်းဒေတာ သတိပေးချက်များ" + "SMS မက်ဆေ့ဂျ်များ" + "အသံမေးလ် မက်ဆေ့ဂျ်များ" + "Wi-Fi ခေါ်ဆိုမှု" "အခြားစက်မှ TTY မုဒ် FULL ပြုရန် တောင်းဆို၏" "အခြားစက်မှ TTY မုဒ် HCO ပြုရန် တောင်းဆို၏" "TTY မုဒ် VCO ပြုရန် အခြားစက်မှ တောင်းဆို၏" @@ -258,6 +265,16 @@ "သတိပေးချက်များ" "လက်လီအရောင်းဆိုင် သရုပ်ပြမှု" "USB ချိတ်ဆက်မှု" + + + + + + + + + + "အန္တရာယ်ကင်းမှု စနစ်(Safe mode)" "Android စနစ်" "ကိုယ်ပိုင်သီးသန့်အဖြစ် ပြောင်းပါ" @@ -265,7 +282,7 @@ "အဆက်အသွယ်များ" "သင့် အဆက်အသွယ်များအား ဝင်ရောက်သုံးရန်" "တည်နေရာ" - "ဤစက်ပစ္စည်း၏ တည်နေရာကို ရယူ" + "ဤစက်ပစ္စည်း၏ တည်နေရာကို ရယူရန်" "ပြက္ခဒိန်" "သင့်ပြက္ခဒိန်အား ဝင်ရောက်သုံးရန်" "စာတိုစနစ်" @@ -280,15 +297,13 @@ "ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ရန်နှင့် စီမံရန်" "ခန္ဓာကိုယ် အာရုံခံကိရိယာများ" "သင်၏ အဓိကကျသော လက္ခဏာများအကြောင်း အာရုံခံကိရိယာဒေတာကို ရယူသုံးစွဲရန်" - "ဝင်းဒိုးမှာပါရှိသည်များကို ထုတ်ယူခြင်း" - "သင် အပြန်အလှန်လုပ်နေသော ဝင်းဒိုးမှာပါရှိသည်များကို သေချာစွာ ကြည့်ရှုစစ်ဆေးပါ" - "ထိတို့ခြင်းဖြင့် ရှာဖွေပေးနိုင်တာကို ဖွင့်လိုက်ပါ" + "ဝင်းဒိုးတွင် ပါရှိသည်များကို ပြန်လည်ရယူရန်" + "သင်အသုံးပြုနေသော ဝင်းဒိုးတွင် ပါရှိသည်များကို ကြည့်ရှုစစ်ဆေးသည်။" + "တို့ထိခြင်းဖြင့် ရှာဖွေမှုကို ဖွင့်ရန်" "တို့လိုက်သည့်အရာများကို အသံထွက်ဖတ်ပေးပါလိမ့်မည်။ လက်ဟန်အမူအရာများကို အသုံးပြု၍ မျက်နှာပြင်ကို လေ့လာနိုင်ပါသည်။" - "ပိုမိုကောင်းမွန်သော ဝဘ်ရယူသုံးစွဲနိုင်မှုကို ဖွင့်ရန်" - "အပလီကေးရှင်းကို ပိုမိုပြည့်စုံစေရန် စကရစ်များကို သွင်းနိုင်ပါတယ်" - "ရိုက်သောစာများကို သေချာစွာ စစ်ဆေးပါ" - "အရေးကြီးသော ကိုယ်ရေးအချက်အလက်များဖြစ်တဲ့ ခရက်ဒစ်ကဒ်နံပါတ်များနှင့် စကားဝှက်များ ပါဝင်ပါတယ်." - "မျက်နှာပြင် ချဲ့ခြင်းကို ထိန်းချုပ်ပါ" + "ရိုက်သောစာများကို စောင့်ကြည့်ရန်" + "ကိုယ်ရေးအချက်အလက်များဖြစ်သော ခရက်ဒစ်ကဒ်နံပါတ်နှင့် စကားဝှက်များ ပါဝင်သည်။" + "မျက်နှာပြင် ချဲ့ခြင်းကို ထိန်းချုပ်ရန်" "မျက်နှာပြင် ဇူးမ်အရွယ်နှင့် နေရာချထားခြင်းကို ထိန်းချုပ်ပါ။" "လက်ဟန်များ အသုံးပြုပါ" "တို့ခြင်း၊ ပွတ်ဆွဲခြင်း၊ နှင့် အခြား လက်ဟန်များကို အသုံးပြုနိုင်ပါသည်။" @@ -579,7 +594,7 @@ "ပင်မစာမျက်နှာ" "မိုဘိုင်း" - "အလုပ်အကိုင်" + "အလုပ်" "အလုပ်ဖက်စ်" "အိမ်ဖက်စ်" "ပေဂျာ" @@ -588,24 +603,24 @@ "ပင်မစာမျက်နှာ" - "အလုပ်အကိုင်" + "အလုပ်" "တခြား" "မိမိစိတ်ကြိုက်" "ပင်မစာမျက်နှာ" - "အလုပ်အကိုင်" + "အလုပ်" "တခြား" "မိမိစိတ်ကြိုက်" "ပင်မစာမျက်နှာ" - "အလုပ်အကိုင်" + "အလုပ်" "တခြား" "မိမိစိတ်ကြိုက်" - "အလုပ်အကိုင်" + "အလုပ်" "တခြား" "မိမိစိတ်ကြိုက်" @@ -622,7 +637,7 @@ "မိမိစိတ်ကြိုက်" "အိမ်" "မိုဘိုင်း" - "အလုပ်အကိုင်" + "အလုပ်" "အလုပ်ဖက်စ်" "အိမ်ဖက်စ်" "ပေဂျာ" @@ -645,17 +660,17 @@ "အထိမ်းအမှတ်" "တခြား" "မိမိစိတ်ကြိုက်" - "ပင်မစာမျက်နှာ" + "အိမ်" "အလုပ်" "တခြား" "မိုဘိုင်း" "မိမိစိတ်ကြိုက်" "ပင်မစာမျက်နှာ" - "အလုပ်အကိုင်" + "အလုပ်" "တခြား" "မိမိစိတ်ကြိုက်" "ပင်မစာမျက်နှာ" - "အလုပ်အကိုင်" + "အလုပ်" "တခြား" "မိမိစိတ်ကြိုက်" "AIM" @@ -667,7 +682,7 @@ "ICQ" "Jabber" "NetMeeting" - "အလုပ်အကိုင်" + "အလုပ်" "တခြား" "မိမိစိတ်ကြိုက်" "မိမိစိတ်ကြိုက်" @@ -687,7 +702,7 @@ "အိမ်ထောင်ဖက်" "မိမိစိတ်ကြိုက်" "ပင်မစာမျက်နှာ" - "အလုပ်အကိုင်" + "အလုပ်" "တခြား" "ဤအဆက်အသွယ်အား ကြည့်ရှုရန် အပလီကေးရှင်းမတွေ့ပါ" "PIN ကုဒ် ရိုက်ထည့်ပါ" @@ -751,7 +766,7 @@ "အကြိမ်ရေ များစွာ ပုံဆွဲသော့ဖွင့်ရန် ကြိုးစားခြင်း" "သော့ဖွင့်ရန် Google အကောင့်ဖြင့် ဝင်ပါ" "သုံးစွဲသူ အမှတ် (အီးမေးလ်)" - "လျို့ဝှက် နံပါတ်" + "စကားဝှက်" "ဝင်ရန်" "အသုံးပြုသူအမည် သို့မဟုတ် လျို့ဝှက် နံပါတ် မှားယွင်းနေသည်" "သုံးစွဲသူ အမည် သို့ စကားဝှင်ကို မေ့နေပါသလား။ \n""google.com/accounts/recovery"" ကို သွားရောက်ပါ။" @@ -838,7 +853,7 @@ "ဤလျှို့ဝှက်စကားဝှက်အား ဘရောင်ဇာကိုမှတ်ခိုင်းမည်လား" "ယခုမလုပ်ပါ" "မှတ်ထားရန်" - "ဘယ်တော့မှ" + "လုံးဝ မလုပ်ပါ" "သင့်ဆီမှာ ဒီစာမျက်နှာကို ဖွင့်ရန် ခွင့်ပြုချက် မရှိပါ။" "clipboardထံ စာသားအားကူးယူမည်" "နောက်ထပ်" @@ -1604,7 +1619,7 @@ "သင်၏ စီမံခန့်ခွဲသူက ထည့်သွင်းထားသည်" "သင်၏ စီမံခန့်ခွဲသူက အပ်ဒိတ်လုပ်ထားသည်" "သင်၏ စီမံခန့်ခွဲသူက ဖျက်လိုက်ပါပြီ" - "ဘက်ထရီသက်တမ်း ကြာရှည်ခံရန်၊ ဘက်ထရီအားထိန်းသည် သင့်ကိရိယာ၏ ဆောင်ရွက်ချက်ကို လျှော့ပေးပြီး တုန်ခါမှု၊ တည်နေရာဝန်ဆောင်မှုများနှင့်၊ နောက်ခံဒေတာအများစုကို ကန့်သတ်ပေး၏။ စင့်လုပ်ပေးရလေ့ရှိသည့် အီးမေးလ်၊ စာပို့ခြင်းနှင့်၊ အခြားအပလီကေးရှင်းများကို ၎င်းတို့အား သင် ဖွင့်မှသာ အပ်ဒိတ်လုပ်မည်ဖြစ်၏။ \n\n ကိရိယာအား အားသွင်းနေစဉ် ဘက်ထရီအားထိန်းအား အလိုအလျောက် ပိတ်ထားသည်။" + "ဘက်ထရီသက်တမ်း ကြာရှည်ခံရန် ဘက်ထရီအားထိန်းသည် သင့်ကိရိယာ၏ ဆောင်ရွက်ချက်ကိုလျှော့ပေးပြီး တုန်ခါမှု၊ တည်နေရာဝန်ဆောင်မှုများနှင့် နောက်ခံဒေတာအများစုကို ကန့်သတ်ပေး၏။ စင့်ခ်လုပ်ပေးရလေ့ရှိသည့် အီးမေးလ်၊ စာပို့ခြင်းနှင့် အခြားအပလီကေးရှင်းများကို ၎င်းတို့အား သင် ဖွင့်မှသာ အပ်ဒိတ်လုပ်မည်ဖြစ်၏။ \n\n ကိရိယာအား အားသွင်းနေစဉ် ဘက်ထရီအားထိန်းကို အလိုအလျောက် ပိတ်ထားသည်။" "ဒေတာအသုံးလျှော့ချနိုင်ရန် အက်ပ်များကို နောက်ခံတွင် ဒေတာပို့ခြင်းနှင့် လက်ခံခြင်းမရှိစေရန် ဒေတာချွေတာမှုစနစ်က တားဆီးထားပါသည်။ ယခုအက်ပ်ဖြင့် ဒေတာအသုံးပြုနိုင်သော်လည်း အကြိမ်လျှော့၍သုံးရပါမည်။ ဥပမာ၊ သင် မတို့မချင်း ပုံများပေါ်လာမည် မဟုတ်ပါ။" "ဒေတာအသုံးပြုမှု ချွေတာမှုစနစ်ကို ဖွင့်မလား။" "ဖွင့်ပါ" @@ -1729,15 +1744,16 @@ "မိ​နစ်​" "အချိန်သတ်မှတ်ရန်" "မှန်ကန်သည့် အမည်တစ်ခု ထည့်ရန်" - "အချိန်ကို ရိုက်ရန်" + "အချိန်ကို ထည့်ရန်" "အချိန်ထည့်သွင်းရန် စာသားထည့်သွင်းမှုမုဒ်သို့ ပြောင်းပါ။" "အချိန်ထည့်သွင်းမှုအတွက် နာရီမုဒ်သို့ ပြောင်းပါ။" "အော်တိုဖြည့် ရွေးချယ်စရာများ" + "အော်တိုဖြည့်ရန်အတွက် သိမ်းပါ" "အကြောင်းအရာများကို အော်တိုဖြည့်၍မရပါ" - "%1$s သို့ သိမ်းဆည်းလိုပါသလား။" - "%1$s ကို %2$s သို့ သိမ်းဆည်းလိုပါသလား။" - "%1$s%2$s ကို %3$s သို့ သိမ်းဆည်းလိုပါသလား။" - "%1$s%2$s%3$s ကို %4$s သို့ သိမ်းဆည်းလိုပါသလား။" + "<b>%1$s</b> တွင် သိမ်းဆည်းလိုပါသလား။" + "%1$s ကို <b>%2$s</b> တွင် သိမ်းဆည်းလိုပါသလား။" + "%1$s နှင့် %2$s ကို <b>%3$s</b> တွင် သိမ်းဆည်းလိုပါသလား။" + "%1$s%2$s နှင့် %3$s ကို <b>%4$s</b> တွင် သိမ်းဆည်းလိုပါသလား။" "သိမ်းရန်" "မလိုပါ" "စကားဝှက်" diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 9c638ec61f7253a02074289f7b26fc15e9db20c7..ab32ff8f8ea263d69923fcbf40e3091376dfa7a3 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -99,6 +99,13 @@ "Operatøren din har midlertidig suspendert tale- og nødanrop på dette stedet" "Får ikke kontakt med nettverket" "For å forbedre signalet, prøv å endre valgt nettverkstype i System > Nettverk og Internett > Mobilnettverk > Foretrukket nettverkstype." + "Varsler" + "Viderekobling" + "Modusen nødsamtale-tilbakeringing" + "Varsler for mobildata" + "SMS-meldinger" + "Talepostmeldinger" + "Wi-Fi-anrop" "Motpart ba om TTY-modus FULL" "Motpart ba om TTY-modus HCO" "Motpart ba om TTY-modus VCO" @@ -258,6 +265,16 @@ "Varsler" "Butikkdemo" "USB-tilkobling" + + + + + + + + + + "Sikkermodus" "Android-system" "Bytt til den personlige profilen" @@ -281,15 +298,13 @@ "Kroppssensorer" "få tilgang til sensordata om de vitale tegnene dine" "hente innhold i vinduer" - "Den analyserer innholdet i vinduer du samhandler med." + "Appen analyserer innholdet i vinduer du samhandler med." "slå på berøringsutforsking" "Elementer du trykker på, leses høyt, og skjermen kan utforskes ved bruk av bevegelser." - "slå på forbedret nettilgjengelighet" - "Skript kan installeres for å gjøre appinnhold mer tilgjengelig." "observere teksten du skriver inn" "Dette omfatter personlige data, som kredittkortnumre og passord." - "Kontrollér forstørrelse for skjermen" - "Kontrollér zoomenivået og plasseringen for skjermen." + "Styre skjermforstørrelsen" + "Appen kan styre zoomnivået og plassering på skjermen." "Gjøre bevegelser" "Kan trykke, sveipe, klype og gjøre andre bevegelser." "Bevegelser på fingeravtrykkssensor" @@ -712,7 +727,7 @@ "Prøv på nytt" "Lås opp for å få alle funksjoner og data" "Du har overskredet grensen for opplåsingsforsøk med Ansiktslås" - "SIM-kortet mangler" + "SIM-kort mangler" "Nettbrettet mangler SIM-kort." "Det er ikke noe SIM-kort i TV-en." "Ikke noe SIM-kort i telefonen." @@ -1603,7 +1618,7 @@ "Installert av administratoren din" "Oppdatert av administratoren din" "Slettet av administratoren din" - "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." + "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." "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." "Vil du slå på Datasparing?" "Slå på" @@ -1726,17 +1741,18 @@ "USB-feilsøking" "time" "minutt" - "Still inn klokkeslett" + "Still klokken" "Angi et gyldig klokkeslett" - "Skriv inn klokkeslett" + "Skriv hva klokken er" "Bytt til tekstinndatamodus for tidsinndata." "Bytt til klokkemodus for tidsinndata." "Alternativer for autofyll" + "Lagre for autofyll" "Innhold kan ikke fylles ut automatisk" - "Vil du lagre i %1$s?" - "Vil du lagre %1$s i %2$s?" - "Vil du lagre %1$s og %2$s til %3$s?" - "Vil du lagre %1$s, %2$s og %3$s til %4$s?" + "Vil du lagre i <b>%1$s</b>?" + "Vil du lagre %1$s i <b>%2$s</b>?" + "Vil du lagre %1$s og %2$s i <b>%3$s</b>?" + "Vil du lagre %1$s, %2$s og %3$s i <b>%4$s</b>?" "Lagre" "Nei takk" "passord" diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 86c18d6ac7dbb366c4009b0cc669e73ffc5f5ed1..33466bcaa2f26b80c413c8946dbe1222ee166129 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -99,6 +99,13 @@ "तपाईंको सेवा प्रदायकले अस्थायी रूपमा यस स्थानमा भ्वाइस तथा आपतकालीन कलहरू निलम्बित गरेको छ" "नेटवर्कमाथि पहुँच राख्न सकिँदैन" "रिसेप्सनमा सुधार गर्न, प्रणाली > नेटवर्क र इन्टरनेट > मोबाइल नेटवर्कहरू > रुचाइएको नेटवर्कको प्रकार मा गएर चयन गरिएको प्रकार परिवर्तन गरी हेर्नुहोस्।" + "अलर्टहरू" + "कल फर्वार्ड गर्ने सेवा" + "आपतकालीन कलब्याक मोड" + "मोबाइल डेटाका अलर्टहरू" + "SMS सन्देशहरू" + "भ्वाइस मेल सन्देशहरू" + "Wi-Fi कल" "सहकर्मी अनुरोध गरियो। TTY मोड पूर्ण" "सहकर्मी अनुरोध गरियो। TTY मोड HCO" "सहकर्मी अनुरोध गरियो। TTY मोड VCO" @@ -258,6 +265,16 @@ "अलर्टहरू" "खुद्रा बिक्री सम्बन्धी डेमो" "USB जडान" + + + + + + + + + + "सुरक्षित मोड" "एन्ड्रोइड प्रणाली" "व्यक्तिगत प्रोफाइलमा स्विच गर्नुहोस्" @@ -265,7 +282,7 @@ "सम्पर्कहरू" "तपाईँको सम्पर्कमाथि पहुँच गर्नुहोस्" "स्थान" - "यस यन्त्रको स्थानमाथि पहुँच गर्नुहोस्" + "यस यन्त्रको स्थानमाथि पहुँच" "पात्रो" "तपाईंको पात्रोमाथि पहुँच गर्नुहोस्" "SMS" @@ -284,8 +301,6 @@ "तपाईँको अन्तरक्रिया भइरहेको विन्डोको सामग्रीको निरीक्षण गर्नुहोस्।" "छोएर गरिने खोजलाई सुचारु गर्नुहोस्" "ट्याप गरिएका वस्तुहरू चर्को स्वरमा बोलिने छन् र इसाराहरूको प्रयोग गरेर स्क्रिनमा अन्वेषण गर्न सकिन्छ।" - "उच्च वेब पहुँचलाई सुचारु गर्नुहोस्" - "अनुप्रयोगको सामग्रीलाई थप पहुँचयोग्य बनाउन लिपिहरू स्थापना गर्न सक्नु हुन्छ।" "आफुले टाइप गरेको पाठको निरीक्षण गर्नुहोस्" "व्यक्तिगत डेटा जस्तै क्रेडिट कार्ड नम्बरहरू र पासवर्डहरू समावेश गर्दछ।" "प्रदर्शन आवर्धन नियन्त्रण गर्नुहोस्" @@ -1283,7 +1298,7 @@ "सेट अप गर्न ट्याप गर्नुहोस्" "फाइल छान्नुहोस्" "कुनै फाइल छानिएको छैन" - "पुनःसेट गर्नु" + "रिसेट गर्नुहोस्" "पेस गर्नुहोस्" "कार मोड सक्षम पारियो।" "कार मोडबाट बाहिर निस्कन ट्याप गर्नुहोस्।" @@ -1738,11 +1753,12 @@ "समय इनपुट गर्न पाठ इनपुट मोडमा स्विच गर्नुहोस्।" "समय इनपुट गर्न घडी मोडमा स्विच गर्नुहोस्।" "स्वतः भरणका विकल्पहरू" + "स्वत: भरणका लागि सुरक्षित गर्नुहोस्‌" "सामग्रीहरूलाई स्वत: भरण गर्न मिल्दैन" - "%1$s मा सुरक्षित गर्ने हो?" - "%1$s लाई %2$s मा सुरक्षित गर्ने हो?" - "%1$s, %2$s लाई %3$s मा सुरक्षित गर्ने हो?" - "%1$s, %2$s, %3$s लाई %4$s मा सुरक्षित गर्ने हो?" + "<b>%1$s</b> मा सुरक्षित गर्ने हो?" + "%1$s लाई <b>%2$s</b> मा सुरक्षित गर्ने हो?" + "%1$s%2$s लाई <b>%3$s</b> मा सुरक्षित गर्ने हो?" + "%1$s, %2$s%3$s लाई to <b>%4$s</b> मा सुरक्षित गर्ने हो?" "सुरक्षित गर्नुहोस्" "पर्दैन, धन्यवाद" "पासवर्ड" diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index af8c0a296e8b52668ad8d29a024f774db9903841..c82219c01ceeee2ffd9ab79bd4d64de8b590737e 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -59,8 +59,8 @@ "De pincodes die je hebt ingevoerd, komen niet overeen." "Voer een pincode van 4 tot 8 cijfers in." "Typ een pukcode die 8 cijfers of langer is." - "Je SIM-kaart is vergrendeld met de pukcode. Typ de pukcode om te ontgrendelen." - "Voer de PUK2-code in om de SIM-kaart te ontgrendelen." + "Je simkaart is vergrendeld met de pukcode. Typ de pukcode om te ontgrendelen." + "Voer de PUK2-code in om de simkaart te ontgrendelen." "Mislukt. Schakel SIM/RUIM-vergrendeling in." Je hebt nog %d pogingen over voordat de simkaart wordt vergrendeld. @@ -99,6 +99,13 @@ "Je provider heeft spraak- en noodoproepen tijdelijk opgeschort op deze locatie" "Kan netwerk niet bereiken" "Als je de ontvangst wilt verbeteren, kun je het netwerktype wijzigen dat is geselecteerd bij Systeem > Netwerk en internet > Mobiele netwerken > Voorkeursnetwerktype." + "Meldingen" + "Oproep doorschakelen" + "Modus voor noodoproepen" + "Meldingen voor mobiele data" + "Sms\'jes" + "Voicemailberichten" + "Bellen via wifi" "Door peer aangevraagde TTY-modus VOL" "Door peer aangevraagde TTY-modus HCO" "Door peer aangevraagde TTY-modus VCO" @@ -258,6 +265,16 @@ "Meldingen" "Demo voor de detailhandel" "USB-verbinding" + + + + + + + + + + "Veilige modus" "Android-systeem" "Overschakelen naar persoonlijk profiel" @@ -283,10 +300,8 @@ "Content van vensters ophalen" "De content inspecteren van een venster waarmee je interactie hebt." "\'Verkennen via aanraking\' inschakelen" - "Aangetikte items worden hardop benoemd en het scherm kan worden verkend door middel van gebaren." - "Verbeterde internettoegankelijkheid inschakelen" - "Er kunnen scripts worden geïnstalleerd om app-content toegankelijker te maken." - "Tekst observeren die u typt" + "Aangetikte items worden hardop benoemd en het scherm kan worden verkend via gebaren." + "Tekst observeren die je typt" "Omvat persoonlijke gegevens zoals creditcardnummers en wachtwoorden." "Schermvergroting bedienen" "Bedien het zoomniveau en de positionering van het scherm." @@ -713,9 +728,9 @@ "Ontgrendelen voor alle functies en gegevens" "Maximaal aantal pogingen voor Ontgrendelen via gezichtsherkenning overschreden" "Geen simkaart" - "Geen SIM-kaart in tablet." + "Geen simkaart in tablet." "Geen simkaart in de tv." - "Geen SIM-kaart in telefoon." + "Geen simkaart in telefoon." "Plaats een simkaart." "De simkaart ontbreekt of kan niet worden gelezen. Plaats een simkaart." "Onbruikbare simkaart." @@ -729,10 +744,10 @@ "Vooruitspoelen" "Alleen noodoproepen" "Netwerk vergrendeld" - "SIM-kaart is vergrendeld met pukcode." + "Simkaart is vergrendeld met pukcode." "Raadpleeg de gebruikershandleiding of neem contact op met de klantenservice." - "SIM-kaart is vergrendeld." - "SIM-kaart ontgrendelen..." + "Simkaart is vergrendeld." + "Simkaart ontgrendelen..." "Je hebt je ontgrendelingspatroon %1$d keer onjuist getekend. \n\nProbeer het opnieuw over %2$d seconden." "Je hebt je wachtwoord %1$d keer onjuist getypt. \n\nProbeer het opnieuw over %2$d seconden." "Je hebt je pincode %1$d keer onjuist getypt. \n\nProbeer het opnieuw over %2$d seconden." @@ -1603,7 +1618,7 @@ "Geïnstalleerd door je beheerder" "Geüpdatet door je beheerder" "Verwijderd door je beheerder" - "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." + "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." "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." "Databesparing inschakelen?" "Inschakelen" @@ -1732,11 +1747,12 @@ "Schakel naar de tekstinvoermodus om de tijd in te voeren." "Schakel naar de klokmodus om de tijd in te voeren." "Opties voor automatisch aanvullen" + "Opslaan voor Automatisch aanvullen" "Content kan niet automatisch worden aangevuld" - "Opslaan in %1$s?" - "%1$s opslaan in %2$s?" - "%1$s en %2$s opslaan in %3$s?" - "%1$s, %2$s en %3$s opslaan in %4$s?" + "Opslaan in <b>%1$s</b>?" + "%1$s opslaan in <b>%2$s</b>?" + "%1$s en %2$s opslaan in <b>%3$s</b>?" + "%1$s, %2$s en %3$s opslaan in <b>%4$s</b>?" "Opslaan" "Nee, bedankt" "Wachtwoord" diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 702e2fb2814223a41e835fce7c3caf34fb73e40a..5c606ae2b961da72cd29ab40e974945b410df051 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -99,6 +99,13 @@ "ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਵੱਲੋਂ ਇਸ ਟਿਕਾਣੇ \'ਤੇ ਆਵਾਜ਼ੀ ਅਤੇ ਸੰਕਟਕਾਲੀਨ ਕਾਲਾਂ ਨੂੰ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਮੁਅੱਤਲ ਕੀਤਾ ਗਿਆ ਹੈ" "ਨੈੱਟਵਰਕ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ" "ਸਿਗਨਲ ਪ੍ਰਾਪਤੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਸਿਸਟਮ > ਨੈੱਟਵਰਕ ਅਤੇ ਇੰਟਰਨੈੱਟ > ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ > ਤਰਜੀਹੀ ਨੈੱਟਵਰਕ ਦੀ ਕਿਸਮ \'ਤੇ ਚੁਣੀ ਗਈ ਕਿਸਮ ਨੂੰ ਬਦਲਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" + "ਸੁਚੇਤਨਾਵਾਂ" + "ਕਾਲ ਫਾਰਵਾਰਡਿੰਗ" + "ਸੰਕਟਕਾਲੀਨ ਕਾਲਬੈਕ ਮੋਡ" + "ਮੋਬਾਈਲ ਡੈਟਾ ਸੁਚੇਤਨਾਵਾਂ" + "SMS ਸੁਨੇਹੇ" + "ਵੌਇਸਮੇਲ ਸੁਨੇਹੇ" + "Wi‑Fi ਕਾਲਿੰਗ" "ਪੀਅਰ ਨੇ TTY Mode FULL ਦੀ ਬੇਨਤੀ ਕੀਤੀ" "ਪੀਅਰ ਨੇ TTY Mode HCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ" "ਪੀਅਰ ਨੇ TTY Mode VCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ" @@ -258,6 +265,16 @@ "ਸੁਚੇਤਨਾਵਾਂ" "ਪ੍ਰਚੂਨ ਸਟੋਰਾਂ ਲਈ ਡੈਮੋ" "USB ਕਨੈਕਸ਼ਨ" + + + + + + + + + + "ਸੁਰੱਖਿਅਤ ਮੋਡ" "Android System" "ਨਿੱਜੀ \'ਤੇ ਸਵਿੱਚ ਕਰੋ" @@ -284,8 +301,6 @@ "ਇੱਕ ਵਿੰਡੋ ਦੀ ਸਮੱਗਰੀ ਦੀ ਜਾਂਚ ਕਰੋ, ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਇੰਟਰੈਕਟ ਕਰ ਰਹੇ ਹੋ।" "ਐਕਸਪਲੋਰ ਬਾਇ ਟਚ ਚਾਲੂ ਕਰੋ" "ਟੈਪ ਕੀਤੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਉੱਚੀ ਆਵਾਜ਼ ਵਿੱਚ ਬੋਲਿਆ ਜਾਵੇਗਾ ਅਤੇ ਸਕ੍ਰੀਨ ਦੀ ਸੰਕੇਤਾਂ ਦੀ ਵਰਤੋਂ ਨਾਲ ਪੜਚੋਲ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ।" - "ਵਧੀ ਹੋਈ ਵੈਬ ਪਹੁੰਚਯੋਗਤਾ ਚਾਲੂ ਕਰੋ" - "ਐਪ ਸਮੱਗਰੀ ਨੂੰ ਵੱਧ ਪਹੁੰਚਯੋਗ ਬਣਾਉਣ ਲਈ ਸਕ੍ਰਿਪਟਾਂ ਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕਦੀਆਂ।" "ਜੋ ਟੈਕਸਟ ਤੁਸੀਂ ਟਾਈਪ ਕਰਦੇ ਹੋ, ਉਸਦਾ ਨਿਰੀਖਣ ਕਰੋ" "ਇਸ ਵਿੱਚ ਨਿੱਜੀ ਡੈਟਾ ਸ਼ਾਮਲ ਹੈ ਜਿਵੇਂ ਕ੍ਰੈਡਿਟ ਕਾਰਡ ਨੰਬਰ ਅਤੇ ਪਾਸਵਰਡ।" "ਡਿਸਪਲੇ ਵੱਡਦਰਸ਼ੀ ਨੂੰ ਨਿਯੰਤ੍ਰਿਤ ਕਰੋ" @@ -1733,11 +1748,12 @@ "ਸਮਾਂ ਇਨਪੁੱਟ ਕਰਨ ਲਈ ਲਿਖਤ ਇਨਪੁੱਟ ਮੋਡ \'ਤੇ ਬਦਲੀ ਕਰੋ।" "ਸਮਾਂ ਇਨਪੁੱਟ ਕਰਨ ਲਈ ਘੜੀ ਮੋਡ \'ਤੇ ਬਦਲੀ ਕਰੋ।" "ਆਟੋਫਿਲ ਵਿਕਲਪ" + "ਆਟੋਫਿਲ ਲਈ ਰੱਖਿਅਤ ਕਰੋ" "ਸਮੱਗਰੀਆਂ ਨੂੰ ਆਟੋਫਿਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" - "%1$s ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?" - "%1$s ਨੂੰ %2$s ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?" - "%1$s, %2$s ਨੂੰ %3$s ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?" - "%1$s, %2$s, %3$s ਨੂੰ %4$s ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?" + "<b>%1$s</b> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?" + "%1$s ਨੂੰ <b>%2$s</b> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?" + "%1$s ਅਤੇ %2$s ਨੂੰ <b>%3$s</b> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?" + "%1$s, %2$s, ਅਤੇ %3$s ਨੂੰ <b>%4$s</b> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੀਏ?" "ਰੱਖਿਅਤ ਕਰੋ" "ਨਹੀਂ ਧੰਨਵਾਦ" "ਪਾਸਵਰਡ" diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index dee76d573d27bc8c984640df8299e359f41ce5e0..7386f2d62cf0162472c77ca9162d4218a97f704a 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -101,6 +101,13 @@ "Twój operator tymczasowo zawiesił połączenia głosowe i alarmowe w tej lokalizacji" "Brak zasięgu sieci" "Aby poprawić odbiór, zmień typ sieci – wybierz System > Sieć i internet > Sieci komórkowe > Preferowany typ sieci." + "Alerty" + "Przekierowanie połączeń" + "Tryb alarmowego połączenia zwrotnego" + "Alerty o mobilnej transmisji danych" + "SMS-y" + "Wiadomości poczty głosowej" + "Połączenia przez Wi-Fi" "Drugie urządzenie zażądało trybu „TTY pełny”" "Drugie urządzenie zażądało trybu „TTY HCO”" "Drugie urządzenie zażądało trybu „TTY VCO”" @@ -264,6 +271,16 @@ "Alerty" "Tryb demo dla sklepów" "Połączenie USB" + + + + + + + + + + "Tryb awaryjny" "System Android" "Włącz profil osobisty" @@ -290,8 +307,6 @@ "Sprawdzanie zawartości okna, z którego korzystasz." "Włączenie czytania dotykiem" "Klikane elementy będą wymawiane na głos, a ekran można przeglądać, używając gestów." - "Włączenie ułatwień dostępu w internecie" - "Można zainstalować skrypty, by zawartość aplikacji była łatwiej dostępna." "Obserwowanie wpisywanego tekstu" "Obejmuje informacje osobiste, takie jak numery kart kredytowych i hasła." "Regulowanie powiększenia ekranu" @@ -1794,11 +1809,12 @@ "Aby wprowadzić czas, włącz tryb wprowadzania tekstu." "Aby wprowadzić czas, włącz tryb zegara." "Opcje autouzupełniania" + "Zapisywanie na potrzeby Autouzupełniania" "Nie można automatycznie uzupełnić treści" - "Zapisać w: %1$s?" - "Zapisać element %1$s w: %2$s?" - "Zapisać: %1$s, %2$s w: %3$s?" - "Zapisać: %1$s, %2$s, %3$s w: %4$s?" + "Zapisać w: <b>%1$s</b>?" + "%1$s – zapisać w: <b>%2$s</b>?" + "%1$s%2$s – zapisać w: <b>%3$s</b>?" + "%1$s, %2$s%3$s – zapisać w: <b>%4$s</b>?" "Zapisz" "Nie, dziękuję" "hasło" diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 2212c06178c745e3dd373cb02466ff434be9e1ea..d5dc39502b485a61932a71bdd30d49b6d32cfc7e 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -99,6 +99,13 @@ "Sua operadora suspendeu temporariamente as chamadas de voz e de emergência neste local" "Não foi possível acessar a rede" "Para melhorar a recepção, tente alterar o tipo selecionado em Sistema > Rede & Internet > Redes móveis > Tipo de rede preferencial." + "Alertas" + "Encaminhamento de chamada" + "Modo de retorno de chamada de emergência" + "Alertas de dados móveis" + "Mensagens SMS" + "Mensagens do correio de voz" + "Chamadas por Wi-Fi" "TTD modo COMPLETO solicitado" "TTD modo HCO solicitado" "TTD modo VCO solicitado" @@ -258,6 +265,16 @@ "Alertas" "Demonstração na loja" "Conexão USB" + + + + + + + + + + "Modo de segurança" "Sistema Android" "Alternar para \"Pessoal\"" @@ -284,8 +301,6 @@ "Inspecionar o conteúdo da janela com a qual você está interagindo." "Ativar Explorar por toque" "Itens tocados serão falados em voz alta, e a tela poderá ser explorada por meio de gestos." - "Ativar acessibilidade na Web aprimorada" - "Scripts podem ser instalados para tornar o conteúdo do app mais acessível." "Observar o texto digitado" "Inclui dados pessoais, como números de cartão de crédito e senhas." "Controlar ampliação da tela" @@ -1603,7 +1618,7 @@ "Instalado pelo seu administrador" "Atualizado pelo seu administrador" "Excluído pelo seu administrador" - "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." + "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." "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." "Ativar Economia de dados?" "Ativar" @@ -1732,11 +1747,12 @@ "Alterne para o modo de entrada de texto para informar o horário." "Alterne para o modo de relógio para informar o horário." "Opções de preenchimento automático" + "Salvar no Preenchimento automático" "Não é possível preencher os conteúdos automaticamente" - "Salvar em %1$s?" - "Salvar %1$s em %2$s?" - "Salvar %1$s e %2$s em %3$s?" - "Salvar %1$s, %2$s e %3$s em %4$s?" + "Salvar em <b>%1$s</b>?" + "Salvar %1$s em <b>%2$s</b>?" + "Salvar %1$s e %2$s em <b>%3$s</b>?" + "Salvar %1$s, %2$s e %3$s em <b>%4$s</b>?" "Salvar" "Não, obrigado" "senha" diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 241b2fe61b9ebb13976b7ddb74bd8314a4dd6250..1f297c2f01fe84c1f17ad019bff584e5c731963a 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -99,6 +99,13 @@ "O seu operador suspendeu temporariamente as chamadas de voz e de emergência nesta localização" "Não é possível ligar à rede" "Para melhorar a receção, experimente alterar o tipo selecionado em Sistema > Rede e Internet > Redes móveis > Tipo de rede preferido." + "Alertas" + "Reencaminhamento de chamadas" + "Modo de chamada de retorno de emergência" + "Alertas de dados móveis" + "Mensagens SMS" + "Mensagens de correio de voz" + "Chamadas Wi-Fi" "O par solicitou o modo COMPLETO de teletipo" "O par solicitou o modo HCO de teletipo" "O par solicitou o modo VCO de teletipo" @@ -258,6 +265,16 @@ "Alertas" "Demonstração para retalho" "Ligação USB" + + + + + + + + + + "Modo seguro" "Sistema Android" "Mudar para pessoal" @@ -284,8 +301,6 @@ "Inspecionar o conteúdo de uma janela com a qual está a interagir." "Ativar Explorar Através do Toque" "Os itens em que tocar serão pronunciados em voz alta e o ecrã poderá ser explorado através de gestos." - "Ativar a acessibilidade Web melhorada" - "Poderão ser instalados scripts para tornar o conteúdo da aplicação mais acessível." "Observar o texto que escreve" "Inclui dados pessoais, como números de cartões de crédito e palavras-passe." "Controlar a ampliação do ecrã" @@ -1732,11 +1747,12 @@ "Mude para o modo de introdução de texto para a introdução da hora." "Mude para o modo de relógio para a introdução da hora." "Opções de preenchimento automático" + "Guardar para o Preenchimento automático" "Não é possível preencher automaticamente o conteúdo" - "Pretende guardar no %1$s?" - "Pretende guardar o(a) %1$s no %2$s?" - "Pretende guardar %1$s e %2$s no %3$s?" - "Pretende guardar %1$s, %2$s e %3$s no %4$s?" + "Pretende guardar no <b>%1$s</b>?" + "Pretende guardar %1$s no <b>%2$s</b>?" + "Pretende guardar %1$s e %2$s no <b>%3$s</b>?" + "Pretende guardar %1$s, %2$s e %3$s no <b>%4$s</b>?" "Guardar" "Não, obrigado" "palavra-passe" diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 2212c06178c745e3dd373cb02466ff434be9e1ea..d5dc39502b485a61932a71bdd30d49b6d32cfc7e 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -99,6 +99,13 @@ "Sua operadora suspendeu temporariamente as chamadas de voz e de emergência neste local" "Não foi possível acessar a rede" "Para melhorar a recepção, tente alterar o tipo selecionado em Sistema > Rede & Internet > Redes móveis > Tipo de rede preferencial." + "Alertas" + "Encaminhamento de chamada" + "Modo de retorno de chamada de emergência" + "Alertas de dados móveis" + "Mensagens SMS" + "Mensagens do correio de voz" + "Chamadas por Wi-Fi" "TTD modo COMPLETO solicitado" "TTD modo HCO solicitado" "TTD modo VCO solicitado" @@ -258,6 +265,16 @@ "Alertas" "Demonstração na loja" "Conexão USB" + + + + + + + + + + "Modo de segurança" "Sistema Android" "Alternar para \"Pessoal\"" @@ -284,8 +301,6 @@ "Inspecionar o conteúdo da janela com a qual você está interagindo." "Ativar Explorar por toque" "Itens tocados serão falados em voz alta, e a tela poderá ser explorada por meio de gestos." - "Ativar acessibilidade na Web aprimorada" - "Scripts podem ser instalados para tornar o conteúdo do app mais acessível." "Observar o texto digitado" "Inclui dados pessoais, como números de cartão de crédito e senhas." "Controlar ampliação da tela" @@ -1603,7 +1618,7 @@ "Instalado pelo seu administrador" "Atualizado pelo seu administrador" "Excluído pelo seu administrador" - "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." + "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." "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." "Ativar Economia de dados?" "Ativar" @@ -1732,11 +1747,12 @@ "Alterne para o modo de entrada de texto para informar o horário." "Alterne para o modo de relógio para informar o horário." "Opções de preenchimento automático" + "Salvar no Preenchimento automático" "Não é possível preencher os conteúdos automaticamente" - "Salvar em %1$s?" - "Salvar %1$s em %2$s?" - "Salvar %1$s e %2$s em %3$s?" - "Salvar %1$s, %2$s e %3$s em %4$s?" + "Salvar em <b>%1$s</b>?" + "Salvar %1$s em <b>%2$s</b>?" + "Salvar %1$s e %2$s em <b>%3$s</b>?" + "Salvar %1$s, %2$s e %3$s em <b>%4$s</b>?" "Salvar" "Não, obrigado" "senha" diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index f347a8ebe075eea2eb7bb8c69f20a30f55a9f64e..3a2c38d2905e9d639134caa3bbeb64d12724cc7d 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -100,6 +100,13 @@ "Operatorul dvs. a suspendat temporar apelurile vocale și de urgență în această locație" "Nu se poate stabili conexiunea la rețea" "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." + "Alerte" + "Redirecționarea apelurilor" + "Mod de apelare inversă de urgență" + "Alerte de date mobile" + "Mesaje SMS" + "Mesaje din mesageria vocală" + "Apelare prin Wi-Fi" "Cealaltă persoană a solicitat modul TTY cu setarea COMPLET" "Cealaltă persoană a solicitat modul TTY cu setarea HCO" "Cealaltă persoană a solicitat modul TTY cu setarea VCO" @@ -261,6 +268,16 @@ "Alerte" "Demonstrație comercială" "Conexiune USB" + + + + + + + + + + "Mod sigur" "Sistemul Android" "Comutați la Personal" @@ -287,8 +304,6 @@ "Inspectează conținutul unei ferestre cu care interacționați." "Activează funcția Explorați prin atingere" "Elementele atinse vor fi rostite cu voce tare, iar ecranul poate fi explorat utilizând gesturi." - "Activează accesibilitatea web îmbunătățită" - "Pot fi instalate scripturi pentru a face conținutul aplicațiilor mai accesibil." "Remarcă textul pe care îl introduceți" "Include date personale, cum ar fi numere ale cardurilor de credit sau parole." "Controlați mărirea pe afișaj" @@ -1162,7 +1177,7 @@ "Permiteți întotdeauna" "Nu permiteți niciodată" "Card SIM eliminat" - "Rețeaua mobilă va fi indisponibilă până când reporniți cu o cartelă SIM validă introdusă." + "Rețeaua mobilă va fi indisponibilă până când reporniți cu un card SIM valid introdus." "Terminat" "Card SIM adăugat" "Reporniți dispozitivul pentru a accesa rețeaua mobilă." @@ -1763,11 +1778,12 @@ "Pentru a introduce ora, comutați la modul de introducere a textului." "Pentru a introduce ora, comutați la modul ceas." "Opțiuni de completare automată" + "Salvați pentru completare automată" "Conținutul nu poate fi completat automat" - "Salvați în %1$s?" - "Salvați %1$s în %2$s?" - "Salvați %1$s și %2$s în %3$s?" - "Salvați %1$s, %2$s și %3$s în %4$s?" + "Salvați în <b>%1$s</b>?" + "Salvați %1$s în <b>%2$s</b>?" + "Salvați %1$s și %2$s în <b>%3$s</b>?" + "Salvați %1$s, %2$s și %3$s în <b>%4$s</b>?" "Salvați" "Nu, mulțumesc" "parolă" diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index e32823f7eecfc13444f10e25c778311315615180..0bc71eb4c700c6db2b2647cf582d5bdecc399889 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -101,6 +101,13 @@ "Ваш оператор временно заблокировал голосовые и экстренные вызовы в этом месте." "Сеть недоступна" "Чтобы улучшить сигнал, попробуйте выбрать другой тип сети в настройках (раздел \"Мобильные сети\")." + "Оповещения" + "Переадресация вызовов" + "Режим экстренных обратных вызовов" + "Оповещения, связанные с мобильным Интернетом" + "SMS" + "Голосовые сообщения" + "Звонки по Wi-Fi" "На устройстве абонента выбран режим телетайпа \"ВСЕ\"" "На устройстве абонента выбран режим телетайпа HCO" "На устройстве абонента выбран режим телетайпа VCO" @@ -222,7 +229,7 @@ "Настройки телевизора" "Параметры телефона" "Блокировка экрана" - "Отключить питание" + "Выключить" "Экстренный вызов" "Отчет об ошибке" "Отчет об ошибке" @@ -264,6 +271,16 @@ "Уведомления" "Деморежим для магазина" "USB-подключение" + + + + + + + + + + "Безопасный режим" "Система Android" "Перейти в личный профиль" @@ -290,8 +307,6 @@ "Анализировать содержимое активного окна." "Включать Изучение касанием" "Озвучивать нажимаемые элементы и разрешать управление устройством с помощью жестов." - "Включать спец. возможности для Интернета" - "Могут быть установлены дополнительные скрипты." "Обрабатывать набираемый текст" "В том числе личные данные, например номера кредитных карт и пароли." "Управлять масштабом изображения" @@ -1186,7 +1201,7 @@ "Готово" "SIM-карта добавлена" "Перезагрузите устройство для доступа к мобильной сети." - "Перезапуск" + "Перезапустить" "Чтобы SIM-карта работала корректно, установите и запустите приложение оператора." "СКАЧАТЬ" "НЕ СЕЙЧАС" @@ -1794,11 +1809,12 @@ "Чтобы ввести время, перейдите в режим ввода текста." "Чтобы ввести время, перейдите в режим часов." "Параметры автозаполнения" + "Сохраните данные для автозаполнения" "Ошибка автозаполнения" - "Сохранить в %1$s?" - "%1$s: сохранить в %2$s?" - "Сохранить данные (%1$s, %2$s) в \"%3$s\"?" - "Сохранить данные (%1$s, %2$s, %3$s) в \"%4$s\"?" + "Сохранить в <b>%1$s</b>?" + "Сохранить %1$s в <b>%2$s</b>?" + "Сохранить %1$s и %2$s в <b>%3$s</b>?" + "Сохранить %1$s, %2$s и %3$s в <b>%4$s</b>?" "Сохранить" "Нет, спасибо" "Пароль" diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 6c595fb763a2c46d49b2b29e49c0125c934bf550..b7e695a863e26d9c314764d99639da5bd3da64e7 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -99,6 +99,13 @@ "ඔබගේ වාහකයා මෙම ස්ථානයේ හඬ සහ හදිසි ඇමතුම් තාවකාලිකව අත්හිටුවා ඇත" "ජාලය වෙත ළඟා විය නොහැකිය" "ප්‍රතිග්‍රහණය වැඩි දියුණු කිරීමට, පද්ධතිය > ජාලය සහ අන්තර්ජාලය > ජංගම ජාල > වඩා කැමති ජාල වර්ගය තුළ තෝරන ලද වර්ගය වෙනස් කිරීම උත්සාහ කරන්න." + "ඇඟවීම්" + "ඇමතුම ප්‍රතියොමු කිරීම" + "හදිසි අවස්ථා පසු ඇමතුම් ප්‍රකාරය" + "ජංගම දත්ත ඇඟවීම්" + "SMS පණිවිඩ" + "හඬ තැපැල් පණිවිඩ" + "Wi-Fi ඇමතීම" "සම ඉල්ලීම් කළ TTY ප්‍රකාරය පූර්ණයි" "සම ඉල්ලීම් කළ TTY ප්‍රකාරය HCO" "සම ඉල්ලීම් කළ TTY ප්‍රකාරය VCO" @@ -258,6 +265,16 @@ "ඇඟවීම්" "සිල්ලර ආදර්ශනය" "USB සම්බන්ධතාවය" + + + + + + + + + + "ආරක්‍ෂිත ආකාරය" "Android පද්ධතිය" "පුද්ගලික වෙත මාරු වන්න" @@ -284,8 +301,6 @@ "ඔබ අන්තර්ක්‍රියාකාරී වන කවුළුවේ අන්තර්ගතය පරීක්ෂා කරන්න." "ස්පර්ශයෙන් ගවේෂණය සක්‍රිය කරන්න" "තට්ටු කළ අයිතම හඬ නගා කියවනු ඇති අතර ඉංගිති භාවිතයෙන් තිරය ගවේෂණය කිරීමට හැකිය." - "උසස් වෙබ් ප්‍රවේශ්‍යතාව සක්‍රිය කරන්න" - "යෙදුම් අන්තර්ගතයට ප්‍රවේශ්‍යතාවය වැඩිවන ලෙස සකස් කිරීමට ඇතැම් විට ස්ක්‍රිප්ට් ස්ථාපනය කර ඇත." "ඔබ ටයිප් කළ පෙළ බලන්න" "ණයවරපත් අංක සහ මුරපද වැනි පුද්ගලික දත්ත ඇතුළත් වේ." "සංදර්ශනයේ විශාලනය පාලනය කරන්න" @@ -1605,7 +1620,7 @@ "ඔබගේ පරිපාලක මඟින් ස්ථාපනය කර ඇත" "ඔබගේ පරිපාලක මඟින් යාවත්කාලීන කර ඇත" "ඔබගේ පරිපාලක මඟින් මකා දමා ඇත" - "බැටරි ආයු කාලය වැඩිදියුණු කිරීමට උදවු කිරීමට, බැටරි සුරැකුම ඔබේ උපාංගයේ ක්‍රියාකාරීත්වය අඩුකරන අතර කම්පනය, පිහිටීම් සේවා, සහ බොහෝමයක් පසුබිම් දත්ත සීමා කරයි. ඔබ ඒවා විවෘත නොකරන්නේ නම් මිස ඊමේල්, පණිවිඩකරණය, සහ සමමුහුර්ත කිරීම මත රඳා පවතින වෙනත් යෙදුම් යාවත්කාලීන නොවිය හැකිය.\n\nඔබේ උපාංගය ආරෝපණය වන විට බැටරි සුරැකුම ස්වයංක්‍රියව අක්‍රිය වේ." + "බැටරි ආයු කාලය වැඩිදියුණු කිරීමට උදවු කිරීමට, බැටරි සුරැකුම ඔබේ උපාංගයේ ක්‍රියාකාරීත්වය අඩුකරන අතර කම්පනය, පිහිටීම් සේවා, සහ බොහෝමයක් පසුබිම් දත්ත සීමා කරයි. ඔබ ඒවා විවෘත නොකරන්නේ නම් මිස ඊ-තැපැල්, පණිවිඩකරණය, සහ සමමුහුර්ත කිරීම මත රඳා පවතින වෙනත් යෙදුම් යාවත්කාලීන නොවිය හැකිය.\n\nඔබේ උපාංගය ආරෝපණය වන විට බැටරි සුරැකුම ස්වයංක්‍රියව ක්‍රියාත්මක වේ." "දත්ත භාවිතය අඩු කිරීමට උදවු වීමට, දත්ත සුරැකුම සමහර යෙදුම් පසුබිමින් දත්ත යැවීම සහ ලබා ගැනීම වළක්වයි. ඔබ දැනට භාවිත කරන යෙදුමකට දත්ත වෙත පිවිසීමට හැකිය, නමුත් එසේ කරන්නේ කලාතුරකින් විය හැකිය. මෙයින් අදහස් වන්නේ, උදාහරණයක් ලෙස, එම රූප ඔබ ඒවාට තට්ටු කරන තෙක් සංදර්ශනය නොවන බවය." "දත්ත සුරැකුම ක්‍රියාත්මක කරන්නද?" "ක්‍රියාත්මක කරන්න" @@ -1734,11 +1749,12 @@ "වේලා ආදානය සඳහා ආදාන ප්‍රකාරය වෙත මාරු වෙන්න." "වේලා ආදානය සඳහා ඔරලෝසු ප්‍රකාරය වෙත මාරු වෙන්න." "ස්වයංක්‍රිය පිරවුම් විකල්ප" + "ස්වයං පිරවුම සඳහා සුරකින්න" "අන්තර්ගතය ස්වයං පිරවුම් කළ නොහැකිය" - "%1$s වෙත සුරකින්නද?" - "%1$s %2$s වෙත සුරකින්නද?" - "%3$s වෙත %1$s, %2$s සුරකින්නද?" - "%4$s වෙත %1$s, %2$s, %3$s සුරකින්නද?" + "<b>%1$s</b> වෙත සුරකින්නද?" + "%1$s <b>%2$s</b> වෙත සුරකින්නද?" + "%1$s සහ %2$s <b>%3$s</b> වෙත සුරකින්නද?" + "%1$s, %2$s, සහ %3$s <b>%4$s</b> වෙත සුරකින්නද?" "සුරකින්න" "එපා ස්තූතියි" "මුරපදය" diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index af5268e3ccf45bf5f4f3b76185c02de4f13a2d91..018ea4e6eafe78b858b8df9ecfc6f894a11ace67 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -33,7 +33,7 @@ "%1$d hod." "%1$d hod. %2$d min." "%1$d hod. %2$d min." - "%1$d min." + "%1$d min" "%1$d min" "%1$d min. %2$d s" "%1$d min. %2$d s" @@ -92,15 +92,22 @@ "Služba nie je poskytovaná." "Nemôžete meniť nastavenia identifikácie volajúceho." "Žiadna dátová služba" - "Žiadne núdzové hovory" + "Tiesňové volania nie sú k dispozícii" "Žiadne hlasové hovory" - "Žiadne hlasové ani núdzové hovory" + "Hlasové ani tiesňové volania nie sú k dispozícii" "Váš operátor dočasne pozastavil dátovú službu na tomto mieste" "Váš operátor dočasne pozastavil núdzové hovory z tohto miesta" "Váš operátor dočasne pozastavil hlasové hovory z tohto miesta" - "Váš operátor dočasne pozastavil hlasové a núdzové hovory z tohto miesta" + "Váš operátor v tejto oblasti dočasne blokuje hlasové a tiesňové hovory" "Nepodarilo sa pripojiť k sieti" "Ak chcete vylepšiť príjem, skúste zmeniť vybratý typ siete v časti Systém > Sieť a internet > Mobilné siete > Preferovaný typ siete." + "Upozornenia" + "Presmerovanie hovorov" + "Režim tiesňového spätného volania" + "Upozornenia na mobilné dáta" + "Správy SMS" + "Správy hlasovej schránky" + "Volanie cez Wi-Fi" "Používateľ, s ktorým komunikujete, požiadal o režim FULL textového telefónu" "Používateľ, s ktorým komunikujete, požiadal o režim HCO textového telefónu" "Používateľ, s ktorým komunikujete, požiadal o režim VCO textového telefónu" @@ -264,6 +271,16 @@ "Upozornenia" "Predajná ukážka" "Pripojenie USB" + + + + + + + + + + "Núdzový režim" "Systém Android" "Prepnúť na osobný" @@ -290,12 +307,10 @@ "Môžete preskúmať obsah okna, s ktorým pracujete." "Zapnúť funkciu Preskúmanie dotykom" "Po klepnutí na položku sa vysloví jej názov a obrazovku je možné preskúmať pomocou gest." - "Zapnúť vylepšenú dostupnosť na webe" - "Môže nainštalovať skripty na sprístupnenie obsahu aplikácie." "Sledovať zadávaný text" "Sledovanie zahŕňa osobné údaje ako sú čísla kreditných kariet a heslá." "Ovládanie priblíženia obrazovky" - "Ovládajte úroveň priblíženia/oddialenia obrazovky a umiestnenie" + "Ovládajte umiestnenie a úroveň priblíženia obrazovky." "Gestá" "Je možné použiť klepnutie, prejdenie, stiahnutie prstami a ďalšie gestá." "Gestá odtlačkov prstov" @@ -318,8 +333,8 @@ "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." "prijímať textové správy (MMS)" "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." - "čítať správy Cell Broadcast" - "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." + "čítať správy informačných služieb" + "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." "čítať odoberané informačné kanály" "Umožňuje aplikácii získať podrobnosti o aktuálne synchronizovaných informačných kanáloch." "posielať a zobrazovať SMS" @@ -705,7 +720,7 @@ "Zadajte kód PIN na odomknutie" "Nesprávny kód PIN." "Ak chcete telefón odomknúť, stlačte Menu a následne 0." - "Číslo tiesňového volania" + "Číslo tiesňovej linky" "Žiadny signál" "Obrazovka je uzamknutá." "Ak chcete odomknúť telefón alebo uskutočniť tiesňové volanie, stlačte Menu." @@ -718,7 +733,7 @@ "Skúsiť znova" "Všetky funkcie a dáta získate po odomknutí" "Prekročili ste maximálny povolený počet pokusov o odomknutie tvárou" - "Nie je vložená SIM karta" + "Žiadna SIM karta" "V tablete nie je žiadna SIM karta." "V televízore nie je žiadna SIM karta." "V telefóne nie je žiadna SIM karta." @@ -879,8 +894,8 @@ "dní" "hodina" "hodiny" - "min." - "min." + "min" + "min" "s" "s" "týždeň" @@ -1509,7 +1524,7 @@ "Skratka dostupnosti vypla službu %1$s" "Klepnutím na tlačidlo dostupnosti vyberte požadovanú funkciu:" "Ak chcete zmeniť funkcie, klepnite na tlačidlo dostupnosti a podržte ho" - "Lupa" + "Priblíženie" "Aktuálny používateľ je %1$s." "Prepína sa na účet %1$s…" "Prebieha odhlásenie používateľa %1$s…" @@ -1647,15 +1662,15 @@ "Nainštaloval správca" "Aktualizoval správca" "Odstránil správca" - "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." + "Š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." "Š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." - "Zapnúť Šetrič dát?" + "Chcete zapnúť šetrič dát?" "Zapnúť" %1$d minúty (do %2$s) %1$d minúty (do %2$s) %1$d minút (do %2$s) - Minútu (do %2$s) + 1 minútu (do %2$s) Na %1$d min (do %2$s) @@ -1667,7 +1682,7 @@ %1$d hodiny (do %2$s) %1$d hodiny (do %2$s) %1$d hodín (do %2$s) - Hodinu (do %2$s) + 1 hodinu (do %2$s) Na %1$d h (do %2$s) @@ -1679,7 +1694,7 @@ %d minúty %d minúty %d minút - Minútu + 1 minútu Na %d min @@ -1691,7 +1706,7 @@ %d hodiny %d hodiny %d hodín - Hodinu + 1 hodinu Na %d h @@ -1701,8 +1716,8 @@ "Do %1$s" "Do %1$s (ďalší budík)" - "Dokým nevypnete stav Nerušiť" - "Dokým nevypnete stav Nerušiť" + "Dokiaľ nevypnete režim Nerušiť" + "Dokiaľ nevypnete režim Nerušiť" "%1$s / %2$s" "Zbaliť" "Nerušiť" @@ -1788,17 +1803,18 @@ "Ladenie cez USB" "hodina" "minúta" - "Nastavenie času" + "Nastaviť čas" "Zadajte platný čas" "Zadajte čas" "Ak chcete zadať čas, prepnite na textový režim vstupu" "Ak chcete zadať čas, prepnite na režim hodín." "Možnosti automatického dopĺňania" + "Uložiť do Automatického dopĺňania" "Obsah nie je možné automaticky vyplniť" - "Uložiť do zariadenia %1$s?" - "Uložiť %1$s do zariadenia %2$s?" - "Uložiť %1$s%2$s do služby %3$s?" - "Uložiť %1$s, %2$s%3$s do služby %4$s?" + "Uložiť do služby <b>%1$s</b>?" + "Uložiť %1$s do služby <b>%2$s</b>?" + "Uložiť %1$s%2$s do služby <b>%3$s</b>?" + "Uložiť %1$s, %2$s%3$s do služby <b>%4$s</b>?" "Uložiť" "Nie, vďaka" "heslo" diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 877add7727af12483027612e937a1b28f0c2e0f4..729612fb1571474fc9dcd37affad536f8ec6c217 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -101,6 +101,13 @@ "Vaš operater je na tej lokaciji začasno onemogočil glasovne klice in klice v sili" "Povezave z omrežjem ni mogoče vzpostaviti" "Č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«." + "Opozorila" + "Preusmerjanje klicev" + "Način za povratni klic v sili" + "Opozorila o prenosu podatkov v mobilnem omrežju" + "Sporočila SMS" + "Sporočila v odzivniku" + "Klicanje prek Wi-Fi-ja" "Enakovredna naprava je zahtevala način TTY FULL" "Enakovredna naprava je zahtevala način TTY HCO" "Enakovredna naprava je zahtevala način TTY VCO" @@ -264,6 +271,16 @@ "Opozorila" "Predstavitev za maloprodajo" "Povezava USB" + + + + + + + + + + "Varni način" "Sistem Android" "Preklop na osebni profil" @@ -290,11 +307,9 @@ "Preverjanje vsebine okna, ki ga uporabljate." "Vklopiti raziskovanje z dotikom" "Elementi, ki se jih dotaknete, bodo izrečeni na glas, zaslon pa lahko raziskujete s potezami." - "Vklopiti izboljšano dostopnost spleta za ljudi s posebnimi potrebami" - "Za boljšo dostopnost vsebine aplikacije je mogoče namestiti skripte." "Opazovati besedilo, ki ga natipkate" "Vključuje osebne podatke, kot so številke kreditnih kartic in gesla." - "Nadziranje povečave prikaza" + "Nadzirati povečave prikaza" "Nadziranje stopnje povečave in položaja prikaza." "Izvajanje potez" "Mogoče je izvajanje dotikov, vlečenja, primikanja in razmikanja prstov ter drugih potez." @@ -1794,11 +1809,12 @@ "Preklopite na način za vnašanje besedila, da vnesete čas." "Preklopite na način ure, da vnesete čas." "Možnosti samodejnega izpolnjevanja" + "Shranjevanje v storitev samodejnega izpolnjevanja" "Vsebine ni mogoče samodejno izpolniti" - "Shrani v %1$s?" - "Shrani %1$s v %2$s?" - "Želite shraniti %1$s, %2$s v %3$s?" - "Želite shraniti %1$s, %2$s, %3$s v %4$s?" + "Želite shraniti pod oznako <b>%1$s</b>?" + "Želite %1$s shraniti pod oznako <b>%2$s</b>?" + "Želite %1$s in %2$s shraniti pod oznako <b>%3$s</b>?" + "Želite %1$s, %2$s in %3$s shraniti pod oznako <b>%4$s</b>?" "Shrani" "Ne, hvala" "geslo" diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index b645553c0b606da13892792214b5cc2fd338d891..563f4bd0d41563ee8662bc967badaf9cfae61757 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -99,6 +99,13 @@ "Operatori yt ka pezulluar përkohësisht telefonatat zanore dhe të urgjencës në këtë vendndodhje" "Rrjeti i paarritshëm" "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." + "Sinjalizimet" + "Transferimi i telefonatave" + "Modaliteti i \"Kthimit të telefonatës së urgjencës\"" + "Sinjalizimet për të dhënat celulare" + "Mesazhet SMS" + "Mesazhet e postës zanore" + "Telefonata me Wi-Fi" "Homologu yt kërkoi modalitet \"TTY\" të plotë" "Homologu kërkoi modalitet \"TTY\" të llojit \"HCO\"" "Homologu yt kërkoi modalitet \"TTY\" të llojit \"VCO\"" @@ -258,6 +265,16 @@ "Sinjalizimet" "Demonstrimi i shitjes me pakicë" "Lidhja USB" + + + + + + + + + + "Modaliteti i sigurisë" "Sistemi \"android\"" "Ndryshoje te \"Personale\"" @@ -284,8 +301,6 @@ "Inspekton përmbajtjen e dritares me të cilën po ndërvepron." "Aktivizojë funksionin \"Eksploro me prekje\"" "Artikujt e trokitur do të lexohen me zë të lartë dhe ekrani mund të eksplorohet duke përdorur gjestet." - "Aktivizojë qasjen e përmirësuar në ueb" - "Skriptet mund të instalohen për ta bërë përmbajtjen e aplikacionit më të qasshme." "Vëzhgojë tekstin që shkruan" "Përfshi të dhënat personale si numrat e kartave të kreditit si dhe fjalëkalimet." "Kontrollo zmadhimin e ekranit" @@ -1069,7 +1084,7 @@ "Procesi %1$s ka kaluar kufirin e tij të memories së procesit me %2$s. 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." "Zgjidh një veprim për tekstin" "Volumi i ziles" - "volumi i klipit \"media\"" + "Volumi i medias" "Luajtje përmes \"bluetooth-it\"" "Zilja \"në heshjte\" u caktua" "Volumi i telefonatës" @@ -1080,7 +1095,7 @@ "Volumi i \"bluetooth-it\"" "Volumi i ziles" "Volumi i telefonatës" - "volumi i klipit \"media\"" + "Volumi i medias" "Volumi i njoftimeve" "Zile e paracaktuar." "I parazgjedhur (%1$s)" @@ -1604,7 +1619,7 @@ "Instaluar nga administratori" "Përditësuar nga administratori" "Fshirë nga administratori" - "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." + "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." "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." "Të aktivizohet \"Kursyesi i të dhënave\"?" "Aktivizo" @@ -1733,11 +1748,12 @@ "Kalo te modaliteti i hyrjes së tekstit për hyrjen e kohës." "Kalo te modaliteti i orës për hyrjen e kohës." "Opsionet e plotësimit automatik" + "Ruaje për \"Plotësim automatik\"" "Përmbajtjet nuk mund të plotësohen automatikisht" - "Të ruhet te %1$s?" - "Të ruhet %1$s te %2$s?" - "Të ruhen %1$s, %2$s te %3$s?" - "Të ruhen %1$s, %2$s, %3$s te %4$s?" + "Të ruhet te <b>%1$s</b>?" + "Të ruhet %1$s te <b>%2$s</b>?" + "Të ruhen %1$s dhe %2$s te <b>%3$s</b>?" + "Të ruhen %1$s, %2$s dhe %3$s te <b>%4$s</b>?" "Ruaj" "Jo, faleminderit" "fjalëkalimi" diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 6dc7761d1e612695beed94153479641c8b486325..2d2cc708be23f824c357de36e2ff7fd0215984ad 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -100,6 +100,13 @@ "Мобилни оператер је привремено суспендовао гласовне и хитне позиве на овој локацији" "Повезивање са мрежом није успело" "Да бисте побољшали пријем, пробајте да промените изабрани тип у одељку Систем > Мрежа и интернет > Мобилне мреже > Жељени тип мреже." + "Обавештења" + "Преусмеравање позива" + "Режим за хитан повратни позив" + "Обавештења за мобилне податке" + "SMS-ови" + "Поруке говорне поште" + "Позивање преко Wi-Fi мреже" "Корисник захтева ПОТПУН режим TTY" "Корисник захтева ПРЕНОС ЗВУКА за режим TTY" "Корисник захтева ПРЕНОС ГЛАСА за режим TTY" @@ -261,6 +268,16 @@ "Обавештења" "Режим демонстрације за малопродајне објекте" "USB веза" + + + + + + + + + + "Безбедни режим" "Android систем" "Пређи на Лични профил" @@ -287,8 +304,6 @@ "Проверава садржај прозора са којим остварујете интеракцију." "Укључи Истраживања додиром" "Ставке које додирнете ће бити изговорене наглас, а можете да се крећете по екрану покретима." - "Укључи побољшану приступачност веба" - "Могу да се инсталирају скрипте да би садржај апликација био приступачнији." "Прати текст који уносите" "Обухвата личне податке као што су бројеви кредитних картица и лозинке." "Управљај увећањем приказа" @@ -1625,7 +1640,7 @@ "Инсталирао је администратор" "Ажурирао је администратор" "Избрисао је администратор" - "Да би продужила време трајања батерије, уштеда батерије смањује перформансе уређаја и ограничава вибрацију, услуге локације и већину позадинских података. Имејл, размена порука и друге апликације које се ослањају на синхронизацију можда неће да се ажурирају ако их не отворите.\n\nУштеда батерије се аутоматски искључује када се уређај пуни." + "Да би продужила време трајања батерије, уштеда батерије смањује перформансе уређаја и ограничава вибрацију, услуге локације и већину позадинских података. Имејл, размена порука и друге апликације које се ослањају на синхронизацију неће се ажурирати док их не отворите.\n\nУштеда батерије се аутоматски искључује када се уређај пуни." "Да би се смањила потрошња података, Уштеда података спречава неке апликације да шаљу или примају податке у позадини. Апликација коју тренутно користите може да приступа подацима, али ће то чинити ређе. На пример, слике се неће приказивати док их не додирнете." "Укључити Уштеду података?" "Укључи" @@ -1763,11 +1778,12 @@ "Пређите у режим уноса текста ради уноса времена." "Пређите у режим сата ради уноса времена." "Опције аутоматског попуњавања" + "Сачувајте за аутоматско попуњавање" "Садржај не може аутоматски да се попуни" - "Желите ли да сачувате у: %1$s?" - "Желите ли да сачувате ставку %1$s у: %2$s?" - "Желите ли да сачувате ставке %1$s и %2$s у %3$s?" - "Желите ли да сачувате ставке %1$s, %2$s и %3$s у %4$s?" + "Желите ли да сачувате у: <b>%1$s</b>?" + "Желите ли да сачувате ставку %1$s у: <b>%2$s</b>?" + "Желите ли да сачувате ставке %1$s и %2$s у: <b>%3$s</b>?" + "Желите ли да сачувате ставке %1$s, %2$s и %3$s у: <b>%4$s</b>?" "Сачувај" "Не, хвала" "лозинка" diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 90dfd681afd1c1c83cd1ab54731b9bd49f9957c7..c480df43cc9673411153e96fef74c04b15c02496 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -99,6 +99,13 @@ "Operatören har tillfälligt stängt av röst- och nödsamtal på denna plats" "Det går inte att nå nätverket" "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." + "Aviseringar" + "Vidarebefordra samtal" + "Läget Återuppringning vid nödsamtal" + "Aviseringar för mobildata" + "Sms" + "Röstmeddelanden" + "Wi-Fi-samtal" "Peer-enheten begärde texttelefonläget FULL" "Peer-enheten begärde texttelefonläget HCO" "Peer-enheten begärde texttelefonläget VCO" @@ -258,6 +265,16 @@ "Varningar" "Demo för återförsäljare" "USB-anslutning" + + + + + + + + + + "Säkert läge" "Android-system" "Byt till din personliga profil" @@ -284,8 +301,6 @@ "Granska innehållet i ett fönster som du interagerar med." "Aktivera Explore by touch" "Objekt som användaren trycker på läses upp högt och skärmen kan utforskas med hjälp av rörelser." - "Aktivera förbättrad webbtillgänglighet" - "Skript kan installeras för att göra appens innehåll tillgängligare." "Observera text som du skriver" "Omfattar personuppgifter som kreditkortsnummer och lösenord." "Styr skärmförstoringen" @@ -1178,7 +1193,7 @@ "DELA" "AVVISA" "Byt tangentbord" - "Ha kvar den på skärmen när det fysiska tangentbordet används" + "Ha kvar det på skärmen när det fysiska tangentbordet används" "Visa virtuellt tangentbord" "Konfigurera fysiskt tangentbord" "Tryck om du vill välja språk och layout" @@ -1732,11 +1747,12 @@ "Byt till textinmatningsläget och ange tid." "Byt till klockläget och ange tid." "Alternativ för autofyll" + "Spara för Autofyll" "Det gick inte att fylla i innehållet automatiskt" - "Vill du spara detta i %1$s?" - "Vill du spara %1$s i %2$s?" - "Spara %1$s och %2$s i %3$s?" - "Spara %1$s, %2$s och %3$s i %4$s?" + "Vill du spara innehållet i <b>%1$s</b>?" + "Vill du spara %1$s i <b>%2$s</b>?" + "Vill du spara %1$s och %2$s i <b>%3$s</b>?" + "Vill du spara %1$s, %2$s och %3$s i <b>%4$s</b>?" "Spara" "Nej tack" "lösenordet" diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index d104bb703b1a2ff9b7231b9b023e50af231fd6b2..cec75bca468ad3f26a4fe9c6855da3160dc101f6 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -45,7 +45,7 @@ "Ujumbe wa sauti" "MSISDN1" "Tatizo la muunganisho au msimbo batili MMI." - "Uendeshaji umepunguzwa kwa namba za upigaji simu za kudumu pekee." + "Ni matumizi yanayohusisha nambari za simu zilizobainishwa pekee yatakayowezekana." "Haiwezi kubadilisha mipangilio ya kusambaza simu kutoka kwenye simu yako ukiwa unatumia mitandao mingine." "Huduma iliwezeshwa" "Huduma iliwezesha kwa:" @@ -73,7 +73,7 @@ "Kitambulisho cha Mstari Uliounganishwa" "Kizuizi cha Kitambulisho cha Mstari Uliounganishwa" "Kusambaza simu" - "Simu inasubiriwa" + "Simu inayosubiri kupokewa" "Kuzuia upigaji simu" "Badilisho la nenosiri" "Badilisha PIN" @@ -99,6 +99,13 @@ "Mtoa huduma wako amesitisha kwa muda huduma ya kupiga simu za dharura na za sauti mahali hapa" "Haiwezi kufikia mtandao" "Ili kupata mtandao thabiti, jaribu kubadilisha aina iliyochaguliwa katika Mfumo > Mtandao na Intaneti > Mitandao ya simu > Aina ya mtandao unaopendelea." + "Arifa" + "Kupeleka simu kwenye nambari nyingine" + "Hali ya kupiga simu za dharura" + "Arifa za matumizi ya data ya simu" + "Ujumbe wa SMS" + "Ujumbe wa sauti" + "Kupiga simu kupitia Wi-Fi" "Hali ya TTY iliyoombwa na mtandao mwenza KAMILI" "Hali ya TTY iliyoombwa na mtandao mwenza HCO" "Hali ya TTY iliyoombwa na mtandao mwenza VCO" @@ -232,9 +239,9 @@ "Mtindo wa kimya" "Sauti Imezimwa" "Sauti imewashwa" - "Hali ya ndege" - "Hali ya ndege IMEWASHWA" - "Hali ya ndege IMEZIMWA" + "Hali ya ndegeni" + "Hali ya ndegeni IMEWASHWA" + "Hali ya ndegeni IMEZIMWA" "Mipangilio" "Mapendekezo" "Usaidizi wa Sauti" @@ -256,6 +263,16 @@ "Arifa" "Onyesho la duka la rejareja" "Muunganisho wa USB" + + + + + + + + + + "Mtindo salama" "Mfumo wa Android" "Badili uweke wasifu wa Binafsi" @@ -278,16 +295,14 @@ "piga na udhibiti simu" "Vihisi vya Mwili" "fikia data ya kitambuzi kuhusu alama zako muhimu" - "Rejesha maudhui ya dirisha" - "Chunguza maudhui ya dirisha unaloingiliana nalo." - "Washa Chunguza kwa Mguso" + "Kurejesha maudhui ya dirisha" + "Kuchunguza maudhui ya dirisha unalotumia." + "Kuwasha \'Chunguza kwa Kugusa\'" "Ukigonga vipengee, vitatamka maneno kwa sauti na unaweza kukagua skrini kwa kutumia ishara." - "Washa ufikiaji wa wavuti ulioboreshwa" - "Hati zinaweza kusakinishwa ili kuyafanya maudhui ya programu kufikiwa zaidi." - "Angalia maandishi unayoyacharaza" + "Kuangalia maandishi unayoyacharaza" "Inajumuisha data binafsi kama vile nambari za kadi ya mkopo na manenosiri." - "Dhibiti ukuzaji wa onyesho" - "Dhibiti kiwango cha kukuza na nafasi cha onyesho." + "Kudhibiti ukuzaji wa onyesho" + "Kudhibiti kiwango cha kukuza na nafasi cha onyesho." "Tekeleza ishara" "Unaweza kugonga, kutelezesha kidole, kubana na kutekeleza ishara zingine." "Ishara za alama ya kidole" @@ -1067,7 +1082,7 @@ "Mchakato wa %1$s umezidi kiwango kinachotakikana cha hifadhi cha %2$s. 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." "Chagua kitendo kwa ajili ya maandishi" "Sauti ya mlio" - "Sauti ya media" + "Sauti ya muziki" "Inacheza kupitia Bluetooth" "Mlio wa simu ulionyamaza umewekwa" "Sauti ya simu inayoendelea" @@ -1176,7 +1191,7 @@ "SHIRIKI" "KATAA" "Badilisha kibodi" - "Iweke kwenye skrini wakati kibodi inapotumika" + "Ionyeshe kwenye skrini wakati kibodi halisi inatumika" "Onyesha kibodi pepe" "Sanidi kibodi halisi" "Gonga ili uchague lugha na muundo" @@ -1601,7 +1616,7 @@ "Imesakinishwa na msimamizi wako" "Imesasishwa na msimamizi wako" "Imefutwa na msimamizi wako" - "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." + "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." "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." "Ungependa Kuwasha Kiokoa Data?" "Washa" @@ -1681,7 +1696,7 @@ "Ongeza lugha" "Mapendeleo ya eneo" "Weka jina la lugha" - "Inayopendekezwa" + "Zinazopendekezwa" "Lugha zote" "Maeneo yote" "Tafuta" @@ -1730,11 +1745,12 @@ "Badilisha iwe katika hali ya maandishi wakati wa kuweka muda." "Badilisha umbo liwe la saa ya mishale wakati wa kuweka muda." "Chaguo za kujaza otomatiki" + "Hifadhi kwa ajili ya Kujaza Kiotomatiki" "Maudhui hayawezi kujazwa kiotomatiki" - "Ungependa kuhifadhi kwenye %1$s?" - "Ungependa kuhifadhi %1$s kwenye %2$s?" - "Ungependa kuhifadhi %1$s, %2$s kwenye %3$s?" - "Ungependa kuhifadhi %1$s, %2$s, %3$s kwenye %4$s?" + "Ungependa kuhifadhi kwenye <b>%1$s</b>?" + "Ungependa kuhifadhi %1$s kwenye <b>%2$s</b>?" + "Ungependa kuhifadhi %1$s na %2$s kwenye <b>%3$s</b>?" + "Ungependa kuhifadhi %1$s, %2$s, na %3$s kwenye <b>%4$s</b>?" "Hifadhi" "Hapana, asante" "nenosiri" diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 1f817576ce2899e3de0596a3d36f0b91e6346564..7062e9834f89a0a21a65692cf8cad12656a158b5 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -99,6 +99,13 @@ "உங்கள் தொலைத்தொடர்பு நிறுவனம் குரல் மற்றும் அவசர அழைப்புகளை இந்த இடத்தில் தற்காலிகமாக நிறுத்தியுள்ளது" "நெட்வொர்க்குடன் இணைக்க முடியவில்லை" "பெறுதலை மேம்படுத்த, சாதனம் > நெட்வொர்க் & இணையம் > மொபைல் நெட்வொர்க்குகள் > விரும்பும் நெட்வொர்க் வகை என்பதற்குச் சென்று, தேர்ந்தெடுத்த வகையை மாற்றவும்." + "விழிப்பூட்டல்கள்" + "அழைப்புப் பகிர்வு" + "அவசரகாலத் திரும்ப அழைக்கும் பயன்முறை" + "மொபைல் தரவு விழிப்பூட்டல்கள்" + "SMS செய்திகள்" + "குரலஞ்சல் செய்திகள்" + "வைஃபை அழைப்பு" "TTY Mode FULLஐ இணைச் செயல்பாடு கோரியது" "TTY Mode HCOஐ இணைச் செயல்பாடு கோரியது" "TTY Mode VCOஐ இணைச் செயல்பாடு கோரியது" @@ -258,6 +265,16 @@ "விழிப்பூட்டல்கள்" "விற்பனையாளர் டெமோ" "USB இணைப்பு" + + + + + + + + + + "பாதுகாப்பு பயன்முறை" "Android அமைப்பு" "தனிப்பட்ட சுயவிவரத்திற்கு மாறு" @@ -284,8 +301,6 @@ "நீங்கள் பணியாற்றி கொண்டிருக்கும் சாளரத்தின் உள்ளடக்கத்தைப் பார்க்கலாம்." "தொடுவதன் மூலம் அறிவதை இயக்கும்" "தட்டிய உருப்படிகள் சத்தமாகப் படிக்கப்படும், சைகைகளைப் பயன்படுத்தி திரையில் உலாவலாம்." - "மேம்பட்ட இணைய அணுகல்தன்மையை இயக்கும்" - "பயன்பாட்டு உள்ளடக்கத்தை மேலும் எளிதாக அணுகக்கூடியதாக்க ஸ்கிரிப்ட்கள் நிறுவப்படலாம்." "நீங்கள் தட்டச்சு செய்யும் உரையைக் கவனிக்கும்" "கிரெடிட் கார்டு எண்கள் மற்றும் கடவுச்சொற்கள் போன்ற தனிப்பட்ட தகவலும் உள்ளடங்கும்." "திரையின் உருப்பெருக்கத்தைக் கட்டுப்படுத்துதல்" @@ -1733,11 +1748,12 @@ "உரை உள்ளீட்டிற்காக, கடிகாரப் பயன்முறைக்கு மாற்றும்." "நேர உள்ளீட்டிற்காக, கடிகாரப் பயன்முறைக்கு மாற்றும்." "தன்னிரப்பி விருப்பங்கள்" + "தன்னிரப்பியில் சேமி" "உள்ளடக்கத்தைத் தானாக நிரப்ப முடியவில்லை" - "%1$s இல் சேமிக்கவா?" - "%1$s%2$s இல் சேமிக்கவா?" - "%1$s, %2$s ஆகியவற்றை %3$s இல் சேமிக்கவா?" - "%1$s, %2$s, %3$s ஆகியவற்றை %4$s இல் சேமிக்கவா?" + "<b>%1$s</b> இல் சேமிக்கவா?" + "%1$sஐ <b>%2$s</b> இல் சேமிக்கவா?" + "%1$s மற்றும் %2$sஐ <b>%3$s</b> இல் சேமிக்கவா?" + "%1$s, %2$s, %3$s ஆகியவற்றை <b>%4$s</b> இல் சேமிக்கவா?" "சேமி" "வேண்டாம்" "கடவுச்சொல்" diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 0fb49d57bbc8b15e4e90b949f89091a7725a3405..31e27215337715cec223427c74c058bb02832cd3 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -99,6 +99,13 @@ "మీ క్యారియర్ ఈ స్థానంలో వాయిస్ మరియు అత్యవసర కాల్‌లను తాత్కాలికంగా నిలిపివేసింది" "నెట్‌వర్క్‌ను చేరుకోలేరు" "స్వీకరణను మెరుగుపరచాలంటే, సిస్టమ్ > నెట్‌వర్క్ & ఇంటర్నెట్ > మొబైల్ నెట్‌వర్క్‌లు > ప్రాధాన్య నెట్‌వర్క్ రకంలో మీరు ఎంచుకున్న రకాన్ని మార్చి ప్రయత్నించండి." + "హెచ్చరికలు" + "కాల్ ఫార్వార్డింగ్" + "అత్యవసర కాల్‌బ్యాక్ మోడ్" + "మొబైల్ డేటా హెచ్చరికలు" + "SMS సందేశాలు" + "వాయిస్ మెయిల్ సందేశాలు" + "Wi-Fi కాలింగ్" "అవతలి వారు FULL TTY మోడ్‌ని అభ్యర్థించారు" "అవతలి వారు HCO TTY మోడ్‌ని అభ్యర్థించారు" "అవతలి వారు VCO TTY మోడ్‌ని అభ్యర్థించారు" @@ -258,6 +265,16 @@ "హెచ్చరికలు" "రిటైల్ డెమో" "USB కనెక్షన్" + + + + + + + + + + "సురక్షిత మోడ్" "Android సిస్టమ్" "వ్యక్తిగతానికి మార్చు" @@ -281,11 +298,9 @@ "శరీర సెన్సార్‌లు" "మీ అత్యంత కీలకమైన గుర్తుల గురించి సెన్సార్ డేటాని ప్రాప్యత చేస్తుంది" "విండో కంటెంట్‍ను తిరిగి పొందుతుంది" - "మీరు పరస్పర చర్య చేస్తున్న విండో కంటెంట్‌‍ను పరిశీలించండి." + "మీరు పరస్పర చర్య చేస్తున్న విండో కంటెంట్‌‍ను పరిశీలిస్తుంది." "తాకడం ద్వారా విశ్లేషణను ప్రారంభిస్తుంది" "నొక్కిన అంశాలు బిగ్గరగా చదివి వినిపించబడతాయి మరియు సంజ్ఞలను ఉపయోగించి స్క్రీన్‌ను విశ్లేషించవచ్చు." - "మెరుగైన వెబ్ ప్రాప్యతను ప్రారంభిస్తుంది" - "అనువర్తన కంటెంట్‌కు మరింత సులభ ప్రాప్యత సౌలభ్యం అందించడానికి స్క్రిప్ట్‌లు ఇన్‌స్టాల్ చేయబడవచ్చు." "మీరు టైప్ చేస్తున్న వచనాన్ని పరిశీలిస్తుంది" "క్రెడిట్ కార్డు నంబర్‌లు మరియు పాస్‌వర్డ్‌ల వంటి వ్యక్తిగత డేటాను కలిగి ఉంటుంది." "డిస్‌ప్లే మాగ్నిఫికేషన్‌ను నియంత్రించండి" @@ -671,7 +686,7 @@ "ఇతరం" "అనుకూలం" "అనుకూలం" - "సహాయకం" + "అసిస్టెంట్" "సోదరుడు" "బిడ్డ" "జీవిత భాగస్వామి" @@ -1604,7 +1619,7 @@ "మీ నిర్వాహకులు ఇన్‌స్టాల్ చేసారు" "మీ నిర్వాహకులు నవీకరించారు" "మీ నిర్వాహకులు తొలగించారు" - "బ్యాటరీ జీవితకాలాన్ని మెరుగుపరచడంలో సహాయపడటానికి, బ్యాటరీ సేవర్ మీ పరికరం పనితీరును తగ్గిస్తుంది మరియు వైబ్రేషన్‌ను, స్థాన సేవలను మరియు ఎక్కువ నేపథ్య డేటాను పరిమితం చేస్తుంది. ఇమెయిల్, మెసేజింగ్ మరియు సమకాలీకరణపై ఆధారపడే ఇతర అనువర్తనాలు మీరు వాటిని తెరిస్తే మినహా నవీకరించబడవు.\n\nమీ పరికరం ఛార్జ్ అవుతున్నప్పుడు బ్యాటరీ సేవర్ స్వయంచాలకంగా ఆఫ్ అవుతుంది." + "బ్యాటరీ జీవితకాలాన్ని మెరుగుపరచడంలో సహాయపడటానికి, బ్యాటరీ సేవర్ మీ పరికరం పనితీరును తగ్గిస్తుంది మరియు వైబ్రేషన్‌ను, స్థాన సేవలను మరియు అత్యధిక నేపథ్య డేటాను పరిమితం చేస్తుంది. ఇమెయిల్, మెసేజింగ్ మరియు సమకాలీకరణపై ఆధారపడే ఇతర అనువర్తనాలు మీరు వాటిని తెరిస్తే మినహా నవీకరించబడవు.\n\nమీ పరికరం ఛార్జ్ అవుతున్నప్పుడు బ్యాటరీ సేవర్ స్వయంచాలకంగా ఆఫ్ అవుతుంది." "డేటా వినియోగాన్ని తగ్గించడంలో సహాయకరంగా ఉండటానికి, డేటా సేవర్ కొన్ని అనువర్తనాలను నేపథ్యంలో డేటాను పంపకుండా లేదా స్వీకరించకుండా నిరోధిస్తుంది. మీరు ప్రస్తుతం ఉపయోగిస్తున్న అనువర్తనం డేటాను ప్రాప్యత చేయగలదు కానీ అలా అరుదుగా చేయవచ్చు. అంటే, ఉదాహరణకు, మీరు ఆ చిత్రాలను నొక్కే వరకు అవి ప్రదర్శించబడవు." "డేటా సేవర్‌ను ఆన్ చేయాలా?" "ఆన్ చేయి" @@ -1733,11 +1748,12 @@ "సమయాన్ని నమోదు చేయడం కోసం వచన నమోదు మోడ్‌కి మారండి." "సమయాన్ని నమోదు చేయడం కోసం గడియారం మోడ్‌కు మారండి." "స్వీయ పూరింపు ఎంపికలు" + "స్వీయ పూరింపు కోసం సేవ్ చేయండి" "కంటెంట్‌లను స్వీయ పూరింపు చేయడం సాధ్యపడదు" - "%1$sకు సేవ్ చేయాలా?" - "%1$sని %2$sకు సేవ్ చేయాలా?" - "%1$s, %2$sలను %3$sకు సేవ్ చేయాలా?" - "%1$s, %2$s, %3$sలను %4$sకు సేవ్ చేయాలా?" + "<b>%1$s</b>కు సేవ్ చేయాలా?" + "%1$sని <b>%2$s</b>కు సేవ్ చేయాలా?" + "%1$s మరియు %2$sలను <b>%3$s</b>కు సేవ్ చేయాలా?" + "%1$s, %2$s మరియు %3$sలను <b>%4$s</b>కు సేవ్ చేయాలా?" "సేవ్ చేయి" "వద్దు, ధన్యవాదాలు" "పాస్‌వర్డ్" diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index ed22eef6756614affe001d7390c26b5b85763dc2..fd7158ffa55460ff30d7e8e4ee61d3ade7e83d31 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -99,6 +99,13 @@ "ผู้ให้บริการของคุณระงับการโทรด้วยเสียงและหมายเลขฉุกเฉินที่นี่ชั่วคราว" "เข้าถึงเครือข่ายไม่ได้" "เพื่อให้การรับสัญญาณดีขึ้น ลองเปลี่ยนประเภทที่เลือกใน \"การตั้งค่า\" > \"เครือข่ายและอินเทอร์เน็ต\" > \"เครือข่ายมือถือ\" > \"ประเภทเครือข่ายที่ต้องการ\"" + "การแจ้งเตือน" + "การโอนสาย" + "โหมดติดต่อกลับฉุกเฉิน" + "การแจ้งเตือนอินเทอร์เน็ตมือถือ" + "ข้อความ SMS" + "ข้อความเสียง" + "การโทรผ่าน Wi-Fi" "อีกฝั่งหนึ่งขอโหมด TTY เป็น \"เต็ม\"" "อีกฝั่งหนึ่งขอโหมด TTY เป็น \"HCO\"" "อีกฝั่งหนึ่งขอโหมด TTY เป็น \"VCO\"" @@ -258,6 +265,16 @@ "การแจ้งเตือน" "การสาธิตสำหรับผู้ค้าปลีก" "การเชื่อมต่อ USB" + + + + + + + + + + "โหมดปลอดภัย" "ระบบ Android" "เปลี่ยนไปใช้โปรไฟล์ส่วนตัว" @@ -284,8 +301,6 @@ "ตรวจสอบเนื้อหาของหน้าต่างที่คุณกำลังโต้ตอบอยู่" "เปิด \"แตะเพื่อสำรวจ\"" "ระบบจะพูดออกเสียงรายการที่แตะและหน้าจอสามารถสำรวจได้ด้วยท่าทางสัมผัส" - "เปิดการเข้าถึงเว็บที่มีประสิทธิภาพมากขึ้น" - "อาจติดตั้งสคริปต์เพื่อทำให้สามารถเข้าถึงเนื้อหาแอปได้ง่ายขึ้น" "สังเกตข้อความที่คุณพิมพ์" "รวมถึงข้อมูลส่วนบุคคล เช่น หมายเลขบัตรเครดิตและรหัสผ่าน" "ควบคุมการขยายการแสดงผล" @@ -1732,11 +1747,12 @@ "สลับไปโหมดป้อนข้อความเพื่อป้อนเวลา" "สลับไปโหมดนาฬิกาเพื่อป้อนเวลา" "ตัวเลือกในการป้อนอัตโนมัติ" + "บันทึกไว้ป้อนอัตโนมัติ" "ไม่สามารถป้อนเนื้อหาอัตโนมัติ" - "บันทึกไปยัง %1$s ใช่ไหม" - "บันทึก %1$s ไปยัง %2$s ใช่ไหม" - "บันทึก %1$s, %2$s ไปยัง %3$s ไหม" - "บันทึก %1$s, %2$s, %3$s ไปยัง %4$s ไหม" + "บันทึกไปยัง <b>%1$s</b> ใช่ไหม" + "บันทึก %1$s ไปยัง <b>%2$s</b> ใช่ไหม" + "บันทึก %1$s และ %2$s ไปยัง <b>%3$s</b> ใช่ไหม" + "บันทึก %1$s %2$s และ %3$s ไปยัง <b>%4$s</b> ใช่ไหม" "บันทึก" "ไม่เป็นไร" "รหัสผ่าน" diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 8b5962f70c57c427a5855b35078ba85deff757dc..e58f62ff0d10598b5e4fe80d738293dd6eeb9217 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -99,6 +99,13 @@ "Pansamantalang sinuspinde ng iyong carrier ang mga voice call at emergency na tawag sa lokasyong ito" "Hindi maabot ang network" "Upang lumakas ang reception, subukang baguhin ang uring napili sa System > Network at Internet > Mga mobile network > Gustong uri ng network." + "Mga Alerto" + "Pagpasa ng tawag" + "Emergency callback mode" + "Mga alerto ng mobile data" + "Mga mensaheng SMS" + "Mga mensahe sa voicemail" + "Pagtawag gamit ang Wi-Fi" "Hiniling ng peer ang TTY Mode FULL" "Hiniling ng peer ang TTY Mode HCO" "Hiniling ng peer ang TTY Mode VCO" @@ -258,6 +265,16 @@ "Mga Alerto" "Retail demo" "Koneksyon ng USB" + + + + + + + + + + "Safe mode" "Android System" "Lumipat sa Personal" @@ -270,7 +287,7 @@ "i-access ang iyong kalendaryo" "SMS" "magpadala at tumingin ng mga mensaheng SMS" - "Imbakan" + "Storage" "i-access ang mga larawan, media at file sa iyong device" "Mikropono" "mag-record ng audio" @@ -284,8 +301,6 @@ "Siyasatin ang nilalaman ng isang window kung saan ka nakikipag-ugnayan." "I-on ang Explore by Touch" "Bibigkasin nang malakas ang mga na-tap na item at mae-explore ang screen gamit ang mga galaw." - "I-on ang pinahusay na accessibility sa web" - "Maaaring mag-install ng mga script upang gawing mas naa-access ang nilalaman ng app." "Obserbahan ang tekstong tina-type mo" "May kasamang personal na data tulad ng mga numero ng credit card at password." "Kontrolin ang pag-magnify ng display" @@ -570,7 +585,7 @@ "Itakda ang pandaigdigang proxy ng device na gagamitin habang naka-enable ang patakaran. Ang may-ari ng device lang ang makakapagtakda sa pandaigdigang proxy." "Itakda screen lock password expiration" "Baguhin kung gaano kadalas dapat palitan ang password, PIN o pattern sa screen lock." - "Itakda pag-encrypt ng imbakan" + "Itakda pag-encrypt ng storage" "Hilinging naka-encrypt ang nakaimbak na data ng app." "Huwag paganahin mga camera" "Pigilan ang paggamit sa lahat ng camera ng device." @@ -1732,11 +1747,12 @@ "Lumipat sa pamamaraan ng pag-input ng text para sa input na oras." "Lumipat sa mode ng orasan para sa input na oras." "Mga opsyon sa autofill" + "I-save para sa Autofill" "Hindi maaaring ma-autofill ang mga content" - "I-save sa %1$s?" - "I-save ang %1$s sa %2$s?" - "I-save ang %1$s, %2$s sa %3$s?" - "I-save ang %1$s, %2$s, %3$s sa %4$s?" + "I-save sa <b>%1$s</b>?" + "I-save ang %1$s sa <b>%2$s</b>?" + "I-save ang %1$s at %2$s sa <b>%3$s</b>?" + "I-save ang %1$s, %2$s, at %3$s sa <b>%4$s</b>?" "I-save" "Hindi, salamat na lang" "password" diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 7be1384f8a66aae8de103b2d796c382533130c3b..e39543596c96824373ef6fb639746103c0626f0e 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -99,6 +99,13 @@ "Operatörünüz bu konumdaki sesli ve acil durum çağrılarını geçici olarak askıya aldı" "Ağa erişilemiyor" "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." + "Uyarılar" + "Çağrı yönlendirme" + "Acil geri arama modu" + "Mobil veri uyarıları" + "SMS mesajları" + "Sesli mesajlar" + "Kablosuz çağrı" "Karşı taraf TTY Modunu TAM yaptı" "Karşı taraf TTY Modunu HCO yaptı" "Karşı taraf TTY Modunu VCO yaptı" @@ -258,6 +265,16 @@ "Uyarılar" "Mağaza demo" "USB bağlantısı" + + + + + + + + + + "Güvenli mod" "Android Sistemi" "Kişisel Profile Geç" @@ -284,14 +301,12 @@ "Etkileşim kurduğunuz pencerenin içeriğini inceler." "Dokunarak Keşfet\'i açma" "Dokunulan öğeler sesli olarak okunur ve ekranı keşfetmek için hareketler kullanılabilir." - "Gelişmiş web erişilebilirliğini açma" - "Uygulamanın erişilebilirliğini artırmak için komut dosyaları yüklenebilir." "Yazdığınız metni izleme" "Kredi kartı ve şifre gibi kişisel bilgiler içerir." - "Ekran büyütecini kontrol et" + "Ekran büyütecini kontrol etme" "Ekranın yakınlaştırma seviyesini ve konumunu kontrol edin." "Haraketleri yapma" - "Hafifçe dokunabilir, hızlıca kaydırabilir, sıkıştırabilir ve diğer hareketleri yapabilirsiniz." + "Dokunabilir, hızlıca kaydırabilir, sıkıştırabilir ve diğer hareketleri yapabilirsiniz." "Parmak izi hareketleri" "Cihazların parmak izi sensörlerinde gerçekleştirilen hareketleri yakalayabilir." "durum çubuğunu devre dışı bırak veya değiştir" @@ -1181,7 +1196,7 @@ "Fiziksel klavye etkin durumdayken ekranda tut" "Sanal klavyeyi göster" "Fiziksel klavyeyi yapılandırın" - "Dili ve düzeni seçmek için hafifçe dokunun" + "Dili ve düzeni seçmek için dokunun" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" "%s, diğer uygulamaların üzerinde görüntüleniyor" @@ -1268,8 +1283,8 @@ "Bildirim sıralama hizmeti" "VPN etkinleştirildi" "VPN, %s tarafından etkinleştirildi" - "Ağı yönetmek için hafifçe vurun." - "%s oturumuna bağlı. Ağı yönetmek için hafifçe vurun." + "Ağı yönetmek için dokunun." + "%s oturumuna bağlı. Ağı yönetmek için dokunun." "Her zaman açık VPN\'ye bağlanılıyor…" "Her zaman açık VPN\'ye bağlanıldı" "Her zaman açık VPN bağlantısı kesildi" @@ -1732,11 +1747,12 @@ "Zaman girişi için metin girişi moduna geçin." "Zaman girişi için saat moduna geçin." "Otomatik doldurma seçenekleri" + "Otomatik Doldurma için kaydedin" "İçerikler otomatik doldurulamıyor" - "%1$s hizmetine kaydedilsin mi?" - "%1$s, %2$s etkinliğine kaydedilsin mi?" - "%1$s ve %2$s bilgileri %3$s hizmetine kaydedilsin mi?" - "%1$s, %2$s ve %3$s bilgileri %4$s hizmetine kaydedilsin mi?" + "<b>%1$s</b> hizmetine kaydedilsin mi?" + "%1$s, <b>%2$s</b> hizmetine kaydedilsin mi?" + "%1$s ve %2$s, <b>%3$s</b> hizmetine kaydedilsin mi?" + "%1$s, %2$s ve %3$s, <b>%4$s</b> hizmetine kaydedilsin mi?" "Kaydet" "Hayır, teşekkürler" "şifre" diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 6c5846d9eabe324f424c93e2b0d2d558e2823447..09cec2a54af2be0a1df8f4b75ccc485e2c1f63b5 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -101,6 +101,13 @@ "Оператор тимчасово заблокував голосові й екстрені виклики в цьому місці" "Не вдається під’єднатися до мережі" "Щоб покращити якість сигналу, змініть тип у меню \"Система\" > \"Мережа й Інтернет\" > \"Мобільні мережі\" > \"Тип мережі\"." + "Сповіщення" + "Переадресація виклику" + "Режим екстреного зворотного виклику" + "Сповіщення про мобільне передавання даних" + "SMS-повідомлення" + "Повідомлення голосової пошти" + "Дзвінки через Wi-Fi" "Пристрій змінив режим TTY на FULL" "Пристрій змінив режим TTY на HCO" "Пристрій змінив режим TTY на VCO" @@ -197,7 +204,7 @@ "Беззвуч. режим" "Увімкнути радіо" "Вимкнути радіо" - "Заблок. екран" + "Блокування екрана" "Вимкнути" "Дзвінок вимкнено" "Дзвінок на вібросигналі" @@ -221,7 +228,7 @@ "Парам. пристрою" "Параметри ТБ" "Параметри телеф." - "Заблок. екран" + "Блокування екрана" "Вимкнути" "Екстрений виклик" "Звіт про помилки" @@ -264,6 +271,16 @@ "Сповіщення" "Демо-режим для роздрібної торгівлі" "З’єднання USB" + + + + + + + + + + "Безп. режим" "Система Android" "Перейти в особистий профіль" @@ -290,8 +307,6 @@ "Перевіряти вміст вікна, з яким ви взаємодієте." "Увімкнути функцію дослідження дотиком" "Активувати голосові підказки для елементів, яких торкаються, і користуватися інтерфейсом за допомогою жестів." - "Увімкнути покращення веб-доступності" - "Можуть установлюватися сценарії, щоб зробити вміст програми доступнішим." "Переглядати текст, який ви вводите" "Включає особисті дані, як-от номери кредитних карток і паролі." "Контролювати збільшення екрана" @@ -641,7 +656,7 @@ "Інший факс" "Радіо" "Телекс" - "TTY TDD" + "Телетайп" "Роб. мобільний" "Роб. пейджер" "Помічник" @@ -651,12 +666,12 @@ "Річниця" "Інші" "Указати" - "Дом." - "Роб." + "Особиста" + "Робоча" "Інше" "Мобільний" "Указати" - "Дом." + "Домашня" "Роб." "Інше" "Указати" @@ -1317,7 +1332,7 @@ "Торкніться, щоб налаштувати" "Виберіть файл" "Не вибрано файл" - "Віднов." + "Скинути" "Надіслати" "Режим авто ввімкн." "Торкніться, щоб вийти з режиму автомобіля." @@ -1794,11 +1809,12 @@ "Перейти в текстовий режим, щоб ввести час." "Перейти в режим годинника, щоб ввести час." "Параметри автозаповнення" + "Зберегти в службі Автозаповнення" "Вміст не можна заповнити автоматично" - "Зберегти в службі %1$s?" - "Зберегти дані (%1$s) у службі %2$s?" - "Зберегти дані (%1$s і %2$s) у службі %3$s?" - "Зберегти дані (%1$s, %2$s і %3$s) у службі %4$s?" + "Зберегти дані в службі <b>%1$s</b>?" + "Зберегти дані (%1$s) у службі <b>%2$s</b>?" + "Зберегти дані (%1$s і %2$s) у службі <b>%3$s</b>?" + "Зберегти дані (%1$s, %2$s і %3$s) у службі <b>%4$s</b>?" "Зберегти" "Ні, дякую" "пароль" diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index ccaa412ab18116595da76233677b9a84ce05df77..225faa65cfc2adc46246ce03bd6d1494edbe7c6f 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -99,6 +99,13 @@ "آپ کے کیریئر نے عارضی طور پر اس مقام پر صوتی اور ہنگامی کالز کو معطل کر دیا ہے" "نیٹ ورک تک نہیں پہنچا جا سکتا" "‏ریسپشن کو بہتر بنانے کیلئے، سسٹم ‎> نیٹ ورک اور انٹرنیٹ ‎> موبائل نیٹ ورکس ‎> ترجیحی نیٹ ورک کی قسم تبدیل کرنے کی کوشش کریں۔" + "الرٹس" + "کال آگے منتقل کرنا" + "ہنگامی کال بیک وضع" + "موبائل ڈیٹا الرٹس" + "‏SMS پیغامات" + "صوتی میل پیغامات" + "‏Wi-Fi کالنگ" "‏ہمسر نے TTY وضع مکمل کی درخواست کی" "‏ہمسر نے TTY وضع HCO کی درخواست کی" "‏ہمسر نے TTY وضع VCO کی درخواست کی" @@ -258,6 +265,16 @@ "الرٹس" "ریٹیل ڈیمو" "‏USB کنکشن" + + + + + + + + + + "حفاظتی وضع" "‏Android سسٹم" "ذاتی پر سوئچ کریں" @@ -284,8 +301,6 @@ "کسی ایسی ونڈو کے مواد کا معائنہ کریں جس کے ساتھ آپ تعامل کر رہے ہیں۔" "ٹچ کے ذریعے دریافت کریں کو آن کرنے کی" "تھپتھپائے گئے آئٹمز کو باآواز بلند بولا جائے گا اور اشاروں کا استعمال کرکے اسکرین کو دریافت کیا جا سکتا ہے۔" - "بہتر ویب ایکسیسبیلٹی کو آن کرنے کی" - "ایپ کا مواد مزید قابل رسائی بنانے کیلئے اسکرپٹس کو انسٹال کیا جا سکتا ہے۔" "آپکے ٹائپ کردہ متن کا مشاہدہ کرنے کی" "اس میں ذاتی ڈیٹا جیسے کریڈٹ کارڈ نمبرز اور پاس ورڈز شامل ہیں۔" "ڈسپلے بڑا کرنے کے عمل کو کنٹرول کریں" @@ -1282,7 +1297,7 @@ "جمع کرائیں" "کار وضع فعال ہے" "کار موڈ سے خارج ہونے کیلئے تھپتھپائیں۔" - "ربط بنانا یا ہاٹ اسپاٹ فعال" + "ٹیتھرنگ یا ہاٹ اسپاٹ فعال" "سیٹ اپ کرنے کیلئے تھپتھپائیں۔" "واپس جائیں" "اگلا" @@ -1733,11 +1748,12 @@ "وقت ان پٹ کے لیے ٹیکسٹ ان پٹ وضع پر سوئچ کریں۔" "وقت ان پٹ کے لیے گھڑی و‏ضع پر سوئچ کریں۔" "آٹو فل کے اختیارات" + "آٹوفل کیلئے محفوظ کریں" "موادوں کو آٹو فل نہیں کیا جا سکتا" - "%1$s میں محفوظ کریں؟" - "%1$s کو %2$s میں محفوظ کریں؟" - "%1$s، %2$s کو %3$s میں محفوظ کریں؟" - "%1$s، %2$s، %3$s کو %4$s میں محفوظ کریں؟" + "‏<b>%1$s</b> میں محفوظ کریں؟" + "‏%1$s کو <b>%2$s</b> میں محفوظ کریں؟" + "‏%1$s اور %2$s کو <b>%3$s</b> میں محفوظ کریں؟" + "‏%1$s،%2$s، اور %3$s کو <b>%4$s</b> میں محفوظ کریں؟" "محفوظ کریں" "نہیں، شکریہ" "پاس ورڈ" diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 35e4455ecc3f95505bb26de5a197440b84ffb8cb..0e7d4ffa370aa9e68763570288ddebf3a98e0475 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -99,6 +99,13 @@ "Aloqa operatoringiz bu joyda ovozli va favqulodda chaqiruvlarni bloklagan" "Tarmoq bilan bog‘lanib bo‘lmadi" "Qabul qilish sifatini yaxshilash uchun Tizim > Tarmoq va Internet > Mobil tarmoqlar > Asosiy tarmoq turi orqali o‘zgartirib ko‘ring." + "Ogohlantirishlar" + "Chaqiruvlarni uzatish" + "Favqulodda qaytarib chaqirish rejimi" + "Mobil internetga oid ogohlantirishlar" + "SMS xabarlar" + "Ovozli xabarlar" + "Wi-Fi chaqiruv" "Teng huquqli ishtirokchi teletayp rejimini FULL (to‘liq) qilib o‘zgartirdi" "Teng huquqli ishtirokchi teletayp rejimini HCO (eshitadi, gapirolmaydi) qilib o‘zgartirdi" "Teng huquqli ishtirokchi teletayp rejimini VCO (gapiradi, eshitolmaydi) qilib o‘zgartirdi" @@ -258,6 +265,16 @@ "Ogohlantirishlar" "Demo rejim" "USB orqali ulanish" + + + + + + + + + + "Xavfsiz usul" "Android tizimi" "Shaxsiy profilga o‘tish" @@ -284,8 +301,6 @@ "Joriy oynadagi kontent mazmunini aniqlaydi." "Teginib o‘rganish xizmatini yoqadi" "Tegilgan elementlar nomini talaffuz qiladi va ekran bo‘ylab barmoq orqali kezish imkoniyatini yoqadi." - "Internet uchun maxsus imkoniyatlarni yoqadi" - "Qo‘shimcha skriptlar o‘rnatilishi mumkin." "Kiritilayotgan matnni kuzatadi" "Bunga kredit karta raqamlari va parollar kabi shaxsiy ma’lumotlar kiradi." "Ekranni kattalashtirishni boshqarish" @@ -717,7 +732,7 @@ "Televizorda SIM karta yo‘q." "Telefoningizda SIM karta yo‘q." "SIM kartani soling." - "SIM karta solinmagan yoki uni o‘qib bo‘lmaydi. SIM kartani soling." + "SIM karta solinmagan yoki u yaroqsiz. SIM kartani soling." "Foydalanib bo‘lmaydigan SIM karta." "SIM kartangiz butunlay bloklab qo‘yilgan.\n Yangi SIM karta olish uchun aloqa operatoringiz bilan bog‘laning." "Avvalgi musiqa" @@ -1169,7 +1184,7 @@ "USB jihozga ulangan" "Boshqa parametrlarini ko‘rish uchun bosing." "USB orqali nosozliklarni tuzatish" - "O‘chirib qo‘yish uchun bu yerga bosing." + "Faolsizlantirish uchun bu yerga bosing." "Xatoliklar hisoboti olinmoqda…" @@ -1733,11 +1748,12 @@ "Vaqtni kiritish uchun matn kiritish rejimiga o‘ting." "Vaqtni kiritish uchun soat rejimiga o‘ting." "Avtomatik to‘ldirish parametrlari" + "Avtomatik to‘ldirish xizmatiga saqlash" "Avtomatik to‘ldirib bo‘lmaydi" - "%1$s xizmatiga saqlansinmi?" - "%1$s %2$s xizmatiga saqlansinmi?" - "%1$s, %2$s ma’lumotlari %3$s ichiga saqlansinmi?" - "%1$s, %2$s, %3$s ma’lumotlari %4$s ichiga saqlansinmi?" + "<b>%1$s</b> xizmatiga saqlansinmi?" + "%1$s <b>%2$s</b> xizmatiga saqlansinmi?" + "%1$s va %2$s <b>%3$s</b> xizmatiga saqlansinmi?" + "%1$s, %2$s va %3$s <b>%4$s</b> xizmatiga saqlansinmi?" "Saqlash" "Yo‘q, kerak emas" "parol" diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index c85f41393ba60bb0c5acb738e351a9c8f325879f..f2ba67166230ae4bd7da8b3461f0863d0f0736ff 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -99,6 +99,13 @@ "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" "Không thể kết nối mạng" "Để 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." + "Thông báo" + "Chuyển tiếp cuộc gọi" + "Chế độ gọi lại khẩn cấp" + "Thông báo dữ liệu di động" + "Tin nhắn SMS" + "Thư thoại" + "Gọi qua Wi-Fi" "TTY theo yêu cầu của thiết bị ngang hàng ở chế độ ĐẦY ĐỦ" "TTY theo yêu cầu của thiết bị ngang hàng ở chế độ HCO" "TTY theo yêu cầu của thiết bị ngang hàng ở chế độ VCO" @@ -258,6 +265,16 @@ "Cảnh báo" "Giới thiệu bán lẻ" "Kết nối USB" + + + + + + + + + + "Chế độ an toàn" "Hệ thống Android" "Chuyển sang Cá nhân" @@ -284,8 +301,6 @@ "Kiểm tra nội dung của cửa sổ bạn đang tương tác." "Bật Khám phá bằng cách chạm" "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ỉ." - "Bật khả năng truy cập web nâng cao" - "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." "Xem nội dung bạn nhập" "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." "Kiểm soát thu phóng màn hình" @@ -1732,11 +1747,12 @@ "Chuyển sang chế độ nhập văn bản để nhập thời gian." "Chuyển sang chế độ đồng hồ để nhập thời gian." "Tùy chọn tự động điền" + "Lưu cho Tự động điền" "Không thể tự động điền nội dung" - "Lưu vào %1$s?" - "Lưu %1$s vào %2$s?" - "Lưu %1$s, %2$s vào %3$s?" - "Lưu %1$s, %2$s, %3$s vào %4$s?" + "Lưu vào <b>%1$s</b>?" + "Lưu %1$s vào <b>%2$s</b>?" + "Lưu %1$s%2$s vào <b>%3$s</b>?" + "Lưu %1$s, %2$s%3$s vào <b>%4$s</b>?" "Lưu" "Không, cảm ơn" "mật khẩu" diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 2d1a20b071f51fcd31163154a896666f9c6d41af..6e35e3f9cbce668d32c782fff4a1b56bbe5f2796 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -99,6 +99,13 @@ "您的运营商在此位置暂时不提供语音通话和紧急呼救服务" "无法连接网络" "要改善信号情况,请尝试更改在“系统”>“网络和互联网”>“移动网络”>“首选网络类型”中选择的类型。" + "提醒" + "来电转接" + "紧急回拨模式" + "移动数据提醒" + "短信" + "语音邮件" + "WLAN 通话" "对方请求使用“TTY 完整”模式" "对方请求使用“TTY HCO”模式" "对方请求使用“TTY VCO”模式" @@ -258,6 +265,16 @@ "提醒" "零售演示模式" "USB 连接" + + + + + + + + + + "安全模式" "Android 系统" "切换到“个人”" @@ -281,11 +298,9 @@ "身体传感器" "访问与您的生命体征相关的传感器数据" "检索窗口内容" - "检查您正与其进行互动的窗口的内容。" + "检测您正访问的窗口的内容。" "启用触摸浏览" "设备将大声读出您点按的内容,同时您可以通过手势来浏览屏幕。" - "启用网页无障碍增强功能" - "可能会安装程序以便访问应用的内容。" "监测您输入的文字" "包含个人数据,例如信用卡号和密码。" "控制显示内容放大功能" @@ -1123,7 +1138,7 @@ "发件人:" "收件人:" "输入所需的PIN码:" - "PIN码:" + "PIN 码:" "平板电脑连接到“%1$s”时会暂时断开与WLAN的连接" "电视连接到%1$s时会暂时断开与 WLAN 的连接" "手机连接到%1$s时会暂时断开与WLAN的连接。" @@ -1178,7 +1193,7 @@ "分享" "拒绝" "更改键盘" - "连接到实体键盘时使其在屏幕上保持显示状态" + "开启后,连接到实体键盘时,它会一直显示在屏幕上" "显示虚拟键盘" "配置实体键盘" "点按即可选择语言和布局" @@ -1732,11 +1747,12 @@ "切换到文字输入模式来输入时间。" "切换到时钟模式来输入时间。" "自动填充选项" + "保存以便用于自动填充" "无法自动填充内容" - "要保存到%1$s吗?" - "要将%1$s保存到%2$s吗?" - "要将%1$s%2$s保存到%3$s吗?" - "要将%1$s%2$s%3$s保存到%4$s吗?" + "要保存到<b>%1$s</b>吗?" + "要将%1$s保存到<b>%2$s</b>吗?" + "要将%1$s%2$s保存到<b>%3$s</b>吗?" + "要将%1$s%2$s%3$s保存到<b>%4$s</b>吗?" "保存" "不用了" "密码" diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 902cfea8f65b819e2869117f48eb2f1b0f40dbef..74f498725b476ebcc5e87e824a4183dfa72e6877 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -72,8 +72,8 @@ "本機號碼" "連接線識別功能" "連接線識別限制" - "來電轉接" - "來電待接" + "來電轉駁" + "來電等候" "通話限制" "密碼更改" "更改 PIN" @@ -99,7 +99,14 @@ "您的流動網絡供應商已在此地點暫時停權語音和緊急通話" "無法連接網絡" "如要改善接收品質,請前往 [系統] > [網絡與互聯網] > [流動網絡] > [偏好的網絡類型],然後變更所選的網絡類型。" - "對方曾要求 TTY 模式 (FULL)" + "通知" + "來電轉駁" + "緊急回撥模式" + "流動數據通知" + "短訊" + "留言訊息" + "Wi-Fi 通話" + "對方曾要求 TTY 完整模式" "對方曾要求 TTY 模式 (HCO)" "對方曾要求 TTY 模式 (VCO)" "對方曾要求 TTY 模式 (OFF)" @@ -258,6 +265,16 @@ "通知" "零售示範" "USB 連線" + + + + + + + + + + "安全模式" "Android 系統" "切換至個人設定檔" @@ -284,8 +301,6 @@ "檢查您使用中的視窗內容。" "開啟「輕觸探索」功能" "朗讀您輕按的項目,並可讓您使用手勢探索螢幕。" - "開啟增強版網頁無障礙設定" - "可能會安裝程式碼,使應用程式內容更易於存取。" "記錄您輸入的文字" "包括個人資料,如信用卡號碼和密碼。" "控制顯示屏的放大功能" @@ -1021,7 +1036,7 @@ "「%1$s」不斷停止運作" "「%1$s」不斷停止運作" "再次開啟應用程式" - "傳送意見反映" + "傳送意見" "關閉" "忽略直至裝置重新啟動" "等一下" @@ -1603,7 +1618,7 @@ "已由您的管理員安裝" "已由您的管理員更新" "已由您的管理員刪除" - "節約電池用量模式有助於延長電池壽命,但這會降低裝置效能,並限制震動、定位服務及大部分背景數據傳輸。除非您啟用,否則電郵、短訊及其他需要使用同步功能的應用程式均不會更新。\n\n當裝置充電時,節約電池用量模式會自動關閉。" + "為延長電池壽命,省電模式會降低裝置效能,並限制震動、位置資訊服務及大部分背景數據傳輸。如電郵、短訊及其他使用同步功能的應用程式沒有開啟,便不會自動更新。\n\n裝置充電時,省電模式會自動關閉。" "「數據節省程式」可防止部分應用程式在背景收發資料,以節省數據用量。您正在使用的應用程式雖可存取資料,但次數可能會減少。例如,圖片可能需要輕按才會顯示。" "要啟用數據節省程式嗎?" "開啟" @@ -1732,11 +1747,12 @@ "切換至文字輸入模式即可輸入時間。" "切換至時鐘模式即可輸入時間。" "自動填入選項" + "儲存資料,方便您自動填入" "無法自動填入內容" - "要儲存至 %1$s 嗎?" - "要將%1$s儲存至 %2$s 嗎?" - "要將%1$s%2$s儲存至「%3$s」嗎?" - "要將%1$s%2$s%3$s儲存至「%4$s」嗎?" + "要儲存至「<b>%1$s</b>」嗎?" + "要將%1$s儲存至「<b>%2$s</b>」嗎?" + "要將%1$s%2$s儲存至「<b>%3$s</b>」嗎?" + "要將%1$s%2$s%3$s儲存至「<b>%4$s</b>」嗎?" "儲存" "不用了,謝謝" "密碼" diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 91c5df38c28da09bf0ad79b60b5fe2fa0effffe0..87e98dd381f2c9abff42f7c51b417704e1223323 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -54,17 +54,17 @@ "清除成功。" "密碼錯誤。" "MMI 完成。" - "您輸入的舊 PIN 不正確。" - "您輸入的 PUK 不正確。" - "您輸入的 PIN 碼不符。" + "你輸入的舊 PIN 不正確。" + "你輸入的 PUK 不正確。" + "你輸入的 PIN 碼不符。" "輸入 4~8 個數字的 PIN。" "輸入 8 位數以上的 PUK。" "SIM 卡的 PUK 已鎖定。請輸入 PUK 碼解除鎖定。" "請輸入 PUK2 以解鎖 SIM 卡。" "操作失敗,請啟用 SIM/RUIM 鎖定。" - 您還可以再試 %d 次。如果仍然失敗,SIM 卡將被鎖定。 - 您還可以再試 %d 次。如果仍然失敗,SIM 卡將被鎖定。 + 你還可以再試 %d 次。如果仍然失敗,SIM 卡將被鎖定。 + 你還可以再試 %d 次。如果仍然失敗,SIM 卡將被鎖定。 "IMEI" "MEID" @@ -88,7 +88,7 @@ "預設顯示本機號碼,但下一通電話不顯示。" "預設顯示本機號碼,下一通電話也繼續顯示。" "無法提供此服務。" - "您無法變更來電顯示設定。" + "你無法變更來電顯示設定。" "無法使用數據連線服務" "無法使用緊急通話服務" "無法使用語音通話服務" @@ -99,6 +99,13 @@ "你的電信業者在這個地點暫時不提供語音和緊急通話服務" "無法連上網路" "如要改善收訊狀況,請依序開啟 [系統] > [網路與網際網路] > [行動網路] > [偏好的網路類型],然後選取其他網路類型。" + "快訊" + "來電轉接" + "緊急回撥模式" + "行動數據快訊" + "簡訊" + "語音留言" + "Wi-Fi 通話" "通訊對象要求使用 TTY 的 FULL 模式" "通訊對象要求使用 TTY 的 HCO 模式" "通訊對象要求使用 TTY 的 VCO 模式" @@ -127,10 +134,10 @@ "正在搜尋服務" "Wi-Fi 通話" - "如要透過 Wi-FI 撥打電話及傳送訊息,請先要求您的電信業者開通這項服務,然後再到「設定」啟用 Wi-Fi 通話功能。" + "如要透過 Wi-FI 撥打電話及傳送訊息,請先要求你的電信業者開通這項服務,然後再到「設定」啟用 Wi-Fi 通話功能。" - "向您的電信業者註冊" + "向你的電信業者註冊" "%s" @@ -184,7 +191,7 @@ "你的 Work 設定檔已不在這個裝置上" "裝置受到管理" "貴機構會管理這個裝置,且可能監控網路流量。輕觸即可瞭解詳情。" - "您的裝置資料將遭到清除" + "你的裝置資料將遭到清除" "無法使用管理員應用程式,系統現在將清除你裝置中的資料。\n\n如有任何問題,請與貴機構的管理員聯絡。" "我" "平板電腦選項" @@ -205,13 +212,13 @@ "恢復原廠設定" "正在重新啟動…" "關機中…" - "您的平板電腦將會關機。" - "您的電視即將關閉。" - "您的手錶即將關機。" + "你的平板電腦將會關機。" + "你的電視即將關閉。" + "你的手錶即將關機。" "手機即將關機。" - "您要關機嗎?" + "你要關機嗎?" "重新啟動進入安全模式" - "您要重新啟動進入安全模式嗎?這會將您安裝的所有第三方應用程式全部停用。如要還原這些應用程式,只要再次重新啟動即可。" + "你要重新啟動進入安全模式嗎?這會將你安裝的所有第三方應用程式全部停用。如要還原這些應用程式,只要再次重新啟動即可。" "最新的" "沒有最近用過的應用程式。" "平板電腦選項" @@ -222,11 +229,11 @@ "緊急電話" "錯誤報告" "取得錯誤報告" - "這會收集您目前裝置狀態的相關資訊,以便透過電子郵件傳送。從錯誤報告開始建立到準備傳送的這段過程可能需要一點時間,敬請耐心等候。" + "這會收集你目前裝置狀態的相關資訊,以便透過電子郵件傳送。從錯誤報告開始建立到準備傳送的這段過程可能需要一點時間,敬請耐心等候。" "互動式報告" - "在一般情況下,建議您使用這個選項,以便追蹤報告產生進度、輸入更多與問題相關的資訊,以及擷取螢幕畫面。系統可能會省略部分較少使用的區段,藉此縮短報告產生時間。" + "在一般情況下,建議你使用這個選項,以便追蹤報告產生進度、輸入更多與問題相關的資訊,以及擷取螢幕畫面。系統可能會省略部分較少使用的區段,藉此縮短報告產生時間。" "完整報告" - "如果您的裝置沒有回應或運行速度過慢,或是當您需要所有區段的報告時,建議您使用這個選項來減少系統干擾。這個選項不支援您輸入更多資訊,也不會擷取其他螢幕畫面。" + "如果你的裝置沒有回應或運行速度過慢,或是當你需要所有區段的報告時,建議你使用這個選項來減少系統干擾。這個選項不支援你輸入更多資訊,也不會擷取其他螢幕畫面。" 系統將在 %d 秒後擷取錯誤報告的螢幕畫面。 系統將在 %d 秒後擷取錯誤報告的螢幕畫面。 @@ -258,16 +265,26 @@ "快訊" "零售商示範模式" "USB 連線" + + + + + + + + + + "安全模式" "Android 系統" "切換至個人設定檔" "切換至公司設定檔" "聯絡人" - "存取您的聯絡人" + "存取你的聯絡人" "位置" "存取這台裝置的位置資訊" "日曆" - "存取您的日曆" + "存取你的日曆" "簡訊" "傳送及查看簡訊" "儲存" @@ -279,14 +296,12 @@ "電話" "撥打電話及管理通話" "身體感應器" - "存取與您生命徵象相關的感應器資料" + "存取與你生命徵象相關的感應器資料" "擷取視窗內容" - "檢查您存取的視窗內容。" + "檢查你存取的視窗內容。" "啟用輕觸探索功能" - "朗讀您輕觸的項目,而且可讓您用手勢探索螢幕。" - "啟用強化網頁協助工具" - "可能會安裝程式碼,使應用程式內容更易於存取。" - "記錄您輸入的文字" + "朗讀你輕觸的項目,而且可讓你用手勢探索螢幕。" + "記錄你輸入的文字" "包括個人資料,如信用卡號碼和密碼。" "控管顯示畫面放大功能" "控管顯示畫面的縮放等級和位置。" @@ -309,27 +324,27 @@ "接聽電話" "允許應用程式接聽來電。" "接收簡訊 (SMS)" - "允許應用程式接收和處理簡訊。這項設定可讓應用程式監控傳送至您裝置的訊息,或在您閱讀訊息前擅自刪除訊息。" + "允許應用程式接收和處理簡訊。這項設定可讓應用程式監控傳送至你裝置的訊息,或在你閱讀訊息前擅自刪除訊息。" "接收簡訊 (MMS)" - "允許應用程式接收和處理多媒體訊息。這項設定可讓應用程式監控傳送至您裝置的訊息,或在您閱讀訊息前擅自刪除訊息。" + "允許應用程式接收和處理多媒體訊息。這項設定可讓應用程式監控傳送至你裝置的訊息,或在你閱讀訊息前擅自刪除訊息。" "讀取區域廣播訊息" - "允許應用程式讀取您裝置收到的區域廣播訊息。某些地點會發出區域廣播警示,警告您有緊急狀況發生。請注意,惡意應用程式可能會在裝置收到緊急區域廣播時,干擾裝置的效能或運作。" + "允許應用程式讀取你裝置收到的區域廣播訊息。某些地點會發出區域廣播警示,警告你有緊急狀況發生。請注意,惡意應用程式可能會在裝置收到緊急區域廣播時,干擾裝置的效能或運作。" "讀取訂閱資訊提供" "允許應用程式取得目前已同步處理的資訊提供詳細資料。" "傳送及查看簡訊" - "允許應用程式傳送簡訊,但可能產生非預期的費用。惡意應用程式可能利用此功能擅自傳送簡訊,增加您不必要的額外支出。" - "讀取您的簡訊 (SMS 或 MMS)" + "允許應用程式傳送簡訊,但可能產生非預期的費用。惡意應用程式可能利用此功能擅自傳送簡訊,增加你不必要的額外支出。" + "讀取你的簡訊 (SMS 或 MMS)" "這個應用程式可讀取所有儲存在平板電腦上的簡訊。" "這個應用程式可讀取所有儲存在電視上的簡訊。" "這個應用程式可讀取所有儲存在手機上的簡訊。" "接收簡訊 (WAP)" - "允許應用程式接收和處理 WAP 訊息。這項權限也能讓應用程式監控訊息,或在您閱讀訊息前擅自刪除訊息。" + "允許應用程式接收和處理 WAP 訊息。這項權限也能讓應用程式監控訊息,或在你閱讀訊息前擅自刪除訊息。" "擷取執行中的應用程式" "允許應用程式擷取最近執行工作的資訊。這項設定可讓應用程式找出裝置所用程式的相關資訊。" "管理個人資料和裝置擁有者" "允許應用程式設定個人資料擁有者和裝置擁有者。" "重新排序正在執行的應用程式" - "允許應用程式將工作移至前景或背景。應用程式可以自行處理,不待您操作。" + "允許應用程式將工作移至前景或背景。應用程式可以自行處理,不待你操作。" "啟用行車模式" "允許應用程式啟用車用模式。" "關閉其他應用程式" @@ -356,30 +371,30 @@ "允許應用程式傳送記憶廣播,這類廣播在廣播動作結束後仍繼續存在。請注意,過度使用此功能可能導致平板電腦使用過多的記憶體,導致平板電腦的執行速度變慢或不穩定。" "允許應用程式傳送記憶廣播,這類廣播在廣播動作結束後仍繼續存在。如果過度使用,可能會使電視佔用過多記憶體,造成運作速度變慢或穩定性降低。" "允許應用程式傳送記憶廣播,這類廣播在廣播動作結束後仍繼續存在。請注意,過度使用此功能可能導致手機使用過多的記憶體,導致手機的執行速度變慢或不穩定。" - "讀取您的聯絡人" - "允許應用程式讀取平板電腦上儲存的聯絡人資料,包括您與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式儲存您的聯絡人資料,惡意應用程式也可能私自共用聯絡人資料。" - "允許應用程式讀取電視上儲存的聯絡人資料,包括您與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式儲存您的聯絡人資料,惡意應用程式也可能會逕自洩露您的聯絡人資料。" - "允許應用程式讀取手機上儲存的聯絡人資料,包括您與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式儲存您的聯絡人資料,惡意應用程式也可能私自共用聯絡人資料。" - "修改您的聯絡人" - "允許應用程式讀取平板電腦上儲存的聯絡人資料,包括您與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式刪除聯絡人資料。" - "允許應用程式修改電視上儲存的聯絡人資料,包括您與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式刪除聯絡人資料。" - "允許應用程式讀取手機上儲存的聯絡人資料,包括您與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式刪除聯絡人資料。" + "讀取你的聯絡人" + "允許應用程式讀取平板電腦上儲存的聯絡人資料,包括你與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式儲存你的聯絡人資料,惡意應用程式也可能私自共用聯絡人資料。" + "允許應用程式讀取電視上儲存的聯絡人資料,包括你與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式儲存你的聯絡人資料,惡意應用程式也可能會逕自洩露你的聯絡人資料。" + "允許應用程式讀取手機上儲存的聯絡人資料,包括你與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式儲存你的聯絡人資料,惡意應用程式也可能私自共用聯絡人資料。" + "修改你的聯絡人" + "允許應用程式讀取平板電腦上儲存的聯絡人資料,包括你與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式刪除聯絡人資料。" + "允許應用程式修改電視上儲存的聯絡人資料,包括你與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式刪除聯絡人資料。" + "允許應用程式讀取手機上儲存的聯絡人資料,包括你與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率。這項權限可讓應用程式刪除聯絡人資料。" "讀取通話紀錄" "這個應用程式可讀取通話紀錄。" "寫入通話紀錄" - "允許應用程式修改平板電腦的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能濫用此功能刪除或修改您的通話紀錄。" - "允許應用程式修改電視的通話紀錄,包括來電和已撥電話相關資料。惡意應用程式可能會藉此清除或修改您的通話紀錄。" - "允許應用程式修改手機的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能濫用此功能刪除或修改您的通話紀錄。" + "允許應用程式修改平板電腦的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能濫用此功能刪除或修改你的通話紀錄。" + "允許應用程式修改電視的通話紀錄,包括來電和已撥電話相關資料。惡意應用程式可能會藉此清除或修改你的通話紀錄。" + "允許應用程式修改手機的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能濫用此功能刪除或修改你的通話紀錄。" "存取身體感應器 (例如心跳速率監測器)" - "允許應用程式存取感測器所收集的資料 (這類感測器可監測您的體能狀態,例如您的心跳速率)。" + "允許應用程式存取感測器所收集的資料 (這類感測器可監測你的體能狀態,例如你的心跳速率)。" "讀取日曆活動和詳細資訊" "這個應用程式可讀取所有儲存在平板電腦上的日曆活動資訊,以及共用或儲存日曆資料。" "這個應用程式可讀取所有儲存在電視上的日曆活動資訊,以及共用或儲存日曆資料。" "這個應用程式可讀取所有儲存在手機上的日曆活動資訊,以及共用或儲存日曆資料。" "在未經擁有者同意的情況下新增或修改日曆活動,以及傳送電子郵件給邀請對象" - "這個應用程式可在平板電腦上新增、移除或變更日曆活動。提醒您,這個應用程式可能會以日曆擁有者的名義傳送訊息,或是在不通知日曆擁有者的情況下變更活動內容。" - "這個應用程式可在電視上新增、移除或變更日曆活動。提醒您,這個應用程式可能會以日曆擁有者的名義傳送訊息,或是在不通知日曆擁有者的情況下變更活動內容。" - "這個應用程式可在手機上新增、移除或變更日曆活動。提醒您,這個應用程式可能會以日曆擁有者的名義傳送訊息,或是在不通知日曆擁有者的情況下變更活動內容。" + "這個應用程式可在平板電腦上新增、移除或變更日曆活動。提醒你,這個應用程式可能會以日曆擁有者的名義傳送訊息,或是在不通知日曆擁有者的情況下變更活動內容。" + "這個應用程式可在電視上新增、移除或變更日曆活動。提醒你,這個應用程式可能會以日曆擁有者的名義傳送訊息,或是在不通知日曆擁有者的情況下變更活動內容。" + "這個應用程式可在手機上新增、移除或變更日曆活動。提醒你,這個應用程式可能會以日曆擁有者的名義傳送訊息,或是在不通知日曆擁有者的情況下變更活動內容。" "接收額外的位置提供者指令" "允許應用程式存取額外位置資訊提供者指令。這項設定可能會造成應用程式干擾 GPS 或其他位置資訊來源的運作。" "存取精確位置 (以 GPS 和網路為依據)" @@ -399,7 +414,7 @@ "控制震動" "允許應用程式控制震動。" "直接撥打電話號碼" - "允許應用程式自行撥打電話,但可能產生非預期的費用或撥打非預期的電話。注意:這項權限不允許應用程式撥打緊急電話。惡意應用程式可能利用此功能擅自撥打電話,增加您不必要的額外支出。" + "允許應用程式自行撥打電話,但可能產生非預期的費用或撥打非預期的電話。注意:這項權限不允許應用程式撥打緊急電話。惡意應用程式可能利用此功能擅自撥打電話,增加你不必要的額外支出。" "存取 IMS 撥號服務" "允許應用程式自動使用 IMS 服務撥打電話。" "讀取手機狀態和識別碼" @@ -427,9 +442,9 @@ "允許應用程式變更電視的時區。" "允許應用程式變更手機的時區。" "尋找裝置上的帳戶" - "允許應用程式取得平板電腦上所記憶的帳戶清單,其中可能包括您安裝的應用程式所建立的任何帳戶。" - "允許應用程式取得電視已知的帳戶清單,可能包括您已安裝的應用程式建立的任何帳戶。" - "允許應用程式取得手機上所記憶的帳戶清單,其中可能包括您安裝的應用程式所建立的任何帳戶。" + "允許應用程式取得平板電腦上所記憶的帳戶清單,其中可能包括你安裝的應用程式所建立的任何帳戶。" + "允許應用程式取得電視已知的帳戶清單,可能包括你已安裝的應用程式建立的任何帳戶。" + "允許應用程式取得手機上所記憶的帳戶清單,其中可能包括你安裝的應用程式所建立的任何帳戶。" "查看網路連線" "允許應用程式查看網路連線相關資訊,例如有哪些網路,以及已連上哪些網路。" "擁有完整的網路存取權" @@ -443,9 +458,9 @@ "建立及中斷 Wi-Fi 連線" "允許應用程式與 Wi-Fi 存取點連線或中斷連線,並可變更 Wi-Fi 網路的裝置設定。" "允許接收 Wi-Fi 多點傳播封包" - "允許應用程式接收透過多點傳播位址傳送給 Wi-Fi 網路上所有裝置 (而不只是傳送給您的平板電腦) 的封包。這項設定會比非多點傳播模式耗用更多電力。" - "允許應用程式接收透過多點傳播位址傳送給 Wi-Fi 網路上所有裝置 (而不只是傳送給您的電視) 的封包。這項設定會比非多點傳播模式耗用更多電力。" - "允許應用程式接收透過多點傳播位址傳送給 Wi-Fi 網路上所有裝置 (而不只是傳送給您的手機) 的封包。這項設定會比非多點傳播模式耗用更多電力。" + "允許應用程式接收透過多點傳播位址傳送給 Wi-Fi 網路上所有裝置 (而不只是傳送給你的平板電腦) 的封包。這項設定會比非多點傳播模式耗用更多電力。" + "允許應用程式接收透過多點傳播位址傳送給 Wi-Fi 網路上所有裝置 (而不只是傳送給你的電視) 的封包。這項設定會比非多點傳播模式耗用更多電力。" + "允許應用程式接收透過多點傳播位址傳送給 Wi-Fi 網路上所有裝置 (而不只是傳送給你的手機) 的封包。這項設定會比非多點傳播模式耗用更多電力。" "存取藍牙設定" "允許應用程式設定本機藍牙平板電腦,以及搜尋遠端裝置並配對連線。" "允許應用程式設定本機藍牙電視,以及搜尋與配對遠端裝置。" @@ -719,7 +734,7 @@ "插入 SIM 卡。" "找不到或無法讀取 SIM 卡。請插入 SIM 卡。" "SIM 卡無法使用。" - "您的 SIM 卡已遭永久停用。\n請與您的無線網路服務供應商聯絡,以取得其他 SIM 卡。" + "你的 SIM 卡已遭永久停用。\n請與你的無線網路服務供應商聯絡,以取得其他 SIM 卡。" "上一首曲目" "下一首曲目" "暫停" @@ -733,18 +748,18 @@ "參閱《使用者指南》或與客戶服務中心聯絡。" "SIM 卡已鎖定。" "解鎖 SIM 卡中…" - "您的解鎖圖案已畫錯 %1$d 次。\n\n請在 %2$d 秒後再試一次。" - "您的密碼已輸錯 %1$d 次。\n\n請在 %2$d 秒後再試一次。" - "您的 PIN 已輸錯 %1$d 次。\n\n請在 %2$d 秒後再試一次。" - "您的解鎖圖案已畫錯 %1$d 次,如果再嘗試 %2$d 次仍未成功,系統就會要求您使用您的 Google 登入資訊解除平板電腦的鎖定狀態。\n\n請在 %3$d 秒後再試一次。" - "您已畫錯解鎖圖案 %1$d 次,目前還剩 %2$d 次嘗試機會。如果失敗次數超過限制,您就必須登入 Google 帳戶才能解鎖電視。\n\n請過 %3$d 秒後再試一次。" - "您的解鎖圖案已畫錯 %1$d 次,如果再試 %2$d 次仍未成功,系統就會要求您使用您的 Google 登入資訊解除手機的鎖定狀態。\n\n請在 %3$d 秒後再試一次。" - "您嘗試解除這個平板電腦的鎖定已失敗 %1$d 次,目前還剩 %2$d 次機會。如果失敗次數超過限制,平板電腦將恢復原廠設定,所有使用者資料都會遺失。" - "您嘗試解鎖電視已失敗 %1$d 次,目前還剩 %2$d 次機會。如果失敗次數超過限制,電視將恢復原廠設定,所有使用者資料都會遺失。" - "您嘗試解除這支手機的鎖定已失敗 %1$d 次,目前還剩 %2$d 次機會。如果失敗次數超過限制,手機將恢復原廠設定,所有使用者資料都會遺失。" - "您嘗試解除這個平板電腦的鎖定已失敗 %d 次,平板電腦現在將恢復原廠設定。" - "您嘗試解鎖電視已失敗 %d 次,電視現在將恢復原廠設定。" - "您嘗試解除這支手機的鎖定已失敗 %d 次,手機現在將恢復原廠設定。" + "你的解鎖圖案已畫錯 %1$d 次。\n\n請在 %2$d 秒後再試一次。" + "你的密碼已輸錯 %1$d 次。\n\n請在 %2$d 秒後再試一次。" + "你的 PIN 已輸錯 %1$d 次。\n\n請在 %2$d 秒後再試一次。" + "你的解鎖圖案已畫錯 %1$d 次,如果再嘗試 %2$d 次仍未成功,系統就會要求你使用你的 Google 登入資訊解除平板電腦的鎖定狀態。\n\n請在 %3$d 秒後再試一次。" + "你已畫錯解鎖圖案 %1$d 次,目前還剩 %2$d 次嘗試機會。如果失敗次數超過限制,你就必須登入 Google 帳戶才能解鎖電視。\n\n請過 %3$d 秒後再試一次。" + "你的解鎖圖案已畫錯 %1$d 次,如果再試 %2$d 次仍未成功,系統就會要求你使用你的 Google 登入資訊解除手機的鎖定狀態。\n\n請在 %3$d 秒後再試一次。" + "你嘗試解除這個平板電腦的鎖定已失敗 %1$d 次,目前還剩 %2$d 次機會。如果失敗次數超過限制,平板電腦將恢復原廠設定,所有使用者資料都會遺失。" + "你嘗試解鎖電視已失敗 %1$d 次,目前還剩 %2$d 次機會。如果失敗次數超過限制,電視將恢復原廠設定,所有使用者資料都會遺失。" + "你嘗試解除這支手機的鎖定已失敗 %1$d 次,目前還剩 %2$d 次機會。如果失敗次數超過限制,手機將恢復原廠設定,所有使用者資料都會遺失。" + "你嘗試解除這個平板電腦的鎖定已失敗 %d 次,平板電腦現在將恢復原廠設定。" + "你嘗試解鎖電視已失敗 %d 次,電視現在將恢復原廠設定。" + "你嘗試解除這支手機的鎖定已失敗 %d 次,手機現在將恢復原廠設定。" "%d 秒後再試一次。" "忘記解鎖圖案?" "帳戶解鎖" @@ -802,7 +817,7 @@ "確認瀏覽" "離開這一頁" "停留在這一頁" - "%s\n\n您確定要前往其他網頁瀏覽嗎?" + "%s\n\n你確定要前往其他網頁瀏覽嗎?" "確認" "提示:輕觸兩下即可縮放。" "自動填入功能" @@ -823,7 +838,7 @@ "教區" "區" "大公國" - "讀取您的網路書籤和紀錄" + "讀取你的網路書籤和紀錄" "允許應用程式讀取瀏覽器造訪過的所有網址紀錄,以及瀏覽器的所有書籤。注意:這項權限不適用於第三方瀏覽器或其他具備網頁瀏覽功能的應用程式。" "寫入網路書籤和紀錄" "允許應用程式修改平板電腦上儲存的瀏覽紀錄或書籤。這項設定會讓應用程式具有清除或修改瀏覽資料的權限。注意:這項權限不適用於第三方瀏覽器或其他具備網頁瀏覽功能的應用程式。" @@ -832,14 +847,14 @@ "設定鬧鐘" "允許應用程式在安裝的鬧鐘應用程式中設定鬧鐘,某些鬧鐘應用程式可能無法執行這項功能。" "新增語音留言" - "允許應用程式將訊息新增至您的語音信箱收件匣。" + "允許應用程式將訊息新增至你的語音信箱收件匣。" "修改瀏覽器地理資訊的權限" - "允許應用程式修改瀏覽器的地理位置權限。請注意,惡意應用程式可能利用此功能允許將您的位置資訊任意傳送給某些網站。" + "允許應用程式修改瀏覽器的地理位置權限。請注意,惡意應用程式可能利用此功能允許將你的位置資訊任意傳送給某些網站。" "是否記住此密碼?" "現在不要" "記住" "永不" - "您沒有開啟這個頁面的權限。" + "你沒有開啟這個頁面的權限。" "文字已複製到剪貼簿。" "更多" "[Menu] +" @@ -854,8 +869,8 @@ "提交查詢" "語音搜尋" "啟用輕觸探索?" - "%1$s 需要啟用「輕觸探索」。開啟這項功能時,系統會在您的手指輕觸螢幕上的物件時顯示或朗讀說明,您也可以執行手勢來與平板電腦互動。" - "%1$s 需要啟用「輕觸探索」。開啟這項功能時,系統會在您的手指輕觸螢幕上的物件時顯示或朗讀說明,您也可以執行手勢來與手機互動。" + "%1$s 需要啟用「輕觸探索」。開啟這項功能時,系統會在你的手指輕觸螢幕上的物件時顯示或朗讀說明,你也可以執行手勢來與平板電腦互動。" + "%1$s 需要啟用「輕觸探索」。開啟這項功能時,系統會在你的手指輕觸螢幕上的物件時顯示或朗讀說明,你也可以執行手勢來與手機互動。" "1 個月以前" "1 個月前" @@ -978,7 +993,7 @@ "瀏覽" "儲存空間即將用盡" "部分系統功能可能無法運作" - "系統儲存空間不足。請確定您已釋出 250MB 的可用空間,然後重新啟動。" + "系統儲存空間不足。請確定你已釋出 250MB 的可用空間,然後重新啟動。" "「%1$s」目前正在執行" "輕觸即可瞭解詳情或停止應用程式。" "確定" @@ -1034,7 +1049,7 @@ "確定" "回報" "等待" - "網頁沒有回應。\n\n您要結束嗎?" + "網頁沒有回應。\n\n你要結束嗎?" "應用程式已重新導向" "「%1$s」現在正在執行。" "「%1$s」原先已啟動。" @@ -1058,7 +1073,7 @@ "%1$s 執行中" "輕觸即可切換至應用程式" "切換應用程式?" - "其他應用程式已在執行中,您必須停止執行該應用程式,才能啟動新的應用程式。" + "其他應用程式已在執行中,你必須停止執行該應用程式,才能啟動新的應用程式。" "返回 %1$s" "請勿啟動新的應用程式。" "啟動 %1$s" @@ -1066,7 +1081,7 @@ "%1$s 已超出記憶體上限" "已取得記憶體快照資料;輕觸即可分享" "分享記憶體快照資料?" - "程序「%1$s」已超出 %2$s 的程序記憶體上限。系統已產生記憶體快照資料,可供您與開發人員分享。請注意:記憶體快照資料中可能包含應用程式可存取的個人資訊。" + "程序「%1$s」已超出 %2$s 的程序記憶體上限。系統已產生記憶體快照資料,可供你與開發人員分享。請注意:記憶體快照資料中可能包含應用程式可存取的個人資訊。" "選取傳送文字內容的方式" "鈴聲音量" "媒體音量" @@ -1129,25 +1144,25 @@ "手機與 %1$s 連線期間將暫時中斷 Wi-Fi 連線" "插入字元" "傳送 SMS 簡訊" - "<b></b>「%1$s」正在傳送大量簡訊。您要允許這個應用程式繼續傳送簡訊嗎?" + "<b></b>「%1$s」正在傳送大量簡訊。你要允許這個應用程式繼續傳送簡訊嗎?" "允許" "拒絕" "<b>%1$s</b> 要求將訊息傳送至 <b>%2$s</b>。" - "這""可能會透過您的行動帳戶計費""。" - "這會透過您的行動帳戶計費。" + "這""可能會透過你的行動帳戶計費""。" + "這會透過你的行動帳戶計費。" "傳送" "取消" "記住我的選擇" - "您日後可在 [設定] > [應用程式] 中進行變更。" + "你日後可在 [設定] > [應用程式] 中進行變更。" "一律允許" "一律不允許" "SIM 卡已移除" - "您必須先插入有效的 SIM 卡再重新啟動手機,才能使用行動網路。" + "你必須先插入有效的 SIM 卡再重新啟動手機,才能使用行動網路。" "完成" "SIM 卡已新增" "請重新啟動裝置,才能使用行動網路。" "重新啟動" - "要讓新的 SIM 卡正常運作,您必須先安裝電信業者提供的應用程式,並開啟該應用程式。" + "要讓新的 SIM 卡正常運作,你必須先安裝電信業者提供的應用程式,並開啟該應用程式。" "取得應用程式" "暫時不要" "已插入新的 SIM 卡" @@ -1178,7 +1193,7 @@ "分享" "拒絕" "變更鍵盤" - "有連接的實體鍵盤時保持顯示" + "連接實體鍵盤時保持顯示" "顯示虛擬鍵盤" "設定實體鍵盤" "輕觸即可選取語言和版面配置" @@ -1248,15 +1263,15 @@ "執行" "使用 %s\n撥號" "建立手機號碼為 %s\n的聯絡人" - "下列一或多個應用程式要求取得今後都可存取您帳戶的權限。" - "您確定要允許這個要求嗎?" + "下列一或多個應用程式要求取得今後都可存取你帳戶的權限。" + "你確定要允許這個要求嗎?" "存取權限要求" "允許" "拒絕" "已要求權限" "帳戶 %s 已提出\n權限要求。" - "您目前並非透過 Work 設定檔使用這個應用程式" - "您目前透過工作設定檔使用這個應用程式" + "你目前並非透過 Work 設定檔使用這個應用程式" + "你目前透過工作設定檔使用這個應用程式" "輸入法" "同步處理" "協助工具" @@ -1306,7 +1321,7 @@ "是" "否" "已超過刪除上限" - "帳戶 %3$s%2$s會刪除 %1$d 個項目。您要如何處理?" + "帳戶 %3$s%2$s會刪除 %1$d 個項目。你要如何處理?" "刪除這些項目" "復原刪除" "暫不執行" @@ -1427,7 +1442,7 @@ "輸入 SIM PIN" "輸入 PIN" "輸入密碼" - "SIM 卡已遭停用,必須輸入 PUK 碼才能繼續使用。詳情請洽您的電信業者。" + "SIM 卡已遭停用,必須輸入 PUK 碼才能繼續使用。詳情請洽你的電信業者。" "輸入所需的 PIN 碼" "確認所需的 PIN 碼" "正在解除 SIM 卡鎖定..." @@ -1444,21 +1459,21 @@ "使用者名稱或密碼無效。" "忘了使用者名稱或密碼?\n請前往 ""google.com/accounts/recovery""。" "正在檢查帳戶…" - "您的 PIN 已輸錯 %1$d 次。\n\n請在 %2$d 秒後再試一次。" - "您的密碼已輸錯 %1$d 次。\n\n請在 %2$d 秒後再試一次。" - "您的解鎖圖案已畫錯 %1$d 次。\n\n請在 %2$d 秒後再試一次。" - "您嘗試解除這個平板電腦的鎖定已失敗 %1$d 次,目前還剩 %2$d 次機會。如果失敗次數超過限制,平板電腦將恢復原廠設定,所有使用者資料都會遺失。" - "您嘗試解鎖電視已失敗 %1$d 次,目前還剩 %2$d 次機會。如果失敗次數超過限制,電視將恢復原廠設定,所有使用者資料都會遺失。" - "您嘗試解除這支手機的鎖定已失敗 %1$d 次,目前還剩 %2$d 次機會。如果失敗次數超過限制,手機將恢復原廠設定,所有使用者資料都會遺失。" - "您嘗試解除這個平板電腦的鎖定已失敗 %d 次,平板電腦現在將恢復原廠設定。" - "您嘗試解鎖電視已失敗 %d 次,電視現在將恢復原廠設定。" - "您嘗試解除這支手機的鎖定已失敗 %d 次,手機現在將恢復原廠設定。" - "您的解鎖圖案已畫錯 %1$d 次,如果再嘗試 %2$d 次仍未成功,系統就會要求您透過電子郵件帳戶解除平板電腦的鎖定狀態。\n\n請在 %3$d 秒後再試一次。" - "您已畫錯解鎖圖案 %1$d 次,目前還剩 %2$d 次嘗試機會。如果失敗次數超過限制,您就必須使用電子郵件帳戶才能解鎖電視。\n\n請過 %3$d 秒後再試一次。" - "您的解鎖圖案已畫錯 %1$d 次,如果再嘗試 %2$d 次仍未成功,系統就會要求您透過電子郵件帳戶解除手機的鎖定狀態。\n\n請在 %3$d 秒後再試一次。" + "你的 PIN 已輸錯 %1$d 次。\n\n請在 %2$d 秒後再試一次。" + "你的密碼已輸錯 %1$d 次。\n\n請在 %2$d 秒後再試一次。" + "你的解鎖圖案已畫錯 %1$d 次。\n\n請在 %2$d 秒後再試一次。" + "你嘗試解除這個平板電腦的鎖定已失敗 %1$d 次,目前還剩 %2$d 次機會。如果失敗次數超過限制,平板電腦將恢復原廠設定,所有使用者資料都會遺失。" + "你嘗試解鎖電視已失敗 %1$d 次,目前還剩 %2$d 次機會。如果失敗次數超過限制,電視將恢復原廠設定,所有使用者資料都會遺失。" + "你嘗試解除這支手機的鎖定已失敗 %1$d 次,目前還剩 %2$d 次機會。如果失敗次數超過限制,手機將恢復原廠設定,所有使用者資料都會遺失。" + "你嘗試解除這個平板電腦的鎖定已失敗 %d 次,平板電腦現在將恢復原廠設定。" + "你嘗試解鎖電視已失敗 %d 次,電視現在將恢復原廠設定。" + "你嘗試解除這支手機的鎖定已失敗 %d 次,手機現在將恢復原廠設定。" + "你的解鎖圖案已畫錯 %1$d 次,如果再嘗試 %2$d 次仍未成功,系統就會要求你透過電子郵件帳戶解除平板電腦的鎖定狀態。\n\n請在 %3$d 秒後再試一次。" + "你已畫錯解鎖圖案 %1$d 次,目前還剩 %2$d 次嘗試機會。如果失敗次數超過限制,你就必須使用電子郵件帳戶才能解鎖電視。\n\n請過 %3$d 秒後再試一次。" + "你的解鎖圖案已畫錯 %1$d 次,如果再嘗試 %2$d 次仍未成功,系統就會要求你透過電子郵件帳戶解除手機的鎖定狀態。\n\n請在 %3$d 秒後再試一次。" " — " "移除" - "要調高音量,比建議的音量更大聲嗎?\n\n長時間聆聽高分貝音量可能會使您的聽力受損。" + "要調高音量,比建議的音量更大聲嗎?\n\n長時間聆聽高分貝音量可能會使你的聽力受損。" "要使用協助工具捷徑嗎?" "啟用捷徑功能後,只要同時按下兩個音量鍵 3 秒,就能啟動協助工具功能。\n\n 目前設定的協助工具功能為:\n%1$s\n\n 如要變更設定的功能,請依序輕觸 [設定] > [協助工具]。" "停用捷徑" @@ -1603,8 +1618,8 @@ "已由你的管理員安裝" "已由你的管理員更新" "已由你的管理員刪除" - "節約耗電量模式會透過降低裝置效能、震動限制、定位服務限制和大多數背景資料運作限制等方式,延長電池續航力。此外,如果未開啟電子郵件、簡訊和其他需要使用同步功能的應用程式,系統將不會自動更新這些應用程式。\n\n當您為裝置充電時,節約耗電量模式會自動關閉。" - "「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。您目前使用的某個應用程式可以存取資料,但存取頻率可能不如平時高。舉例來說,圖片可能不會自動顯示,而必須由您輕觸後才會顯示。" + "為了延長電池續航力,節約耗電量模式會降低裝置效能,並限制震動、定位服務及大部分背景數據傳輸。此外,如果未開啟電子郵件、簡訊和其他需要使用同步功能的應用程式,系統將不會自動更新這些應用程式。\n\n當你為裝置充電時,節約耗電量模式會自動關閉。" + "「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。你目前使用的某個應用程式可以存取資料,但存取頻率可能不如平時高。舉例來說,圖片可能不會自動顯示,而必須由你輕觸後才會顯示。" "要開啟數據節省模式嗎?" "開啟" @@ -1642,7 +1657,7 @@ "結束時間:%1$s" "到%1$s 為止 (下一個鬧鐘)" "直到你關閉「零打擾」模式" - "直到您關閉「零打擾」模式" + "直到你關閉「零打擾」模式" "%1$s/%2$s" "收合" "零打擾" @@ -1651,8 +1666,8 @@ "週末" "活動" "由 %1$s 設為靜音" - "您的裝置發生內部問題,必須將裝置恢復原廠設定才能解除不穩定狀態。" - "您的裝置發生內部問題,詳情請洽裝置製造商。" + "你的裝置發生內部問題,必須將裝置恢復原廠設定才能解除不穩定狀態。" + "你的裝置發生內部問題,詳情請洽裝置製造商。" "USSD 要求已改為 DIAL 要求。" "USSD 要求已改為 SS 要求。" "USSD 要求已改為新的 USSD 要求。" @@ -1676,7 +1691,7 @@ 已選取 %1$d 個項目 "其他" - "這些通知的重要性由您決定。" + "這些通知的重要性由你決定。" "這則通知涉及特定人士,因此被歸為重要通知。" "要允許 %1$s%2$s 建立新使用者嗎?" "要允許 %1$s%2$s 建立新使用者嗎 (這個帳戶目前已有使用者)?" @@ -1690,7 +1705,7 @@ "要啟用工作模式嗎?" "這樣做會啟用你的 Work 設定檔,包括應用程式、背景同步處理和相關功能" "開啟" - "您有新訊息" + "你有新訊息" "開啟簡訊應用程式來查看內容" "部分功能可能受到鎖定" "輕觸即可解鎖" @@ -1708,7 +1723,7 @@ "正在啟動示範模式..." "正在重設裝置..." "要重設裝置嗎?" - "系統不會儲存您所做的變更,示範模式將於 %1$s 秒後重新開始…" + "系統不會儲存你所做的變更,示範模式將於 %1$s 秒後重新開始…" "取消" "立即重設" "已停用的%1$s" @@ -1732,11 +1747,12 @@ "切換至文字輸入模式來輸入時間。" "切換至時鐘模式來輸入時間。" "自動填入選項" + "儲存以便用於自動填入" "無法自動填入內容" - "要儲存到「%1$s」嗎?" - "要將%1$s儲存到「%2$s」嗎?" - "要將%1$s%2$s儲存到「%3$s」嗎?" - "要將%1$s%2$s%3$s儲存到「%4$s」嗎?" + "要儲存到「%1$s」嗎?" + "要將%1$s儲存到「%2$s」嗎?" + "要將%1$s%2$s儲存到「%3$s」嗎?" + "要將%1$s%2$s%3$s儲存到「%4$s」嗎?" "儲存" "不用了,謝謝" "密碼" diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 52898345796b97dab49229d346b4f3a111a7b364..a656e6ce1aee55322826b15b83f4bc5ca714a86a 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -99,6 +99,13 @@ "Inkampani yakho yenethiwekhi imise okwesikhashana amakholi ezwi nawezimo eziphuthumayo kule ndawo" "Ayikwazi ukufinyelela inethiwekhi" "Ukuze kuthuthukiswe ukwamukelwa, zama ukushintsha uhlobo olukhethiwe kusistimu > Inethiwekhi ne-inthanethi > amanethiwekhi eselula > uhlobo oluncanyelwayo lwenethiwekhi." + "Izexwayiso" + "Ukudlulisa ikholi" + "Imodi yokushayela yesimo esiphuthumayo" + "Izexwayiso zedatha yeselula" + "Imilayezo ye-SMS" + "Imilayezo yevoyisimeyili" + "Ukushaya kwe-Wi-Fi" "Umngani ucele imodi ye-TTY ephelele" "Umngani ucele imodi ye-TTY HCO" "Umngani ucele imodi ye-TTY VCO" @@ -258,6 +265,16 @@ "Izexwayiso" "Idemo yokuthenga" "Ukuxhumeka kwe-USB" + + + + + + + + + + "Imodi ephephile" "Uhlelo lwe-Android" "Shintshela komuntu siqu" @@ -284,8 +301,6 @@ "Hlola okuqukethwe kwewindi ohlanganyela nalo." "Vula ukuhlola ngokuthinta" "Izinto ezithephiwe zizokhulunywa ngokuzwakalayo futhi isikrini singahlolwa kusetshenziswa ukuthintwa." - "Vula ukufinyeleleka kwewebhu okuthuthukisiwe" - "Amaskripthi angase afakwe ukwenza okuqukethwe kohlelo lokusebenza kufinyeleleke kakhulu." "Qapha umbhalo owuthayiphayo" "Kufaka phakathi idatha yomuntu siqu efana nezinombolo zekhadi lesikweletu namaphasiwedi." "Lawula ukulungiswa kwesibonisi" @@ -1732,11 +1747,12 @@ "Shintshela kumodi yokufaka umbhalo ngokufaka isikhathi." "Shintshela kumodi yewashi ngokufakwa kwesikhathi." "Izinketho zokugcwalisa ngokuzenzakalela" + "Londolozela ukugcwalisa okuzenzakalelayo" "Okuqukethwe akukwazi ukugcwalisa ngokuzenzakalela" - "Londoloza ku-%1$s?" - "Londoloza i-%1$s ku-%2$s?" - "Londoloza i-%1$s, %2$s ku-%3$s?" - "Londoloza i-%1$s, %2$s, %3$s ku-%4$s?" + "Londoloza ku-<b>%1$s</b>?" + "Londoloza i-%1$s ku-<b>%2$s</b>?" + "Londoloza i-%1$s ne-%2$s ku-<b>%3$s</b>?" + "Londoloza i-%1$s, %2$s, ne-%3$s ku-<b>%4$s</b>?" "Londoloza" "Cha ngiyabonga" "iphasiwedi" diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 3898cae0df0709a03b8b6d7ab293dbfc32b23d21..cfe25b33a4c3028add488a581b6dea1a3fe7cfef 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -60,6 +60,15 @@ mode. --> + + + + + + + + + @@ -3448,8 +3457,8 @@ - - + + @@ -3489,10 +3498,10 @@ the fingerprint sensor.

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.

--> - + diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 95ba94209343f0c736aea47536812e55aebbc32a..ced22cc37f5a84bf9298433e0a5fd4bf5a3a2809 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -324,7 +324,7 @@ - + @@ -784,13 +784,13 @@ - - + be recreated, specify them in recreateOnConfigChanges. --> + @@ -817,15 +817,15 @@ + 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. --> + 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. --> @@ -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. --> - + - + - + diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index eb25ab37b4b55e7049e7143c15ab5c8a9c56d3a4..f3c54ba63aa2c5e46d0cfe9b1ea38e61ca0f0aaf 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2877,4 +2877,13 @@ + + + + + + + + +
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 52937a389fb334233ce287a220d4d8574b94ba25..880e0e1526b9e585044876727111920555693832 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -228,8 +228,8 @@ 41dp - - 94dp + + 72dp 20dp @@ -559,4 +559,8 @@ 20dp 120dp 800dp + + + 90% +
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index e13026b1360ea34a1501e4bc4855564a018e34a9..42d3f27eccfb2d4cf129d819b03dc19ba22d94f0 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2778,7 +2778,7 @@ - + @@ -2786,13 +2786,13 @@ - + - + @@ -2815,13 +2815,14 @@ - + + @@ -2833,11 +2834,6 @@ - - - - - diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 35b12ffb5d68113ff5f390e5aa0391a327634872..9848485d15c29f122557b85bfd9ee7deaaad5872 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -644,6 +644,29 @@ USB connection + + Apps running in background + + + %1$s is + running in the background + + + %1$d apps + are running in the background + + + Tap for details on battery and + data usage + + + %1$s, + %2$s + Safe mode @@ -3132,6 +3155,11 @@ Connected to a USB accessory Tap for more options. + + Audio accessory not supported + + Tap for more info + USB debugging connected diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 850d381b5ec488e538dc1029a11cc9b1e4b938d0..5aec3ceb2e99c9c18508c7a69f06855a431113d9 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -238,7 +238,9 @@ - + + + @@ -598,11 +600,9 @@ - - @@ -1959,6 +1959,8 @@ + + @@ -2624,7 +2626,7 @@ - + @@ -2916,6 +2918,7 @@ + @@ -2980,6 +2983,12 @@ + + + + + + @@ -3008,4 +3017,9 @@ + + + + + diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index a661b070872db59f87a0ebe225986ce85ca60ea8..383ae5d577cef81127364cdd0950e8fd9bfef940 100644 --- a/core/res/res/values/themes.xml +++ b/core/res/res/values/themes.xml @@ -435,6 +435,9 @@ please see themes_device_defaults.xml. @drawable/view_accessibility_focused + + @drawable/autofilled_highlight + @dimen/light_y @dimen/light_z @@ -446,6 +449,10 @@ please see themes_device_defaults.xml. @drawable/tooltip_frame @color/bright_foreground_light @color/tooltip_background_light + + + @dimen/autofill_dataset_picker_max_size + @dimen/autofill_dataset_picker_max_size diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index d80ff1d1e3131a3d998b4841f2271cd51ef88d03..75179463f0c4ba118d96f9a7c0fbfd8c68632578 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -744,6 +744,7 @@ easier. @color/primary_dark_device_default_settings_light @color/secondary_device_default_settings_light @color/accent_device_default_light + @android:color/black "Код прыняты!"
"Не абслугоўваецца." "Пераключэнне рэжыму ўводу" - "Рэжым самалёта" + "Рэжым палёту" "Пасля перазапуску прылады патрабуецца ўзор" "Пасля перазапуску прылады патрабуецца PIN-код" "Пасля перазапуску прылады патрабуецца пароль" diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml index 7529d7a9967aaea93793a830d2235212d145663c..6dd7ab9854c3ee223c6aef443c7349fd201a62e1 100644 --- a/packages/SystemUI/res-keyguard/values-bg/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml @@ -51,8 +51,7 @@ "Област за PUK кода на SIM картата" "Следващият будилник е зададен за %1$s" "Изтриване" - - + "Деактивиране на ел. SIM карта" "„Enter“" "Забравена фигура" "Грешна фигура" @@ -60,12 +59,9 @@ "Грешен ПИН код" "Опитайте отново след %d секунди." "Начертайте фигурата си" - - - - - - + "Въведете ПИН кода за SIM картата." + "Въведете ПИН кода на SIM картата за „%1$s“." + "Деактивирайте електронната SIM карта, за да използвате устройството без мобилна услуга." "Въведете ПИН кода" "Въведете паролата" "SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Свържете се с оператора за подробности." diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml index 3e5ea2d123f77e86247eda7c07fa28f64f7ba48a..25e74432e7f49488be1ba58140e25fc4f08b4134 100644 --- a/packages/SystemUI/res-keyguard/values-bn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml @@ -51,8 +51,7 @@ "সিম PUK অঞ্চল" "পরবর্তী অ্যালার্ম %1$s এ সেট করা হয়েছে" "মুছুন" - - + "ই-সিমটি অক্ষম করুন" "এন্টার" "প্যাটার্ন ভুলে গেছি" "ভুল প্যাটার্ন" @@ -60,12 +59,9 @@ "ভুল পিন" "%d সেকেন্ডের মধ্যে আবার চেষ্টা করুন।" "আপনার প্যাটার্ন আঁকুন" - - - - - - + "সিমের পিন লিখুন।" + "\"%1$s\" এর জন্য সিমের পিন লিখুন।" + "মোবাইল পরিষেবা ছাড়াই ডিভাইস ব্যবহার করতে ই-সিম অক্ষম করুন।" "পিন লিখুন" "পাসওয়ার্ড লিখুন" "সিমটি এখন অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোডটি লিখুন। বিশদ বিবরণের জন্য পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।" diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml index 74bfa8363c594ce4b1db0b0b6c0d3048a32ca999..6ca33a629cb15c5516fe0c68904a1c62ea3976fd 100644 --- a/packages/SystemUI/res-keyguard/values-da/strings.xml +++ b/packages/SystemUI/res-keyguard/values-da/strings.xml @@ -51,8 +51,7 @@ "Område for PUK-koden til SIM-kortet" "Næste alarm er indstillet til %1$s" "Slet" - - + "Deaktiver eSIM" "Enter" "Har du glemt mønsteret?" "Forkert mønster" @@ -60,12 +59,9 @@ "Forkert pinkode" "Prøv igen om %d sekunder." "Tegn dit mønster" - - - - - - + "Angiv pinkoden til SIM-kortet." + "Angiv pinkoden til SIM-kortet fra \"%1$s\"." + "Deaktiver eSIM for at bruge enheden uden mobiltjeneste." "Indtast pinkode" "Angiv adgangskode" "SIM-kortet er nu deaktiveret. Indtast PUK-koden for at fortsætte. Kontakt mobilselskabet for at få flere oplysninger." diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml index 94a3bb1839c2b113f525956c6c4572421cb76adc..219c813a70fc034a2edbb0b715a2ea3bf909609f 100644 --- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml @@ -63,7 +63,7 @@ "Ingresa el PIN de la tarjeta SIM de \"%1$s\"." "Inhabilita la eSIM para usar el dispositivo sin servicio de datos móviles." "Ingresa el PIN" - "Ingresa tu contraseña" + "Escribe la contraseña" "La tarjeta SIM está inhabilitada. Para continuar, ingresa el código PUK. Si quieres obtener más información, comunícate con el proveedor." "La tarjeta SIM \"%1$s\" está inhabilitada. Para continuar, ingresa el código PUK. Para obtener más información, comunícate con el proveedor." "Ingresa el código PIN deseado" diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml index ea5e71f0030b266c880da874a4981b2a82fdc785..14df1e575e22d7c5f19138972be51c3f64b2b014 100644 --- a/packages/SystemUI/res-keyguard/values-es/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es/strings.xml @@ -60,7 +60,7 @@ "Vuelve a intentarlo en %d segundos." "Dibuja tu patrón" "Introduce el PIN de la tarjeta SIM." - "Introduce el PIN de la tarjeta SIM de \"%1$s\"." + "Introduce el PIN de la tarjeta SIM de %1$s." "Inhabilita la tarjeta eSIM para utilizar el dispositivo sin servicio móvil." "Introduce el PIN" "Introduce tu contraseña" diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml index 69ca745eedd1bf1a347043fdf9d56e3ad8ad6674..a6d8e208c4849894310a7a558d33124d8b3e44df 100644 --- a/packages/SystemUI/res-keyguard/values-et/strings.xml +++ b/packages/SystemUI/res-keyguard/values-et/strings.xml @@ -106,7 +106,7 @@ "Kood on õige." "Teenus puudub." "Vaheta sisestusmeetodit" - "Lennukirežiim" + "Lennurežiim" "Pärast seadme taaskäivitamist tuleb sisestada muster" "Pärast seadme taaskäivitamist tuleb sisestada PIN-kood" "Pärast seadme taaskäivitamist tuleb sisestada parool" diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml index 31acab32a5138a74142139730b8c80addd79d9ac..2fe7bfbbd3b8e01db75cec450e07280f6c3c1dcd 100644 --- a/packages/SystemUI/res-keyguard/values-fa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml @@ -51,8 +51,7 @@ "‏قسمت PUK سیم‌کارت" "زنگ ساعت بعدی برای %1$s تنظیم شد" "حذف" - - + "‏غیرفعال کردن eSIM" "Enter" "الگو را فراموش کرده‌اید" "الگوی اشتباه" @@ -60,12 +59,9 @@ "پین اشتباه" "پس از %d ثانیه دوباره امتحان کنید." "الگوی خود را رسم کنید" - - - - - - + "پین سیم‌کارت را وارد کنید." + "پین سیم‌کارت «%1$s» را وارد کنید." + "‏برای استفاده از دستگاه بدون سرویس همراه، eSIM را غیرفعال کنید." "کد پین را وارد کنید" "گذرواژه را وارد کنید" "اکنون سیم‌کارت غیرفعال است. کد پین را برای ادامه وارد کنید. برای جزئیات با شرکت مخابراتی خود تماس بگیرید." diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml index 059d2f2d0326b2fba45956a3a88f08063a53dc0e..c795024d2484b80a73acc421dd8edaf4f2390c7d 100644 --- a/packages/SystemUI/res-keyguard/values-gu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml @@ -51,8 +51,7 @@ "SIM PUK ક્ષેત્ર" "%1$s માટે આગલું એલાર્મ સેટ કર્યું" "કાઢી નાખો" - - + "eSIMને અક્ષમ કરો" "દાખલ કરો" "પેટર્ન ભૂલી ગયાં" "ખોટી પેટર્ન" @@ -60,12 +59,9 @@ "ખોટો PIN" "%d સેકંડમાં ફરીથી પ્રયાસ કરો." "તમારી પેટર્ન દોરો" - - - - - - + "SIM PIN દાખલ કરો" + "\"%1$s\" માટે SIM PIN દાખલ કરો." + "મોબાઇલ સેવા વગર ઉપકરણનો ઉપયોગ કરવા eSIMને અક્ષમ કરો." "PIN દાખલ કરો" "પાસવર્ડ દાખલ કરો" "SIM હમણાં અક્ષમ કરેલ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. વિગતો માટે કૅરિઅરનો સંપર્ક કરો." diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml index 54e43baf72f179d669fb986e8ac1630582df63bc..3a2013daa6c44571c0fbf846e497a6833c25590b 100644 --- a/packages/SystemUI/res-keyguard/values-hu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml @@ -51,8 +51,7 @@ "A SIM-kártyához tartozó PUK-kód mezője" "A következő ébresztés beállított ideje: %1$s" "Törlés" - - + "Az e-SIM-kártya letiltása" "Enter" "Elfelejtettem a mintát" "Helytelen minta" @@ -60,12 +59,9 @@ "Helytelen PIN-kód" "Próbálja újra %d másodperc múlva." "Rajzolja le a mintát" - - - - - - + "Adja meg a SIM-kártya PIN-kódját." + "Adja meg a(z) „%1$s” SIM-kártya PIN-kódját." + "Tiltsa le az e-SIM-kártyát az eszköz mobilszolgáltatás nélküli használatához." "Adja meg a PIN-kódot" "Írja be a jelszót" "A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. A részletekért vegye fel a kapcsolatot szolgáltatójával." diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml index 4553eecaa77a82ae202be2ff1a758618ded68cda..3fdffbb50e63980d627901aa1de4d6d01d86c15c 100644 --- a/packages/SystemUI/res-keyguard/values-hy/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml @@ -105,7 +105,7 @@ "SIM PUK կոդի գործողությունը ձախողվեց:" "Կոդն ընդունվեց:" "Ծառայությունն անհասանելի է։" - "Փոխարկել մուտքագրման եղանակը" + "Փոխել ներածման եղանակը" "Ինքնաթիռի ռեժիմ" "Սարքը վերագործարկելուց հետո անհրաժեշտ է մուտքագրել նախշը" "Սարքը վերագործարկելուց հետո անհրաժեշտ է մուտքագրել PIN կոդը" diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml index 3f9a4726d63c5806f0ce2a38927b4835ea53949a..c570c89be9068dcd604b41c14a87270aebb28eb8 100644 --- a/packages/SystemUI/res-keyguard/values-iw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml @@ -51,8 +51,7 @@ "‏אזור לקוד הגישה של כרטיס ה-SIM" "ההתראה הבאה נקבעה ל-%1$s" "Delete" - - + "‏השבתת ה-eSIM" "Enter" "שכחתי את הקו" "קו ביטול הנעילה שגוי" @@ -60,20 +59,17 @@ "קוד הגישה שגוי" "נסה שוב בעוד %d שניות." "שרטט את קו ביטול הנעילה" - - - - - - - "‏הזן קוד PIN" + "‏הזן את קוד הגישה של כרטיס ה-SIM." + "‏הזן את קוד הגישה של כרטיס ה-SIM של %1$s." + "‏השבת את ה-eSIM כדי להשתמש במכשיר ללא שירות סלולרי." + "הזן קוד גישה" "הזן את הסיסמה" "‏כרטיס ה-SIM מושבת כעת. הזן קוד PUK כדי להמשיך. פנה אל הספק לפרטים." "‏ה-SIM של \"%1$s\" מושבת כעת. הזן קוד PUK כדי להמשיך. לפרטים, פנה אל הספק." "הזן את קוד הגישה הרצוי" "אשר את קוד הגישה הרצוי" "‏מבטל את הנעילה של כרטיס ה-SIM…" - "‏הקלד PIN שאורכו 4 עד 8 ספרות." + "הקלד קוד גישה שאורכו 4 עד 8 ספרות." "‏קוד PUK צריך להיות בן 8 ספרות או יותר." "‏הזן את קוד ה-PUK הנכון. ניסיונות חוזרים ישביתו את כרטיס ה-SIM לצמיתות." "קודי הגישה אינם תואמים" diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml index f48dcc9032221c170c0d468778576d7a4ed7e6c8..38eed79bc91d757c1cf96bc9c5194c49bad6ae57 100644 --- a/packages/SystemUI/res-keyguard/values-ka/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml @@ -51,8 +51,7 @@ "SIM ბარათის PUK-კოდის არე" "შემდეგი მაღვიძარა დაყენებულია %1$s-ზე" "წაშლა" - - + "eSIM-ის გათიშვა" "შეყვანა" "დაგავიწყდათ ნიმუში" "ნიმუში არასწორია" @@ -60,12 +59,9 @@ "PIN-კოდი არასწორია" "ცადეთ ხელახლა %d წამში." "დახატეთ თქვენი ნიმუში" - - - - - - + "შეიყვანეთ SIM ბარათის PIN-კოდი." + "შეიყვანეთ SIM ბარათის PIN-კოდი „%1$s“-ისთვის." + "გათიშეთ eSIM, მოწყობილობის მობილური სერვისების გარეშე გამოსაყენებლად." "შეიყვანეთ PIN-კოდი" "შეიყვანეთ პაროლი" "SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს." diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml index f99464142b09299f10a4a90982a711d8f4318465..21d1d2bec4ea6c7860d3699f68232950aba4b85f 100644 --- a/packages/SystemUI/res-keyguard/values-km/strings.xml +++ b/packages/SystemUI/res-keyguard/values-km/strings.xml @@ -51,8 +51,7 @@ "ប្រអប់​បំពេញ​កូដ PUK របស់​ស៊ីម" "បាន​កំណត់ម៉ោង​រោទិ៍​បន្ទាប់​នៅថ្ងៃ %1$s" "លុប" - - + "បិទ eSIM" "Enter" "ភ្លេច​​លំនាំ" "លំនាំ​មិន​ត្រឹមត្រូវ​ទេ" @@ -60,12 +59,9 @@ "កូដ PIN មិន​ត្រឹមត្រូវ​ទេ" "សូម​ព្យាយាម​ម្ដង​ទៀត​ក្នុង​រយៈ​ពេល %d វិនាទី​ទៀត។" "គូរ​លំនាំ​របស់​អ្នក" - - - - - - + "បញ្ចូល​កូដ PIN របស់​ស៊ីម។" + "បញ្ចូល​កូដ PIN របស់​ស៊ីម​សម្រាប់ \"%1$s\"។" + "បិទ eSIM ដើម្បីប្រើប្រាស់ឧបករណ៍​ដោយ​មិនចាំបាច់ប្រើសេវាកម្មទិន្នន័យចល័ត។" "បញ្ចូល​កូដ PIN" "បញ្ចូល​ពាក្យ​សម្ងាត់" "ឥឡូវ​នេះ​ ស៊ីម​ត្រូវ​បាន​បិទ​ដំណើរការ​ហើយ។ បញ្ចូល​កូដ PUK ដើម្បី​បន្ត។ សូម​ទាក់ទង​ទៅក្រុមហ៊ុន​បម្រើ​សេវា​ទូរសព្ទ​របស់​អ្នក ដើម្បី​ទទួល​បាន​ព័ត៌មាន​លម្អិត។" diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml index 4859222fe2c69e6a377950b49a6fffedb2928497..c16dcb9fe58da654c18c845846b8f8a8986545c2 100644 --- a/packages/SystemUI/res-keyguard/values-kn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml @@ -36,7 +36,7 @@ "ನಿಮ್ಮ ಚಾರ್ಜರ್ ಸಂಪರ್ಕಗೊಳಿಸಿ." "ಅನ್‌ಲಾಕ್ ಮಾಡಲು ಮೆನು ಒತ್ತಿರಿ." "ನೆಟ್‌ವರ್ಕ್ ಲಾಕ್ ಆಗಿದೆ" - "ಯಾವುದೇ ಸಿಮ್‌ ಕಾರ್ಡ್ ಇಲ್ಲ" + "ಸಿಮ್‌ ಕಾರ್ಡ್ ಇಲ್ಲ" "ಟ್ಯಾಬ್ಲೆಟ್‌ನಲ್ಲಿ ಸಿಮ್‌ ಕಾರ್ಡ್ ಇಲ್ಲ." "ಪೋನ್‌ನಲ್ಲಿ ಯಾವುದೇ ಸಿಮ್‌ ಕಾರ್ಡ್ ಇಲ್ಲ." "ಸಿಮ್‌ ಕಾರ್ಡ್ ಸೇರಿಸಿ." @@ -51,8 +51,7 @@ "ಸಿಮ್ PUK ಪ್ರದೇಶ" "%1$s ಗಂಟೆಗೆ ಮುಂದಿನ ಅಲಾರಮ್ ಹೊಂದಿಸಲಾಗಿದೆ" "ಅಳಿಸಿ" - - + "eSIM ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ" "ನಮೂದಿಸಿ" "ಪ್ಯಾಟರ್ನ್ ಮರೆತಿದ್ದೀರಿ" "ಪ್ಯಾಟರ್ನ್ ತಪ್ಪಾಗಿದೆ" @@ -60,12 +59,9 @@ "ಪಿನ್‌ ತಪ್ಪಾಗಿದೆ" "%d ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ." "ನಿಮ್ಮ ಪ್ಯಾಟರ್ನ್ ಚಿತ್ರಿಸಿ" - - - - - - + "ಸಿಮ್‌ ಪಿನ್‌ ನಮೂದಿಸಿ." + "\"%1$s\" ಗಾಗಿ ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ." + "ಮೊಬೈಲ್ ಸೇವೆ ಇಲ್ಲದೆಯೇ ಸಾಧನವನ್ನು ಬಳಸಲು eSIM ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ." "ಪಿನ್‌ ನಮೂದಿಸಿ" "ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸಿ" "ಈಗ ಸಿಮ್‌ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ. ಮುಂದುವರೆಯಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ." diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml index 0efa6eed8ceb1a5580d4992802e5bcf5feb16894..a402a97ba529979e0df3ca70a0ccb5fca6cbacdd 100644 --- a/packages/SystemUI/res-keyguard/values-ko/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml @@ -51,8 +51,7 @@ "SIM PUK 영역" "%1$s에 다음 알람이 설정됨" "삭제" - - + "eSIM 사용 중지" "Enter 키" "패턴을 잊음" "잘못된 패턴" @@ -60,12 +59,9 @@ "잘못된 PIN" "%d초 후에 다시 시도하세요." "패턴 그리기" - - - - - - + "SIM PIN을 입력하세요." + "\'%1$s\'의 SIM PIN을 입력하세요." + "모바일 서비스 없이 기기를 사용하려면 eSIM을 사용 중지하세요." "PIN 입력" "비밀번호 입력" "SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. 자세한 내용은 이동통신사에 문의하시기 바랍니다." diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml index f8af669c88b6416dd84f6d615d935a30a771f585..d9e033ca8a0f3cd43433a26212dc510605c0677a 100644 --- a/packages/SystemUI/res-keyguard/values-ky/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml @@ -36,7 +36,7 @@ "Кубаттагычка туташтырыңыз." "Кулпуну ачуу үчүн Менюну басыңыз." "Тармак кулпуланган" - "SIM-карта жок" + "SIM карта жок" "Планшетте SIM-карта жок." "Телефондо SIM-карта жок." "SIM-карта салыңыз." @@ -51,8 +51,7 @@ "SIM-картанын PUK-кодунун аймагы" "Кийинки ойготкуч саат %1$s коюлган" "Жок кылуу" - - + "eSIM-картаны өчүрүү" "Киргизүү" "Графикалык ачкычты унутуп калдым" "Графикалык ачкыч туура эмес" @@ -60,12 +59,9 @@ "PIN-код туура эмес" "%d секунддан кийин кайталаңыз." "Графикалык ачкычты тартыңыз" - - - - - - + "SIM-картанын PIN-кодун киргизиңиз." + "\"%1$s\" SIM-картасынын PIN-кодун киргизиңиз." + "Түзмөктү мобилдик кызматсыз колдонуу үчүн eSIM-картаны өчүрүңүз." "PIN-кодду киргизиңиз" "Сырсөздү киргизиңиз" "SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. Анын чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз." diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml index 71cca9544d9540bc4ef18b3e353321fccfcb5cba..f253386261737d9350b760c560160e5458e224f6 100644 --- a/packages/SystemUI/res-keyguard/values-lo/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml @@ -51,8 +51,7 @@ "ພື້ນທີ່ PUK ຂອງ SIM" "ໂມງປຸກຕໍ່ໄປຖືກຕັ້ງໄວ້ເວລາ %1$s" "ລຶບ" - - + "ປິດການໃຊ້ eSIM ແລ້ວ" "ປ້ອນເຂົ້າ" "ລືມຮູບແບບປົດລັອກ?" "ຮູບແບບຜິດ" @@ -60,12 +59,9 @@ "ລະຫັດ PIN ບໍ່ຖືກຕ້ອງ" "ລອງໃໝ່ໃນອີກ %d ວິນາທີ." "ແຕ້ມຮູບແບບປົດລັອກຂອງທ່ານ" - - - - - - + "ໃສ່ລະຫັດ PIN ຂອງຊິມ." + "ໃສ່ລະຫັດ PIN ຂອງຊິມສຳລັບ \"%1$s\"." + "ປິດການໃຊ້ eSIM ເພື່ອໃຊ້ອຸປະກອນໂດຍບໍ່ມີບໍລິການມືຖື." "ໃສ່ລະຫັດ PIN" "ໃສ່ລະຫັດຜ່ານ" "ຊິມຖືກປິດການນຳໃຊ້ແລ້ວ. ປ້ອນລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ຕິດຕໍ່ຜູ່ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ." diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml index 563eca3b8dd798cfc1d7d5940dac3b1c5cc25962..11de6e2685ff32b6bc482f8c14585c8b9d0f714f 100644 --- a/packages/SystemUI/res-keyguard/values-lt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml @@ -51,8 +51,7 @@ "SIM kortelės PUK kodo sritis" "Kitas nustatytas signalas: %1$s" "Ištrinti" - - + "Išjungti eSIM kortelę" "Enter" "Pamiršau atrakinimo piešinį" "Netinkamas atrakinimo piešinys" @@ -60,12 +59,9 @@ "Netinkamas PIN kodas" "Bandykite dar kartą po %d sek." "Nupieškite atrakinimo piešinį" - - - - - - + "Įveskite SIM kortelės PIN kodą." + "Įveskite „%1$s“ SIM kortelės PIN kodą" + "Išjungti eSIM kortelę ir naudoti įrenginį be mobiliojo ryšio paslaugos." "Įveskite PIN kodą" "Įveskite slaptažodį" "Dabar SIM neleidžiama. Jei norite tęsti, įveskite PUK kodą. Jei reikia išsamios informacijos, susisiekite su operatoriumi." diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml index 5271a59600bb4f7bf14021872868d45d1623fdbf..51df25f97aa5d637b488deec8a68b4bb44455755 100644 --- a/packages/SystemUI/res-keyguard/values-lv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml @@ -51,8 +51,7 @@ "SIM kartes PUK apgabals" "Nākamā signāla atskaņošanas laiks: %1$s" "Dzēšanas taustiņš" - - + "Atspējot eSIM karti" "Ievadīšanas taustiņš" "Aizmirsu kombināciju" "Nepareiza kombinācija." @@ -60,12 +59,9 @@ "Nepareizs PIN kods." "Mēģiniet vēlreiz pēc %d sekundes(-ēm)." "Zīmējiet savu kombināciju." - - - - - - + "Ievadiet SIM kartes PIN kodu." + "Ievadiet SIM kartes “%1$s” PIN kodu." + "Atspējojiet eSIM karti, lai ierīci varētu izmantot bez mobilā pakalpojuma." "Ievadiet PIN." "Ievadiet paroli" "SIM karte ir atspējota. Lai turpinātu, ievadiet PUK kodu. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru." diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml index 2b50d2dbf9d00ea99e08d838a81984c2fea81a3c..043e7c209591f030b16aac0cdee6ce0af4717515 100644 --- a/packages/SystemUI/res-keyguard/values-ml/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml @@ -51,8 +51,7 @@ "സിം PUK ഏരിയ" "അടുത്ത അലാറം %1$s-ന് സജ്ജീകരിച്ചു" "ഇല്ലാതാക്കുക" - - + "eSIM പ്രവർത്തനരഹിതമാക്കുക" "എന്റർ" "പാറ്റേൺ മറന്നു" "പാറ്റേൺ തെറ്റാണ്" @@ -60,12 +59,9 @@ "പിൻ തെറ്റാണ്" "%d സെക്കന്റിനു‌ശേഷം വീണ്ടും ശ്രമിക്കുക." "നിങ്ങളുടെ പാറ്റേൺ വരയ്‌ക്കുക" - - - - - - + "സിം പിൻ നൽകുക." + "\"%1$s\" എന്ന കാരിയർക്കുള്ള സിം പിൻ നൽകുക." + "മൊ‌ബൈൽ സേവനമില്ലാതെ ഉപകരണം ഉപയോഗിക്കാൻ eSIM പ്രവർത്തനരഹിതമാക്കുക." "പിൻ നൽകുക" "പാസ്‌വേഡ് നൽകുക" "സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. വിശദാംശങ്ങൾക്ക് കാരിയറെ ബന്ധപ്പെടുക." diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml index 26a73d56a2660bb377eb59cd764d224ff8d82a26..360b09ec0461baf6b72f749de7a4409eb2a9ff06 100644 --- a/packages/SystemUI/res-keyguard/values-mn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml @@ -51,8 +51,7 @@ "SIM-н PUK кодын хэсэг" "Дараагийн сэрүүлгийг %1$s-д тавьсан" "Устгах" - - + "eSIM-г идэвхгүй болгох" "Оруулах" "Загварыг мартсан" "Загвар буруу байна" @@ -60,12 +59,9 @@ "ПИН код буруу байна" "%d секундын дараа дахин оролдоно уу." "Загварыг оруулна уу" - - - - - - + "SIM-н ПИН-г оруулна уу." + "\"%1$s\"-н SIM-н ПИН-г оруулна уу." + "Төхөөрөмжийг мобайл үйлчилгээгүй ашиглахын тулд eSIM-г идэвхгүй болгоно уу." "ПИН оруулна уу" "Нууц үг оруулна уу" "SIM идэвхгүй байна. Үргэлжлүүлэх бол PUK кодыг оруулна уу. Дэлгэрэнгүй мэдээлэл авах бол оператор компанитайгаа холбогдоно уу." diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml index 803273141e5b099400441ea45f25fbe076b3b375..7bb8ae5e30260a06552de5212ea2b7fb8113c409 100644 --- a/packages/SystemUI/res-keyguard/values-mr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml @@ -51,8 +51,7 @@ "सिम PUK क्षेत्र" "पुढील अलार्म %1$s साठी सेट केला" "हटवा" - - + "eSIM बंद करा" "प्रविष्ट करा" "नमुना विसरलात" "चुकीचा नमुना" @@ -60,12 +59,9 @@ "चुकीचा पिन" "%d सेकंदांमध्ये पुन्हा प्रयत्न करा." "आपला नमुना काढा" - - - - - - + "सिम पिन एंटर करा" + "\"%1$s\" साठी सिम पिन एंटर करा" + "मोबाइल सेवांशिवाय डिव्हाइस वापरण्यासाठी eSIM बंद करा." "पिन प्रविष्ट करा" "संकेतशब्द प्रविष्ट करा" "सिम आता अक्षम केले आहे. सुरू ठेवण्यासाठी PUK कोड प्रविष्ट करा. तपशीलांसाठी वाहकाशी संपर्क साधा." diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml index 4104d21a73c80292da4e5751fc31f9134829755b..144e5074c08f7445351fce777066e7f3bce367ae 100644 --- a/packages/SystemUI/res-keyguard/values-ms/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml @@ -51,8 +51,7 @@ "Bahagian PUK SIM" "Penggera seterusnya ditetapkan pada %1$s" "Padam" - - + "Lumpuhkan eSIM" "Kekunci Enter" "Terlupa Corak" "Corak salah" @@ -60,12 +59,9 @@ "PIN salah" "Cuba lagi dalam %d saat." "Lukis corak anda" - - - - - - + "Masukkan PIN SIM." + "Masukkan PIN SIM untuk \"%1$s\"." + "Lumpuhkan eSIM untuk menggunakan peranti tanpa perkhidmatan mudah alih." "Masukkan PIN" "Masukkan Kata Laluan" "SIM kini dilumpuhkan. Masukkan kod PUK untuk meneruskan. Hubungi pembawa untuk mendapatkan butiran." diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml index 00478abff2541b3b3308db7a9e0878398ce7ff24..7e61e6f2087f0cf338f8e2d8f2845c4e8b1e1d28 100644 --- a/packages/SystemUI/res-keyguard/values-nb/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml @@ -36,7 +36,7 @@ "Koble til en batterilader." "Trykk på menyknappen for å låse opp." "Nettverket er låst" - "SIM-kortet mangler" + "SIM-kort mangler" "Nettbrettet mangler SIM-kort." "Telefonen mangler SIM-kort." "Sett inn et SIM-kort." diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml index 974836f33b8b78957dded5025c520350e2102f2a..47501637c8f2342e72af03ee9ad213af12afc596 100644 --- a/packages/SystemUI/res-keyguard/values-ne/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml @@ -51,8 +51,7 @@ "SIM को PUK क्षेत्र" "अर्को अलार्म %1$s का लागि सेट गरियो" "मेट्नुहोस्" - - + "eSIM लाई असक्षम पार्नुहोस्" "प्रविष्टि गर्नुहोस्" "ढाँचा बिर्सनुभयो" "गलत ढाँचा" @@ -60,12 +59,9 @@ "गलत PIN" "%d सेकेन्डमा फेरि प्रयास गर्नुहोस्।" "आफ्नो ढाँचा कोर्नुहोस्" - - - - - - + "SIM को PIN प्रविष्टि गर्नुहोस्।" + "\"%1$s\" को SIM को PIN प्रविष्ट गर्नुहोस्।" + "मोबाइल सेवा बिना यन्त्रको प्रयोग गर्न eSIM लाई असक्षम पार्नुहोस्।" "PIN प्रविष्टि गर्नुहोस्" "पासवर्ड प्रविष्ट गर्नुहोस्" "SIM कार्ड अहिले असक्षम छ। सुचारु गर्नको लागि PUK कोड प्रविष्ट गर्नुहोस्। विवरणको लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्।" diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml index 6ec4abd4684091f1c0d5688d3e74128e1bb7b68e..eb27c2bd644f63323a52efd4560bcaf95a82d7eb 100644 --- a/packages/SystemUI/res-keyguard/values-nl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml @@ -51,8 +51,7 @@ "Gebied voor pukcode van simkaart" "Volgende alarm ingesteld voor %1$s" "Delete" - - + "Simkaart uitschakelen" "Enter" "Patroon vergeten" "Onjuist patroon" @@ -60,12 +59,9 @@ "Onjuiste pincode" "Probeer het over %d seconden opnieuw." "Teken je patroon" - - - - - - + "Geef de pincode van de simkaart op." + "Geef de pincode voor de simkaart van \'%1$s\' op." + "Schakel de e-simkaart uit om het apparaat te gebruiken zonder mobiele service." "Geef je pincode op" "Geef je wachtwoord op" "De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Neem contact op met de provider voor informatie." diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml index fa9ff2264cf157d092a5c03c96419b088940caf1..be98391ef42c427e8570ef7c258244040aa7b5e8 100644 --- a/packages/SystemUI/res-keyguard/values-pa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml @@ -51,8 +51,7 @@ "SIM PUK ਖੇਤਰ" "ਅਗਲਾ ਅਲਾਰਮ %1$s \'ਤੇ ਸੈੱਟ ਕੀਤਾ ਗਿਆ" "ਮਿਟਾਓ" - - + "eSIM ਨੂੰ ਅਯੋਗ ਬਣਾਓ" "ਦਾਖਲ ਕਰੋ" "ਪੈਟਰਨ ਭੁੱਲ ਗਏ" "ਗਲਤ ਪੈਟਰਨ" @@ -60,12 +59,9 @@ "ਗਲਤ PIN" "%d ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" "ਆਪਣਾ ਪੈਟਰਨ ਉਲੀਕੋ" - - - - - - + "SIM PIN ਦਾਖਲ ਕਰੋ।" + "\"%1$s\" ਲਈ SIM PIN ਦਾਖਲ ਕਰੋ।" + "ਮੋਬਾਈਲ ਸੇਵਾ ਤੋਂ ਬਿਨਾਂ ਡੀਵਾਈਸ ਨੂੰ ਵਰਤਣ ਲਈ eSIM ਅਯੋਗ ਬਣਾਓ।" "PIN ਦਾਖਲ ਕਰੋ" "ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ" "SIM ਹੁਣ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।" diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml index fa0becb32d4968229184165797f831db9d80e2cb..71a2ce60a4440911932c2fc616149b58d299ef19 100644 --- a/packages/SystemUI/res-keyguard/values-pl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml @@ -51,8 +51,7 @@ "Miejsce na kod PUK karty SIM" "Następny alarm ustawiony na: %1$s" "Usuwanie" - - + "Wyłącz eSIM" "Enter" "Nie pamiętam wzoru" "Nieprawidłowy wzór" @@ -60,12 +59,9 @@ "Nieprawidłowy kod PIN" "Spróbuj ponownie za %d s." "Narysuj wzór" - - - - - - + "Wpisz kod PIN karty SIM." + "Wpisz kod PIN karty SIM „%1$s”." + "Wyłącz eSIM, by używać urządzenia bez usługi sieci komórkowej." "Wpisz kod PIN" "Wpisz hasło" "Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Skontaktuj się z operatorem, by uzyskać więcej informacji." diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml index 9fffc2057fdbd7e70f007e5a779e8b0702b360ba..d60b50eb9fa2b2aee3d3227ca8ce29f4408c5196 100644 --- a/packages/SystemUI/res-keyguard/values-si/strings.xml +++ b/packages/SystemUI/res-keyguard/values-si/strings.xml @@ -51,8 +51,7 @@ "SIM PUK කොටස" "%1$sට ඊළඟ එලාමය සකසා ඇත" "මකන්න" - - + "eSIM අබල කරන්න" "ඇතුල් කරන්න" "රටාව අමතකයි" "වැරදි රටාවකි" @@ -60,12 +59,9 @@ "PIN එක වැරදියි" "තත්පර %d කින් නැවත උත්සහ කරන්න." "ඔබගේ රටාව අඳින්න" - - - - - - + "SIM PIN ඇතුළු කරන්න" + "\"%1$s\" සඳහා SIM PIN ඇතුළු කරන්න" + "ජංගම සේවාවෙන් තොරව උපාංගය භාවිත කිරීමට eSIM අබල කරන්න." "PIN එක ඇතුළු කරන්න" "මුරපදය ඇතුළු කරන්න" "දැන් SIM එක අබල කර ඇත. ඉදිරියට යාමට PUK කේතය යොදන්න. විස්තර සඳහා වාහකයා අමතන්න." diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml index 3ebfb9e350afd67b5b94533f2fdf8dc587a38f3b..4b3a7f70c92a2c0a5e65edbe1a8eee00912210b7 100644 --- a/packages/SystemUI/res-keyguard/values-sk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml @@ -36,7 +36,7 @@ "Pripojte nabíjačku." "Odomknete stlačením tlačidla ponuky." "Sieť je zablokovaná" - "Nie je vložená SIM karta" + "Žiadna SIM karta" "V tablete nie je žiadna SIM karta." "V telefóne nie je žiadna SIM karta." "Vložte SIM kartu." diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml index 86371664837c095e8a0b00bba38cbaa148914046..a5236250c00ebbe38fed576fa9d6d0a4b117f00d 100644 --- a/packages/SystemUI/res-keyguard/values-sl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml @@ -51,8 +51,7 @@ "Območje za kodo PUK kartice SIM" "Naslednji alarm je nastavljen za %1$s" "Izbris" - - + "Onemogoči kartico e-SIM" "Tipka Enter" "Pozabljen vzorec" "Napačen vzorec" @@ -60,12 +59,9 @@ "Napačna koda PIN" "Poskusite znova čez %d s." "Narišite vzorec" - - - - - - + "Vnesite kodo PIN kartice SIM." + "Vnesite kodo PIN kartice SIM operaterja »%1$s«." + "Onemogočite kartico e-SIM, če želite napravo uporabljati brez mobilne storitve." "Vnesite kodo PIN" "Vnesite geslo" "Kartica SIM je onemogočena. Če želite nadaljevati, vnesite kodo PUK. Za dodatne informacije se obrnite na operaterja." diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml index d09f219553434d21594638e6ed9e7b87295d8974..9a102663db4cc1b4cc26ae3edd53d23155ada635 100644 --- a/packages/SystemUI/res-keyguard/values-sw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml @@ -105,7 +105,7 @@ "Utendakazi wa PUK ya SIM haujafanikiwa!" "Nambari Imekubaliwa!" "Hakuna mtandao." - "Badilisha mbinu ya kuingiza data" + "Kubadili mbinu ya kuingiza data" "Hali ya ndegeni" "Unafaa kuchora mchoro baada ya kuwasha kifaa upya" "Unafaa kuweka PIN baada ya kuwasha kifaa upya" diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml index b3ef410bfbe94e848a1b74f3ee37b30e65fb57cd..3973bce216d1caaa90d87521d2f656af4f627e98 100644 --- a/packages/SystemUI/res-keyguard/values-te/strings.xml +++ b/packages/SystemUI/res-keyguard/values-te/strings.xml @@ -51,8 +51,7 @@ "SIM PUK ప్రాంతం" "తదుపరి అలారం %1$sకి సెట్ చేయబడింది" "తొలగించు" - - + "eSIMని నిలిపివేయండి" "Enter" "నమూనాను మర్చిపోయాను" "నమూనా తప్పు" @@ -60,12 +59,9 @@ "పిన్ తప్పు" "%d సెకన్లలో మళ్లీ ప్రయత్నించండి." "మీ నమూనాను గీయండి" - - - - - - + "SIM పిన్‌ని నమోదు చేయండి." + "\"%1$s\" కోసం SIM పిన్‌ని నమోదు చేయండి." + "మొబైల్ సేవ లేకుండా డివైజ్‌ని ఉపయోగించడం కోసం eSIMని నిలిపివేయండి." "పిన్‌ను నమోదు చేయండి" "పాస్‌వర్డ్‌ని నమోదు చేయండి" "ఇప్పుడు SIM నిలిపివేయబడింది. కొనసాగించాలంటే, PUK కోడ్‌ను నమోదు చేయండి. వివరాల కోసం క్యారియర్‌ను సంప్రదించండి." diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml index b00ec902eb86fbd3f697dfd21039db8ba060966b..8d69e61e6c629220f92db920fbde5ded0716248f 100644 --- a/packages/SystemUI/res-keyguard/values-th/strings.xml +++ b/packages/SystemUI/res-keyguard/values-th/strings.xml @@ -51,8 +51,7 @@ "พื้นที่ PUK ของซิม" "ตั้งเวลาปลุกครั้งถัดไปไว้ที่ %1$s" "ลบ" - - + "ปิดใช้ซิมอิเล็กทรอนิกส์" "Enter" "ลืมรูปแบบ" "รูปแบบไม่ถูกต้อง" @@ -60,12 +59,9 @@ "PIN ไม่ถูกต้อง" "ลองอีกครั้งในอีก %d วินาที" "วาดรูปแบบของคุณ" - - - - - - + "ป้อน PIN ของซิม" + "ป้อน PIN ของซิมสำหรับ \"%1$s\"" + "ปิดใช้ซิมอิเล็กทรอนิกส์เพื่อใช้อุปกรณ์โดยไม่มีบริการมือถือ" "ป้อน PIN" "ป้อนรหัสผ่าน" "ซิมการ์ดถูกปิดใช้แล้ว ป้อนรหัส PUK เพื่อดำเนินการต่อ โปรดสอบถามรายละเอียดจากผู้ให้บริการ" diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml index 600827d98527aa98002a61064f76e2b85032afdd..f34718ed005fe99f1bbf40bca126afa1be925205 100644 --- a/packages/SystemUI/res-keyguard/values-tl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml @@ -51,8 +51,7 @@ "Lugar ng PUK ng SIM" "Nakatakda ang susunod na alarm sa %1$s" "I-delete" - - + "I-disable ang eSIM" "Enter" "Nakalimutan ang Pattern" "Mali ang Pattern" @@ -60,12 +59,9 @@ "Mali ang PIN" "Subukang muli sa loob ng %d (na) segundo." "Iguhit ang iyong pattern" - - - - - - + "Ilagay ang PIN ng SIM." + "Ilagay ang PIN ng SIM para sa \"%1$s\"." + "I-disable ang eSIM upang magamit ang device nang walang serbisyo sa mobile." "Ilagay ang PIN" "Ilagay ang Password" "Naka-disable na ngayon ang SIM. Ilagay ang PUK code upang magpatuloy. Makipag-ugnayan sa carrier para sa mga detalye." diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml index 42246ffd50232aba7e2a73d8d0a2b0f2941d1e9c..183af79d7b161b3af87d2110be3ca93bffca2d41 100644 --- a/packages/SystemUI/res-keyguard/values-tr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml @@ -51,8 +51,7 @@ "SIM PUK alanı" "Sonraki alarm %1$s olarak ayarlandı" "Delete" - - + "eSIM\'i devre dışı bırak" "Enter" "Deseni unuttunuz mu?" "Yanlış Desen" @@ -60,12 +59,9 @@ "Yanlış PIN" "%d saniye içinde yeniden deneyin." "Deseninizi çizin" - - - - - - + "SIM PIN kodunu girin." + "\"%1$s\" için SIM PIN kodunu girin." + "Cihazı mobil hizmet olmadan kullanmak için eSIM\'i devre dışı bırakın." "PIN\'i girin" "Şifreyi Girin" "SIM kart artık devre dışı bırakıldı. Devam etmek için PUK kodunu girin. Ayrıntılı bilgi için operatörle bağlantı kurun." diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml index 79d949cfa89257f042f160cce5f0ab9e8cd30d18..1b20118e4b6e9c059a4aa5f6c491f78f5a273f89 100644 --- a/packages/SystemUI/res-keyguard/values-ur/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml @@ -51,8 +51,7 @@ "‏SIM PUK کا علاقہ" "اگلا الارم %1$s کیلئے سیٹ ہے" "حذف کریں" - - + "‏eSIM غیر فعال کریں" "درج کریں" "پیٹرن بھول گئے" "غلط پیٹرن" @@ -60,12 +59,9 @@ "‏غلط PIN" "%d سیکنڈ میں دوبارہ کوشش کریں۔" "اپنا پیٹرن ڈرا کریں" - - - - - - + "‏SIM PIN درج کریں۔" + "‏\"%1$s\" کیلئے SIM PIN درج کریں۔" + "‏موبائل سروس کے بغیر آلہ کا استعمال کرنے کیلئے eSIM غیر فعال کریں۔" "‏PIN درج کریں" "پاسورڈ درج کریں" "‏SIM اب غیر فعال ہوگیا ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔" diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml index bab043e12bd48eb01610b78499296d3dbeebc52d..4fdddb23fef3a1b9c8621937fe8862c8586947e0 100644 --- a/packages/SystemUI/res-keyguard/values-vi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml @@ -51,8 +51,7 @@ "Khu vực mã PUK của SIM" "Báo thức tiếp theo được đặt cho %1$s" "Xóa" - - + "Vô hiệu hóa eSIM" "Nhập" "Đã quên hình mở khóa" "Hình mở khóa sai" @@ -60,12 +59,9 @@ "Mã PIN sai" "Thử lại sau %d giây." "Vẽ hình mở khóa của bạn" - - - - - - + "Nhập mã PIN của SIM." + "Nhập mã PIN của SIM dành cho \"%1$s\"." + "Vô hiệu hóa eSIM để sử dụng thiết bị khi không có dịch vụ di động." "Nhập mã PIN" "Nhập mật khẩu" "SIM hiện bị vô hiệu hóa. Hãy nhập mã PUK để tiếp tục. Liên hệ với nhà cung cấp dịch vụ để biết chi tiết." diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml index afd5c2869fdd883de0fd62682b143b630e42241c..ad92979cb55e92a4ac6e745ff0a6538d0762a35d 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml @@ -51,8 +51,7 @@ "SIM 卡 PUK 码区域" "下一个闹钟时间已设置为%1$s" "删除" - - + "停用 eSIM 卡" "输入" "忘记了图案" "图案错误" @@ -60,12 +59,9 @@ "PIN 码错误" "请在 %d 秒后重试。" "绘制您的图案" - - - - - - + "请输入 SIM 卡 PIN 码。" + "请输入“%1$s”的 SIM 卡 PIN 码。" + "停用 eSIM 卡即可在没有移动服务的情况下使用设备。" "请输入 PIN 码" "请输入密码" "SIM 卡现已停用,需要输入 PUK 码才能继续使用。要了解详情,请联系您的运营商。" diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml index 41adcc80b55e21c21fcc205c4e37b0aee91ed1eb..5cf4ac533e8ecfe334823eff72b358f7c20a2f02 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml @@ -51,8 +51,7 @@ "SIM 卡 PUK 區域" "已經將下一個鬧鐘時間設做%1$s" "Delete 鍵 (刪除)" - - + "停用 eSIM" "Enter 鍵 (輸入)" "忘記上鎖圖案" "上鎖圖案錯誤" @@ -60,12 +59,9 @@ "PIN 碼錯誤" "請在 %d 秒後再試一次。" "畫出上鎖圖案" - - - - - - + "輸入 SIM 卡的 PIN 碼。" + "輸入「%1$s」SIM 卡的 PIN 碼。" + "停用 eSIM,即可在沒有流動服務的情況下使用裝置。" "輸入 PIN 碼" "輸入密碼" "SIM 卡現已停用,請輸入 PUK 碼以繼續。詳情請與流動網絡供應商聯絡。" diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml index 57680b106854c5e814772eb3b1d7813f09c3189f..6b7435a15562a2e05484194f6c8879b8d10484ce 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml @@ -51,8 +51,7 @@ "SIM 卡 PUK 區" "已設定下一個鬧鐘時間:%1$s" "刪除" - - + "停用 eSIM 卡" "Enter 鍵" "忘記解鎖圖案" "解鎖圖案錯誤" @@ -60,12 +59,9 @@ "PIN 碼錯誤" "請在 %d 秒後再試一次。" "畫出解鎖圖案" - - - - - - + "輸入 SIM 卡的 PIN 碼。" + "輸入「%1$s」SIM 卡的 PIN 碼。" + "停用 eSIM 卡即可在沒有行動服務的情況下使用裝置。" "輸入 PIN 碼" "輸入密碼" "SIM 卡已遭停用,輸入 PUK 碼即可繼續使用。如需瞭解詳情,請與電信業者聯絡。" diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml index e45dba63b128866fd64b7040e7323366a96f7ff6..b951c4c591f709270fe1092b314b2209df54e8ef 100644 --- a/packages/SystemUI/res-keyguard/values/strings.xml +++ b/packages/SystemUI/res-keyguard/values/strings.xml @@ -102,6 +102,9 @@ h\uee01mm kk\uee01mm + + \uee01 PIN area 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 be9a7e266c6f23746cc83e4bbdf2ca82a4d12848..d7463a446657ebb606b444fb5835b9de8ff55b62 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 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> + android:width="8.5dp" + android:height="17dp" + android:viewportWidth="12.0" + android:viewportHeight="24.0"> 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 fd7a6584112997d25eb20d6c1157f77702e2416c..6309b6d9903be007775383cad3e65ed73fccbc73 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 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> + android:viewportHeight="24.0"> 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 02c4ab6161c695d3f046db0531e898721b7ea193..4067ae5b4800bca3184fe097b7d1142adb483e59 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 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> + android:viewportHeight="24.0"> 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 daf40618c24a4a2351b5085b19af5944b5788018..3cdd3e104bfb2feefba3678d8e04c30887c675e7 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. --> + android:viewportWidth="24.0" + android:viewportHeight="24.0"> 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 cd0cc65853916bbd5b056331d8796cd3f4d3e021..acaa9b1c2be8ced2c582154e86cfd1772ff2ce63 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 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> + android:viewportHeight="24.0"> 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 92ed49c711893e5cbec74cba735a5c3a484a8bbf..7985237d8a44656010f4cc10be0523f47ddab21c 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 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> + android:viewportHeight="24.0"> 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 ca61b6f0299cb5823ca6406b06f5cbb184a815d5..fda87612582ed75f9095663e11cbd9fd64bdcf69 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 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> + android:viewportHeight="24.0"> 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 add96b4352e8e9135a8b1c44ab704657702713af..c08ff20c54fc46cc98d9ce903cadf216cc65cac5 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 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> + android:viewportWidth="13.0" + android:viewportHeight="24.0"> 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 8811d2f9b7ba7398a0b503817cd13b1979bf27bd..db18fad637e7f6977b47dccb92e29c9c0aa0686d 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. --> + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/packages/SystemUI/res/drawable/stat_sys_roaming.xml b/packages/SystemUI/res/drawable/stat_sys_roaming.xml index 363e231cf03c3a314c84dcebc64b7b25a7be7752..4baa472acb88d155563471c7eb2453ae682f32a9 100644 --- a/packages/SystemUI/res/drawable/stat_sys_roaming.xml +++ b/packages/SystemUI/res/drawable/stat_sys_roaming.xml @@ -14,10 +14,10 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> + android:viewportHeight="12.0"> 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 8e626e949cbd0beab1e11798c939f802a7e4da7b..0000000000000000000000000000000000000000 --- a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_disconnected.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - 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 c1856fa30e7e60724e76779d74b6b41ad917b716..5169de46ea2997909c0270fd97ef0c7bd6107781 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 @@ Copyright (C) 2014 The Android Open Source Project android:viewportHeight="24.0"> - + 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"/> 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 0000000000000000000000000000000000000000..0a1dea05413fe2edfb439e18859a97aca6137b1f --- /dev/null +++ b/packages/SystemUI/res/layout/foreground_service_item.xml @@ -0,0 +1,48 @@ + + + + + + + + + + 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 0000000000000000000000000000000000000000..b5434b2402aaf667069000300ba9ba79b4afecb5 --- /dev/null +++ b/packages/SystemUI/res/layout/foreground_service_title.xml @@ -0,0 +1,40 @@ + + + + + + + diff --git a/packages/SystemUI/res/layout/mobile_signal_group.xml b/packages/SystemUI/res/layout/mobile_signal_group.xml index 6d4365c644e417dfe794ea05ae65eef0129b4ece..33effba53059f91d714537cbf4e1c56de3221929 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" /> diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml index 0c9858dc8397fbad05da63239508252515c9e1a0..6fe00c02508fb806c648c014925a4c277580d07a 100644 --- a/packages/SystemUI/res/layout/notification_info.xml +++ b/packages/SystemUI/res/layout/notification_info.xml @@ -74,8 +74,9 @@ android:orientation="horizontal"> diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml index 5df50cdeba1a6559507e8380916fdbcd14836f81..9a97d60fa0fd2cd7ea6540f66dbad0f3680158c4 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" /> - - - - - - - - - + android:layout_width="wrap_content"> + + + + + + + + + "Mobiele data is af" "Bluetooth-verbinding." "Vliegtuigmodus." + "VPN aan." "Geen SIM-kaart nie." "Diensverskaffernetwerk verander tans." "Maak batterybesonderhede oop" @@ -401,7 +402,7 @@ "Verwyder gebruiker?" "Alle programme en data van hierdie gebruiker sal uitgevee word." "Verwyder" - "Batteryspaarder is aan" + "Batterybespaarder is aan" "Verminder werkverrigting en agtergronddata" "Skakel batterybespaarder af" "%s sal alles begin vasvang wat op jou skerm gewys word." @@ -427,8 +428,7 @@ "Werkprofiel is gekoppel aan %1$s" "Persoonlike profiel is aan %1$s gekoppel" "Toestel is aan %1$s gekoppel" - - + "Toestelbestuur" "Profielmonitering" "Netwerkmonitering" "VPN" @@ -437,18 +437,14 @@ "Deaktiveer VPN" "Ontkoppel VPN" "Bekyk beleide" - - - - + "Jou toestel word deur %1$s bestuur.\n\nJou administrateur kan instellings, korporatiewe toegang, programme, data wat met jou toestel geassosieer word en jou toestel se ligginginligting monitor en bestuur.\n\nVir meer inligting, kontak jou administrateur." + "Jou toestel word deur jou organisasie bestuur.\n\nJou administrateur kan instellings, korporatiewe toegang, programme, data wat met jou toestel geassosieer word en jou toestel se ligginginligting monitor en bestuur.\n\nVir meer inligting, kontak jou administrateur." "Jou organisasie het \'n sertifikaatoutoriteit op hierdie toestel geïnstalleer. Jou veilige netwerkverkeer kan gemonitor of gewysig word." "Jou organisasie het \'n sertifikaatoutoriteit in jou werkprofiel geïnstalleer. Jou veilige netwerkverkeer kan gemonitor of gewysig word." "\'n Sertifikaatoutoriteit is op hierdie toestel geïnstalleer. Jou veilige netwerkverkeer kan gemonitor of gewysig word." "Jou administrateur het netwerkloginskrywing aangeskakel, wat verkeer op jou toestel monitor." - - - - + "Jy is gekoppel aan %1$s, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor." + "Jy is gekoppel aan %1$s en %2$s, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor." "Jou werkprofiel is gekoppel aan %1$s, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor." "Jy persoonlike profiel is gekoppel aan %1$s, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor." "Jou toestel word bestuur deur %1$s." @@ -470,6 +466,8 @@ "Jy is gekoppel aan %1$s, wat jou persoonlike netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor." "%1$s bestuur jou werkprofiel. Die profiel is gekoppel aan %2$s, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nKontak jou administrateur vir meer inligting." "%1$s bestuur jou werkprofiel. Die profiel is gekoppel aan %2$s, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nJy is ook gekoppel aan %3$s, wat jou persoonlike netwerkaktiwiteit kan monitor." + + "Toestel sal gesluit bly totdat jy dit handmatig ontsluit" "Kry kennisgewings vinniger" "Sien hulle voordat jy ontsluit" @@ -703,6 +701,8 @@ "%1$s-kennisgewing: %2$s" "Program sal dalk nie met verdeelde skerm werk nie." "Program steun nie verdeelde skerm nie." + "Program sal dalk nie op \'n sekondêre skerm werk nie." + "Program steun nie begin op sekondêre skerms nie." "Maak instellings oop." "Maak kitsinstellings oop." "Maak kitsinstellings toe." @@ -752,8 +752,7 @@ "Kitsprogramme" "Kitsprogramme hoef nie geïnstalleer te word nie." "Programinligting" - - + "Gaan na web" "Mobiele data" "Wi-Fi is af" "Bluetooth is af" diff --git a/packages/SystemUI/res/values-af/strings_car.xml b/packages/SystemUI/res/values-af/strings_car.xml index 7c6f6091130d1c2c7446eb123de1814c7c4e443c..a8f600e81e778029c100730d56374d8101c5dc84 100644 --- a/packages/SystemUI/res/values-af/strings_car.xml +++ b/packages/SystemUI/res/values-af/strings_car.xml @@ -19,6 +19,5 @@ - "Ry veilig" - "Bly heeltemal bewus van bestuurtoestande en gehoorsaam toepaslike wette altyd. Rigtingaanwysings sal dalk onakkuraat, onvolledig, gevaarlik, ontoepaslik of verbode wees of behels dat administratiewe gebiede oorgesteek word. Besigheidsinligting sal dalk ook onakkuraat of onvolledig wees. Data is nie intyds nie en liggingakkuraatheid kan nie gewaarborg word nie. Moenie jou mobiele toestel hanteer of programme wat nie vir Android Auto bedoel is, gebruik terwyl jy bestuur nie." + "Onbekend" diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 90848686bb158adea3f52902ac2a226525ed27be..30ddf198a8ba944e2793cdd66edcaad9f0283bb3 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -157,6 +157,7 @@ "የተንቀሳቃሽ ስልክ ውሂብ ጠፍቷል" "ብሉቱዝ ማያያዝ።" "የአውሮፕላን ሁነታ።" + "ቪፒኤን በርቷል።" "ምንም SIM ካርድ የለም።" "የአገልግሎት አቅራቢ አውታረ መረብን በመቀየር ላይ።" "የባትሪ ዝርዝሮችን ክፈት" @@ -427,8 +428,7 @@ "የሥራ መገለጫ ወደ %1$s ተገናኝቷል" "የግል መገለጫ ወደ %1$s ተገናኝቷል" "ይህ መሣሪያ ወደ %1$s ተገናኝቷል" - - + "የመሣሪያ አስተዳደር" "መገለጫን መከታተል" "የአውታረ መረብ ክትትል" "VPN" @@ -437,18 +437,14 @@ "VPN አሰናክል" "የVPN ግንኙነት አቋርጥ" "መመሪያዎችን ይመልከቱ" - - - - + "የእርስዎ መሣሪያ በ%1$s የሚተዳደር ነው።\n\nየእርስዎ አስተዳዳሪ ከመሣሪያዎ ጋር የተጎዳኙ ቅንብሮችን፣ የኮርፖሬት መዳረሻን፣ መተግበሪያዎችን እና የመሣሪያዎን የአካባቢ መረጃ መከታተል እና ማቀናበር ይችላሉ።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።" + "የእርስዎ መሣሪያ በድርጅትዎ የሚተዳደር ነው።\n\nየእርስዎ አስተዳዳሪ ከመሣሪያዎ ጋር የተጎዳኙ ቅንብሮችን፣ የኮርፖሬት መዳረሻንና ውሂብን እና የመሣሪያዎን የአካባቢ መረጃ መከታተል እና ማቀናበር ይችላሉ።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።" "የእርስዎ ድርጅት የእውቅና ማረጋገጫ ሰጪ ባለሥልጣን በዚህ መሣሪያ ላይ ጭኗል። የእርስዎ ደኅንነቱ የተጠበቀ አውታረ መረብ ትራፊክ ክትትል ሊደረግበት እና ሊሻሻል ይችላል።" "የእርስዎ ድርጅት የእውቅና ማረጋገጫ ሰጪ ባለሥልጣን በእርስዎ የሥራ መገለጫ ላይ ጭኗል። የእርስዎ ደኅንነቱ የተጠበቀ አውታረ መረብ ትራፊክ ክትትል ሊደረግበት እና ሊሻሻል ይችላል።" "የእውቅና ማረጋገጫ ሰጪ ባለሥልጣን በዚህ መሣሪያ ላይ ተጭኗል። የእርስዎ ደኅንነቱ የተጠበቀ አውታረ መረብ ትራፊክ ክትትል ሊደረግበት እና ሊሻሻል ይችላል።" "የእርስዎ አስተዳዳሪ የአውታረ መረብ ምዝግብ ማስታወሻ መያዝን አብርተዋል፣ ይህም በመሣሪያዎ ላይ ያለውን ትራፊክ ይከታተላል።" - - - - + "እርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %1$s ጋር ተገናኝተዋል።" + "ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችሉት %1$s እና %2$s ጋር ተገናኝተዋል።" "የእርስዎ የሥራ መገለጫ የእርስዎን ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %1$s ጋር ተገናኝቷል።" "የእርስዎ የግል መገለጫ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %1$s ጋር ተገናኝቷል።" "የእርስዎ መሣሪያ በ%1$s ነው የሚቀናበረው።" @@ -470,6 +466,8 @@ "እርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን ከሚከታተለው ከ%1$s ጋር ተገናኝተዋል።" "የእርስዎ የሥራ መገለጫ በ%1$s የሚተዳደር ነው። መገለጫው ኢሜይሎችን፣ መተግበሪያዎችን፣ እና የድር ጣቢያዎችን ጨምሮ የአውታረ መረብ እንቅስቃሴን መቆጣጠር ከሚችለው ከ%2$s ጋር ተገናኝቷል።\n\nለተጨማሪ መረጃ የእርስዎን አስተዳዳሪ ያነጋግሩ።" "የእርስዎ የሥራ መገለጫ በ%1$s የሚተዳደር ነው። መገለጫው ኢሜይሎችን፣ መተግበሪያዎችን፣ እና የድር ጣቢያዎችን ጨምሮ የአውታረ መረብ እንቅስቃሴን መቆጣጠር ከሚችለው ከ%2$s ጋር ተገናኝቷል።\n\nበተጨማሪ የእርስዎን የግል የአውታረ መረብ እንቅስቃሴ መቆጣጠር ከሚችለው ከ%3$s ጋር ተገናኝተዋል።" + + "እራስዎ እስኪከፍቱት ድረስ መሣሪያ እንደተቆለፈ ይቆያል" "ማሳወቂያዎችን ፈጥነው ያግኙ" "ከመክፈትዎ በፊት ይመልከቷቸው" @@ -703,6 +701,8 @@ "የ%1$s ማሳወቂያ፦ %2$s" "መተግበሪያ ከተከፈለ ማያ ገጽ ጋር ላይሠራ ይችላል" "መተግበሪያው የተከፈለ ማያ ገጽን አይደግፍም።" + "መተግበሪያ በሁለተኛ ማሳያ ላይ ላይሠራ ይችላል።" + "መተግበሪያ በሁለተኛ ማሳያዎች ላይ ማስጀመርን አይደግፍም።" "ቅንብሮችን ክፈት።" "ፈጣን ቅንብሮችን ክፈት።" "ፈጣን ቅንብሮችን ዝጋ።" @@ -752,8 +752,7 @@ "የቅጽበት መተግበሪያዎች" "ቅጽበታዊ መተግበሪያዎች መጫን አያስፈልጋቸውም።" "የመተግበሪያ መረጃ" - - + "ወደ ድር ሂድ" "የተንቀሳቃሽ ስልክ ውሂብ" "Wi-Fi ጠፍቷል" "ብሉቱዝ ጠፍቷል" diff --git a/packages/SystemUI/res/values-am/strings_car.xml b/packages/SystemUI/res/values-am/strings_car.xml index 8550c42b87a7fecec6d6f74101a26cecaaa236b0..c4516562d8252d00f5f198afff7c928e8e9f2982 100644 --- a/packages/SystemUI/res/values-am/strings_car.xml +++ b/packages/SystemUI/res/values-am/strings_car.xml @@ -19,6 +19,5 @@ - "ደህንነትዎን ጠብቀው ያሽከርክሩ" - "የመኪና አነዳድ ሁኔታዎችን በተመለከተ ሙሉ በሙሉ ግንዛቤ ይኑርዎት፣ እንዲሁም የሚመለከታቸውን ሕጎች ሁልጊዜ ያክብሩ። የሚሰጡ አቅጣጫዎች ምናልባት ትክክል ያልሆኑ፣ ያልተሟሉ፣ አደገኛ፣ አግባብ ያልሆኑ፣ የተከለከሉ ወይም አስተዳደራዊ አካባቢዎችን ማቋረጥን የሚያካትቱ ሊሆኑ ይችላሉ። በተጨማሪም የንግድ ሥራ መረጃ ትክክል ያልሆነ ወይም ያልተሟላ ሊሆን ይችላል። ውሂብ ቅጽበታዊ አይደለም፣ እና የአካባቢ ትክክለኛነት ዋስትና ሊሰጥበት አይችልም። መኪና በሚነዱበት ጊዜ የእርስዎን ተንቀሳቃሽ መሣሪያ አይነካኩ ወይም ለAndroid Auto የታለሙ መተግበሪያዎችን አይጠቀሙ።" + "ያልታወቀ" diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 096b1cbbd68427cf817abd3be23e9221080f8803..32a181b2cad2764bb87b13f974a5ea77db4f7c8f 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -161,6 +161,7 @@ "إيقاف بيانات الجوال" "ربط البلوتوث." "وضع الطائرة." + "‏الشبكة الظاهرية الخاصة (VPN) قيد التشغيل." "‏ليس هناك شريحة SIM." "جارٍ تغيير شبكة مشغِّل شبكة الجوّال." "فتح تفاصيل البطارية" @@ -435,8 +436,7 @@ "تم ربط الملف الشخصي للعمل بـ %1$s" "تم ربط الملف الشخصي بـ %1$s" "تم ربط الجهاز بـ %1$s" - - + "إدارة الأجهزة" "مراقبة الملف الشخصي" "مراقبة الشبكات" "‏شبكة ظاهرية خاصة (VPN)" @@ -445,18 +445,14 @@ "تعطيل الشبكة الظاهرية الخاصة" "‏قطع الاتصال بشبكة VPN" "عرض السياسات" - - - - + "تتم إدارة جهازك بواسطة %1$s.\n\nيمكن للمشرف مراقبة وإدارة الإعدادات والدخول إلى المؤسسة والتطبيقات والبيانات المرتبطة بجهازك ومعلومات الموقع الجغرافي للجهاز.\n\nللحصول على المزيد من المعلومات، اتصل بالمشرف." + "تتم إدارة جهازك بواسطة المؤسسة.\n\nيمكن للمشرف مراقبة وإدارة الإعدادات والدخول إلى المؤسسة والتطبيقات والبيانات المرتبطة بجهازك ومعلومات الموقع الجغرافي للجهاز.\n\nللحصول على المزيد من المعلومات، اتصل بالمشرف." "ثبّتت مؤسستك مرجعًا مصدّقًا على هذا الجهاز. قد تتم مراقبة حركة بيانات شبكتك الآمنة أو تعديلها." "ثبّتت مؤسستك مرجعًا مصدّقًا في ملفك الشخصي للعمل. قد تتم مراقبة حركة بيانات شبكتك الآمنة أو تعديلها." "تم تثبيت مرجع مصدّق على هذا الجهاز. قد تتم مراقبة حركة بيانات شبكتك الآمنة أو تعديلها." "شغَّل المشرف ميزة تسجيل بيانات الشبكة، والتي يتم من خلالها مراقبة حركة البيانات على جهازك." - - - - + "لقد اتصلت بتطبيق %1$s، الذي يمكن أن يراقب نشاط شبكتك، بما في ذلك رسائل البريد الإلكتروني والتطبيقات والمواقع الإلكترونية." + "لقد اتصلت بتطبيق %1$s و%2$s اللذين يمكنهما مراقبة نشاط شبكتك، بما في ذلك رسائل البريد الإلكتروني والتطبيقات والمواقع الإلكترونية." "تم ربط الملف الشخصي للعمل بـ %1$s، الذي يمكنه مراقبة أنشطتك الشخصية على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب." "تم ربط ملفك الشخصي بـ %1$s، الذي يمكنه مراقبة أنشطة شبكتك، بما في ذلك رسائل البريد الإلكتروني والتطبيقات والمواقع الإلكترونية." "تتم إدارة جهازك بواسطة %1$s." @@ -478,6 +474,8 @@ "أنت متصل بـ %1$s، الذي يمكنه مراقبة أنشطتك الشخصية على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب." "يخضع الملف الشخصي للعمل لإدارة %1$s. تم ربط الملف الشخصي بـ %2$s، الذي يمكنه مراقبة أنشطة شبكتك، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب.\n\nيمكنك الاتصال بالمشرف للحصول على مزيد من المعلومات." "يخضع الملف الشخصي للعمل لإدارة %1$s. تم ربط هذا الملف الشخصي بـ %2$s، الذي يمكنه مراقبة أنشطة شبكتك، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب.\n\nتم ربطك بـ %3$s، الذي يمكنه مراقبة أنشطة شبكتك الشخصية." + + "سيظل الجهاز مقفلاً إلى أن يتم إلغاء قفله يدويًا" "الحصول على الإشعارات بشكل أسرع" "الاطلاع عليها قبل إلغاء القفل" @@ -719,6 +717,8 @@ "إشعار %1$s: %2$s" "يمكن ألا يعمل التطبيق مع وضع تقسيم الشاشة." "التطبيق لا يتيح تقسيم الشاشة." + "قد لا يعمل التطبيق على شاشة عرض ثانوية." + "التطبيق لا يسمح بتشغيله على شاشات عرض ثانوية." "فتح الإعدادات." "فتح الإعدادات السريعة." "إغلاق الإعدادات السريعة." @@ -768,8 +768,7 @@ "التطبيقات الفورية" "لا تتطلب التطبيقات الفورية إجراء التثبيت." "معلومات عن التطبيق" - - + "الانتقال إلى الويب" "بيانات الجوّال" "‏تم إيقاف شبكة Wi-Fi" "تم إيقاف البلوتوث." diff --git a/packages/SystemUI/res/values-ar/strings_car.xml b/packages/SystemUI/res/values-ar/strings_car.xml index 0f315a4dddf1d3213305715954b288d0e9d22d73..db62b484ac56615bdfe0d923b684a9eeb88ec60d 100644 --- a/packages/SystemUI/res/values-ar/strings_car.xml +++ b/packages/SystemUI/res/values-ar/strings_car.xml @@ -19,6 +19,5 @@ - "القيادة بأمان" - "‏عليك التعرف بشكل تام على ظروف القيادة والالتزام بالقوانين السارية. ويمكن أن تكون الاتجاهات غير دقيقة أو غير مكتملة أو خطيرة أو غير مناسبة أو محظورة أو تتضمن عبور مناطق إدارية. ويمكن أن تكون معلومات الأنشطة التجارية أيضًا غير دقيقة أو غير مكتملة. ولا يتم نشر البيانات في الوقت الفعلي، كما لا يمكن ضمان دقة المواقع. ولا تتعامل مع جهازك الجوّال أو تستخدم تطبيقات ليست متوافقة مع Android Auto أثناء القيادة." + "غير معروف" diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 940b009ba94c8a9b09e766ff25798c5dd96c63f7..e46354367b9c05d411e6c5bfb450623d18cf69fb 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -157,6 +157,7 @@ "Mobil Data Deaktivdir" "Bluetooth tezering." "Uçuş rejimi" + "VPN aktivdir." "SIM kart yoxdur." "Carrier şəbəkə dəyişir." "Batareya detallarını açın" @@ -427,8 +428,7 @@ "İş profili %1$s tətbiqinə qoşuludur" "Şəxsi profil %1$s tətbiqinə qoşuludur" "Cihaz %1$s tətbiqinə qoşuludur" - - + "Cihaz idarəetməsi" "Profil izlənməsi" "Şəbəkə monitorinqi" "VPN (Virtual Şəxsi Şəbəkələr)" @@ -437,18 +437,14 @@ "VPN-i deaktiv edin" "VPN-i bağlantıdan ayırın" "Siyasətlərə Baxın" - - - - + "Cihaz %1$s tərəfindən idarə edilir.\n\nAdmin cihaz və cihaz məkan məlumatı ilə əlaqəli ayarlara, korporativ girişə, tətbiqə və dataya nəzarət edə və idarə edə bilər.\n\nƏtraflı məlumat üçün admin ilə əlaqə saxlayın." + "Cihaz təşkilatınız tərəfindən idarə edilir.\n\nAdmin cihaz və cihaz məkan məlumatı ilə əlaqəli ayarlara, korporativ girişə, tətbiqə və dataya nəzarət edə və idarə edə bilər.\n\nƏtraflı məlumat üçün admin ilə əlaqə saxlayın." "Təşkilat bu cihazda sertifikat səlahiyyəti quraşdırdı. Təhlükəsiz şəbəkə ötürülməsinə nəzarət edilə və ya dəyişdirilə bilər." "Təşkilat iş profilində sertifikat səlahiyyəti quraşdırdı. Təhlükəsiz şəbəkə ötürülməsinə nəzarət edilə və ya dəyişdirilə bilər." "Bu cihazda sertifikat səlahiyyəti quraşdırıldı. Təhlükəsiz şəbəkə ötürülməsinə nəzarət edilə və ya dəyişdirilə bilər." "Admin cihazda şəbəkə ötürülməsinə nəzarət edən şəbəkə qeydlərini aktiv etdi." - - - - + "E-poçt, tətbiq və veb saytlar daxil olmaqla şəbəkə fəaliyyətinə nəzarət edən %1$s tətbiqinə qoşulusunuz." + "E-poçt, tətbiq və veb saytlar daxil olmaqla şəbəkə fəaliyyətinə nəzarət edən %1$s%2$s tətbiqlərinə qoşulusunuz." "İş profili e-poçt, tətbiq və veb saytlar da daxil olmaqla şəbəkə fəaliyyətinə nəzarət edən %1$s tətbiqinə qoşuludur." "Şəxsi profil e-poçt, tətbiq və veb saytlar daxil olmaqla şəbəkə fəaliyyətinə nəzarət edən %1$s tətbiqinə qoşuludur." "Cihaz %1$s tərəfindən idarə olunur." @@ -470,6 +466,8 @@ "%1$s tətbiqinə qoşulmusunuz və o, e-məktublar, tətbiq və veb saytlar daxil olmaqla şəxsi şəbəkə fəaliyyətinizə nəzarət edə bilər." "İş profili %1$s tərəfindən idarə olunur. Profil e-poçt, tətbiq və veb saytlar da daxil olmaqla şəbəkə fəaliyyətinə nəzarət edən %2$s tətbiqinə qoşuludur.\n\nƏtraflı məlumat üçün admin ilə əlaqə saxlayın." "İş profili %1$s tərəfindən idarə edilir. Profil e-poçt, tətbiq və veb saytlar da daxil olmaqla şəbəkə fəaliyyətinə nəzarət edən %2$s tətbiqinə qoşuludur.\n\nEyni zamanda şəxsi şəbəkə fəaliyyətinə nəzarət edən %3$s tətbiqinə qoşulusunuz." + + "Device will stay locked until you manually unlock" "Bildirişləri daha sürətlə əldə edin" "Kiliddən çıxarmadan öncə onları görün" @@ -703,6 +701,8 @@ "%1$s bildiriş: %2$s" "Tətbiq bölünmüş ekran ilə işləməyə bilər." "Tətbiq ekran bölünməsini dəstəkləmir." + "Tətbiq ikinci ekranda işləməyə bilər." + "Tətbiq ikinci ekranda başlamağı dəstəkləmir." "Ayarları açın." "Cəld ayarları açın." "Cəld ayarları bağlayın." @@ -752,8 +752,7 @@ "Ani Tətbiqlər" "Ani tətbiqlər quraşdırma tələb etmir." "Tətbiq məlumatı" - - + "Vebə keçin" "Mobil data" "Wi-Fi deaktivdir" "Bluetooth deaktivdir" diff --git a/packages/SystemUI/res/values-az/strings_car.xml b/packages/SystemUI/res/values-az/strings_car.xml index 9ac7ce0b336357ff54c807b7ad7427fe8150798f..a225982f8aa85037a8887df392a2286641d6f305 100644 --- a/packages/SystemUI/res/values-az/strings_car.xml +++ b/packages/SystemUI/res/values-az/strings_car.xml @@ -19,6 +19,5 @@ - "Təhlükəsiz sürün" - "Yol şəraitindən tam xəbərdar olun və hər zaman tətbiq olunan qaydalara riayət edin. İstiqamətlər qeyri-dəqiq, natamam, təhlükəli, uyğun olmayan, qadağan edilmiş və ya inzibati sahələrə keçid ilə nəticələnə bilər. Biznes məlumatı da qeyri-dəqiq və ya natamam ola bilər. Data real vaxtda deyil və məkan dəqiqliyinə zəmanət verilmir. Avtomobil idarə edərkən mobil cihazınızı elinizə almayın və ya Android Avto üçün nəzərdə tutulmamış tətbiqlərdən istifadə etməyin." + "Naməlum" diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index f1e7e63ba0b1b885b282147c5ed1a21c33ec221e..7210a826287b7a67f318b6d390add244304405d2 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -158,6 +158,7 @@ "Mobilni podaci su isključeni" "Bluetooth privezivanje." "Režim rada u avionu." + "VPN je uključen." "Nema SIM kartice." "Promena mreže mobilnog operatera." "Otvori detalje o bateriji" @@ -429,8 +430,7 @@ "Profil za Work je povezan sa aplikacijom %1$s" "Lični profil je povezan sa aplikacijom %1$s" "Uređaj je povezan sa aplikacijom %1$s" - - + "Upravljanje uređajima" "Nadgledanje profila" "Nadgledanje mreže" "VPN" @@ -439,18 +439,14 @@ "Onemogući VPN" "Prekini vezu sa VPN-om" "Prikaži smernice" - - - - + "Uređajem upravlja %1$s.\n\nAdministrator može da nadgleda podešavanja, korporativni pristup, aplikacije, podatke povezane sa uređajem i informacije o lokaciji uređaja, kao i da upravlja njima.\n\nViše informacija potražite od administratora." + "Uređajem upravlja organizacija.\n\nAdministrator može da nadgleda podešavanja, korporativni pristup, aplikacije, podatke povezane sa uređajem i informacije o lokaciji uređaja, kao i da upravlja njima.\n\nViše informacija potražite od administratora." "Organizacija je na ovom uređaju instalirala autoritet za izdavanje sertifikata. Bezbedni mrežni saobraćaj može da se prati ili menja." "Organizacija je na profilu za Work instalirala autoritet za izdavanje sertifikata. Bezbedni mrežni saobraćaj može da se prati ili menja." "Na ovom uređaju je instaliran autoritet za izdavanje sertifikata. Bezbedni mrežni saobraćaj može da se prati ili menja." "Administrator je uključio evidentiranje mreže, koje prati saobraćaj na uređaju." - - - - + "Povezani ste sa aplikacijom %1$s, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove." + "Povezani ste sa aplikacijama %1$s i %2$s, koje mogu da nadgledaju aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove." "Profil za Work je povezan sa aplikacijom %1$s, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove." "Lični profil je povezan sa aplikacijom %1$s, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove." "Uređajem upravlja %1$s." @@ -472,6 +468,8 @@ "Povezani ste sa aplikacijom %1$s, koja može da nadgleda aktivnosti na ličnoj mreži, uključujući imejlove, aplikacije i veb-sajtove." "Profilom za Work upravlja %1$s. Povezan je sa aplikacijom %2$s, koja može da nadgleda aktivnosti na poslovnoj mreži, uključujući imejlove, aplikacije i veb-sajtove.\n\nViše informacija potražite od administratora." "Profilom za Work upravlja %1$s. Povezan je sa aplikacijom %2$s, koja može da nadgleda aktivnosti na poslovnoj mreži, uključujući imejlove, aplikacije i veb-sajtove.\n\nPovezani ste i sa aplikacijom %3$s, koja može da nadgleda aktivnosti na ličnoj mreži." + + "Uređaj će ostati zaključan dok ga ne otključate ručno" "Brže dobijajte obaveštenja" "Pregledajte ih pre otključavanja" @@ -707,6 +705,8 @@ "Obaveštenja za %1$s: %2$s" "Aplikacija možda neće funkcionisati sa podeljenim ekranom." "Aplikacija ne podržava podeljeni ekran." + "Aplikacija možda neće funkcionisati na sekundarnom ekranu." + "Aplikacija ne podržava pokretanje na sekundarnim ekranima." "Otvori Podešavanja." "Otvori Brza podešavanja." "Zatvori Brza podešavanja." @@ -756,8 +756,7 @@ "Instant aplikacije" "Instant aplikacije ne zahtevaju instalaciju." "Informacije o aplikaciji" - - + "Idi na veb" "Mobilni podaci" "Wi-Fi je isključen" "Bluetooth je isključen" diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings_car.xml b/packages/SystemUI/res/values-b+sr+Latn/strings_car.xml index f45af7ce350c64098de3fc4e13c1e98b115673ae..3837c7b2d80fa819658611b575463130b3877386 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings_car.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings_car.xml @@ -19,6 +19,5 @@ - "Vozite bezbedno" - "Uvek vodite računa o uslovima vožnje i uvek poštujte primenjive zakone. Uputstva mogu da budu netačna, nepotpuna, opasna, neprikladna ili zabranjena, odnosno da podrazumevaju prelazak između administrativnih oblasti. I podaci o preduzeću mogu da budu netačni ili nepotpuni. Podaci ne nastaju u realnom vremenu i ne možemo da garantujemo preciznost lokacije. Nemojte da upotrebljavate mobilni uređaj niti da koristite aplikacije koje nisu namenjene za Android Auto tokom vožnje." + "Nepoznato" diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 51c8ea6a4a28f1cb4a5bf630022df4e8251a1b9f..e4431cb506d204373295453472157195f5dad0ab 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -159,6 +159,7 @@ "Мабільная перадача даных выключана" "Сувязь па Bluetooth." "Рэжым палёту." + "VPN уключана." "Няма SIM-карты." "Змяненне аператара сеткі." "Паказаць падрабязную інфармацыю пра акумулятар" @@ -433,8 +434,7 @@ "Працоўны профіль падключаны да праграмы %1$s" "Асабісты профіль падключаны да праграмы %1$s" "Прылада падключана да праграмы %1$s" - - + "Кіраванне прыладай" "Маніторынг профіляў" "Маніторынг сеткі" "VPN" @@ -443,18 +443,14 @@ "Адключыць VPN" "Адлучыць VPN" "Праглядзець палітыку" - - - - + "Ваша прылада знаходзіцца пад кіраваннем %1$s.\n\nВаш адміністратар можа сачыць і кіраваць наладамі, карпаратыўным доступам, праграмамі, данымі, звязанымі з вашай прыладай, і звесткамі пра месцазнаходжанне вашай прылады.\n\nДля атрымання дадатковай інфармацыі звярніцеся да адміністратара." + "Ваша прылада знаходзіцца пад кіраваннем вашай арганізацыі.\n\nУ вашага адміністратара ёсць магчымасць маніторынгу і адміністравання налад, карпаратыўнага доступу, праграм, даных, звязаных з гэтай прыладай, і адпаведных геаданых.\n\nДля атрымання дадатковай інфармацыі звярніцеся да адміністратара." "Ваша арганізацыя ўсталявала на гэтай прыладзе цэнтр сертыфікацыі. Ваш абаронены сеткавы трафік могуць праглядваць ці змяняць." "Ваша арганізацыя ўсталявала ў вашым працоўным профілі цэнтр сертыфікацыі. Ваш абаронены сеткавы трафік могуць праглядваць ці змяняць." "На гэтай прыладзе ўсталяваны цэнтр сертыфікацыі. Ваш абаронены сеткавы трафік могуць праглядваць ці змяняць." "Ваш адміністратар уключыў вядзенне журнала сеткі, з дапамогай якога адсочваецца трафік на вашай прыладзе." - - - - + "Вы падключаны да праграмы %1$s, якая можа сачыць за вашай сеткавай дзейнасцю, уключаючы электронную пошту, праграмы і вэб-сайты." + "Вы падключаны да праграм %1$s і %2$s, якія могуць сачыць за вашай сеткавай дзейнасцю, уключаючы электронную пошту, праграмы і вэб-сайты." "Ваш працоўны профіль падключаны да праграмы %1$s, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты." "Ваш асабісты профіль падключаны да праграмы %1$s, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты." "Ваша прылада знаходзіцца пад кіраваннем %1$s." @@ -476,6 +472,8 @@ "Вы падключаны да праграмы %1$s, якая можа сачыць за вашай асабістай сеткавай дзейнасцю, уключаючы электронную пошту, праграмы і вэб-сайты." "Ваш працоўны профіль знаходзіцца пад кіраваннем %1$s. Ён падключаны да праграмы %2$s, якая можа сачыць за вашай працоўнай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты.\n\nДля атрымання дадатковай інфармацыі звярніцеся да адміністратара." "Ваш працоўны профіль знаходзіцца пад кіраваннем %1$s. Ён падключаны да праграмы %2$s, якая можа сачыць за вашай працоўнай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты.\n\nВы таксама падключаны да праграмы %3$s, якая можа сачыць за вашай асабістай сеткавай актыўнасцю." + + "Прылада будзе заставацца заблакіраванай, пакуль вы не разблакіруеце яе ўручную" "Атрымлівайце апавяшчэнні хутчэй" "Праглядайце іх перад разблакіроўкай" @@ -713,6 +711,8 @@ "Апавяшчэнне %1$s: %2$s" "Праграма можа не працаваць у рэжыме дзялення экрана." "Праграма не падтрымлівае функцыю дзялення экрана." + "Праграма можа не працаваць на дадатковых дысплэях." + "Праграма не падтрымлівае запуск на дадатковых дысплэях." "Адкрыць налады." "Адкрыць хуткія налады." "Закрыць хуткія налады." @@ -762,8 +762,7 @@ "Імгненныя праграмы" "Імгненныя праграмы не патрабуюць усталёўкі." "Інфармацыя пра праграму" - - + "Перайсці ў інтэрнэт" "Маб. перадача даных" "Wi-Fi выключаны" "Bluetooth выключаны" diff --git a/packages/SystemUI/res/values-be/strings_car.xml b/packages/SystemUI/res/values-be/strings_car.xml index e3ef7c6d59188aa518c38d2a54ab8d2aa87dda66..ca53f9b93bfb8df90c39bd96d5d5bc2e8390cfb3 100644 --- a/packages/SystemUI/res/values-be/strings_car.xml +++ b/packages/SystemUI/res/values-be/strings_car.xml @@ -19,6 +19,5 @@ - "Кіруйце аўтамабілем бяспечна" - "Будзьце заўсёды ў курсе дарожных умоў і заўсёды прытрымлівайцеся дзеючага заканадаўства. Указанні могуць быць недакладнымі, няпоўнымі, небяспечнымі, непадыходзячымі, забароненымі ці прадугледжваць уезд на адміністрацыйныя тэрыторыі. Інфармацыя пра кампаніі таксама можа быць недакладнай ці няпоўнай. Даныя не прадстаўляюцца ў рэжыме рэальнага часу, і дакладнасць вызначэння месцазнаходжання не можа быць гарантавана. Не выкарыстоўвайце сваю мабільную прыладу або праграмы, не прызначаныя для Android Auto, падчас кіравання." + "Невядомы" diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index f3c5651ab7965856b58880514f2956778634a4b7..3df3deff5b4535e80b324db6f6d83a0ea4588b55 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -152,14 +152,12 @@ "Edge" "Wi-Fi" "Няма SIM карта." - - - - - - + "Мобилни данни" + "Мобилните данни са включени" + "Мобилните данни са изключени" "Тетъринг през Bluetooth." "Самолетен режим." + "Функцията за виртуална частна мрежа (VPN) е включена." "Няма SIM карта." "Промяна на мрежата на оператора." "Отваряне на подробностите за батерията" @@ -242,11 +240,9 @@ "Зарежда се" "Данните от 2G – 3G са поставени на пауза" "Данните от 4G са поставени на пауза" - - + "Мобилните данни са поставени на пауза" "Данните са поставени на пауза" - - + "Достигнахте зададеното от вас ограничение за данните. Вече не използвате мобилната мрежа.\n\nАко възобновите връзката с нея, може да бъдете таксувани за пренос на данни." "Възобновяване" "Няма връзка с интернет" "Wi-Fi: Има връзка" @@ -309,7 +305,7 @@ "Няма налични устройства" "Яркост" "АВТ." - "Обръщане на цветовете" + "Инвертиране на цветовете" "Режим на коригиране на цветовете" "Още настройки" "Готово" @@ -319,8 +315,7 @@ "Точка за достъп" "Известия" "Фенерче" - - + "Мобилни данни" "Пренос на данни" "Оставащи данни" "Над ограничението" @@ -433,8 +428,7 @@ "Служебният потребителски профил е свързан с приложението %1$s" "Личният потребителски профил е свързан с приложението %1$s" "Устройството е свързано с приложението %1$s" - - + "Управление на устройствата" "Наблюдаване на потр. профил" "Наблюдение на мрежата" "VPN" @@ -443,18 +437,14 @@ "Деактивиране на VPN" "Прекратяване на връзката с VPN" "Преглед на правилата" - - - - + "Устройството ви се управлява от %1$s.\n\nАдминистраторът ви може да наблюдава и управлява настройките, корпоративния достъп, приложенията, свързаните с устройството данни и информацията за местоположението му.\n\nЗа повече информация се свържете с администратора си." + "Устройството ви се управлява от организацията ви.\n\nАдминистраторът ви може да наблюдава и управлява настройките, корпоративния достъп, приложенията, свързаните с устройството данни и информацията за местоположението му.\n\nЗа повече информация се свържете с администратора си." "Организацията ви е инсталирала сертифициращ орган на това устройство. Трафикът в защитената ви мрежа може да бъде наблюдаван или променян." "Организацията ви е инсталирала сертифициращ орган в служебния ви потребителски профил. Трафикът в защитената ви мрежа може да бъде наблюдаван или променян." "На това устройство е инсталиран сертифициращ орган. Трафикът в защитената ви мрежа може да бъде наблюдаван или променян." "Администраторът ви е включил функцията за регистриране на мрежовата активност, която следи трафика на устройството ви." - - - - + "Установена е връзка с приложението %1$s, което може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове." + "Установена е връзка с приложенията %1$s и %2$s, които могат да наблюдават активността ви в мрежата, включително имейли, приложения и уебсайтове." "Служебният ви потребителски профил е свързан с приложението %1$s, което може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове." "Личният ви потребителски профил е свързан с приложението %1$s, което може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове." "Устройството ви се управлява от %1$s." @@ -476,6 +466,8 @@ "Установена е връзка с приложението %1$s, което може да наблюдава личната ви активност в мрежата, включително имейли, приложения и уебсайтове." "Служебният ви потребителски профил се управлява от %1$s. Той е свързан с приложението %2$s, което може да наблюдава служебната ви активност в мрежата, включително имейли, приложения и уебсайтове.\n\nЗа още информация се свържете с администратора си." "Служебният ви потребителски профил се управлява от %1$s. Той е свързан с приложението %2$s, което може да наблюдава служебната ви активност в мрежата, включително имейли, приложения и уебсайтове.\n\nУстановена е връзка и с приложението %3$s, което може да наблюдава личната ви активност в мрежата." + + "Устройството ще остане заключено, докато не го отключите ръчно" "Получавайте известия по-бързо" "Вижте известията, преди да отключите" @@ -569,12 +561,9 @@ %1$s“, „%2$s“ и още %3$d %1$s“, „%2$s“ и още %3$d - - - - - - + "Контролите за известията за %1$s са оттворени" + "Контролите за известията за %1$s са затворени" + "Разрешаване на известия от този канал" "Всички категории" "Още настройки" "Персонализиране: %1$s" @@ -712,6 +701,8 @@ "Известие от %1$s: %2$s" "Приложението може да не работи в режим на разделен екран." "Приложението не поддържа разделен екран." + "Възможно е приложението да не работи на алтернативни дисплеи." + "Приложението не поддържа използването на алтернативни дисплеи." "Отваряне на настройките." "Отваряне на бързите настройки." "Затваряне на бързите настройки." @@ -730,14 +721,10 @@ "Меню за режима „Картина в картина“" "%s е в режима „Картина в картина“" "Ако не искате %s да използва тази функция, докоснете, за да отворите настройките, и я изключете." - - - - - - - - + "Пускане" + "Поставяне на пауза" + "Към следващия елемент" + "Към предишния елемент" "Тел. се изкл. поради загряване" "Телефонът ви вече работи нормално" "Телефонът ви бе твърде горещ, затова се изключи с цел охлаждане. Вече работи нормално.\n\nТелефонът ви може да стане твърде горещ, ако:\n • използвате приложения, които ползват голям обем ресурси (като например игри, видеосъдържание или приложения за навигация);\n • изтегляте или качвате големи файлове;\n • използвате устройството си при високи температури." @@ -765,8 +752,7 @@ "Мигновени приложения" "За мигновените приложения не се изисква инсталиране." "Информация за приложението" - - + "Към мрежата" "Мобилни данни" "Функцията за Wi‑Fi е изключена" "Функцията за Bluetooth е изключена" diff --git a/packages/SystemUI/res/values-bg/strings_car.xml b/packages/SystemUI/res/values-bg/strings_car.xml index bd9fe799fc8b69315093ad9c74d098166cae38c5..0ff0729e172a4c5ef28d66fa35f31ee34847b889 100644 --- a/packages/SystemUI/res/values-bg/strings_car.xml +++ b/packages/SystemUI/res/values-bg/strings_car.xml @@ -19,6 +19,5 @@ - "Карайте внимателно" - "Бъдете осведомени за условията при шофиране и винаги спазвайте приложимите закони. Упътванията може да са неточни, непълни, опасни, неподходящи, забранени или да включват преминаване през административни райони. Бизнес информацията може също да е неточна или непълна. Данните не са в реално време и точността на местоположението не може да се гарантира. Не работете с мобилното си устройство, нито използвайте приложения, които не са предназначени за Android Auto, докато шофирате." + "Няма информация" diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 853196fb8a7a39496217dffa939e6747a2685f6e..2ab8585c012089addfba89363fc7159747ec1433 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -152,14 +152,12 @@ "Edge" "ওয়াই-ফাই" "কোনো সিম নেই৷" - - - - - - + "মোবাইল ডেটা" + "মোবাইল ডেটা চালু আছে" + "মোবাইল ডেটা বন্ধ আছে" "ব্লুটুথ টিথারিং৷" "বিমান মোড৷" + "VPN চালু আছে।" "কোনো সিম কার্ড নেই।" "পরিষেবা প্রদানকারীর নেটওয়ার্ক পরিবর্তিত হচ্ছে।" "ব্যাটারির বিশদ বিবরণ খুলুন" @@ -192,8 +190,8 @@ "কর্মস্থলের স্ক্রীন লক" "বন্ধ করুন" "%1$s।" - "WiFi বন্ধ হয়েছে।" - "WiFi চালু হয়েছে।" + "ওয়াই ফাই বন্ধ হয়েছে।" + "ওয়াই ফাই চালু হয়েছে।" "মোবাইল %1$s%2$s%3$s৷" "ব্যাটারি %s৷" "বিমান মোড বন্ধ আছে।" @@ -242,11 +240,9 @@ "চার্জ হচ্ছে" "2G-3G ডেটা বিরতি দেওয়া হয়েছে" "4G ডেটা বিরতি দেওয়া হয়েছে" - - + "মোবাইল ডেটা সাময়িক ভাবে বন্ধ করা হয়েছে" "ডেট বিরতি দেওয়া হয়েছে" - - + "আপনার সেট করা ডেটার সীমা ফুরিয়ে গেছে। আপনি এখন আর মোবাইল ডেটা ব্যবহার করতে পারবেন না।\n\nযদি আপনি আবার শুরু করেন, ডেটা ব্যবহারের জন্য মূল্য প্রযোজ্য হতে পারে।" "পুনঃসূচনা করুন" "কোনো ইন্টারনেট সংযোগ নেই" "ওয়াই-ফাই সংযুক্ত হয়েছে" @@ -319,8 +315,7 @@ "হটস্পট" "বিজ্ঞপ্তিগুলি" "ফ্ল্যাশলাইট" - - + "মোবাইল ডেটা" "ডেটার ব্যবহার" "অবশিষ্ট ডেটা" "সীমার উর্ধ্বে" @@ -433,8 +428,7 @@ "কর্মস্থলের প্রোফাইল %1$s এর সাথে সংযুক্ত রয়েছে" "ব্যক্তিগত প্রোফাইল %1$s এর সাথে সংযুক্ত রয়েছে" "ডিভাইসটি %1$s এর সাথে সংযুক্ত রয়েছে" - - + "ডিভাইসের পরিচালনা" "প্রোফাইল দেখরেখ করা" "নেটওয়ার্ক নিরীক্ষণ" "VPN" @@ -443,18 +437,14 @@ "VPN অক্ষম করুন" "VPN এর সংযোগ বিচ্ছিন্ন করুন" "নীতিগুলি দেখুন" - - - - + "আপনার ডিভাইসটি %1$s এর দ্বারা পরিচালিত হয়।\n\nআপনার প্রশাসক এই ডিভাইসের সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ, ডিভাইসের সাথে সম্পর্কিত ডেটা এবং ডিভাইসের অবস্থান তথ্য নিরীক্ষণ ও পরিচালনা করতে পারেন।\n\nআরও তথ্যের জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন।" + "আপনার ডিভাইসটি আপনার প্রতিষ্ঠানের দ্বারা পরিচালিত হয়।\n\nআপনার প্রশাসক এই ডিভাইসের সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ, ডিভাইসের সাথে সম্পর্কিত ডেটা এবং ডিভাইসের অবস্থান তথ্য নিরীক্ষণ ও পরিচালনা করতে পারেন।\n\nআরও তথ্যের জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন।" "আপনার প্রতিষ্ঠান আপনার কর্মস্থলের প্রোফাইলে একটি শংসাপত্র কর্তৃপক্ষ ইনস্টল করেছে।আপনার সুরক্ষিত নেটওয়ার্ক ট্রাফিক নিরীক্ষণ বা পরিবর্তন করা হতে পারে।" "আপনার প্রতিষ্ঠান আপনার কর্মস্থলের প্রোফাইলে একটি শংসাপত্র কর্তৃপক্ষ ইনস্টল করেছে। আপনার নিরাপদ নেটওয়ার্ক ট্রাফিকে নজর রাখা হতে পারে বা তাতে পরিবর্তন করা হতে পারে।" "এই ডিভাইসে একটি শংসাপত্র কর্তৃপক্ষ ইনস্টল করা আছে। আপনার নিরাপদ নেটওয়ার্ক ট্রাফিকে নজর রাখা হতে পারে বা তাতে পরিবর্তন করা হতে পারে।" "আপনার প্রশাসক নেটওয়ার্ক লগিং চালু করেছেন, যা আপনার ডিভাইসের ট্রাফিকের উপরে নজর রাখে।" - - - - + "আপনি %1$s এ সংযুক্ত রয়েছেন, যা আপনার ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপের উপর নজর রাখতে পারে।" + "আপনি %1$s এবং %2$s এর সাথে সংযুক্ত রয়েছেন, যেগুলি আপনার ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপের উপর নজর রাখতে পারে।" "আপনার কর্মস্থলের প্রোফাইল %1$s এর সাথে সংযুক্ত রয়েছে, যেটি ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপে নজর রাখতে পারে।" "আপনার ব্যক্তিগত প্রোফাইল %1$s এর সাথে সংযুক্ত রয়েছে, যেটি ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপে নজর রাখতে পারে৷" "আপনার ডিভাইসটি %1$s এর দ্বারা পরিচালিত৷" @@ -476,6 +466,8 @@ "আপনি %1$s এর সাথে সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ এবং ওয়েবসাইটগুলি সহ আপনার ব্যক্তিগত নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করবে৷" "%1$s আপনার কর্মস্থলের প্রোফাইল পরিচালনা করে। প্রোফাইলটি %2$s এর সাথে সংযুক্ত, যেটি ইমেল, অ্যাপ, ও ওয়েবসাইট সহ আপনার কর্মস্থলের নেটওয়ার্ক কার্যকলাপের উপরে নজর রাখতে পারে।\n\nআরো তথ্যের জন্য প্রশাসকের সাথে যোগাযোগ করুন।" "%1$s আপনার কর্মস্থলের প্রোফাইল পরিচালনা করে। প্রোফাইলটি %2$s এর সাথে সংযুক্ত, যেটি ইমেল অ্যাপ, ও ওয়েবসাইট সহ আপনার কর্মস্থলের নেটওয়ার্ক কার্যকলাপের উপরে নজর রাখতে পারে।\n\n এ ছাড়াও আপনি %3$s এর সাথে সংযুক্ত, যেটি আপনার ব্যক্তিগত নেটওয়ার্কে নজর রাখে।" + + "আপনি নিজে আনলক না করা পর্যন্ত ডিভাইসটি লক হয়ে থাকবে" "বিজ্ঞপ্তিগুলি আরো দ্রুত পান" "আপনি আনলক করার আগে ওগুলো দেখুন" @@ -569,12 +561,9 @@ %1$s, %2$s, এবং আরো %3$dটি %1$s, %2$s, এবং আরো %3$dটি - - - - - - + "%1$s খোলা থাকলে বিজ্ঞপ্তি নিয়ন্ত্রণ" + "%1$s বন্ধ থাকলে বিজ্ঞপ্তি নিয়ন্ত্রণ" + "এই চ্যানেল থেকে বিজ্ঞপ্তি আসতে দেয়" "সকল বিভাগ" "আরো সেটিংস" "কাস্টমাইজ করুন: %1$s" @@ -712,6 +701,8 @@ "%1$s বিজ্ঞপ্তি: %2$s" "অ্যাপ্লিকেশানটি বিভক্ত স্ক্রীনে কাজ নাও করতে পারে৷" "অ্যাপ্লিকেশান বিভক্ত-স্ক্রীন সমর্থন করে না৷" + "সেকেন্ডারি ডিসপ্লেতে অ্যাপটি কাজ নাও করতে পারে।" + "সেকেন্ডারি ডিসপ্লেতে অ্যাপ লঞ্চ করা যাবে না।" "সেটিংস খুলুন।" "দ্রুত সেটিংস খুলুন৷" "দ্রুত সেটিংস বন্ধ করুন৷" @@ -730,14 +721,10 @@ "পিকচার ইন পিকচার মেনু" "ছবির-মধ্যে-ছবি তে %s আছেন" "%s কে এই বৈশিষ্ট্যটি ব্যবহার করতে দিতে না চাইলে ট্যাপ করে সেটিংসে গিয়ে সেটি বন্ধ করে দিন।" - - - - - - - - + "চালান" + "বিরাম দিন" + "এগিয়ে যাওয়ার জন্য এড়িয়ে যান" + "পিছনে যাওয়ার জন্য এড়িয়ে যান" "আপনার ফোন গরম হওয়ার জন্য বন্ধ হয়ে গেছে" "আপনার ফোন এখন ঠিক-ঠাক চলছে" "আপনার ফোন খুব বেশি গরম হয়েছিল বলে ঠান্ডা হওয়ার জন্য বন্ধ হয়ে গেছে। আপনার ফোন ঠিক-ঠাক ভাবে চলছে না।\n\nআপনার ফোন খুব বেশি গরম হয়ে যাবে যদি আপনি:\n •এমন অ্যাপ ব্যবহার করলে যেটি আপনার ডিভাইসের রিসোর্স বেশি ব্যবহার করে (যেমন গেমিং, ভিডিও বা নেভিগেশন অ্যাপ)\n • বড় ফাইল ডাউনলোড বা আপলোড করলে\n • বেশি তাপমাত্রায় আপনার ফোন ব্যবহার করলে" @@ -765,8 +752,7 @@ "ঝটপট অ্যাপ" "ঝটপট অ্যাপ ইনস্টল করার প্রয়োজন হয় না।" "অ্যাপ্লিকেশানের তথ্য" - - + "ওয়েবে যান" "মোবাইল ডেটা" "ওয়াই ফাই বন্ধ আছে" "ব্লুটুথ বন্ধ আছে" diff --git a/packages/SystemUI/res/values-bn/strings_car.xml b/packages/SystemUI/res/values-bn/strings_car.xml index d8a8732c84b3b798fc1b728041ef49fc0d72e073..4271f987b81e1ccb2d05ce457b5d93bd277e906e 100644 --- a/packages/SystemUI/res/values-bn/strings_car.xml +++ b/packages/SystemUI/res/values-bn/strings_car.xml @@ -19,6 +19,5 @@ - "সাবধানে চালান" - "গাড়ি চালানোর সময় সর্বদা সতর্ক থাকুন এবং প্রযোজ্য আইন মেনে চলুন৷ দিকনির্দেশ ভুল, অসম্পূর্ণ, বিপজ্জনক, অনুপযুক্ত, নিষিদ্ধ হতে পারে বা প্রশাসনিক এলাকাগুলি অতিক্রম করতে হতে পারে৷ বাণিজ্যিক তথ্য ভুল বা অসম্পূর্ণ হতে পারে৷ ডেটা প্রকৃত সময়ের নয় এবং অবস্থানের নির্ভুলতা নিশ্চিত করাও সম্ভব নয়৷ গাড়ি চালানোর সময় আপনার মোবাইল ডিভাইসটিকে বা Android Auto এর জন্য উপযুক্ত নয় এমন অ্যাপগুলিকে ব্যবহার করবেন না৷" + "অজানা" diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 01e2006d91faa69542e07fc026b1740c1575783a..f313e62b8e46349f038666a1194b48d87743da2b 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -158,6 +158,7 @@ "Mobilni podaci su isključeni" "Dijeljenje Bluetooth veze." "Način rada u avionu." + "VPN uključen." "Nema SIM kartice." "Promjena mreže operatera." "Otvori detalje o potrošnji baterije" @@ -350,7 +351,7 @@ "Do kraja punjenja preostalo %s" "Ne puni se" "Mreža može \n biti nadzirana" - "Traži" + "Pretraživanje" "Povucite gore za %s." "Povucite lijevo za %s." "Zvukovi i vibracije vas neće uznemiravati, osim alarma, podsjetnika, događaja i pozivalaca koje odredite." @@ -429,8 +430,7 @@ "Radni profil je povezan s aplikacijom %1$s" "Lični profil je povezan s aplikacijom %1$s" "Uređaj je povezan s aplikacijom %1$s" - - + "Upravljanje uređajem" "Praćenje profila" "Praćenje mreže" "VPN mreža" @@ -439,18 +439,14 @@ "Isključi VPN" "Prekini VPN vezu" "Prikaži pravila" - - - - + "Vašim uređajem upravlja organizacija %1$s.\n\nVaš administrator može nadgledati i upravljati vašim postavkama, korporativnom pristupu, aplikacijama, podacima koji su povezani s vašim uređajem i informacijama o lokaciji vašeg uređaja.\n\nZa više informacija, obratite se svom administratoru." + "Vašim uređajem upravlja vaša organizacija.\n\nVaš administrator može nadgledati i upravljati vašim postavkama, korporativnom pristupu, aplikacijama, podacima koji su povezani s vašim uređajem i informacijama o lokaciji vašeg uređaja.\n\nZa više informacija, obratite se svom administratoru." "Vaša organizacija je instalirala CA certifikat na ovom uređaju. Vaš promet preko sigurne mreže može se pratiti." "Vaša organizacija je instalirala CA certifikat na vašem radnom profilu. Vaš promet preko sigurne mreže može se pratiti." "CA certifikat je instaliran na ovom uređaju. Vaš promet preko sigurne mreže može se pratiti." "Vaš administrator je uključio zapisivanje na mreži, čime se prati promet na vašem uređaju." - - - - + "Povezani ste s aplikacijom %1$s koja može pratiti vašu aktivnost na mreži, uključujući e-poštu i web lokacije." + "Povezani ste s aplikacijama %1$s i %2$s koje mogu pratiti vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web lokacije." "Vaš radni profil je povezan s aplikacijom %1$s, koja može pratiti vašu aktivnost na mreži, uključujući e-poruke i web lokacije." "Vaš lični profil je povezan s aplikacijom %1$s, koja može pratiti vašu aktivnost na mreži, uključujući e-poruke, aplikacije i web lokacije." "Vašim uređajem upravlja aplikacija %1$s." @@ -472,6 +468,8 @@ "Povezani ste na aplikaciju %1$s, koja može pratiti vaše privatne aktivnosti na mreži, uključujući e-poštu, aplikacije i web stranice." "Vašim radnim profilom upravlja %1$s. Profil je povezan s aplikacijom %2$s, koja može pratiti vašu aktivnost na radnoj mreži, uključujući e-poruke, aplikacije i web lokacije.\n\nZa više informacija, obratite se svom administratoru." "Radnim profilom upravlja %1$s. Profil je povezan s aplikacijom %2$s, koja može pratiti vašu aktivnost na radnoj mreži, uključujući e-poruke, aplikacije i web lokacije.\n\nPovezani ste i sa aplikacijom %3$s, koja može pratiti vašu aktivnost na privatnoj mreži." + + "Uređaj će ostati zaključan dok ga ručno ne otključate" "Brže primaj obavještenja" "Vidi ih prije otključavanja" @@ -484,7 +482,7 @@ "Ekran je prikačen" "Ekran ostaje prikazan ovako dok ga ne otkačite. Da ga otkačite, dodirnite i držite dugme Nazad." "Ekran ostaje prikazan ovako dok ga ne otkačite. Da ga otkačite, dodirnite i držite dugme Pregled." - "Jasno mi je" + "Razumijem" "Ne, hvala" "Želite li sakriti %1$s?" "Pojavit će se sljedeći put kada opciju uključite u postavkama." @@ -533,7 +531,7 @@ "Zabava za neke, ali ne za sve" "Podešavač za korisničko sučelje sistema vam omogućava dodatne načine da podesite i prilagodite Androidovo sučelje. Ove eksperimentalne funkcije se u budućim verzijama mogu mijenjati, kvariti ili nestati. Budite oprezni." "Ove eksperimentalne funkcije se u budućim verzijama mogu mijenjati, kvariti ili nestati. Budite oprezni." - "Jasno mi je" + "Razumijem" "Čestitamo! Podešavač za korisničko sučelje sistema je dodan u Postavke" "Ukloni iz Postavki" "Želite li ukloniti Podešavač za korisničko sučelje sistema iz Postavki i prestati koristiti sve njegove funkcije?" @@ -619,7 +617,7 @@ "Nedavni ekrani" "Nazad" "Obavještenja" - "Skracenice tastature" + "Prečice tastature" "Promijeni način unosa" "Aplikacije" "Pomoć" @@ -643,7 +641,7 @@ "Ušteda podataka je uključena" "Ušteda podataka je isključena" "Uključeno" - "Isključi" + "Isključeno" "Navigaciona traka" "Raspored" "Dodatni tip dugmeta lijevo" @@ -663,7 +661,7 @@ "Prebacivač tastatura" "Sačuvaj" - "Ponovno pokretanje" + "Vrati na zadano" "Podesite širinu dugmeta" "Međumemorija" "Prilagođeno dugme za navigaciju" @@ -709,6 +707,8 @@ "%1$s obavještenje: %2$s" "Aplikacija možda neće raditi na podijeljenom ekranu" "Aplikacija ne podržava dijeljenje ekrana." + "Aplikacija možda neće raditi na sekundarnom ekranu." + "Aplikacija ne podržava pokretanje na sekundarnim ekranima." "Otvori postavke." "Otvoriti brze postavke." "Zatvoriti brze postavke." @@ -753,13 +753,12 @@ "Aplikacija %1$s" "Upozorenja" "Snimci ekrana" - "Općenite poruke" + "Opće poruke" "Pohrana" "Instant-aplikacije" "Za instant aplikacije nije potrebna instalacija" "Informacije o aplikaciji" - - + "Idite na internet" "Mobilni podaci" "Wi-Fi veza je isključena" "Bluetooth je isključen" diff --git a/packages/SystemUI/res/values-bs/strings_car.xml b/packages/SystemUI/res/values-bs/strings_car.xml index 744eea867991c76bbaac85bcdd9c04d5fbe4ac8b..3837c7b2d80fa819658611b575463130b3877386 100644 --- a/packages/SystemUI/res/values-bs/strings_car.xml +++ b/packages/SystemUI/res/values-bs/strings_car.xml @@ -19,6 +19,5 @@ - "Vozite sigurno" - "Uvijek budite upoznati s uslovima za vožnju i poštujte važeće zakone. Upute za kretanje mogu biti netačne, nepotpune, opasne, neprikladne, zabranjene ili takve da obuhvataju prelaženje preko administrativnih područja. Poslovne informacije takođe mogu biti netačne ili nepotpune. Podaci nisu u realnom vremenu, a tačnost lokacije se ne može garantirati. U vožnji nemojte rukovati mobilnim uređajem ili koristiti aplikacije koje nisu namijenjene za Android Auto." + "Nepoznato" diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 1b89d2516ac0e486354fda5fdc7dadd2e9d54030..efe0aa3c3bad5f745b7558f4c09ee8e71ef7dc10 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -157,6 +157,7 @@ "Dades mòbils desactivades" "Compartició de xarxa per Bluetooth" "Mode d\'avió." + "VPN activada" "No hi ha cap targeta SIM." "S\'està canviant la xarxa de l\'operador de telefonia mòbil." "Obre la informació detallada de la bateria" @@ -197,7 +198,7 @@ "El Mode d\'avió està activat." "S\'ha desactivat el Mode d\'avió." "S\'ha activat el Mode d\'avió." - "El mode No molestis està activat (només amb prioritat)." + "Mode No molestis activat (només amb prioritat)." "El mode No molestis està activat; silenci total." "El mode No molestis està activat (només alarmes)." "Mode No molestis." @@ -272,7 +273,7 @@ "Bluetooth" "Bluetooth (%d dispositius)" "Bluetooth desactivat" - "No hi ha dispositius vinculats disponibles." + "No hi ha dispositius vinculats disponibles" "Brillantor" "Gira automàticament" "Gira la pantalla automàticament" @@ -351,9 +352,9 @@ "Cerca" "Llisca cap amunt per %s." "Llisca cap a l\'esquerra per %s." - "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." + "No t\'interromprà cap so ni cap vibració, tret dels sons de les alarmes, recordatoris, esdeveniments i trucades de les persones que especifiquis." "Personalitza" - "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." + "Es bloquejaran TOTS els sons i totes les vibracions, inclosos els de vídeos, jocs, alarmes i música. Encara podràs fer trucades." "Es bloquejaran TOTS els sons i totes les vibracions, inclosos els de vídeos, jocs, alarmes i música." "+%d" "Notificacions menys urgents a continuació" @@ -427,8 +428,7 @@ "El perfil professional està connectat a %1$s" "El perfil professional està connectat a %1$s" "El dispositiu està connectat a %1$s" - - + "Gestió del dispositiu" "Supervisió del perfil" "Supervisió de la xarxa" "VPN" @@ -437,18 +437,14 @@ "Desactiva la VPN" "Desconnecta la VPN" "Consulta les polítiques" - - - - + "%1$s gestiona el dispositiu.\n\nL\'administrador pot supervisar i gestionar la configuració, l\'accés corporatiu, les aplicacions, les dades associades al dispositiu, inclosa la informació d\'ubicació.\n\nPer obtenir més informació, contacta amb l\'administrador." + "La teva organització gestiona el dispositiu.\n\nL\'administrador pot supervisar i gestionar la configuració, l\'accés corporatiu, les aplicacions, les dades associades al dispositiu, inclosa la informació d\'ubicació.\n\nPer obtenir més informació, contacta amb l\'administrador." "La teva organització ha instal·lat una autoritat de certificació en aquest dispositiu. És possible que el trànsit a la xarxa segura se supervisi o es modifiqui." "La teva organització ha instal·lat una autoritat de certificació al teu perfil professional. És possible que el trànsit de xarxa segura se supervisi o es modifiqui." "S\'ha instal·lat una autoritat de certificació en aquest dispositiu. És possible que el trànsit de xarxa segura se supervisi o es modifiqui." "L\'administrador ha activat el registre de xarxa, que supervisa el trànsit del teu dispositiu." - - - - + "Estàs connectat a %1$s, que pot supervisar la teva activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web." + "Estàs connectat a %1$s i %2$s, que poden supervisar la teva activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web." "El teu perfil professional està connectat a %1$s, que pot supervisar la teva activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web." "El teu perfil personal està connectat a %1$s,que pot supervisar la teva activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web." "%1$s gestiona el teu dispositiu." @@ -470,6 +466,8 @@ "Estàs connectat a %1$s, que pot supervisar la teva activitat personal a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web." "%1$s gestiona el teu perfil professional. El perfil està connectat a %2$s, que pot supervisar la teva activitat a la xarxa de treball, com ara els correus electrònics, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador." "%1$s gestiona el teu perfil professional. El perfil està connectat a %2$s, que pot supervisar la teva activitat a la xarxa de treball, com ara els correus electrònics, les aplicacions i els llocs web.\n\nTambé estàs connectat a %3$s, que pot supervisar la teva activitat personal a la xarxa." + + "El dispositiu continuarà bloquejat fins que no el desbloquegis manualment." "Rep notificacions més ràpidament" "Mostra-les abans de desbloquejar" @@ -563,8 +561,8 @@ %1$s, %2$s i %3$d més %1$s, %2$s i %3$d més - "S\'han obert els controls de notificació de: %1$s" - "S\'han tancat els controls de notificació de: %1$s" + "S\'han obert els controls de notificació per a %1$s" + "S\'han tancat els controls de notificació per a %1$s" "Permet les notificacions d\'aquest canal" "Totes les categories" "Més opcions" @@ -703,6 +701,8 @@ "Notificació de %1$s: %2$s" "És possible que l\'aplicació no funcioni amb la pantalla dividida." "L\'aplicació no admet la pantalla dividida." + "Pot ser que l\'aplicació no funcioni en una pantalla secundària." + "L\'aplicació no es pot obrir en pantalles secundàries." "Obre la configuració." "Obre la configuració ràpida." "Tanca la configuració ràpida." @@ -752,8 +752,7 @@ "Aplicacions instantànies" "No cal instal·lar les aplicacions instantànies." "Informació de l\'aplicació" - - + "Vés al web" "Dades mòbils" "La Wi-Fi està desactivada" "El Bluetooth està desactivat" diff --git a/packages/SystemUI/res/values-ca/strings_car.xml b/packages/SystemUI/res/values-ca/strings_car.xml index efcac2342ef8a2c02f684d574689efe27db50d10..ed53d2f3235bda675e29180bacd5af7621c65cb3 100644 --- a/packages/SystemUI/res/values-ca/strings_car.xml +++ b/packages/SystemUI/res/values-ca/strings_car.xml @@ -19,6 +19,5 @@ - "Condueix amb precaució" - "Estigues al cas de la conducció i respecta sempre les lleis aplicables. Les indicacions poden ser inexactes, perilloses, inadequades o incompletes, o bé poden comportar maniobres prohibides o que creuis circumscripcions territorials. La informació de les empreses també pot ser inexacta o incompleta. No s\'ofereixen dades en temps real i no es pot garantir la precisió de les ubicacions. Mentre condueixes, no utilitzis el dispositiu mòbil ni cap aplicació que no estigui destinada a Android Auto." + "Desconegut" diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index d87dedc8c130d57cba05ea314e34dc4b6a7262a5..c8c6ee5dcd5e4b2425d885c7ebb36563153c16b8 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -159,6 +159,7 @@ "Mobilní data jsou vypnuta" "Sdílené připojení přes Bluetooth." "Režim Letadlo." + "VPN je zapnuto." "Není vložena SIM karta" "Probíhá změna sítě operátora." "Otevřít podrobnosti o baterii" @@ -433,8 +434,7 @@ "Pracovní profil je připojen k aplikaci %1$s" "Osobní profil je připojen k aplikaci %1$s" "Zařízení je připojeno k aplikaci %1$s" - - + "Správa zařízení" "Monitoring profilu" "Sledování sítě" "VPN" @@ -443,18 +443,14 @@ "Deaktivovat VPN" "Odpojit VPN" "Zobrazit zásady" - - - - + "Toto zařízení spravuje organizace %1$s.\n\nAdministrátor může sledovat a spravovat nastavení, firemní přístup, aplikace, data přidružená k tomuto zařízení a jeho polohu.\n\nDalší informace vám poskytne administrátor." + "Zařízení spravuje vaše organizace.\n\nAdministrátor může sledovat a spravovat nastavení, firemní přístup, aplikace, data přidružená k tomuto zařízení a jeho polohu.\n\nDalší informace vám poskytne administrátor." "Organizace do tohoto zařízení nainstalovala certifikační autoritu. Zabezpečený síťový provoz může být sledován nebo upravován." "Organizace do vašeho pracovního profilu nainstalovala certifikační autoritu. Zabezpečený síťový provoz může být sledován nebo upravován." "V zařízení je nainstalována certifikační autorita. Zabezpečený síťový provoz může být sledován nebo upravován." "Administrátor zapnul protokolování sítě, které monitoruje síťový provoz v zařízení." - - - - + "Jste připojeni k aplikaci %1$s, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů." + "Jste připojeni k aplikacím %1$s%2$s, které mohou sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů." "Váš pracovní profil je připojen k aplikaci %1$s, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů." "Váš osobní profil je připojen k aplikaci %1$s, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů." "Vaše zařízení je spravováno aplikací %1$s." @@ -476,6 +472,8 @@ "Jste připojeni k aplikaci %1$s, která může sledovat vaši osobní aktivitu v síti, včetně e-mailů, aplikací a webů." "Váš pracovní profil spravuje organizace %1$s. Je připojen k aplikaci %2$s, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nDalší informace vám poskytne administrátor." "Váš pracovní profil spravuje organizace %1$s. Je připojen k aplikaci %2$s, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nTaké jste připojeni k aplikaci %3$s, která může sledovat vaši osobní aktivitu v síti." + + "Zařízení zůstane uzamčeno, dokud je ručně neodemknete" "Čtěte si oznámení rychleji" "Můžete si je přečíst před odemčením obrazovky." @@ -713,6 +711,8 @@ "Oznámení aplikace %1$s: %2$s" "Aplikace v režimu rozdělené obrazovky nemusí fungovat." "Aplikace nepodporuje režim rozdělené obrazovky." + "Aplikace na sekundárním displeji nemusí fungovat." + "Aplikace nepodporuje spuštění na sekundárních displejích." "Otevřít nastavení." "Otevřít rychlé nastavení." "Zavřít rychlé nastavení." @@ -762,8 +762,7 @@ "Okamžité aplikace" "Okamžité aplikace není třeba instalovat." "Informace o aplikaci" - - + "Přejít na web" "Mobilní data" "Wi-Fi je vypnuta" "Bluetooth je vypnuto" diff --git a/packages/SystemUI/res/values-cs/strings_car.xml b/packages/SystemUI/res/values-cs/strings_car.xml index d5e3324fcdc4242acd5cb1f352da33fbba954d1d..08c1183bddb3d907c7e4277496fd7a431f0e9503 100644 --- a/packages/SystemUI/res/values-cs/strings_car.xml +++ b/packages/SystemUI/res/values-cs/strings_car.xml @@ -19,6 +19,5 @@ - "Řiďte bezpečně" - "Věnujte plnou pozornost řízení a dodržujte platné předpisy. Trasy mohou být nepřesné, neúplné, nebezpečné, nevhodné, zakázané nebo mohou zahrnovat překročení hranic. Informace o firmách mohou být také nepřesné nebo neúplné. Data se neaktualizují v reálném čase a přesnost polohy nelze zaručit. Mobilní zařízení ani aplikace určené pro Android Auto nepoužívejte za jízdy." + "Neznámé" diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 774a25d3eaf5b230a51d585ee7eb376251ad5fee..fa3eac126266b0d6e1da89f4f0c928836479c236 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -152,14 +152,12 @@ "Edge" "Wi-Fi" "Intet SIM-kort." - - - - - - + "Mobildata" + "Mobildata er aktiveret" + "Mobildata er deaktiveret" "Bluetooth-netdeling." "Flytilstand." + "VPN er slået til." "Der er ikke noget SIM-kort." "Mobilnetværket skiftes." "Åbn oplysninger om batteri" @@ -242,11 +240,9 @@ "Oplader" "2G-3G-data er sat på pause" "4G-data er sat på pause" - - + "Mobildata er sat på pause" "Data er sat på pause" - - + "Din angivne datagrænse er nået, og du bruger ikke længere mobildata.\n\nHvis du fortsætter, bliver du muligvis opkrævet betaling for dit dataforbrug." "Genoptag" "Ingen internetforb." "Wi-Fi er forbundet" @@ -319,8 +315,7 @@ "Hotspot" "Underretninger" "Lommelygte" - - + "Mobildata" "Dataforbrug" "Resterende data" "Over grænsen" @@ -433,8 +428,7 @@ "Arbejdsprofilen er forbundet til %1$s" "Den personlige profil er forbundet til %1$s" "Enheden er forbundet til %1$s" - - + "Administration af enheder" "Profilovervågning" "Overvågning af netværk" "VPN" @@ -443,18 +437,14 @@ "Deaktiver VPN" "Afbryd VPN-forbindelse" "Se politikker" - - - - + "Din enhed administreres af %1$s.\n\nDin administrator kan overvåge og administrere indstillinger, virksomhedsadgang, apps, data, der er knyttet til din enhed, og din enheds stedoplysninger.\n\nKontakt din administrator, hvis du vil have flere oplysninger." + "Din enhed administreres af din organisation.\n\nDin administrator kan overvåge og administrere indstillinger, virksomhedsadgang, apps, data, der er knyttet til din enhed, og din enheds stedoplysninger.\n\nKontakt din administrator, hvis du vil have flere oplysninger." "Din organisation har installeret et nøglecenter på denne enhed. Din sikre netværkstrafik kan overvåges eller ændres." "Din organisation har installeret et nøglecenter på din arbejdsprofil. Din sikre netværkstrafik kan overvåges eller ændres." "Der er installeret et nøglecenter på denne enhed. Din sikre netværkstrafik kan overvåges eller ændres." "Din administrator har aktiveret netværksregistrering, som overvåger trafik på din enhed." - - - - + "Du har forbindelse til %1$s, som kan overvåge din netværksaktivitet, bl.a. mails, apps og websites." + "Du har forbindelse til %1$s og %2$s, som kan overvåge din netværksaktivitet, bl.a. mails, apps og websites." "Din arbejdsprofil har forbindelse til %1$s, som kan overvåge din netværksaktivitet, bl.a. mails, apps og websites." "Din personlige profil har forbindelse til %1$s, som kan overvåge din netværksaktivitet, bl.a. mails, apps og websites." "Din enhed administreres af %1$s." @@ -476,6 +466,8 @@ "Du har forbindelse til %1$s, som kan overvåge din private netværksaktivitet, bl.a. e-mails, apps og websites." "Din arbejdsprofil administreres af %1$s. Profilen har forbindelse til %2$s, som kan overvåge din netværksaktivitet, bl.a. mails, apps og websites.\n\nKontakt din administrator for at få flere oplysninger." "Din arbejdsprofil administreres af %1$s. Profilen har forbindelse til %2$s, som kan overvåge din netværksaktivitet, bl.a. mails, apps og websites.\n\nDu har også forbindelse til %3$s, som kan overvåge din personlige netværksaktivitet." + + "Enheden vil forblive låst, indtil du manuelt låser den op" "Modtag underretninger hurtigere" "Se dem, før du låser op" @@ -569,12 +561,9 @@ %1$s, %2$s og %3$d anden %1$s, %2$s og %3$d andre - - - - - - + "Styring af underretninger for %1$s blev åbnet" + "Styring af underretninger for %1$s blev lukket" + "Tillad underretninger fra denne kanal" "Alle kategorier" "Flere indstillinger" "Tilpas: %1$s" @@ -712,6 +701,8 @@ "%1$s-underretning: %2$s" "Appen fungerer muligvis ikke i delt skærm." "Appen understøtter ikke delt skærm." + "Appen fungerer muligvis ikke på en sekundær skærm." + "Appen kan ikke åbnes på en sekundær skærm." "Åbn Indstillinger." "Åbn Hurtige indstillinger." "Luk Hurtige indstillinger." @@ -730,14 +721,10 @@ "Billede i billede-menu" "%s vises i billede i billede" "Hvis du ikke ønsker, at %s skal benytte denne funktion, kan du åbne indstillingerne og deaktivere den." - - - - - - - - + "Afspil" + "Sæt på pause" + "Gå videre til næste" + "Gå til forrige" "Telefonen slukkede pga. varme" "Din telefon kører nu normalt" "Din telefon var blevet for varm, så den slukkede for at køle ned. Din telefon kører nu igen normalt. \n\nDin telefon kan blive for varm, hvis du:\n • Bruger ressourcekrævende apps (f.eks. spil, video eller navigation)\n • Downloader eller uploader store filer\n • Bruger din telefon i varme omgivelser" @@ -765,8 +752,7 @@ "Instant Apps" "Instant apps kræver ingen installation." "Oplysninger om appen" - - + "Gå til website" "Mobildata" "Wi-Fi er slået fra" "Bluetooth er slået fra" diff --git a/packages/SystemUI/res/values-da/strings_car.xml b/packages/SystemUI/res/values-da/strings_car.xml index 6a421da91b906a00a08471059b9e9e44ab493501..4f210ddbc503d507c9daf674ba342fb3eace70e6 100644 --- a/packages/SystemUI/res/values-da/strings_car.xml +++ b/packages/SystemUI/res/values-da/strings_car.xml @@ -19,6 +19,5 @@ - "Kør forsigtigt" - "Vær opmærksom på køreforholdene, og overhold altid færdselsloven. Rutevejledningen kan være unøjagtig, ufuldstændig, farlig, upassende, forbudt eller involvere krydsning af forbudte områder. Virksomhedsoplysninger kan også være unøjagtige eller ufuldstændige. Data er ikke i realtid, og placeringers nøjagtighed kan ikke garanteres. Håndter ikke din mobilenhed, og brug ikke apps, der ikke er beregnet til Android Auto, mens du kører." + "Ukendt" diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 8b9b407b159738fdff0d0985d4cb4ad8e86b18cd..6281f35763bda88833001df9ce1516d83d3c8651 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -157,6 +157,7 @@ "Mobile Datennutzung deaktiviert" "Bluetooth-Tethering" "Flugmodus" + "VPN an." "Keine SIM-Karte" "Netzwerk des Mobilfunkanbieters wird gewechselt" "Akkudetails öffnen" @@ -299,7 +300,7 @@ "WLAN aus" "WLAN an" "Keine WLAN-Netzwerke verfügbar" - "Übertragen" + "Streamen" "Wird übertragen" "Unbenanntes Gerät" "Startklar" @@ -429,8 +430,7 @@ "Arbeitsprofil verbunden mit %1$s" "Das persönliche Profil ist mit %1$s verbunden" "Das Gerät ist mit %1$s verbunden" - - + "Geräteverwaltung" "Profilüberwachung" "Netzwerküberwachung" "VPN" @@ -439,18 +439,14 @@ "VPN deaktivieren" "VPN-Verbindung trennen" "Richtlinien ansehen" - - - - + "Dein Gerät wird von %1$s verwaltet.\n\nDein Administrator kann Einstellungen, Zugriffsrechte auf Unternehmensinhalte, Apps und Daten deines Geräts sowie dessen Standortinformationen überwachen und verwalten.\n\nWeitere Informationen erhältst du von deinem Administrator." + "Dein Gerät wird von deiner Organisation verwaltet.\n\nDein Administrator kann Einstellungen, Zugriffsrechte auf Unternehmensinhalte, Apps und Daten deines Geräts sowie dessen Standortinformationen überwachen und verwalten.\n\nWeitere Informationen erhältst du von deinem Administrator." "Deine Organisation hat ein Zertifikat einer Zertifizierungsstelle auf deinem Gerät installiert. Eventuell wird dein sicherer Netzwerkverkehr überwacht oder bearbeitet." "Deine Organisation hat ein Zertifikat einer Zertifizierungsstelle in deinem Arbeitsprofil installiert. Eventuell wird dein sicherer Netzwerkverkehr überwacht oder bearbeitet." "Auf dem Gerät ist das Zertifikat einer Zertifizierungsstelle installiert. Eventuell wird dein sicherer Netzwerkverkehr überwacht oder bearbeitet." "Dein Administrator hat die Netzwerkprotokollierung aktiviert. Damit wird der Netzwerkverkehr auf deinem Gerät überwacht." - - - - + "Du bist mit %1$s verbunden. Die App kann deine Netzwerkaktivitäten (E-Mails, Apps und Websites) erfassen." + "Du bist mit %1$s und %2$s verbunden. Die Apps können deine Netzwerkaktivitäten (E-Mails, Apps und Websites) erfassen." "Dein Arbeitsprofil ist mit %1$s verbunden, die deine Netzwerkaktivitäten wie E-Mails, Apps und Websites überwachen kann." "Dein persönliches Profil ist mit %1$s verbunden, die deine Netzwerkaktivitäten wie E-Mails, Apps und Websites überwachen kann." "Dein Gerät wird von %1$s verwaltet." @@ -472,6 +468,8 @@ "Du bist mit der App \"%1$s\" verbunden. Diese kann deine persönlichen Netzwerkaktivitäten erfassen, einschließlich E-Mails, Apps und Websites." "Dein Arbeitsprofil wird von %1$s verwaltet. Das Profil ist mit %2$s verknüpft. Diese App kann deine Netzwerkaktivitäten überwachen, einschließlich E-Mails, Apps und Websites.\n\nWeitere Informationen erhältst du von deinem Administrator." "Dein Arbeitsprofil wird von %1$s verwaltet. Das Profil ist mit %2$s verknüpft. Diese App kann deine Netzwerkaktivitäten überwachen, einschließlich E-Mails, Apps und Websites.\n\nDu bist auch mit %3$s verbunden, die deine persönlichen Netzwerkaktivitäten überwachen kann." + + "Das Gerät bleibt gesperrt, bis du es manuell entsperrst." "Benachrichtigungen schneller erhalten" "Vor dem Entsperren anzeigen" @@ -627,9 +625,9 @@ "YouTube" "Kalender" "Einschließlich Lautstärkeregler anzeigen" - "Bitte nicht stören" + "Nicht stören" "Tastenkombination für Lautstärketasten" - "\"Bitte nicht stören\" bei \"Lauter\" deaktivieren" + "\"Nicht stören\" bei \"Lauter\" deaktivieren" "Akku" "Uhr" "Headset" @@ -705,6 +703,8 @@ "Benachrichtigung von %1$s: %2$s" "Die App funktioniert unter Umständen bei geteiltem Bildschirm nicht." "Das Teilen des Bildschirms wird in dieser App nicht unterstützt." + "Die App funktioniert auf einem sekundären Display möglicherweise nicht." + "Die App unterstützt den Start auf sekundären Displays nicht." "Einstellungen öffnen." "Schnelleinstellungen öffnen." "Schnelleinstellungen schließen." @@ -754,8 +754,7 @@ "Instant-Apps" "Bei Instant-Apps ist keine vorherige Installation erforderlich." "App-Informationen" - - + "Web aufrufen" "Mobile Daten" "WLAN ist deaktiviert" "Bluetooth ist deaktiviert" diff --git a/packages/SystemUI/res/values-de/strings_car.xml b/packages/SystemUI/res/values-de/strings_car.xml index 5b5920e24ab18a55a8d717ebcd225542437c2a9d..44c47d36ddcd0ff5e7bbc026d78c206f205e389c 100644 --- a/packages/SystemUI/res/values-de/strings_car.xml +++ b/packages/SystemUI/res/values-de/strings_car.xml @@ -19,6 +19,5 @@ - "Sicher fahren" - "Achte stets auf die Straßenverhältnisse und halte dich an die geltenden Gesetze. Routen können unter Umständen fehlerhaft, unvollständig, gefährlich, ungeeignet oder verboten sein oder das Überqueren von Verwaltungsgrenzen erfordern. Informationen zum Unternehmen können ebenfalls fehlerhaft oder unvollständig sein. Die Datenübertragung erfolgt nicht in Echtzeit und die Genauigkeit der Standortangaben kann nicht gewährleistet werden. Bediene während der Fahrt nicht dein Mobilgerät und verwende keine Apps, die du nicht über Android Auto steuern kannst." + "Unbekannt" diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index dcabbc2b1ec3427b5c2ef6b19f0357713b726e1b..79ba29a80d1226e57d666b10b2c303ea8233108f 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -157,6 +157,7 @@ "Τα δεδομένα κινητής τηλεφωνίας απενεργοποιήθηκαν" "Πρόσδεση Bluetooth" "Λειτουργία πτήσης." + "VPN ενεργό." "Δεν υπάρχει κάρτα SIM." "Αλλαγή δικτύου εταιρείας κινητής τηλεφωνίας." "Άνοιγμα λεπτομερειών μπαταρίας" @@ -427,8 +428,7 @@ "Το προφίλ εργασίας είναι συνδεδεμένο με το %1$s" "Το προσωπικό προφίλ έχει συνδεθεί στην εφαρμογή %1$s" "Η συσκευή έχει συνδεθεί στην εφαρμογή %1$s" - - + "Διαχείριση συσκευών" "Παρακολούθηση προφίλ" "Παρακολούθηση δικτύου" "VPN" @@ -437,18 +437,14 @@ "Απενεργοποίηση VPN" "Αποσύνδεση VPN" "Προβολή πολιτικών" - - - - + "Η διαχείριση της συσκευής σας γίνεται από %1$s.\n\nΟ διαχειριστής μπορεί να παρακολουθεί και να διαχειρίζεται ρυθμίσεις, εταιρική πρόσβαση, εφαρμογές και δεδομένα που σχετίζονται με τη συσκευή, καθώς και τις πληροφορίες τοποθεσίας.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή σας." + "Η διαχείριση της συσκευής σας γίνεται από τον οργανισμό σας.\n\nΟ διαχειριστής μπορεί να παρακολουθεί και να διαχειρίζεται ρυθμίσεις, εταιρική πρόσβαση, εφαρμογές και δεδομένα που σχετίζονται με τη συσκευή, καθώς και τις πληροφορίες τοποθεσίας.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή σας." "Ο οργανισμός σας εγκατέστησε μια αρχή έκδοσης πιστοποιητικών σε αυτήν τη συσκευή. Η ασφαλής επισκεψιμότητα δικτύου σας μπορεί να παρακολουθείται ή να τροποποιείται." "Ο οργανισμός σας εγκατέστησε μια αρχή έκδοσης πιστοποιητικών στο προφίλ εργασίας σας. Η ασφαλής επισκεψιμότητα δικτύου σας μπορεί να παρακολουθείται ή να τροποποιείται." "Μια αρχή έκδοσης πιστοποιητικών έχει εγκατασταθεί σε αυτήν τη συσκευή. Η ασφαλής επισκεψιμότητα δικτύου σας μπορεί να παρακολουθείται ή να τροποποιείται." "Ο διαχειριστής σας ενεργοποίησε την καταγραφή δικτύου, η οποία παρακολουθεί την επισκεψιμότητα στη συσκευή σας." - - - - + "Έχετε συνδεθεί στην εφαρμογή %1$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων." + "Έχετε συνδεθεί στις εφαρμογές %1$s και %2$s, οι οποίες μπορούν να παρακολουθούν τη δραστηριότητα του δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων." "Το προφίλ εργασίας σας είναι συνδεδεμένο στο %1$s, το οποίο μπορεί να παρακολουθεί τη δραστηριότητα δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων." "Το προσωπικό προφίλ σας είναι συνδεμένο στην εφαρμογή %1$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων." "Η διαχείριση της συσκευής σας γίνεται από %1$s." @@ -470,7 +466,9 @@ "Έχετε συνδεθεί στην εφαρμογή %1$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του προσωπικού σας δικτύου, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων." "Ο οργανισμός %1$s διαχειρίζεται το προφίλ εργασίας σας. Το προφίλ είναι συνδεδεμένο στην εφαρμογή %2$s, η οποία μπορεί να παρακολουθήσει τη δραστηριότητα του δικτύου εργασίας σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή σας." "Ο οργανισμός %1$s διαχειρίζεται το προφίλ εργασίας σας. Το προφίλ συνδέεται με την εφαρμογή %2$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου της εργασίας σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων.\n\nΕπίσης, είστε συνδεδεμένοι στην εφαρμογή %3$s, που έχει τη δυνατότητα παρακολούθησης της δραστηριότητας του προσωπικού σας δικτύου." - "Η συσκευή θα παραμείνει κλειδωμένη έως ότου την ξεκλειδώσετε μη αυτόματα" + + + "Η συσκευή θα παραμείνει κλειδωμένη μέχρι να την ξεκλειδώσετε μη αυτόματα" "Λάβετε ειδοποιήσεις γρηγορότερα" "Εμφάνιση πριν το ξεκλείδωμα" "Όχι" @@ -703,6 +701,8 @@ "Ειδοποίηση %1$s: %2$s" "Δεν είναι δυνατή η λειτουργία της εφαρμογής με διαχωρισμό οθόνης." "Η εφαρμογή δεν υποστηρίζει διαχωρισμό οθόνης." + "Η εφαρμογή μπορεί να λειτουργεί σε μια δευτερεύουσα οθόνη." + "Η εφαρμογή δεν υποστηρίζει την εκκίνηση σε δευτερεύουσες οθόνες." "Άνοιγμα ρυθμίσεων." "Άνοιγμα γρήγορων ρυθμίσεων." "Κλείσιμο γρήγορων ρυθμίσεων." @@ -752,8 +752,7 @@ "Instant Εφαρμογές" "Οι Instant Εφαρμογές δεν απαιτούν εγκατάσταση." "Πληροφορίες εφαρμογής" - - + "Μετάβαση στον ιστό" "Δεδομένα κινητής τηλεφωνίας" "Το Wi-Fi είναι ανενεργό" "Το Bluetooth είναι ανενεργό" diff --git a/packages/SystemUI/res/values-el/strings_car.xml b/packages/SystemUI/res/values-el/strings_car.xml index e9607130308a2ec4d62b967a04480509284db930..4d04141283029c81b272d9e7bf8728b4af196274 100644 --- a/packages/SystemUI/res/values-el/strings_car.xml +++ b/packages/SystemUI/res/values-el/strings_car.xml @@ -19,6 +19,5 @@ - "Οδηγείτε προσεκτικά" - "Μείνετε πλήρως ενημερωμένοι για τις προϋποθέσεις οδήγησης και υπακούτε πάντα τους ισχύοντες νόμους. Οι οδηγίες μπορεί να είναι ανακριβείς, ελλιπείς, επικίνδυνες, ακατάλληλες, απαγορευμένες ή να ανήκουν σε άλλες διοικητικές περιοχές. Οι πληροφορίες επιχειρήσεων μπορεί επίσης να είναι ανακριβείς ή ελλιπείς. Τα δεδομένα δεν είναι σε πραγματικό χρόνο και η ακρίβεια των τοποθεσιών δεν είναι εγγυημένη. Μη χειρίζεστε την κινητή συσκευή σας και μη χρησιμοποιείτε εφαρμογές που δεν προορίζονται για το Android Auto ενώ οδηγείτε." + "Άγνωστο" diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index d8216bfae085f04bc65a324c10474d9c79b7516c..8006409f1c1ae4dca0347ca88dc5eb514e7dbd7b 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -157,6 +157,7 @@ "Mobile data off" "Bluetooth tethering" "Aeroplane mode" + "VPN on." "No SIM card." "Carrier network changing." "Open battery details" @@ -329,7 +330,7 @@ "No recent items" "You\'ve cleared everything" "Application Info" - "screen-pinning" + "screen pinning" "search" "Could not start %s." "%s is disabled in safe-mode." @@ -427,8 +428,7 @@ "Work profile connected to %1$s" "Personal profile connected to %1$s" "Device connected to %1$s" - - + "Device management" "Profile monitoring" "Network monitoring" "VPN" @@ -437,18 +437,14 @@ "Disable VPN" "Disconnect VPN" "View Policies" - - - - + "Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nFor more information, contact your admin." + "Your device is managed by your organisation.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nFor more information, contact your admin." "Your organisation installed a certificate authority on this device. Your secure network traffic may be monitored or modified." "Your organisation installed a certificate authority in your work profile. Your secure network traffic may be monitored or modified." "A certificate authority is installed on this device. Your secure network traffic may be monitored or modified." "Your admin has turned on network logging, which monitors traffic on your device." - - - - + "You\'re connected to %1$s, which can monitor your network activity, including emails, apps and websites." + "You\'re connected to %1$s and %2$s, which can monitor your network activity, including emails, apps and websites." "Your work profile is connected to %1$s, which can monitor your network activity, including emails, apps and websites." "Your personal profile is connected to %1$s, which can monitor your network activity, including emails, apps and websites." "Your device is managed by %1$s." @@ -470,6 +466,7 @@ "You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps and websites." "Your work profile is managed by %1$s. The profile is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nFor more information, contact your admin." "Your work profile is managed by %1$s. The profile is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nYou\'re also connected to %3$s, which can monitor your personal network activity." + "Unlocked for %1$s" "Device will stay locked until you manually unlock" "Get notifications faster" "See them before you unlock" @@ -529,7 +526,7 @@ "Fun for some but not for all" "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." "These experimental features may change, break or disappear in future releases. Proceed with caution." - "Understood" + "Got it" "Congrats! System UI Tuner has been added to Settings" "Remove from settings" "Remove System UI Tuner from Settings and stop using all of its features?" @@ -613,7 +610,7 @@ "Recent" "Back" "Notifications" - "Keyboard Shortcuts" + "Keyboard shortcuts" "Switch input method" "Applications" "Assist" @@ -703,6 +700,8 @@ "%1$s notification: %2$s" "App may not work with split-screen." "App does not support split-screen." + "App may not work on a secondary display." + "App does not support launch on secondary displays." "Open settings." "Open quick settings." "Close quick settings." @@ -752,8 +751,7 @@ "Instant Apps" "Instant apps don\'t require installation." "App info" - - + "Go to web" "Mobile data" "Wi-Fi is off" "Bluetooth is off" diff --git a/packages/SystemUI/res/values-en-rAU/strings_car.xml b/packages/SystemUI/res/values-en-rAU/strings_car.xml index 81089badea5fef3155dda259e0951865dc4ea42c..d6bf442b8b6f2908f357b1a9d9594498d0dde5ba 100644 --- a/packages/SystemUI/res/values-en-rAU/strings_car.xml +++ b/packages/SystemUI/res/values-en-rAU/strings_car.xml @@ -19,6 +19,5 @@ - "Drive safely" - "Stay fully aware of driving conditions and always obey applicable laws. Directions may be inaccurate, incomplete, dangerous, not suitable, prohibited or involve crossing administrative areas. Business information may also be inaccurate or incomplete. Data is not real time and location accuracy cannot be guaranteed. Do not handle your mobile device or use apps not intended for Android Auto while driving." + "Unknown" diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index d8216bfae085f04bc65a324c10474d9c79b7516c..8006409f1c1ae4dca0347ca88dc5eb514e7dbd7b 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -157,6 +157,7 @@ "Mobile data off" "Bluetooth tethering" "Aeroplane mode" + "VPN on." "No SIM card." "Carrier network changing." "Open battery details" @@ -329,7 +330,7 @@ "No recent items" "You\'ve cleared everything" "Application Info" - "screen-pinning" + "screen pinning" "search" "Could not start %s." "%s is disabled in safe-mode." @@ -427,8 +428,7 @@ "Work profile connected to %1$s" "Personal profile connected to %1$s" "Device connected to %1$s" - - + "Device management" "Profile monitoring" "Network monitoring" "VPN" @@ -437,18 +437,14 @@ "Disable VPN" "Disconnect VPN" "View Policies" - - - - + "Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nFor more information, contact your admin." + "Your device is managed by your organisation.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nFor more information, contact your admin." "Your organisation installed a certificate authority on this device. Your secure network traffic may be monitored or modified." "Your organisation installed a certificate authority in your work profile. Your secure network traffic may be monitored or modified." "A certificate authority is installed on this device. Your secure network traffic may be monitored or modified." "Your admin has turned on network logging, which monitors traffic on your device." - - - - + "You\'re connected to %1$s, which can monitor your network activity, including emails, apps and websites." + "You\'re connected to %1$s and %2$s, which can monitor your network activity, including emails, apps and websites." "Your work profile is connected to %1$s, which can monitor your network activity, including emails, apps and websites." "Your personal profile is connected to %1$s, which can monitor your network activity, including emails, apps and websites." "Your device is managed by %1$s." @@ -470,6 +466,7 @@ "You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps and websites." "Your work profile is managed by %1$s. The profile is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nFor more information, contact your admin." "Your work profile is managed by %1$s. The profile is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nYou\'re also connected to %3$s, which can monitor your personal network activity." + "Unlocked for %1$s" "Device will stay locked until you manually unlock" "Get notifications faster" "See them before you unlock" @@ -529,7 +526,7 @@ "Fun for some but not for all" "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." "These experimental features may change, break or disappear in future releases. Proceed with caution." - "Understood" + "Got it" "Congrats! System UI Tuner has been added to Settings" "Remove from settings" "Remove System UI Tuner from Settings and stop using all of its features?" @@ -613,7 +610,7 @@ "Recent" "Back" "Notifications" - "Keyboard Shortcuts" + "Keyboard shortcuts" "Switch input method" "Applications" "Assist" @@ -703,6 +700,8 @@ "%1$s notification: %2$s" "App may not work with split-screen." "App does not support split-screen." + "App may not work on a secondary display." + "App does not support launch on secondary displays." "Open settings." "Open quick settings." "Close quick settings." @@ -752,8 +751,7 @@ "Instant Apps" "Instant apps don\'t require installation." "App info" - - + "Go to web" "Mobile data" "Wi-Fi is off" "Bluetooth is off" diff --git a/packages/SystemUI/res/values-en-rGB/strings_car.xml b/packages/SystemUI/res/values-en-rGB/strings_car.xml index 81089badea5fef3155dda259e0951865dc4ea42c..d6bf442b8b6f2908f357b1a9d9594498d0dde5ba 100644 --- a/packages/SystemUI/res/values-en-rGB/strings_car.xml +++ b/packages/SystemUI/res/values-en-rGB/strings_car.xml @@ -19,6 +19,5 @@ - "Drive safely" - "Stay fully aware of driving conditions and always obey applicable laws. Directions may be inaccurate, incomplete, dangerous, not suitable, prohibited or involve crossing administrative areas. Business information may also be inaccurate or incomplete. Data is not real time and location accuracy cannot be guaranteed. Do not handle your mobile device or use apps not intended for Android Auto while driving." + "Unknown" diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index d8216bfae085f04bc65a324c10474d9c79b7516c..8006409f1c1ae4dca0347ca88dc5eb514e7dbd7b 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -157,6 +157,7 @@ "Mobile data off" "Bluetooth tethering" "Aeroplane mode" + "VPN on." "No SIM card." "Carrier network changing." "Open battery details" @@ -329,7 +330,7 @@ "No recent items" "You\'ve cleared everything" "Application Info" - "screen-pinning" + "screen pinning" "search" "Could not start %s." "%s is disabled in safe-mode." @@ -427,8 +428,7 @@ "Work profile connected to %1$s" "Personal profile connected to %1$s" "Device connected to %1$s" - - + "Device management" "Profile monitoring" "Network monitoring" "VPN" @@ -437,18 +437,14 @@ "Disable VPN" "Disconnect VPN" "View Policies" - - - - + "Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nFor more information, contact your admin." + "Your device is managed by your organisation.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nFor more information, contact your admin." "Your organisation installed a certificate authority on this device. Your secure network traffic may be monitored or modified." "Your organisation installed a certificate authority in your work profile. Your secure network traffic may be monitored or modified." "A certificate authority is installed on this device. Your secure network traffic may be monitored or modified." "Your admin has turned on network logging, which monitors traffic on your device." - - - - + "You\'re connected to %1$s, which can monitor your network activity, including emails, apps and websites." + "You\'re connected to %1$s and %2$s, which can monitor your network activity, including emails, apps and websites." "Your work profile is connected to %1$s, which can monitor your network activity, including emails, apps and websites." "Your personal profile is connected to %1$s, which can monitor your network activity, including emails, apps and websites." "Your device is managed by %1$s." @@ -470,6 +466,7 @@ "You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps and websites." "Your work profile is managed by %1$s. The profile is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nFor more information, contact your admin." "Your work profile is managed by %1$s. The profile is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nYou\'re also connected to %3$s, which can monitor your personal network activity." + "Unlocked for %1$s" "Device will stay locked until you manually unlock" "Get notifications faster" "See them before you unlock" @@ -529,7 +526,7 @@ "Fun for some but not for all" "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." "These experimental features may change, break or disappear in future releases. Proceed with caution." - "Understood" + "Got it" "Congrats! System UI Tuner has been added to Settings" "Remove from settings" "Remove System UI Tuner from Settings and stop using all of its features?" @@ -613,7 +610,7 @@ "Recent" "Back" "Notifications" - "Keyboard Shortcuts" + "Keyboard shortcuts" "Switch input method" "Applications" "Assist" @@ -703,6 +700,8 @@ "%1$s notification: %2$s" "App may not work with split-screen." "App does not support split-screen." + "App may not work on a secondary display." + "App does not support launch on secondary displays." "Open settings." "Open quick settings." "Close quick settings." @@ -752,8 +751,7 @@ "Instant Apps" "Instant apps don\'t require installation." "App info" - - + "Go to web" "Mobile data" "Wi-Fi is off" "Bluetooth is off" diff --git a/packages/SystemUI/res/values-en-rIN/strings_car.xml b/packages/SystemUI/res/values-en-rIN/strings_car.xml index 81089badea5fef3155dda259e0951865dc4ea42c..d6bf442b8b6f2908f357b1a9d9594498d0dde5ba 100644 --- a/packages/SystemUI/res/values-en-rIN/strings_car.xml +++ b/packages/SystemUI/res/values-en-rIN/strings_car.xml @@ -19,6 +19,5 @@ - "Drive safely" - "Stay fully aware of driving conditions and always obey applicable laws. Directions may be inaccurate, incomplete, dangerous, not suitable, prohibited or involve crossing administrative areas. Business information may also be inaccurate or incomplete. Data is not real time and location accuracy cannot be guaranteed. Do not handle your mobile device or use apps not intended for Android Auto while driving." + "Unknown" diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 4be584f7fe6d3f1ac7373d4868bf9e674eb60496..08e4b1dd8ce8fa7bef777c1b58ed5cd5fa4344e1 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -157,6 +157,7 @@ "Desactivar datos móviles" "Conexión mediante Bluetooth" "Modo avión" + "VPN activada" "Sin tarjeta SIM" "Cambio de proveedor de red" "Abrir detalles de la batería" @@ -429,8 +430,7 @@ "Perfil de trabajo conectado a %1$s" "Perfil personal conectado a %1$s" "Dispositivo conectado a %1$s" - - + "Administración del dispositivo" "Supervisión del perfil" "Supervisión de red" "VPN" @@ -439,18 +439,14 @@ "Inhabilitar VPN" "Desconectar VPN" "Ver políticas" - - - - + "%1$s administra tu dispositivo.\n\nTu administrador puede controlar y administrar la configuración, el acceso corporativo, las apps, los datos asociados a tu dispositivo y la información de ubicación.\n\nPara obtener más información, comunícate con tu administrador." + "Tu organización administra tu dispositivo.\n\nTu administrador puede controlar y administrar la configuración, el acceso corporativo, las apps, los datos asociados a tu dispositivo y la información de ubicación.\n\nPara obtener más información, comunícate con tu administrador." "Tu organización instaló una autoridad de certificación en este dispositivo. Es posible que se controle o modifique el tráfico de tu red segura." "Tu organización instaló una autoridad de certificación en tu perfil de trabajo. Es posible que se controle o modifique el tráfico de tu red segura." "Hay una autoridad de certificación instalada en este dispositivo. Es posible que se controle o modifique el tráfico de tu red segura." "Tu administrador activó el registro de red, que supervisa el tráfico en tu dispositivo." - - - - + "Estás conectado a %1$s, que puede controlar la actividad de tu red, incluidos los correos electrónicos, las apps y los sitios web." + "Estás conectado a %1$s y %2$s, que pueden controlar tu actividad de red, incluidos los correos electrónicos, las apps y los sitios web." "Tu perfil de trabajo está conectado a %1$s, que puede controlar tu actividad de red, incluidos los correos electrónicos, las apps y los sitios web." "Tu perfil personal está conectado a %1$s, que puede controlar tu actividad de red, incluidos los correos electrónicos, las apps y los sitios web." "%1$s administra tu dispositivo." @@ -472,6 +468,8 @@ "Te conectaste a %1$s, que puede supervisar la actividad de tu red personal, incluidos los correos electrónicos, las apps y los sitios web." "%1$s administra tu perfil de trabajo. El perfil está conectado a %2$s, que puede controlar tu actividad de red de trabajo, incluidos los correos electrónicos, apps y sitios web.\n\nPara obtener más información, comunícate con tu administrador." "%1$s administra tu perfil de red. El perfil está conectado a %2$s, que puede controlar tu actividad de red de trabajo, incluidos los correos electrónicos, las apps y los sitios web.\n\nTambién estás conectado a %3$s, que puede controlar tu actividad de red personal." + + "El dispositivo permanecerá bloqueado hasta que lo desbloquees manualmente." "Recibe notificaciones más rápido" "Ver antes de desbloquear" @@ -627,9 +625,9 @@ "YouTube" "Calendario" "Mostrar con controles de volumen" - "No interrumpir" + "No molestar" "Combinación de teclas de botones de volumen" - "Desactivar el modo No interrumpir al subir el volumen" + "Desactivar el modo No molestar al subir el volumen" "Batería" "Reloj" "Auriculares" @@ -667,7 +665,7 @@ "Clave de código derecho" "Ícono izquierdo" "Ícono derecho" - "Arrastra los mosaicos para agregarlos" + "Arrastra los íconos para agregarlos" "Arrastra aquí para quitar" "Editar" "Hora" @@ -705,6 +703,8 @@ "Notificación de %1$s: %2$s" "Es posible que la app no funcione en el modo de pantalla dividida." "La app no es compatible con la función de pantalla dividida." + "Es posible que la app no funcione en una pantalla secundaria." + "La app no puede iniciarse en pantallas secundarias." "Abrir Configuración" "Abrir la configuración rápida" "Cerrar configuración rápida" @@ -753,16 +753,15 @@ "Almacenamiento" "Apps instantáneas" "Las Apps instantáneas no requieren instalación." - "Información de la app" - - + "Información de apps" + "Ir a la Web" "Datos móviles" "Wi-Fi desactivado" "Bluetooth desactivado" - "No interrumpir desactivado" - "Una regla automática (%s) activó el modo No interrumpir." - "Una app (%s) activó el modo No interrumpir." - "Una app o regla automática activó el modo No interrumpir." + "No molestar desactivado" + "Se activó el modo No molestar con una regla automática (%s)." + "Se activó el modo No molestar con una app (%s)." + "Se activó el modo No molestar con una app o regla automática." "Hasta la(s) %s" "Mantener" "Reemplazar" diff --git a/packages/SystemUI/res/values-es-rUS/strings_car.xml b/packages/SystemUI/res/values-es-rUS/strings_car.xml index 647236aa0faaa90882ec141c6448871d8cba2dbc..9de5be09d82f2dc40a0d4a7a4fed7b080fd2033c 100644 --- a/packages/SystemUI/res/values-es-rUS/strings_car.xml +++ b/packages/SystemUI/res/values-es-rUS/strings_car.xml @@ -19,6 +19,5 @@ - "Conducir de forma segura" - "Permanece atento a la situación de conducción y cumple siempre con las leyes vigentes. Es posible que las indicaciones sean imprecisas, inadecuadas o peligrosas, que estén incompletas, que sugieran maniobras prohibidas o que impliquen atravesar áreas administrativas. La información de las empresas también puede ser imprecisa o estar incompleta. Los datos no se proporcionan en tiempo real ni se puede garantizar la precisión de las ubicaciones. No uses tu dispositivo móvil ni apps no diseñadas para Android Auto mientras conduces." + "Desconocido" diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 030af0f53add354237a334b7fd6693a410bddad7..f6142b7466340711e23e6c507c2c582aeef2a366 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -134,8 +134,8 @@ "Dos barras" "Tres barras" "Señal al máximo" - "Sí" - "No" + "Activado" + "Desactivado" "Conectado" "Conectando." "GPRS" @@ -157,6 +157,7 @@ "Datos móviles desactivados" "Compartir por Bluetooth" "Modo avión" + "La red VPN está activada." "No hay tarjeta SIM." "Cambiando red de operador." "Abrir detalles de la batería" @@ -429,8 +430,7 @@ "Perfil de trabajo conectado a %1$s" "Perfil personal conectado a %1$s" "Dispositivo conectado a %1$s" - - + "Administración de dispositivos" "Supervisión del perfil" "Supervisión de red" "VPN" @@ -439,18 +439,14 @@ "Inhabilitar VPN" "Desconectar VPN" "Ver políticas" - - - - + "El dispositivo está administrado por %1$s.\n\nEl administrador puede supervisar y gestionar los ajustes, el acceso corporativo, las aplicaciones, los datos asociados a este dispositivo y su información de ubicación.\n\nPara obtener más información, ponte en contacto con el administrador." + "El dispositivo está administrado por tu organización.\n\nEl administrador puede supervisar y gestionar los ajustes, el acceso corporativo, las aplicaciones, los datos asociados a este dispositivo y su información de ubicación.\n\nPara obtener más información, ponte en contacto con el administrador." "Tu organización ha instalado una entidad de certificación en este dispositivo. Es posible que se supervise o se modifique tu tráfico de red seguro." "Tu organización ha instalado una entidad de certificación en tu perfil de trabajo. Es posible que se supervise o se modifique tu tráfico de red seguro." "Se ha instalado una entidad de certificación en este dispositivo. Es posible que se supervise o se modifique tu tráfico de red seguro." "El administrador ha activado el registro de la red para supervisar el tráfico en tu dispositivo." - - - - + "Te has conectado a %1$s, que puede supervisar tu actividad de red, como los correos electrónicos, las aplicaciones y los sitios web." + "Te has conectado a %1$s y %2$s, que pueden supervisar tu actividad de red, como los correos electrónicos, las aplicaciones y los sitios web." "Tu perfil de trabajo está conectado a %1$s, que puede supervisar tu actividad de red, como los correos electrónicos, las aplicaciones y los sitios web." "Tu perfil personal está conectado a %1$s, que puede supervisar tu actividad de red, como los correos electrónicos, las aplicaciones y los sitios web." "Tu dispositivo está administrado por %1$s." @@ -472,6 +468,8 @@ "Estas conectado a %1$s, que puede controlar tu actividad de red personal, como correos electrónicos, aplicaciones y sitios web." "%1$s gestiona tu perfil de trabajo. El perfil está conectado a %2$s, que puede supervisar tu actividad de red profesional, como los correos electrónicos, las aplicaciones y los sitios web.\n\nPara obtener más información, ponte en contacto con el administrador." "%1$s gestiona tu perfil de trabajo. El perfil está conectado a %2$s, que puede supervisar tu actividad de red profesional, como los correos electrónicos, las aplicaciones y los sitios web.\n\nTambién te has conectado a %3$s, que puede supervisar tu actividad de red personal." + + "El dispositivo permanecerá bloqueado hasta que se desbloquee manualmente" "Recibe notificaciones más rápido" "Ver antes de desbloquear" @@ -549,8 +547,8 @@ "No silenciar" "No silenciar ni bloquear" "Controles de energía de las notificaciones" - "Sí" - "No" + "Activado" + "Desactivado" "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""Nivel 5"" \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""Nivel 4"" \n- Evitar interrumpir en el modo de pantalla completa \n- Mostrar siempre \n\n""Nivel 3"" \n- Evitar interrumpir en el modo de pantalla completa \n- No mostrar nunca \n\n""Nivel 2"" \n- Evitar interrumpir en el modo de pantalla completa\n- No mostrar nunca \n- No emitir sonido ni vibrar nunca \n\n""Nivel 1"" \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""Nivel 0"" \n- Bloquear todas las notificaciones de la aplicación" "Notificaciones" "Ya no recibirás estas notificaciones." @@ -638,8 +636,8 @@ "Ahorro de datos" "Ahorro de datos activado" "Ahorro de datos desactivado" - "Sí" - "No" + "Activado" + "Desactivado" "Barra de navegación" "Diseño" "Tipo de botón a la izquierda extra" @@ -705,6 +703,8 @@ "Notificación de %1$s: %2$s" "Es posible que la aplicación no funcione con la pantalla dividida." "La aplicación no admite la pantalla dividida." + "Es posible que la aplicación no funcione en una pantalla secundaria." + "La aplicación no se puede iniciar en pantallas secundarias." "Abrir ajustes." "Abrir ajustes rápidos." "Cerrar ajustes rápidos." @@ -729,7 +729,7 @@ "Volver al anterior" "Teléfono apagado por calor" "El teléfono ahora funciona con normalidad" - "El teléfono se había calentado demasiado y se ha apagado para enfriarlo. Ahora funciona con normalidad.\n\nPuede calentarse demasiado si:\n • Usas aplicaciones que consumen muchos recursos (p. ej., apps de juegos, vídeos o navegación)\n • Descargas o subes archivos grandes\n • Lo usas a altas temperaturas" + "El teléfono se había calentado demasiado y se ha apagado para enfriarse. Ahora funciona con normalidad.\n\nPuede calentarse demasiado si:\n • Usas aplicaciones que consumen muchos recursos (p. ej., apps de juegos, vídeos o navegación)\n • Descargas o subes archivos grandes\n • Lo usas a altas temperaturas" "El teléfono se está calentando" "Se limitan algunas funciones mientras el teléfono se enfría" "El teléfono intentará enfriarse. Puedes seguir utilizándolo, pero es posible que funcione con mayor lentitud.\n\nUna vez que se haya enfriado, funcionará con normalidad." @@ -754,8 +754,7 @@ "Aplicaciones Instantáneas" "No es necesario instalar las Aplicaciones Instantáneas." "Información de la aplicación" - - + "Ir a la Web" "Datos móviles" "Wi-Fi desactivado" "Bluetooth desactivado" diff --git a/packages/SystemUI/res/values-es/strings_car.xml b/packages/SystemUI/res/values-es/strings_car.xml index e19ca787869b24c1a1589c26373c6e334d119b8d..9de5be09d82f2dc40a0d4a7a4fed7b080fd2033c 100644 --- a/packages/SystemUI/res/values-es/strings_car.xml +++ b/packages/SystemUI/res/values-es/strings_car.xml @@ -19,6 +19,5 @@ - "Conduce de forma segura" - "Permanece atento a la conducción y respeta siempre las normas de tráfico. Las indicaciones pueden ser inexactas, incompletas, peligrosas o inadecuadas o dar lugar a maniobras prohibidas o al cruce de zonas regionales diferentes. La información sobre empresas también puede ser inexacta o estar incompleta. No se ofrecen datos en tiempo real ni se puede garantizar la exactitud de las ubicaciones. No utilices el dispositivo móvil ni aplicaciones que no estén destinadas a Android Auto mientras conduces." + "Desconocido" diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 250525e62ce8a6a8603540721ddc2fefa1c8b720..cb8cf823d85a5c0458e19ce79fef6e655c4c12f0 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -157,6 +157,7 @@ "Mobiilne andmeside on väljas" "Bluetoothi jagamine." "Lennurežiim." + "VPN on sees." "SIM-kaarti pole." "Operaatori võrku muudetakse." "Aku üksikasjade avamine" @@ -195,10 +196,10 @@ "WiFi on sisse lülitatud." "Mobiili %1$s. %2$s. %3$s." "Aku: %s." - "Lennukirežiim on väljas." - "Lennukirežiim on sees." - "Lennukirežiim on välja lülitatud." - "Lennukirežiim on sisse lülitatud." + "Lennurežiim on väljas." + "Lennurežiim on sees." + "Lennurežiim on välja lülitatud." + "Lennurežiim on sisse lülitatud." "Funktsioon Mitte segada on sisse lülitatud (ainult prioriteetsed)." "Funktsioon Mitte segada on sisse lülitatud, täielik vaikus." "Funktsioon Mitte segada on sisse lülitatud (ainult alarmid)." @@ -429,8 +430,7 @@ "Tööprofiil on ühendatud rakendusega %1$s" "Isiklik profiil on ühendatud rakendusega %1$s" "Seade on ühendatud rakendusega %1$s" - - + "Seadmehaldus" "Profiili jälgimine" "Võrgu jälgimine" "VPN" @@ -439,18 +439,14 @@ "Keela VPN" "Katkesta VPN-i ühendus" "Kuva eeskirjad" - - - - + "Teie seadet haldab organisatsioon %1$s.\n\nAdministraator saab jälgida ning hallata seadeid, ettevõttesisest juurdepääsu, rakendusi, seadmega seotud andmeid ja seadme asukohateavet.\n\nLisateabe saamiseks võtke ühendust administraatoriga." + "Teie seadet haldab teie organisatsioon.\n\nAdministraator saab jälgida ning hallata seadeid, ettevõttesisest juurdepääsu, rakendusi, seadmega seotud andmeid ja seadme asukohateavet.\n\nLisateabe saamiseks võtke ühendust administraatoriga." "Teie organisatsioon installis sellesse seadmesse sertifikaadi volituse. Teie turvalist võrguliiklust võidakse jälgida ja muuta." "Teie organisatsioon installis teie tööprofiilile sertifikaadi volituse. Teie turvalist võrguliiklust võidakse jälgida ja muuta." "Sertifikaadi volitus on sellesse seadmesse installitud. Teie turvalist võrguliiklust võidakse jälgida ja muuta." "Teie administraator lülitas sisse võrgu logimise funktsiooni, mis jälgib teie seadmes liiklust." - - - - + "Teil on ühendus rakendusega %1$s, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite." + "Teil on ühendus rakendustega %1$s ja %2$s, mis saavad jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite." "Teie tööprofiil on ühendatud rakendusega %1$s, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite." "Teie isiklik profiil on ühendatud rakendusega %1$s, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite." "Teie seadet haldab rakendus %1$s." @@ -472,6 +468,8 @@ "Olete ühendatud rakendusega %1$s, mis võib jälgida teie isiklikke võrgutegevusi, sh meile, rakendusi ja veebisaite." "Teie tööprofiili haldab %1$s. Profiil on ühendatud rakendusega %2$s, mis saab jälgida teie töökoha võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga." "Teie tööprofiili haldab %1$s. Profiil on ühendatud rakendusega %2$s, mis saab jälgida teie töökoha võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nOlete ühendatud ka rakendusega %3$s, mis saab jälgida teie isiklikke võrgutegevusi." + + "Seade jääb lukku, kuni selle käsitsi avate" "Saate märguandeid kiiremini" "Näete neid enne avamist" @@ -518,7 +516,7 @@ "Ethernet" "Äratus" "Tööprofiil" - "Lennukirežiim" + "Lennurežiim" "Paani lisamine" "Paani ülekandmine" "Kuulete järgmist äratust kell %1$s vaid siis, kui lülitate selle enne seda välja" @@ -705,6 +703,8 @@ "Teenuse %1$s märguanne: %2$s" "Rakendus ei pruugi poolitatud ekraaniga töötada." "Rakendus ei toeta jagatud ekraani." + "Rakendus ei pruugi teisesel ekraanil töötada." + "Rakendus ei toeta teisestel ekraanidel käivitamist." "Ava seaded." "Ava kiirseaded." "Sule kiirseaded." @@ -754,8 +754,7 @@ "Installimata avatavad rakendused" "Installimata avatavaid rakendusi pole vaja installida." "Rakenduse teave" - - + "Avage veebis" "Mobiilne andmeside" "WiFi on välja lülitatud" "Bluetooth on välja lülitatud" diff --git a/packages/SystemUI/res/values-et/strings_car.xml b/packages/SystemUI/res/values-et/strings_car.xml index c41385ac791391e99f0df8ba4c94b18bdb5aa68e..819fb7697d010207ef57243ccb9141eab8bfd518 100644 --- a/packages/SystemUI/res/values-et/strings_car.xml +++ b/packages/SystemUI/res/values-et/strings_car.xml @@ -19,6 +19,5 @@ - "Sõitke turvaliselt" - "Olge teadlik sõidutingimustest ja järgige alati kohaldatavaid seadusi. Juhised võivad olla ebatäpsed, mittetäielikud, ohtlikud, sobimatud, keelatud või hõlmata kattuvaid administratiivpiirkondi. Ka ettevõtteteave võib olla ebatäpne või mittetäielik. Andmed pole reaalajas ja asukoha täpsust ei saa garanteerida. Ärge kasutage auto juhtimisel mobiilseadet ega rakendusi, mis pole mõeldud teenuse Android Auto jaoks." + "Teadmata" diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 2adbd725c3c68142fb91e74ae88587274a1ce831..ee0620b0efe587832190eb70757399d094a7ad28 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -157,6 +157,7 @@ "Datu mugikorrak desaktibatuta" "Konexioa partekatzea (Bluetooth)" "Hegaldi-modua" + "VPN eginbidea aktibatuta." "Ez dago SIM txartelik." "Operadorearen sarea aldatzea." "Ireki bateriaren xehetasunak" @@ -299,7 +300,7 @@ "Wi-Fi konexioa desaktibatuta" "Aktibatuta dago Wi-Fi konexioa" "Ez dago Wi-Fi sarerik erabilgarri" - "Igorpena" + "Igorri" "Igortzen" "Izenik gabeko gailua" "Igortzeko prest" @@ -403,7 +404,7 @@ "Erabiltzailea kendu nahi duzu?" "Erabiltzailearen aplikazio eta datu guztiak ezabatuko dira." "Kendu" - "Bateria aurrezlea aktibatuta dago" + "Bateria-aurrezlea aktibatuta dago" "Errendimendua eta atzeko planoko datuak murrizten ditu" "Desaktibatu bateria aurrezteko aukera" "%s aplikazioak pantailan bistaratzen den guztia grabatuko du." @@ -429,8 +430,7 @@ "%1$s aplikaziora dago konektatuta laneko profila" "%1$s aplikaziora konektatuta dago profil pertsonala" "%1$s aplikaziora konektatuta dago gailua" - - + "Gailuaren kudeaketa" "Profila kontrolatzeko aukera" "Sareen kontrola" "VPN" @@ -439,18 +439,14 @@ "Desgaitu VPN konexioa" "Deskonektatu VPN sarea" "Ikusi gidalerroak" - - - - + "%1$s 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." + "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." "Erakundeak ziurtagiri-emaile bat instalatu du gailuan. Baliteke sareko trafiko segurua gainbegiratzea edo aldatzea." "Erakundeak ziurtagiri-emaile bat instalatu dizu laneko profilean. Baliteke sareko trafiko segurua gainbegiratzea edo aldatzea." "Ziurtagiri-emaile bat dago instalatuta gailuan. Baliteke sareko trafiko segurua gainbegiratzea edo aldatzea." "Administratzaileak sare-erregistroak aktibatu ditu; horrela, zure gailuko trafikoa gainbegira dezake." - - - - + "%1$s aplikaziora konektatuta zaude eta hark sareko jarduerak gainbegira ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." + "%1$s eta %2$s aplikazioetara konektatuta zaude, eta haiek sareko jarduerak gainbegira ditzakete, mezu elektronikoak, aplikazioak eta webguneak barne." "%1$s aplikaziora dago konektatuta laneko profila, eta aplikazio horrek sareko jarduerak gainbegira ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." "%1$s aplikaziora konektatuta duzu profil pertsonala, eta aplikazio horrek sareko jarduerak gainbegira ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." "%1$s aplikazioak kudeatzen du gailu hau." @@ -472,6 +468,8 @@ "%1$s aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduera pertsonalak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." "%1$s erakundeak kudeatzen dizu laneko profila. %2$s aplikaziora dago konektatuta profila, eta aplikazio horrek sarean egiten dituzun jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan." "%1$s erakundeak kudeatzen dizu laneko profila. %2$s aplikaziora dago konektatuta profila, eta aplikazio horrek sarean egiten dituzun jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne. \n\n%3$s aplikaziora ere zaude konektatuta, eta hark sare pertsonalean egiten dituzun jarduerak kontrola ditzake." + + "Gailua blokeatuta egongo da eskuz desblokeatu arte" "Eskuratu jakinarazpenak azkarrago" "Ikusi desblokeatu baino lehen" @@ -705,6 +703,8 @@ "%1$s zerbitzuaren jakinarazpena: %2$s" "Baliteke aplikazioak ez funtzionatzea pantaila zatituan." "Aplikazioak ez du onartzen pantaila zatitua" + "Baliteke aplikazioak ez funtzionatzea bigarren mailako pantailan." + "Aplikazioak ez du onartzen bigarren mailako pantailarik." "Ireki ezarpenak." "Ireki ezarpen bizkorrak." "Itxi ezarpen bizkorrak." @@ -754,8 +754,7 @@ "Zuzeneko aplikazioak" "Zuzeneko aplikazioak ez dira instalatu behar." "Aplikazioari buruzko informazioa" - - + "Joan sarera" "Datu mugikorrak" "Wi-Fi konexioa desaktibatuta dago" "Bluetooth konexioa desaktibatuta dago" diff --git a/packages/SystemUI/res/values-eu/strings_car.xml b/packages/SystemUI/res/values-eu/strings_car.xml index c4371f7d4be5433615ae1660c625197b4de41b1c..ac2a4c17a1cafbd64265dc8e8d858d1e0e8711ef 100644 --- a/packages/SystemUI/res/values-eu/strings_car.xml +++ b/packages/SystemUI/res/values-eu/strings_car.xml @@ -19,6 +19,5 @@ - "Gidatu zentzuz" - "Egon erne errepidera begira eta gorde lege aplikagarri oro. Agian jarraibideak ez dira guztiz zehatzak, osatuak edo egokiak izango; arriskutsuak izan daitezke edo debekatuta dagoen zerbait egitea edo mugak zeharkatzea proposa diezazukete. Baliteke enpresei buruzko informazioa ere guztiz zehatza edo osatua ez izatea. Datuak ez dira une-unekoak eta ezin da bermatu kokapenaren zehaztasuna. Gidatu bitartean, ez erabili gailu mugikorrik edo Android Auto zerbitzuarekin erabiltzeko egina ez dagoen aplikaziorik." + "Ezezaguna" diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index e464690154d97b7638125e0a05561819f53fbaf9..77f11eed6cd615ee4756774207df2c6c3715f1a6 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -152,14 +152,12 @@ "Edge" "Wi-Fi" "بدون سیم کارت." - - - - - - + "داده‌ تلفن همراه" + "داده تلفن همراه روشن" + "داده تلفن همراه خاموش" "اتصال اینترنت با بلوتوث تلفن همراه." "حالت هواپیما." + "‏VPN روشن است." "سیم‌کارتی موجود نیست." "تغییر شبکه شرکت مخابراتی." "باز کردن جزئیات باتری" @@ -242,11 +240,9 @@ "درحال شارژ شدن" "‏داده 2G-3G موقتاً متوقف شده است" "‏داده 4G موقتاً متوقف شده است" - - + "داده تلفن همراه موقتاً متوقف شده است" "داده موقتاً متوقف شده است" - - + "مصرف داده شما به محدودیت داده‌ای که تنظیم کردید رسیده است. دیگر از داده تلفن همراه استفاده نمی‌کنید.\n\n درصورت ازسرگیری، ممکن است هزینه‌های مصرف داده اعمال شود." "از سر‌گیری" "اتصال اینترنتی ندارید" "‏Wi-Fi متصل شد" @@ -319,8 +315,7 @@ "نقطه اتصال" "اعلان‌ها" "چراغ قوه" - - + "داده تلفن همراه" "مصرف داده" "داده‌های باقی‌مانده" "بیش از حد مجاز" @@ -433,8 +428,7 @@ "نمایه کاری به %1$s متصل شده است" "نمایه شخصی به %1$s متصل شده است" "دستگاه به %1$s متصل شده است" - - + "مدیریت دستگاه" "کنترل نمایه" "کنترل شبکه" "VPN" @@ -443,18 +437,14 @@ "‏غیرفعال کردن VPN" "‏قطع اتصال VPN" "مشاهده خط‌مشی‌ها" - - - - + "دستگاه شما تحت مدیریت %1$s است.\n\nسرپرست سیستم شما می‌تواند تنظیمات، دسترسی شرکتی، برنامه‌ها، داده‌های مرتبط با دستگاه شما و اطلاعات مکان دستگاهتان را پایش و مدیریت کند.\n\nبرای اطلاعات بیشتر، با سرپرست سیستم تماس بگیرید." + "دستگاه شما تحت مدیریت سازمان شما است.\n\nسرپرست سیستم شما می‌تواند تنظیمات، دسترسی شرکتی، برنامه‌ها، داده‌های مرتبط با دستگاه شما و اطلاعات مکان دستگاهتان را پایش و مدیریت کند.\n\nبرای اطلاعات بیشتر، با سرپرست سیستم تماس بگیرید." "سازمان شما مرجع گواهینامه‌ای در این دستگاه نصب کرده است. ممکن است ترافیک امن شبکه شما پایش یا تغییر داده شود." "سازمان شما مرجع گواهینامه‌ای در نمایه کاری شما نصب کرده است. ممکن است ترافیک امن شبکه شما پایش یا تغییر داده شود." "مرجع گواهینامه‌ای در این دستگاه نصب شده است. ممکن است ترافیک امن شبکه شما پایش یا تغییر داده شود." "سرپرست سیستم شما گزارش‌گیری از شبکه را (که ترافیک دستگاه شما را پایش می‌کند) روشن کرده است." - - - - + "به %1$s متصل شده‌اید، که می‌تواند فعالیت شبکه شما را (ازجمله رایانامه‌‌ها، برنامه‌‌ها و وب‌سایت‌ها) پایش کند." + "به %1$s و %2$s متصل شده‌اید، که می‌توانند فعالیت شما را در شبکه (ازجمله رایانامه‌‌ها، برنامه‌‌ها و وب‌سایت‌ها) پایش کنند." "نمایه کاری شما به %1$s متصل است، که می‌تواند فعالیت شما در شبکه (ازجمله رایانامه‌ها، برنامه‌ها و وب‌سایت‌ها) را پایش کند." "نمایه شخصی شما به %1$s متصل شده‌ است، که می‌تواند فعالیت شما در شبکه (ازجمله رایانامه‌‌ها، برنامه‌‌ها و وب‌سایت‌ها) را پایش کند." "%1$s دستگاه شما را مدیریت می‌کند." @@ -476,6 +466,8 @@ "به %1$s وصل شده‌اید، که می‌تواند فعالیت شبکه شخصی شما را (ازجمله رایانامه‌‌ها، برنامه‌‌ها و وب‌سایت‌ها) کنترل کند." "نمایه کاری شما توسط %1$s مدیریت می‌شود. این نمایه به %2$s متصل است که می‌تواند فعالیت شما در شبکه (ازجمله رایانامه‌ها، برنامه‌ها و وب‌سایت‌ها) را پایش کند.\n\nبرای اطلاعات بیشتر، با سرپرست سیستم تماس بگیرید." "نمایه کاری‌تان توسط %1$s مدیریت می‌شود. این نمایه به %2$s متصل است که می‌تواند تنظیمات، دسترسی شرکتی، برنامه‌ها، داده‌های مرتبط با دستگاه و اطلاعات مکان دستگاه شما را پایش کند.\n\nشما همچنین به %3$s متصل هستید که می‌تواند فعالیت خصوصی شما را در شبکه پایش کند." + + "دستگاه قفل باقی می‌ماند تا زمانی که قفل آن را به صورت دستی باز کنید" "دریافت سریع‌تر اعلان‌ها" "قبل از باز کردن قفل آنها را مشاهده کنید" @@ -569,12 +561,9 @@ %1$s، %2$s و %3$d مورد دیگر %1$s، %2$s و %3$d مورد دیگر - - - - - - + "کنترل‌های اعلان برای %1$s باز شد" + "کنترل‌های اعلان برای %1$s بسته شد" + "مجاز کردن اعلان‌های این کانال" "‏همه دسته‎ها" "تنظیمات بیشتر" "سفارشی کردن: %1$s" @@ -712,6 +701,8 @@ "اعلان %1$s: %2$s" "ممکن است برنامه با تقسیم صفحه کار نکند." "برنامه از تقسیم صفحه پشتیبانی نمی‌کند." + "ممکن است برنامه در نمایشگر ثانویه کار نکند." + "برنامه از راه‌اندازی در نمایشگرهای ثانویه پشتیبانی نمی‌کند." "باز کردن تنظیمات." "باز کردن تنظیمات سریع." "بستن تنظیمات سریع." @@ -730,14 +721,10 @@ "منوی تصویر در تصویر" "%s درحالت تصویر در تصویر است" "اگر نمی‌خواهید %s از این قابلیت استفاده کند، با ضربه زدن، تنظیمات را باز کنید و قابلیت را خاموش کنید." - - - - - - - - + "پخش" + "توقف موقت" + "رد شدن به بعدی" + "رد شدن به قبلی" "تلفن به علت گرم شدن خاموش شد" "اکنون تلفنتان عملکرد معمولش را دارد" "تلفنتان خیلی گرم شده بود، بنابراین خاموش شد تا خنک شود. اکنون تلفنتان عملکرد معمولش را دارد.\n\nتلفنتان خیلی گرم می‌شود، اگر:\n • از برنامه‌های نیازمند پردازش زیاد (مانند بازی، برنامه‌های ویدیویی یا پیمایشی) استفاده کنید\n • فایل‌های بزرگ بارگیری یا بارگذاری کنید\n • در دماهای بالا از تلفنتان استفاده کنید" @@ -765,8 +752,7 @@ "برنامه‌های فوری" "برنامه‌های فوری نیاز به نصب ندارند." "اطلاعات برنامه" - - + "رفتن به وب" "داده تلفن همراه" "‏Wi-Fi خاموش است" "بلوتوث خاموش است" diff --git a/packages/SystemUI/res/values-fa/strings_car.xml b/packages/SystemUI/res/values-fa/strings_car.xml index e8433fadc5547ac086d74e2ae26955aadbb9b2cb..92270a6bb0534760e2085e979a5f9fa31e0e55ef 100644 --- a/packages/SystemUI/res/values-fa/strings_car.xml +++ b/packages/SystemUI/res/values-fa/strings_car.xml @@ -19,6 +19,5 @@ - "با ایمنی برانید" - "‏کاملاً از شرایط رانندگی آگاه باشید و همیشه قوانین مربوطه را رعایت کنید. مسیرها ممکن است غیردقیق، ناقص، ناکامل، خطرناک، نامناسب، ممنوع یا مستلزم عبور از تقسیمات کشوری باشند. اطلاعات کسب و کار نیز ممکن است غیردقیق یا ناکامل باشند. داده‌ها بی‌درنگ نیستند و دقت مکان نمی‌تواند تضمین شود. هنگام رانندگی دستگاه همراه را در دست نگیرید یا از برنامه‌هایی که ویژه Android Auto نیستند استفاده نکنید." + "نامشخص" diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 9be1b9af5c1889c2cd3d44257adc9956fad4293c..7b790da07deeee55de1d9de318fb57e4d98195da 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -157,6 +157,7 @@ "Mobiilidata poissa käytöstä" "Internetin jakaminen Bluetoothin kautta." "Lentokonetila." + "VPN päällä" "Ei SIM-korttia." "Operaattorin verkko muuttuu." "Avaa akun tiedot." @@ -427,8 +428,7 @@ "Työprofiili on yhteydessä sovellukseen %1$s." "Henkilökohtainen profiili on yhteydessä sovellukseen %1$s." "Laite on yhteydessä sovellukseen %1$s." - - + "Laitehallinta" "Profiilin valvonta" "Verkon valvonta" "VPN" @@ -437,18 +437,14 @@ "Poista VPN käytöstä" "Katkaise VPN-yhteys" "Näytä säännöt" - - - - + "%1$s hallinnoi tätä laitetta.\n\nJärjestelmänvalvoja voi valvoa ja hallinnoida asetuksiasi, yrityskäyttöä, sovelluksia, laitteeseesi yhdistettyjä tietoja sekä laitteesi sijaintitietoja.\n\nSaat lisätietoja järjestelmänvalvojalta." + "Organisaatiosi hallinnoi tätä laitetta.\n\nJärjestelmänvalvoja voi valvoa ja hallinnoida asetuksiasi, yrityskäyttöä, sovelluksia, laitteeseesi yhdistettyjä tietoja sekä laitteesi sijaintitietoja.\n\nSaat lisätietoja järjestelmänvalvojalta." "Organisaatiosi asensi laitteeseen varmenteen myöntäjän. Suojattua verkkoliikennettäsi voidaan valvoa tai muuttaa." "Organisaatiosi lisäsi työprofiiliin varmenteen myöntäjän. Suojattua verkkoliikennettäsi voidaan valvoa tai muuttaa." "Laitteeseen on asennettu varmenteen myöntäjä. Suojattua verkkoliikennettäsi voidaan valvoa tai muuttaa." "Järjestelmänvalvoja on ottanut käyttöön verkkolokitietojen tallentamisen, joka valvoo laitteellasi tapahtuvaa liikennettä." - - - - + "Olet yhteydessä sovellukseen %1$s, joka voi valvoa verkkotoimintaasi, esimerkiksi sähköposteja, sovelluksia ja verkkosivustoja." + "Olet yhteydessä sovelluksiin %1$s ja %2$s, jotka voivat valvoa verkkotoimintaasi, esimerkiksi sähköposteja, sovelluksia ja verkkosivustoja." "Työprofiilisi on yhteydessä sovellukseen %1$s, joka voi valvoa toimintaasi verkossa, esimerkiksi sähköposteja, sovelluksia ja verkkosivustoja." "Henkilökohtainen profiilisi on yhteydessä sovellukseen %1$s, joka voi valvoa verkkotoimintaasi, esimerkiksi sähköposteja, sovelluksia ja verkkosivustoja." "Laitettasi hallinnoi %1$s." @@ -470,6 +466,8 @@ "Olet muodostanut yhteyden sovellukseen %1$s, joka voi valvoa henkilökohtaista toimintaasi verkossa. Sovellus voi esimerkiksi seurata avaamiasi sähköposteja, sovelluksia ja verkkosivustoja." "%1$s hallinnoi työprofiiliasi. Se on yhteydessä sovellukseen %2$s, joka voi valvoa toimintaasi verkossa, esimerkiksi sähköposteja, sovelluksia ja verkkosivustoja.\n\nPyydä lisätietoja järjestelmänvalvojalta." "%1$s hallinnoi työprofiiliasi. Se on yhteydessä sovellukseen %2$s, joka voi valvoa toimintaasi verkossa, esimerkiksi sähköposteja, sovelluksia ja verkkosivustoja.\n\nLisäksi olet yhteydessä sovellukseen %3$s, joka voi valvoa henkilökohtaista toimintaasi verkossa." + + "Laite pysyy lukittuna, kunnes se avataan käsin" "Näe ilmoitukset nopeammin" "Näytä ennen lukituksen avaamista" @@ -703,6 +701,8 @@ "Ilmoitus kohteesta %1$s: %2$s" "Sovellus ei ehkä toimi jaetulla näytöllä." "Sovellus ei tue jaetun näytön tilaa." + "Sovellus ei ehkä toimi toissijaisella näytöllä." + "Sovellus ei tue käynnistämistä toissijaisilla näytöillä." "Avaa asetukset." "Avaa pika-asetukset." "Sulje pika-asetukset." @@ -752,8 +752,7 @@ "Instant Apps" "Pikasovelluksia ei tarvitse asentaa." "Sovelluksen tiedot" - - + "Avaa verkossa" "Mobiilitiedonsiirto" "Wi-Fi on pois käytöstä" "Bluetooth ei ole käytössä" diff --git a/packages/SystemUI/res/values-fi/strings_car.xml b/packages/SystemUI/res/values-fi/strings_car.xml index fc94b90af4646e8a7b262d6531d73ae221ecaf75..73c672909db5ff2a819e96e97801bc7d105f11c9 100644 --- a/packages/SystemUI/res/values-fi/strings_car.xml +++ b/packages/SystemUI/res/values-fi/strings_car.xml @@ -19,6 +19,5 @@ - "Aja varovasti" - "Tarkkaile huolellisesti ajo-olosuhteita ja noudata aina voimassa olevia lakeja. Reittiohjeet saattavat olla epätarkkoja, epätäydellisiä, vaarallisia, epäsopivia, kiellettyjä tai kulkea hallintoalueiden läpi. Myös yritystiedot voivat olla epätarkkoja tai epätäydellisiä. Tietoja ei päivitetä reaaliajassa eikä sijaintien tarkkuutta taata. Älä käytä ajon aikana mobiililaitettasi tai sovelluksia, joita ei ole suunniteltu Android Autolle." + "Tuntematon" diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 794757ac793431b4510fdc579f640d03a3455b03..f4dca7b123bd550a3729755cd9124ecff39d629c 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -157,6 +157,7 @@ "Données cellulaires désactivées" "Partage de connexion Bluetooth" "Mode Avion" + "RPV activé." "Aucune carte SIM." "Modification du réseau du fournisseur de services" "Ouvrir les détails de la pile" @@ -194,7 +195,7 @@ "Wi-Fi désactivé" "Wi-Fi activé." "Signal mobile : %1$s, %2$s, %3$s" - "Batterie : %s" + "Pile : %s" "Mode Avion : désactivé" "Mode Avion : activé" "Le mode Avion est désactivé." @@ -353,7 +354,7 @@ "Recherche" "Faire glisser le doigt vers le haut : %s" "Faites glisser votre doigt vers la gauche pour %s." - "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." + "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." "Personnaliser" "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." "Cette option permet de bloquer TOUS les sons et vibrations, y compris pour les alarmes, la musique, les vidéos et les jeux." @@ -429,8 +430,7 @@ "Profil professionnel connecté à %1$s" "Profil personnel connecté à %1$s" "Appareil connecté à %1$s" - - + "Gestion d\'appareils" "Contrôle de profil" "Surveillance réseau" "RPV" @@ -439,18 +439,14 @@ "Désactiver le RPV" "Déconnecter le RPV" "Afficher les politiques" - - - - + "Votre appareil est géré par %1$s.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux données d\'entreprise, les applications, les données associées à l\'appareil et les renseignements sur sa localisation.\n\nPour plus d\'information, communiquez avec votre administrateur." + "Votre appareil est géré par votre organisation.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux données d\'entreprise, les applications, les données associées à l\'appareil et les renseignements sur sa localisation.\n\nPour plus d\'information, communiquez avec votre administrateur." "Votre entreprise a installé une autorité de certification sur cet appareil. Votre trafic sur le réseau sécurisé peut être contrôlé ou modifié." "Votre entreprise a installé une autorité de certification dans votre profil professionnel. Votre trafic sur le réseau sécurisé peut être contrôlé ou modifié." "Une autorité de certification est installée sur cet appareil. Votre trafic sur le réseau sécurisé peut être contrôlé ou modifié." "Votre administrateur a activé la journalisation réseau, qui surveille le trafic sur votre appareil." - - - - + "Vous êtes connecté à %1$s, qui peut contrôler votre activité réseau, y compris les courriels, les applications et les sites Web." + "Vous êtes connecté à %1$s et à %2$s, qui peuvent contrôler votre activité sur le réseau, y compris l\'activité relative aux courriels, aux applications et aux sites Web." "Votre profil professionnel est connecté à %1$s, qui peut contrôler votre activité réseau, y compris les courriels, les applications et les sites Web." "Votre profil professionnel est connecté à %1$s, qui peut contrôler votre activité réseau, y compris les courriels, les applications et les sites Web." "Votre appareil est géré par %1$s." @@ -472,6 +468,8 @@ "Vous êtes connecté à %1$s. Cette application peut contrôler votre activité personnelle sur le réseau, y compris les courriels, les applications et les sites Web." "Votre profil professionnel est géré par %1$s. Ce profil est connecté à %2$s, qui peut contrôler votre activité professionnelle sur le réseau, y compris l\'activité relative aux courriels, aux applications et aux sites Web.\n\nPour en savoir plus, communiquez avec votre administrateur." "Votre profil professionnel est géré par %1$s. Ce profil est connecté à %2$s, qui peut contrôler votre activité professionnelle sur le réseau, y compris l\'activité relative aux courriels, aux applications et aux sites Web.\n\nVous êtes également connecté à %3$s, qui peut contrôler votre activité personnelle sur le réseau." + + "L\'appareil restera verrouillé jusqu\'à ce que vous le déverrouilliez manuellement" "Voir les notifications plus rapidement" "Afficher les notifications avant de déverrouiller l\'appareil" @@ -705,6 +703,8 @@ "Notification %1$s : %2$s" "Il est possible que l\'application ne fonctionne pas en mode Écran partagé." "L\'application n\'est pas compatible avec l\'écran partagé." + "Il est possible que l\'application ne fonctionne pas sur un écran secondaire." + "L\'application ne prend pas en charge le lancement sur les écrans secondaires." "Ouvrir les paramètres." "Ouvrir les réglages rapides." "Fermer les réglages rapides." @@ -754,8 +754,7 @@ "Applications instantanées" "Les applications instantanées ne nécessitent pas d\'installation." "Détails de l\'application" - - + "Accéder au Web" "Données cellulaires" "Le Wi-Fi est désactivé" "Le Bluetooth est désactivé" diff --git a/packages/SystemUI/res/values-fr-rCA/strings_car.xml b/packages/SystemUI/res/values-fr-rCA/strings_car.xml index 10e1fd52604fe041b8cefbf84df4ccd1f0c8217f..8cfee94eb494ec216ebf1618c990b4629e3304cc 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings_car.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings_car.xml @@ -19,6 +19,5 @@ - "Conduisez prudemment" - "Tenez compte des conditions de la route et respectez toujours les lois en vigueur. Les itinéraires peuvent être incorrects, incomplets, dangereux, inappropriés ou interdits, et ils peuvent traverser des zones administratives. Les renseignements sur les entreprises peuvent également être incorrects ou incomplets. Les données ne sont pas fournies en temps réel, et la précision de la localisation n\'est pas garantie. Ne manipulez pas votre appareil mobile et n\'utilisez pas d\'applications non conçues pour Android Auto lorsque vous conduisez." + "Inconnu" diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 57e057e1d02fe103b497d8dab0fe380ac8131eee..73f359802767bfb07fb4eba9c443db27d33f156b 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -157,6 +157,7 @@ "Données mobiles désactivées" "Partage de connexion Bluetooth" "Mode Avion" + "Le VPN est activé." "Aucune carte SIM" "Modification du réseau de l\'opérateur" "Ouvrir les détails de la batterie" @@ -353,7 +354,7 @@ "Rechercher" "Faites glisser vers le haut pour %s." "Faites glisser vers la gauche pour %s." - "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." + "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." "Personnaliser" "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." "Cette option permet de bloquer TOUS les sons et les vibrations, y compris pour les alarmes, la musique, les vidéos et les jeux." @@ -429,8 +430,7 @@ "Profil professionnel connecté à %1$s" "Profil personnel connecté à %1$s" "Appareil connecté à %1$s" - - + "Gestion des appareils" "Contrôle du profil" "Contrôle du réseau" "VPN" @@ -439,18 +439,14 @@ "Désactiver le VPN" "Déconnecter le VPN" "Afficher les règles" - - - - + "Votre appareil est géré par %1$s.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux données d\'entreprise, les applications, les données associées à l\'appareil et les informations sur sa localisation.\n\nPour plus d\'informations, contactez votre administrateur." + "Votre appareil est géré par votre organisation.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux données d\'entreprise, les applications, les données associées à l\'appareil et les informations sur sa localisation.\n\nPour plus d\'informations, contactez votre administrateur." "Votre entreprise a installé une autorité de certification sur cet appareil. Votre trafic sur le réseau sécurisé peut être contrôlé ou modifié." "Votre entreprise a installé une autorité de certification dans votre profil professionnel. Votre trafic sur le réseau sécurisé peut être contrôlé ou modifié." "Une autorité de certification est installée sur cet appareil. Votre trafic sur le réseau sécurisé peut être contrôlé ou modifié." "Votre administrateur a activé la journalisation du réseau, pour contrôler le trafic sur votre appareil." - - - - + "Vous êtes connecté à %1$s, qui peut contrôler votre activité sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web." + "Vous êtes connecté à %1$s et à %2$s, qui peuvent contrôler votre activité sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web." "Votre profil professionnel est connecté à %1$s, qui peut contrôler votre activité sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web." "Votre profil personnel est connecté à %1$s, qui peut contrôler votre activité sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web." "Votre appareil est géré par %1$s." @@ -472,6 +468,8 @@ "Vous êtes connecté à %1$s. Cette application peut contrôler votre activité personnelle sur le réseau, y compris les e-mails, les applications et les sites Web." "Votre profil professionnel est géré par %1$s. Ce profil est connecté à %2$s, qui peut contrôler votre activité professionnelle sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web.\n\nPour plus d\'informations, contactez votre administrateur." "Votre profil professionnel est géré par %1$s. Ce profil est connecté à %2$s, qui peut contrôler votre activité professionnelle sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web.\n\nVous êtes également connecté à %3$s, qui peut contrôler votre activité personnelle sur le réseau." + + "L\'appareil restera verrouillé jusqu\'à ce que vous le déverrouilliez manuellement." "Recevoir les notifications plus vite" "Afficher les notifications avant de déverrouiller l\'appareil" @@ -705,6 +703,8 @@ "Notification %1$s : %2$s" "Il est possible que l\'application ne fonctionne pas en mode Écran partagé." "Application incompatible avec l\'écran partagé." + "Il est possible que l\'application ne fonctionne pas sur un écran secondaire." + "L\'application ne peut être lancée sur des écrans secondaires." "Ouvrir les paramètres." "Ouvrir la fenêtre de configuration rapide." "Fermer la fenêtre de configuration rapide." @@ -754,8 +754,7 @@ "Applis instantanées" "Les applis instantanées ne nécessitent pas d\'installation." "Infos sur l\'appli" - - + "Accéder au site Web" "Données mobiles" "Wi-Fi désactivé" "Bluetooth désactivé" diff --git a/packages/SystemUI/res/values-fr/strings_car.xml b/packages/SystemUI/res/values-fr/strings_car.xml index d42586edfe35d97130d77ecf0627722621d86480..8cfee94eb494ec216ebf1618c990b4629e3304cc 100644 --- a/packages/SystemUI/res/values-fr/strings_car.xml +++ b/packages/SystemUI/res/values-fr/strings_car.xml @@ -19,6 +19,5 @@ - "Soyez prudent sur la route" - "Tenez compte des conditions de conduite et respectez toujours les lois en vigueur. Les itinéraires peuvent être incorrects, incomplets, dangereux, inappropriés ou interdits, et traverser des frontières administratives. Les informations sur les établissements peuvent également être incorrectes ou incomplètes. Les données ne sont pas fournies en temps réel, et la précision de la localisation n\'est pas garantie. Ne manipulez pas votre appareil mobile et n\'utilisez pas d\'applications non conçues pour Android Auto lorsque vous conduisez." + "Inconnu" diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index fda24b36a68543d30d9bb97866848700447f2bb0..453e0e3c54a7dc018f8c681c3b09f27bff08262a 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -48,7 +48,7 @@ "APAGAR" "AUTO" "Notificacións" - "Bluetooth ancorado" + "Conexión compartida por Bluetooth" "Configurar métodos de entrada" "Teclado físico" "Queres permitir que a aplicación %1$s acceda ao dispositivo USB?" @@ -155,8 +155,9 @@ "Datos móbiles" "Os datos móbiles están activados" "Os datos móbiles están desactivados" - "Ancoraxe de Bluetooth." + "Conexión compartida por Bluetooth." "Modo avión" + "A VPN está activada." "Non hai tarxeta SIM" "Cambio de rede do operador." "Abrir os detalles da batería" @@ -228,8 +229,8 @@ "Activouse a lanterna." "Desactivouse a inversión da cor." "Activouse a inversión da cor." - "Desactivouse a zona interactiva móbil." - "Activouse a zona interactiva móbil." + "Desactivouse a zona wifi móbil." + "Activouse a zona wifi móbil." "Detívose a emisión en pantalla." "Modo de traballo desactivado." "Modo de traballo activado." @@ -243,7 +244,7 @@ "Os datos 4G están en pausa" "Pausáronse os datos móbiles" "Os datos están en pausa" - "Alcanzouse o límite de datos establecido. Xa non usarás os datos móbiles.\n\nSe continúas, pódense aplicar cargos polo uso de datos." + "Alcanzouse o límite de datos que fixaches. Xa non estás usando datos móbiles.\n\nSe os reactivas, pódense aplicar cargos polo seu uso." "Retomar" "Sen Internet" "Wi-Fi conectada" @@ -276,7 +277,7 @@ "Bluetooth desactivado" "Non hai dispositivos sincronizados dispoñibles" "Brillo" - "Rotación automática" + "Xirar automaticamente" "Xirar a pantalla automaticamente" "Modo %s" "Rotación bloqueada" @@ -312,7 +313,7 @@ "Feito" "Conectado" "Conectando..." - "Ancoraxe á rede" + "Conexión compartida" "Zona wifi" "Notificacións" "Lanterna" @@ -429,8 +430,7 @@ "O perfil de traballo está conectado a %1$s" "O perfil persoal está conectado a %1$s" "O dispositivo está conectado a %1$s" - - + "Xestión de dispositivos" "Supervisión do perfil" "Supervisión de rede" "VPN" @@ -439,18 +439,14 @@ "Desactivar VPN" "Desconectar VPN" "Ver políticas" - - - - + "O teu dispositivo está xestionado por %1$s.\n\nO administrador pode controlar e xestionar a configuración, o acceso corporativo, as aplicacións, os datos asociados co dispositivo e a información de localización deste último.\n\nPara obter máis información, ponte en contacto co teu administrador." + "A túa organización xestiona o teu dispositivo.\n\nO administrador pode controlar e xestionar a configuración, o acceso corporativo, as aplicacións, os datos asociados co dispositivo e a información de localización deste último.\n\nPara obter máis información, ponte en contacto co teu administrador." "A túa organización instalou unha autoridade de certificación neste dispositivo. É posible que se controle ou se modifique o teu tráfico de rede segura." "A túa organización instalou unha autoridade de certificación no teu perfil de traballo. É posible que se controle ou se modifique o teu tráfico de rede segura." "Este dispositivo ten unha autoridade de certificación instalada. É posible que se controle ou se modifique o teu tráfico de rede segura." "O administrador activou o rexistro na rede, que controla o tráfico do teu dispositivo." - - - - + "Estás conectado a %1$s, que pode controlar a túa actividade na rede, mesmo os correos electrónicos, as aplicacións e os sitios web." + "Estás conectado a %1$s e a %2$s, que poden controlar a túa actividade na rede, mesmo os correos electrónicos, as aplicacións e os sitios web." "O teu perfil de traballo está conectado a %1$s, que pode controlar a túa actividade na rede, mesmo os correos electrónicos, as aplicacións e os sitios web." "O teu perfil persoal está conectado a %1$s, que pode controlar a túa actividade na rede, mesmo os correos electrónicos, as aplicacións e os sitios web." "O teu dispositivo está xestionado por %1$s." @@ -472,6 +468,8 @@ "Estás conectado a %1$s, que pode supervisar a túa actividade persoal na rede, incluídos os correos electrónicos, as aplicacións e os sitios web." "%1$s xestiona o teu perfil de traballo, que está conectado a %2$s. Esta aplicación pode controlar a túa actividade na rede, mesmo os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, contacta co administrador." "%1$s xestiona o teu perfil de traballo, que está conectado a %2$s. Esta aplicación pode controlar a túa actividade na rede, mesmo os correos electrónicos, as aplicacións e os sitios web.\n\nTamén estás conectado a %3$s, que pode controlar a túa actividade persoal na rede." + + "O dispositivo permanecerá bloqueado ata que o desbloquees manualmente" "Recibir notificacións máis rápido" "Consúltaas antes de desbloquear" @@ -705,6 +703,8 @@ "Notificación de %1$s: %2$s" "Pode que a aplicación non funcione coa pantalla dividida." "A aplicación non é compatible coa función de pantalla dividida." + "É posible que a aplicación non funcione nunha pantalla secundaria." + "A aplicación non se pode iniciar en pantallas secundarias." "Abrir configuración." "Abrir a configuración rápida." "Pechar a configuración rápida." @@ -753,9 +753,8 @@ "Almacenamento" "Aplicacións instantáneas" "As aplicacións instantáneas non precisan instalación." - "Información da aplicación" - - + "Información de aplicacións" + "Acceder á web" "Datos móbiles" "A wifi está desactivada" "O Bluetooth está desactivado" diff --git a/packages/SystemUI/res/values-gl/strings_car.xml b/packages/SystemUI/res/values-gl/strings_car.xml index bb3f8eba267f2598e7dce1c02ece07f8c6b3999a..88d1a48c77800ad77193c58185d85f129047c7d0 100644 --- a/packages/SystemUI/res/values-gl/strings_car.xml +++ b/packages/SystemUI/res/values-gl/strings_car.xml @@ -19,6 +19,5 @@ - "Conduce de forma segura" - "Ten moi en conta as condicións de condución e respecta sempre as leis aplicables. É posible que as indicacións sexan imprecisas, incompletas, perigosas, inadecuadas, estean prohibidas ou que impliquen atravesar áreas administrativas. A información das empresas tamén pode ser imprecisa ou estar incompleta. Os datos non se proporcionan en tempo real e non se garante a precisión da localización. Non manipules o teu dispositivo móbil nin utilices aplicacións que non estean deseñadas para Android Auto mentres conduces." + "Descoñecido" diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 2cba93f97cca41c8a8f019920899c365aa6fb3d7..49abb7a0c3ba1ccad9343e116ae3ed858af4f050 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -152,14 +152,12 @@ "Edge" "Wi-Fi" "SIM નથી." - - - - - - + "મોબાઇલ ડેટા" + "મોબાઇલ ડેટા ચાલુ છે" + "મોબાઇલ ડેટા બંધ છે" "Bluetooth ટિથરિંગ." "એરપ્લેન મોડ." + "VPN ચાલુ છે." "કોઇ SIM કાર્ડ નથી." "કેરીઅર નેટવર્કમાં ફેરફાર થઈ રહ્યો છે." "બૅટરીની વિગતો ખોલો" @@ -242,11 +240,9 @@ "ચાર્જ થઈ રહ્યું છે" "2G-3G ડેટા થોભાવ્યો છે" "4G ડેટા થોભાવ્યો છે" - - + "મોબાઇલ ડેટા થોભાવ્યો છે" "ડેટા થોભાવ્યો છે" - - + "તમે સેટ કરેલી ડેટા મર્યાદા પહોંચી ગઇ છે. તમે હવે મોબાઇલ ડેટાનો ઉપયોગ નથી કરી રહ્યાં.\n\nજો હવે તમે ફરી શરૂ કરો, તો ડેટા વપરાશ માટે શુલ્ક લાગુ થઇ શકે છે." "ફરી શરૂ કરો" "કોઈ ઇન્ટરનેટ કનેક્શન નથી" "Wi-Fi કનેક્ટ કર્યું" @@ -319,8 +315,7 @@ "હોટસ્પોટ" "સૂચનાઓ" "ફ્લેશલાઇટ" - - + "મોબાઇલ ડેટા" "ડેટા વપરાશ" "બાકી ડેટા" "મર્યાદાથી વધુ" @@ -433,8 +428,7 @@ "કાર્ય પ્રોફાઇલ %1$s સાથે કનેક્ટ કરેલ છે" "વ્યક્તિગત પ્રોફાઇલ %1$s સાથે કનેક્ટ કરેલ છે" "આ ઉપકરણ %1$s સાથે કનેક્ટ કરેલ છે" - - + "ઉપકરણનું સંચાલન" "પ્રોફાઇલ નિરીક્ષણ" "નેટવર્ક મૉનિટરિંગ" "VPN" @@ -443,18 +437,14 @@ "VPN અક્ષમ કરો" "VPN ડિસ્કનેક્ટ કરો" "નીતિઓ જુઓ" - - - - + "તમારું ઉપકરણ %1$s દ્વારા સંચાલિત કરવામાં આવે છે.\n\nતમારા વ્યવસ્થાપક સેટિંગ્સ, કૉર્પોરેટ ઍક્સેસ, ઍપ્લિકેશનો, તમારા ઉપકરણ સાથે સંકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતીનું નિરીક્ષણ અને સંચાલન કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો." + "તમારું ઉપકરણ તમારી સંસ્થા દ્વારા સંચાલિત કરવામાં આવે છે.\n\nતમારા વ્યવસ્થાપક સેટિંગ્સ, કૉર્પોરેટ ઍક્સેસ, ઍપ્લિકેશનો, તમારા ઉપકરણ સાથે સંકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતીનું નિરીક્ષણ અને સંચાલન કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો." "તમારી સંસ્થાએ આ ઉપકરણ પર પ્રમાણપત્ર સત્તાધિકારી ઇન્સ્ટૉલ કર્યું છે. તમારા સુરક્ષિત નેટવર્ક ટ્રાફિકનું નિયમન થઈ શકે છે અથવા તેમાં ફેરફાર કરવામાં આવી શકે છે." "તમારી સંસ્થાએ તમારી કાર્ય પ્રોફાઇલમાં પ્રમાણપત્ર સત્તાધિકારી ઇન્સ્ટૉલ કર્યું છે. તમારા સુરક્ષિત નેટવર્ક ટ્રાફિકનું નિયમન થઈ શકે છે અથવા તેમાં ફેરફાર કરવામાં આવી શકે છે." "આ ઉપકરણ પર પ્રમાણપત્ર સત્તાધિકારી ઇન્સ્ટૉલ કરેલ છે. તમારા સુરક્ષિત નેટવર્ક ટ્રાફિકનું નિયમન થઈ શકે છે અથવા તેમાં ફેરફાર કરવામાં આવી શકે છે." "તમારા વ્યવસ્થાપકે નેટવર્ક લૉગિંગ ચાલુ કર્યું છે, જે તમારા ઉપકરણ પર નેટવર્ક ટ્રાફિકનું નિયમન કરે છે." - - - - + "તમે %1$s સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ, ઍપ્લિકેશનો અને વેબસાઇટ સહિત તમારી નેટવર્ક પ્રવૃત્તિનું નિરીક્ષણ કરી શકે છે." + "તમે %1$s અને %2$s સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ, ઍપ્લિકેશનો અને વેબસાઇટ સહિત તમારી નેટવર્ક પ્રવૃત્તિનું નિરીક્ષણ કરી શકે છે." "તમારી કાર્ય પ્રોફાઇલ %1$s સાથે કનેક્ટ કરેલ છે, જે ઇમેઇલ, ઍપ્લિકેશનો અને વેબસાઇટો સહિતની તમારી નેટવર્ક પ્રવૃત્તિનું નિયમન કરી શકે છે." "તમારી વ્યક્તિગત પ્રોફાઇલ %1$s સાથે કનેક્ટ કરેલ છે, જે ઇમેઇલ, ઍપ્લિકેશનો અને વેબસાઇટો સહિતની તમારી નેટવર્ક પ્રવૃત્તિનું નિયમન કરી શકે છે." "તમારું ઉપકરણ %1$s દ્વારા સંચાલિત થાય છે." @@ -476,6 +466,8 @@ "તમે %1$s સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિત તમારી વ્યક્તિગત નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે." "તમારી કાર્ય પ્રોફાઇલ %1$s દ્વારા સંચાલિત કરાય છે. આ પ્રોફાઇલ %2$s સાથે કનેક્ટ કરેલ છે, જે ઇમેઇલ, ઍપ્લિકેશનો અને વેબસાઇટો સહિતની તમારી નેટવર્ક પ્રવૃત્તિનું નિયમન કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો." "તમારી કાર્ય પ્રોફાઇલ %1$s દ્વારા સંચાલિત થાય છે. આ પ્રોફાઇલ %2$s સાથે કનેક્ટ કરેલ છે, જે ઇમેઇલ, ઍપ્લિકેશનો અને વેબસાઇટો સહિતની તમારી નેટવર્ક પ્રવૃત્તિનું નિયમન કરી શકે છે.\n\nતમે %3$s સાથે પણ કનેક્ટ કરેલું છે, જે તમારી વ્યક્તિગત નેટવર્ક પ્રવૃત્તિનું નિયમન કરી શકે છે." + + "તમે ઉપકરણને મેન્યુઅલી અનલૉક કરશો નહીં ત્યાં સુધી તે લૉક રહેશે" "વધુ ઝડપથી સૂચનાઓ મેળવો" "તમે અનલૉક કરો તે પહેલાં તેમને જુઓ" @@ -569,12 +561,9 @@ %1$s, %2$s અને અન્ય %3$d %1$s, %2$s અને અન્ય %3$d - - - - - - + "%1$s માટે સૂચના નિયંત્રણો ચાલુ છે" + "%1$s માટે સૂચના નિયંત્રણો બંધ છે" + "આ ચૅનલની સૂચનાઓને મંજૂરી આપો" "બધી કૅટેગરી" "વધુ સેટિંગ્સ" "કસ્ટમાઇઝ કરો: %1$s" @@ -712,6 +701,8 @@ "%1$s સૂચના: %2$s" "વિભાજિત-સ્ક્રીન સાથે ઍપ્લિકેશન કદાચ કામ ન કરે." "ઍપ્લિકેશન સ્ક્રીન-વિભાજનનું સમર્થન કરતી નથી." + "ઍપ્લિકેશન ગૌણ ડિસ્પ્લે પર કદાચ કામ ન કરે." + "ઍપ્લિકેશન ગૌણ ડિસ્પ્લે પર લૉન્ચનું સમર્થન કરતી નથી." "સેટિંગ્સ ખોલો." "ઝડપી સેટિંગ્સ ખોલો." "ઝડપી સેટિંગ્સ બંધ કરો." @@ -730,14 +721,10 @@ "ચિત્રમાં ચિત્ર મેનૂ" "%s ચિત્રમાં-ચિત્રની અંદર છે" "જો તમે નથી ઇચ્છતા કે %s આ સુવિધાનો ઉપયોગ કરે, તો સેટિંગ્સ ખોલવા માટે ટૅપ કરો અને તેને બંધ કરો." - - - - - - - - + "ચલાવો" + "થોભાવો" + "આગલા પર જાઓ" + "પહેલાંના પર જાઓ" "ફોન વધુ પડતી ગરમીને લીધે બંધ થઇ ગયો છે" "તમારો ફોન હવે સામાન્યપણે કાર્ય કરી રહ્યો છે" "તમારો ફોન અત્યંત ગરમ હતો, તેથી તે ઠંડો થવા આપમેળે બંધ થઇ ગયો છે. તમારો ફોન હવે સામાન્યપણે કાર્ય કરી રહ્યો છે.\n\nતમારો ફોન અત્યંત ગરમ થઇ શકે છે, જો તમે:\n • એવી ઍપ્લિકેશન વાપરતા હો જે સંસાધન સઘન રીતે વાપરતી હોય (જેમ કે ગેમિંગ, વિડિઓ, અથવા નેવિગેટ કરતી ઍપ્લિકેશનો)\n • મોટી ફાઇલો અપલોડ અથવા ડાઉનલોડ કરતા હો\n • તમારા ફોનનો ઉપયોગ ઉચ્ચ તાપમાનમાં કરતા હો" @@ -765,8 +752,7 @@ "ઝટપટ ઍપ્લિકેશનો" "ઝટપટ ઍપ્લિકેશનો માટે ઇન્સ્ટૉલેશનની જરૂર નથી." "ઍપ્લિકેશન માહિતી" - - + "વેબ પર જાઓ" "મોબાઇલ ડેટા" "Wi-Fi બંધ છે" "Bluetooth બંધ છે" diff --git a/packages/SystemUI/res/values-gu/strings_car.xml b/packages/SystemUI/res/values-gu/strings_car.xml index b22b6882a64c3f055d7c8ccb59374cfb88ccab95..49f408061e8ecd90669af4c18ee8037daf4eb3e1 100644 --- a/packages/SystemUI/res/values-gu/strings_car.xml +++ b/packages/SystemUI/res/values-gu/strings_car.xml @@ -19,6 +19,5 @@ - "સુરક્ષિત રીતે વાહન ચલાવો" - "ડ્રાઇવિંગ સ્થિતિઓથી સંપૂર્ણપણે વાકેફ રહો અને હંમેશા લાગુ કાયદાઓનું પાલન કરો. દિશા નિર્દેશો અચોક્કસ, અપૂર્ણ, જોખમમકારક, બિન અનુકૂળ, પ્રતિબંધિત અથવા વહીવટી વિસ્તારોને ઓળંગવાનું સમાવતા હોઇ શકે છે. વ્યવસાય માહિતી પણ અચોક્કસ અથવા અપૂર્ણ હોઇ શકે છે. ડેટા રિઅલ-ટાઇમ નથી અને સ્થાન ચોકસાઈની ગેરંટી આપી શકતાં નથી. ડ્રાઇવિંગ કરતી વખતે Android Auto માટે તમારું મોબાઇલ સાધન હેન્ડલ કરવું અથવા ઍપ્લિકેશનનો ઉપયોગ કરવાનું કોઇ પ્રયોજન નથી." + "અજાણ" diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 65dd1fa51e7269dae4021339c64090a950a5b6f3..8f45c8e561a6f0b38c8828c9c03f6263dbed16b0 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -157,6 +157,7 @@ "मोबाइल डेटा बंद है" "ब्लूटूथ टेदरिंग." "हवाई जहाज मोड." + "VPN चालू." "कोई सिम कार्ड नहीं है." "वाहक नेटवर्क बदलना." "बैटरी का विवरण खोलें" @@ -241,7 +242,7 @@ "4G डेटा रोक दिया गया है" "मोबाइल डेटा रोक दिया गया है" "डेटा रोक दिया गया है" - "आपने जो डेटा सीमा सेट की थी, वहां तक पहुंचा जा चुका है. अब आप मोबाइल डेटा का उपयोग नहीं कर रहे हैं.\n\nअगर आप फिर से शुरू करते हैं, तो डेटा उपयोग के लिए शुल्क लगाया जा सकता है." + "आपने जो डेटा सीमा सेट की थी, वह पूरी हो चुकी है. अब आप मोबाइल डेटा का उपयोग नहीं कर रहे हैं.\n\nअगर आप फिर से शुरू करते हैं, तो डेटा उपयोग के लिए शुल्क लगाया जा सकता है." "फिर से शुरू करें" "कोई इंटरनेट कनेक्शन नहीं" "वाई-फ़ाई कनेक्‍ट किया गया" @@ -427,8 +428,7 @@ "कार्य प्रोफ़ाइल %1$s से कनेक्ट है" "व्यक्तिगत प्रोफ़ाइल %1$s से कनेक्ट है" "डिवाइस %1$s से कनेक्ट है" - - + "डिवाइस प्रबंधन" "प्रोफ़ाइल को मॉनीटर करना" "नेटवर्क को मॉनीटर करना" "VPN" @@ -437,18 +437,14 @@ "VPN अक्षम करें" "VPN डिस्‍कनेक्‍ट करें" "नीतियां देखें" - - - - + "%1$s आपके डिवाइस का प्रबंधन करता है.\n\nआपका व्यवस्थापक सेटिंग, कॉर्पोरेट एक्सेस, ऐप्लिकेशन, आपके डिवाइस से संबद्ध डेटा और आपके डिवाइस की स्थान की जानकारी की निगरानी कर सकता है और उन्हें प्रबंधित कर सकता है.\n\nअधिक जानकारी के लिए, अपने व्यवस्थापक से संपर्क करें." + "आपका संगठन आपके डिवाइस का प्रबंधन करता है.\n\nआपका व्यवस्थापक सेटिंग, कॉर्पोरेट एक्सेस, ऐप्लिकेशन, आपके डिवाइस से संबद्ध डेटा और आपके डिवाइस की स्थान की जानकारी की निगरानी कर सकता है और उन्हें प्रबंधित कर सकता है.\n\nअधिक जानकारी के लिए, अपने व्यवस्थापक से संपर्क करें." "आपके संगठन ने इस डिवाइस पर एक प्रमाणपत्र प्राधिकरण इंस्टॉल किया है. आपके सुरक्षित नेटवर्क की निगरानी या उसमें बदलाव किया जा सकता है." "आपके संगठन ने आपकी कार्य प्रोफ़ाइल में एक प्रमाणपत्र प्राधिकरण इंस्टॉल किया है. आपके सुरक्षित नेटवर्क ट्रैफ़िक की निगरानी या उसमें बदलाव किया जा सकता है." "इस डिवाइस पर एक प्रमाणपत्र प्राधिकरण इंस्टॉल किया गया है. आपके सुरक्षित नेटवर्क ट्रैफ़िक की निगरानी या उसमें बदलाव किया जा सकता है." "आपके व्यवस्थापक ने नेटवर्क लॉगिंग चालू किया है, जो आपके डिवाइस पर ट्रैफ़िक की निगरानी करता है." - - - - + "आप %1$s से कनेक्‍ट हैं, जो ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकते हैं." + "आप %1$s और %2$s से कनेक्ट हैं, जो ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकते हैं." "आपकी कार्य प्रोफ़ाइल %1$s से कनेक्ट है, जो ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है." "आपकी व्यक्तिगत प्रोफ़ाइल %1$s से कनेक्ट है, जो ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है." "%1$s आपका डिवाइस प्रबंधित करता है." @@ -470,6 +466,8 @@ "आप %1$s से कनेक्‍ट हैं, जो ईमेल, ऐप्लिकेशन और वेबसाइट सहित आपकी व्‍यक्‍तिगत नेटवर्क गतिविधि को मॉनिटर कर सकता है." "आपकी कार्य प्रोफ़ाइल का प्रबंधन %1$s करता है. प्रोफ़ाइल %2$s से कनेक्ट है, जो ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nअधिक जानकारी के लिए, अपने व्यवस्थापक से संपर्क करें." "आपकी कार्य प्रोफ़ाइल का प्रबंधन %1$s करता है. प्रोफ़ाइल %2$s से कनेक्ट है, जो ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nआप %3$s से भी कनेक्ट हैं, जो आपकी व्यक्तिगत नेटवर्क गतिविधि की निगरानी कर सकता है." + + "जब तक कि आप मैन्‍युअल रूप से अनलॉक नहीं करते तब तक डिवाइस लॉक रहेगा" "सूचनाएं अधिक तेज़ी से प्राप्त करें" "आपके द्वारा उन्हें अनलॉक किए जाने से पहले देखें" @@ -703,6 +701,8 @@ "%1$s नोटिफ़िकेशन: %2$s" "हो सकता है कि ऐप्लिकेशन विभाजित स्क्रीन के साथ काम ना करे." "ऐप विभाजित स्‍क्रीन का समर्थन नहीं करता है." + "हो सकता है कि ऐप्लिकेशन दूसरे प्रदर्शन पर काम नहीं करे." + "दूसरे प्रदर्शन पर यह ऐप्लिकेशन लॉन्च नहीं हो सकता." "सेटिंग खोलें." "त्वरित सेटिंग खोलें." "त्वरित सेटिंग बंद करें." @@ -752,8 +752,7 @@ "झटपट ऐप्स" "झटपट ऐप्स के लिए इंस्टॉलेशन ज़रूरी नहीं है." "ऐप की जानकारी" - - + "वेब पर जाएं" "मोबाइल डेटा" "वाई-फ़ाई बंद है" "ब्लूटूथ बंद है" diff --git a/packages/SystemUI/res/values-hi/strings_car.xml b/packages/SystemUI/res/values-hi/strings_car.xml index a643bd8169dba5ec722f6952808600041dcaa2a9..a7a43790349ad07afea68c984ebc15dfe326843c 100644 --- a/packages/SystemUI/res/values-hi/strings_car.xml +++ b/packages/SystemUI/res/values-hi/strings_car.xml @@ -19,6 +19,5 @@ - "सुरक्षित ढंग से गाड़ी चलाएं" - "गाड़ी चलाने की स्थितियों के प्रति पूरी तरह से सतर्क रहें और हमेशा लागू कानूनों का पालन करें. दिशाएं गलत, अपूर्ण, खतरनाक, निषिद्ध हो सकती हैं या उनमें प्रशासनिक क्षेत्रों को पार करना शामिल हो सकता है. व्यावसायिक जानकारी भी गलत या अपूर्ण हो सकती है. डेटा रीयल-टाइम नहीं है और स्थान सटीकता की गारंटी नहीं दी जा सकती. गाड़ी चलाते समय अपने मोबाइल डिवाइस या फ़ोन या Android Auto के लिए अभिप्रेत न किए गए ऐप्स का उपयोग ना करें." + "अज्ञात" diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 8261522bb2fe05503784cb07a32252fd6352161b..99e2e9eb7f8b96fc9b9ae7ea34a922f8787fb3c7 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -158,6 +158,7 @@ "Mobilni su podaci isključeni" "Posredno povezivanje Bluetootha." "Način rada u zrakoplovu" + "VPN uključen." "Nema SIM kartice." "Promjena mreže operatera." "Otvaranje pojedinosti o bateriji" @@ -306,7 +307,7 @@ "Nema dostupnih uređaja" "Svjetlina" "AUTOMATSKI" - "Zamijeni boje" + "Zamjena boja" "Način korekcije boje" "Više postavki" "Gotovo" @@ -429,8 +430,7 @@ "Radni profil povezan je s aplikacijom %1$s" "Osobni profil povezan je s aplikacijom %1$s" "Uređaj je povezan s aplikacijom %1$s" - - + "Upravljanje uređajem" "Nadzor profila" "Nadzor mreže" "VPN" @@ -439,18 +439,14 @@ "Onemogući VPN" "Prekini vezu s VPN-om" "Prikaži pravila" - - - - + "Uređajem upravlja organizacija %1$s.\n\nAdministrator može nadzirati postavke, korporacijski pristup, aplikacije, podatke o uređaju i lokaciji uređaja te upravljati njima.\n\nZa više informacija obratite se administratoru." + "Uređajem upravlja vaša organizacija.\n\nAdministrator može nadzirati postavke, korporacijski pristup, aplikacije, podatke o uređaju i lokaciji uređaja te upravljati njima.\n\nZa više informacija obratite se administratoru." "Vaša je organizacija instalirala izdavač certifikata na ovom uređaju. Vaš sigurni mrežni promet možda se nadzire ili modificira." "Vaša je organizacija instalirala izdavač certifikata na vašem radnom profilu. Vaš sigurni mrežni promet možda se nadzire ili modificira." "Na ovom je uređaju instaliran izdavač certifikata. Vaš sigurni mrežni promet možda se nadzire ili modificira." "Administrator je uključio mrežni zapisnik koji nadzire promet na vašem uređaju." - - - - + "Povezani ste s aplikacijom %1$s koja može nadzirati vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije." + "Povezani ste s aplikacijama %1$s i %2$s koje mogu nadzirati vašu aktivnost na mreži, uključujući e-poruke, aplikacije i web-lokacije." "Vaš je radni profil povezan s aplikacijom %1$s koja može nadzirati vašu aktivnost na mreži, uključujući e-poruke, aplikacije i web-lokacije." "Vaš je osobni profil povezan s aplikacijom %1$s koja može nadzirati vašu aktivnost na mreži, uključujući e-poruke, aplikacije i web-lokacije." "Vašim uređajem upravlja aplikacija %1$s." @@ -472,6 +468,8 @@ "Povezani ste s aplikacijom %1$s koja može nadzirati vašu osobnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije." "Vašim radnim profilom upravlja organizacija %1$s. Profil je povezan s aplikacijom %2$s koja može nadzirati vaše poslovne aktivnosti na mreži, uključujući e-poruke, aplikacije i web-lokacije.\n\nAko vam je potrebno više informacija, obratite se administratoru." "Vašim radnim profilom upravlja organizacija %1$s. Profil je povezan s aplikacijom %2$s koja može nadzirati vaše poslovne aktivnosti na mreži, uključujući e-poruke, aplikacije i web-lokacije.\n\nPovezani ste i s aplikacijom %3$s koja može nadzirati vaše osobne aktivnosti na mreži." + + "Uređaj će ostati zaključan dok ga ručno ne otključate" "Primajte obavijesti brže" "Pogledajte ih prije otključavanja" @@ -707,6 +705,8 @@ "%1$s obavijest: %2$s" "Aplikacija možda neće funkcionirati s podijeljenim zaslonom." "Aplikacija ne podržava podijeljeni zaslon." + "Aplikacija možda neće funkcionirati na sekundarnom zaslonu." + "Aplikacija ne podržava pokretanje na sekundarnim zaslonima." "Otvaranje postavki." "Otvaranje brzih postavki." "Zatvaranje brzih postavki." @@ -756,8 +756,7 @@ "Instant aplikacije" "Instant aplikacije nije potrebno instalirati." "Informacije o aplikaciji" - - + "Prijeđi na web" "Mobilni podaci" "Wi-Fi je isključen" "Bluetooth je isključen" diff --git a/packages/SystemUI/res/values-hr/strings_car.xml b/packages/SystemUI/res/values-hr/strings_car.xml index 034bd71dc1619ac253643ca0dc0678037428585c..3837c7b2d80fa819658611b575463130b3877386 100644 --- a/packages/SystemUI/res/values-hr/strings_car.xml +++ b/packages/SystemUI/res/values-hr/strings_car.xml @@ -19,6 +19,5 @@ - "Vozite sigurno" - "Pažljivo pratite promet i uvijek se pridržavajte primjenjivih zakona. Upute mogu biti neprecizne, nepotpune, opasne, neprikladne, zabranjene ili mogu uključivati prelazak administrativnih granica. Podaci o tvrtkama također mogu biti neprecizni i nepotpuni. Podaci nisu u stvarnom vremenu i preciznost lokacije nije zajamčena. Tijekom vožnje ne rukujte mobilnim uređajem i ne upotrebljavajte aplikacije koje nisu namijenjene za Android Auto." + "Nepoznato" diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 409d4ab566aeebda72a6fb6a1cdfff68af0a7885..8f823cb30beecfa1c2bbb2c87f1dd6741e4f6f1d 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -152,14 +152,12 @@ "Edge" "Wi-Fi" "Nincs SIM." - - - - - - + "Mobiladatok" + "Mobiladatok bekapcsolva" + "Mobiladatok kikapcsolva" "Bluetooth megosztása." "Repülőgép üzemmód." + "VPN bekapcsolva." "Nincs SIM-kártya." "Szolgáltatói hálózat váltása." "Az akkumulátorral kapcsolatos részletek megnyitása" @@ -242,11 +240,9 @@ "Töltés folyamatban…" "A 2G és 3G adatforgalom szünetel." "A 4G adatforgalom szünetel" - - + "Mobiladatok szüneteltetve" "Az adatforgalom szünetel" - - + "Elérte a beállított adatkorlátot. A továbbiakban nem használ mobiladat-forgalmat.\n\nHa a folytatást választja, szolgáltatója adathasználati díjat számíthat fel." "Folytatás" "Nincs internet" "Wi-Fi csatlakoztatva" @@ -319,8 +315,7 @@ "Hotspot" "Értesítések" "Zseblámpa" - - + "Mobiladatok" "Adathasználat" "Fennmaradó adatmennyiség" "Túllépte a korlátot" @@ -363,7 +358,7 @@ "Ez letiltja az ÖSSZES hanghatást és rezgést, beleértve az ébresztések, zeneszámok, videók és játékok hangjait is." "+%d" "A kevésbé sürgős értesítések lentebb vannak" - "Koppintson rá ismét a megnyitáshoz" + "Koppintson ismét a megnyitáshoz" "Húzza felfelé az ujját a feloldáshoz" "Az eszközt az Ön szervezete kezeli" "Az eszközt a(z) %s felügyeli." @@ -433,8 +428,7 @@ "A munkaprofil csatlakozik a következőhöz: %1$s" "A személyes profil a következőhöz csatlakozik: %1$s" "Az eszköz a következőhöz csatlakozik: %1$s" - - + "Eszközkezelés" "Profilfelügyelet" "Hálózatfigyelés" "VPN" @@ -443,18 +437,14 @@ "VPN letiltása" "VPN-kapcsolat bontása" "Házirendek megtekintése" - - - - + "Az eszközt a(z) %1$s felügyeli.\n\nA rendszergazda figyelheti és kezelheti a beállításokat, a vállalati hozzáférést, az alkalmazásokat, az eszközhöz tartozó adatokat, valamint az eszköz helyadatait.\n\nHa további információra van szüksége, vegye fel a kapcsolatot a rendszergazdával." + "Az eszközt az Ön szervezete felügyeli.\n\nA rendszergazda figyelheti és kezelheti a beállításokat, a vállalati hozzáférést, az alkalmazásokat, az eszközhöz tartozó adatokat, valamint az eszköz helyadatait.\n\nHa további információra van szüksége, vegye fel a kapcsolatot a rendszergazdával." "Szervezete tanúsítványkibocsátót telepített az eszközre. Ezáltal figyelhetik és befolyásolhatják az Ön biztonságos hálózati forgalmát." "Szervezete tanúsítványkibocsátót telepített a munkaprofilba. Ezáltal figyelhetik és befolyásolhatják az Ön biztonságos hálózati forgalmát." "Az eszközre tanúsítványkibocsátó van telepítve. Ezáltal figyelhetik és befolyásolhatják az Ön biztonságos hálózati forgalmát." "A rendszergazda bekapcsolta az eszköz forgalmát figyelő hálózati naplózást." - - - - + "Ön kapcsolódik a(z) %1$s alkalmazáshoz, amely figyelheti hálózati tevékenységét, beleértve a levelezést, valamint az alkalmazás- és webhelyhasználatot." + "Ön csatlakozik a(z) %1$s és a(z) %2$s alkalmazásokhoz, amelyek figyelhetik hálózati tevékenységét, beleértve a levelezést, valamint az alkalmazás- és webhelyhasználatot." "Munkaprofilja csatlakozik a(z) %1$s alkalmazáshoz, amely figyelheti hálózati tevékenységét, beleértve a levelezést, az alkalmazásokat és a webhelyeket." "Az Ön személyes profilja csatlakozik a(z) %1$s alkalmazáshoz, amely figyelheti hálózati tevékenységeit, beleértve a levelezést, az alkalmazásokat és a webhelyeket." "Az eszközt a(z) %1$s kezeli." @@ -476,6 +466,8 @@ "Ön a(z) %1$s alkalmazáshoz csatlakozik, amely figyelheti személyes hálózati tevékenységét, beleértve az e-maileket, alkalmazásokat és webhelyeket." "Munkaprofilját a(z) %1$s kezeli. A profil csatlakozik a(z) %2$s alkalmazáshoz, amely figyelheti az Ön hálózati tevékenységeit, beleértve az e-maileket, alkalmazásokat és webhelyeket.\n\nTovábbi információért forduljon a rendszergazdához." "Munkaprofilját a(z) %1$s kezeli. A profil csatlakozik a(z) %2$s alkalmazáshoz, amely figyelheti az Ön hálózati tevékenységeit, beleértve az e-maileket, alkalmazásokat és webhelyeket.\n\nCsatlakoztatta továbbá a(z) %3$s alkalmazást, amely figyelheti az Ön személyes hálózati tevékenységeit." + + "Az eszköz addig zárolva marad, amíg kézileg fel nem oldja" "Gyorsabban megkaphatja az értesítéseket" "Már a képernyőzár feloldása előtt megtekintheti őket" @@ -569,12 +561,9 @@ %1$s, %2$s és %3$d másik %1$s, %2$s és %3$d másik - - - - - - + "A(z) %1$s értesítésvezérlői megnyitva" + "A(z) %1$s értesítésvezérlői kikapcsolva" + "Értesítések engedélyezése erről a csatornáról" "Minden kategória" "További beállítások" "Személyre szabás: %1$s" @@ -618,7 +607,7 @@ "Num Lock" "Numerikus: %1$s" "Rendszer" - "Otthon" + "Kezdőoldal" "Legutóbbiak" "Vissza" "Értesítések" @@ -712,6 +701,8 @@ "%1$s-értesítések: %2$s" "Lehet, hogy az alkalmazás nem működik osztott képernyős nézetben." "Az alkalmazás nem támogatja az osztott képernyős nézetet." + "Előfordulhat, hogy az alkalmazás nem működik másodlagos kijelzőn." + "Az alkalmazás nem támogatja a másodlagos kijelzőn történő indítást." "Beállítások megnyitása." "Gyorsbeállítások megnyitása." "Gyorsbeállítások bezárása" @@ -730,14 +721,10 @@ "Kép a képben menü" "A(z) %s kép a képben funkciót használ" "Ha nem szeretné, hogy a(z) %s használja ezt a funkciót, koppintson a beállítások megnyitásához, és kapcsolja ki." - - - - - - - - + "Lejátszás" + "Szüneteltetés" + "Ugrás a következőre" + "Ugrás az előzőre" "A meleg miatt kikapcsolt" "A telefon most már megfelelően működik" "Telefonja túlmelegedett, így kikapcsolt, hogy lehűlhessen. Most már megfelelően működik.\n\nA telefon akkor melegedhet túl, ha Ön:\n • Energiaigényes alkalmazásokat használ (például játékokat, videókat vagy navigációs alkalmazásokat)\n • Nagy fájlokat tölt le vagy fel\n • Melegben használja a telefonját" @@ -765,8 +752,7 @@ "Azonnali alkalmazások" "Az azonnali alkalmazásokat nem kell telepíteni." "Alkalmazásinformáció" - - + "Tovább az internetre" "Mobiladatok" "A Wi-Fi ki van kapcsolva" "A Bluetooth ki van kapcsolva" diff --git a/packages/SystemUI/res/values-hu/strings_car.xml b/packages/SystemUI/res/values-hu/strings_car.xml index 688d88bec96493a5db4c835fbdafd2541c98fd6c..8e741bb1f49fe6fe786d430033a8a63ca5960d35 100644 --- a/packages/SystemUI/res/values-hu/strings_car.xml +++ b/packages/SystemUI/res/values-hu/strings_car.xml @@ -19,6 +19,5 @@ - "Vezessen óvatosan" - "Mindig legyen teljes mértékben tisztában a vezetési körülményekkel, és a vonatkozó törvényeket tartsa be! Az útvonaltervek pontatlanok, hiányosak, veszélyesek, nem megfelelők vagy tiltottak lehetnek, illetve a közforgalom számára nem használható utakat érinthetnek. Az üzleti információk is pontatlanok vagy hiányosak lehetnek. Az adatok nem valós idejűek, ezért nem garantálhatjuk a helyadatok pontosságát. Vezetés közben ne kezelje mobileszközét, illetve ne használjon olyan alkalmazásokat az Android Auto rendszerrel, amelyeket nem ahhoz terveztek." + "Ismeretlen" diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 12565d1ba6b83a3e3cd1c12867acccf768e8dcf1..f09cd9c91da2c147b880acf196f663fcb729f576 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -86,7 +86,7 @@ "Մատչելիություն" "Համատեսք" "Որոնել" - "Ֆոտոխցիկ" + "Տեսախցիկ" "Հեռախոս" "Ձայնային հուշումներ" "Ապակողպել" @@ -152,11 +152,12 @@ "Edge" "Wi-Fi" "SIM չկա:" - "Բջջային տվյալներ" + "Բջջային ինտերնետ" "Բջջային տվյալները միացված են" "Բջջային տվյալներն անջատված են" "Bluetooth-ը կապվում է:" "Ինքնաթիռի ռեժիմ" + "Միացնել VPN-ը։" "SIM քարտ չկա:" "Օպերատորի ցանցի փոփոխում:" "Բացել մարտկոցի տվյալները" @@ -200,7 +201,7 @@ "Չխանգարելու ընտրանքը միացված է: Ընդհատել միայն կարևոր ծանուցումների դեպքում:" "Չանհանգստացնել՝ ընդհանուր լուռ վիճակը:" "Չանհանգստացնել՝ միայն զարթուցիչ" - "Չընդհատել:" + "Չանհանգստացնել:" "Չխանգարելու ընտրանքն անջատված է:" "Չխանգարելու ընտրանքն անջատվեց:" "Չխանգարելու ընտրանքը միացվեց:" @@ -263,25 +264,25 @@ "Էկրանն այժմ կողպված է հորիզոնական դիրքում:" "Էկրանն այժմ կողպված է ուղղահայաց դիրքում:" "Dessert Case" - "Էկրանի խնայարար" + "Էկրանապահ" "Ethernet" - "Չխանգարել" + "Չանհանգստացնել" "Միայն կարևոր ծանուցումների դեպքում" "Միայն զարթուցիչ" - "Ընդհանուր լուռ վիճակը" + "Կատարյալ լռություն" "Bluetooth" "Bluetooth (%d սարք)" "Bluetooth-ն անջատված է" - "Հասանելի զուգավորված սարքեր չկան" + "Զուգակցված սարքեր չկան" "Պայծառություն" "Ինքնապտտում" - "Ինքնուրույն պտտել էկրանը" + "Ավտոմատ պտտել էկրանը" "%s ռեժիմ" "Պտտումը կողպված է" "Դիմանկար" "Լանդշաֆտ" "Մուտքագրման եղանակը" - "Տեղադրություն" + "Տեղորոշում" "Անջատել տեղադրությունը" "Մեդիա սարք" "RSSI" @@ -305,7 +306,7 @@ "Պայծառություն" "Ինքնաշխատ" "Շրջել գույները" - "Գույների կարգավորման ռեժիմ" + "Գունաշտկման ռեժիմ" "Հավելյալ կարգավորումներ" "Պատրաստ է" "Կապակցված է" @@ -351,10 +352,10 @@ "Որոնել" "Սահեցրեք վերև %s-ի համար:" "Սահեցրեք ձախ` %s-ի համար:" - "Ոչ մի ձայն և թրթռում չի անհանգստացնի ձեզ, բացառությամբ ձեր ընտրած զարթուցիչներից, հիշեցումներից, իրադարձություններից և զանգողներից:" + "Բոլոր ձայներն ու թրթռոցները կանջատվեն։ Ձեզ կանհանգստացնեն միայն զարթուցիչը, հիշեցումները, միջոցառումների մասին ծանուցումները և զանգերը ձեր ընտրած մարդկանցից։" "Հարմարեցնել" - "Այս գործողությունն արգելափակում է ԲՈԼՈՐ ձայներն ու թրթռումները, այդ թվում նաև զարթուցիչների, երաժշտության, տեսանյութերի և խաղերի ձայներն ու թրթռումները: Սակայն կկարողանաք կատարել հեռախոսազանգեր:" - "Այս գործողությունն արգելափակում է ԲՈԼՈՐ ձայներն ու թրթռումները, այդ թվում նաև զարթուցիչների, երաժշտության, տեսանյութերի և խաղերի ձայներն ու թրթռումները:" + "Այս գործողությունն արգելափակում է ԲՈԼՈՐ ձայներն ու թրթռոցները, այդ թվում զարթուցիչները, երաժշտությունը, տեսանյութերի և խաղերի ձայները: Դուք կկարողանաք հեռախոսազանգեր անել։" + "Այս գործողությունն արգելափակում է ԲՈԼՈՐ ձայներն ու թրթռոցները, այդ թվում նաև զարթուցիչների, երաժշտության, տեսանյութերի և խաղերի ձայներն ու թրթռոցները:" "+%d" "Պակաս հրատապ ծանուցումները ստորև" "Կրկին հպեք՝ բացելու համար" @@ -365,7 +366,7 @@ "Սահահարվածեք ձայնային հուշման պատկերակից" "Սահահարվածեք խցիկի պատկերակից" "Կատարյալ լռություն: Արդյունքում կանջատվի նաև էկրանի ընթերցիչների ձայնը:" - "Ընդհանուր լուռ վիճակը" + "Կատարյալ լռություն" "Միայն կարևորները" "Միայն զարթուցիչ" "Ընդհանուր\nլուռ վիճակը" @@ -404,7 +405,7 @@ "Մարտկոցի տնտեսումը միացված է" "Նվազեցնում է ծանրաբեռնվածությունը և ֆոնային տվյալները" "Անջատել մարտկոցի տնտեսումը" - "%s ծրագիրը կսկսի հավաքագրել այն ամենն ինչ ցուցադրվում է ձեր էկրանին:" + "%s ծրագիրը կսկսի հավաքել այն ամենն ինչ ցուցադրվում է ձեր էկրանին:" "Այլևս ցույց չտալ" "Մաքրել բոլորը" "Մեկնարկել հիմա" @@ -427,8 +428,7 @@ "Աշխատանքային պրոֆիլը կապակցված է %1$s հավելվածին" "Անձնական պրոֆիլը կապակցված է %1$s հավելվածին" "Սարքը կապակցված է %1$s հավելվածին" - - + "Սարքերի կառավարում" "Պրոֆիլի վերահսկում" "Ցանցի մշտադիտարկում" "VPN" @@ -437,18 +437,14 @@ "Անջատել VPN-ը" "Անջատել VPN-ը" "Դիտել քաղաքականությունները" - - - - + "Ձեր սարքը կառավարվում է %1$s.\n\n-ի կողմից: Ձեր ադմինիստրատորը կարող է վերահսկել և կառավարել կարգավորումները, կորպորատիվ օգտագործման թույլտվությունները, հավելվածները, սարքին կապված տվյալները և սարքի տեղադրման մասին տեղեկատվությունը:\n\nՄանրամասների համար դիմեք ձեր ադմինիստրատորին:" + "Ձեր շարժական սարքը կառավարվում է ձեր կազմակերպության կողմից։\n\nՁեր ադմինիստրատորը կարող է վերահսկել և կառավարել կարգավորումները, կորպորատիվ օգտագործման թույլտվությունները, հավելվածները, սարքին կապված տվյալները և սարքի տեղադրման մասին տեղեկատվությունը:\n\nՄանրամասների համար դիմեք ձեր ադմինիստրատորին:" "Ձեր կազմակերպությունը այս սարքում տեղադրել է վկայագրման կենտրոն։ Ձեր ցանցի ապահով թրաֆիկը կարող է վերահսկվել կամ փոփոխվել։" "Ձեր կազմակերպությունը ձեր աշխատանքային պրոֆիլում տեղադրել է վկայագրման կենտրոն։ Ձեր ցանցի ապահով թրաֆիկը կարող է վերահսկվել կամ փոփոխվել։" "Այս սարքում տեղադրված է վկայագրման կենտրոն։ Ձեր ցանցի ապահով թրաֆիկը կարող է վերահսկվել կամ փոփոխվել։" "Ձեր ադմինիստրատորը միացրել է ցանցային իրադարձությունների գրանցումը, որը վերահսկում է ձեր սարքի թրաֆիկը։" - - - - + "Դուք կապակցված եք %1$s հավելվածին, որը կարող է վերահսկել ձեր ցանցային գործողությունը, այդ թվում նաև էլփոստը, հավելվածները և կայքերը:" + "Դուք կապակցված եք %1$s և %2$s հավելվածներին, որոնք կարող են վերահսկել ձեր ցանցային գործունեությունը, այդ թվում նաև էլփոստը, հավելվածները և կայքերը:" "Ձեր աշխատանքային պրոֆիլը կապակցված է %1$s հավելվածին, որը կարող է վերահսկել ձեր ցանցային գործունեությունը, այդ թվում նաև էլփոստը, հավելվածները և կայքերը:" "Ձեր անձնական պրոֆիլը կապակցված է %1$s հավելվածին, որը կարող է վերահսկել ձեր ցանցային գործունեությունը, այդ թվում նաև էլփոստը, հավելվածները և կայքերը:" "Ձեր սարքը կառավարվում է %1$s հավելվածի կողմից:" @@ -470,6 +466,8 @@ "Դուք կապակցված եք %1$s հավելվածին, որը կարող է վերահսկել անձնական ցանցում կատարած ձեր գործողությունները, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:" "Ձեր աշխատանքային պրոֆիլի կառավարիչն է %1$s կազմակերպությունը: Այն կապակցված է %2$s հավելվածին, որը կարող է վերահսկել աշխատանքային ցանցում կատարած գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:\n\nԼրացուցիչ տեղեկություններ ստանալու համար դիմեք ձեր ադմինիստրատորին։" "Ձեր աշխատանքային պրոֆիլի կառավարիչն է %1$s կազմակերպությունը: Այն կապակցված է %2$s հավելվածին, որը կարող է վերահսկել աշխատանքային ցանցում կատարած գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:\n\nԴուք կապակցված եք նաև %3$s հավելվածին, որը կարող է վերահսկել անձնական ցանցում կատարած ձեր գործողությունները:" + + "Սարքը կմնա արգելափակված՝ մինչև ձեռքով չբացեք" "Ավելի արագ ստացեք ծանուցումները" "Տեսեք դրանք մինչև ապակողպելը" @@ -614,7 +612,7 @@ "Հետ" "Ծանուցումներ" "Ստեղնային դյուրանցումներ" - "Փոխարկել մուտքագրման եղանակը" + "Փոխել ներածման եղանակը" "Հավելվածներ" "Օգնություն" "Դիտարկիչ" @@ -625,15 +623,15 @@ "YouTube" "Օրացույց" "Ցույց տալ ձայնի ուժգնության կառավարման տարրերի հետ" - "Չընդհատել" + "Չանհանգստացնել" "Ձայնի կոճակների դյուրանցում" - "Ելնել Չխանգարել գործառույթից ձայնի ավելացման կոճակը սեղմելիս" + "Ելնել Չանհանգստացնել գործառույթից ձայնի ավելացման կոճակը սեղմելիս" "Մարտկոց" "Ժամացույց" "Ականջակալ" "Ականջակալը կապակցված է" "Ականջակալը կապակցված է" - "Տվյալների խնայում" + "Թրաֆիկի խնայում" "Տվյալների խնայումը միացված է" "Տվյալների խնայումն անջատված է" "Միացնել" @@ -703,6 +701,8 @@ "%1$s ծանուցում՝ %2$s" "Հավելվածը չի կարող աշխատել տրոհված էկրանի ռեժիմում:" "Հավելվածը չի աջակցում էկրանի տրոհումը:" + "Հավելվածը չի կարող աշխատել երկրորդական էկրանի վրա։" + "Հավելվածը չի աջակցում երկրորդական էկրանների վրա գործարկումը։" "Բացել կարգավորումները:" "Բացել արագ կարգավորումները:" "Փակել արագ կարգավորումները:" @@ -752,8 +752,7 @@ "Ակնթարթորեն գործարկվող հավելվածներ" "Ակնթարթորեն գործարկվող հավելվածները տեղադրում չեն պահանջում։" "Հավելվածի տվյալներ" - - + "Բացեք համացանցում" "Բջջային ինտերնետ" "Wi-Fi-ն անջատված է" "Bluetooth-ն անջատված է" diff --git a/packages/SystemUI/res/values-hy/strings_car.xml b/packages/SystemUI/res/values-hy/strings_car.xml index 4f214f7a8e00805f6fbdeb538401c3b0173761a3..acb376c3070ee85a67103d38839f68f8d09e4f9c 100644 --- a/packages/SystemUI/res/values-hy/strings_car.xml +++ b/packages/SystemUI/res/values-hy/strings_car.xml @@ -19,6 +19,5 @@ - "Վարեք ապահով" - "Երթևեկության պայմաններին միշտ լավատեղյակ եղեք և կատարեք համապատասխան օրենքների պահանջները: Երթուղիները կարող են լինել սխալ, կիսատ, վտանգավոր, ոչ պատշաճ, արգելված կամ կարող են անցնել վարչական միավորների միջով: Բիզնես տվյալները նույնպես կարող են լինել սխալ կամ կիսատ: Տվյալներն իրական ժամանակում չեն թարմացվում, իսկ տեղադրության ճշգրտությունը չի կարող երաշխավորվել: Մեքենա վարելիս մի օգտագործեք ձեր շարժական սարքը, ինչպես նաև Android Auto-ի համար չնախատեսված հավելվածները:" + "Անհայտ" diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 2954b79acecc9e79d639d11acc47f72f1e22214e..bf21c593c7803a4a90f51310bf6b6f303ce5d251 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -157,6 +157,7 @@ "Data Seluler Tidak Aktif" "Tethering bluetooth." "Mode pesawat." + "VPN aktif." "Tidak ada kartu SIM." "Jaringan operator berubah." "Membuka detail baterai" @@ -427,8 +428,7 @@ "Profil kerja tersambung ke %1$s" "Profil pribadi tersambung ke %1$s" "Perangkat tersambung ke %1$s" - - + "Pengelolaan perangkat" "Pemantauan profil" "Pemantauan jaringan" "VPN" @@ -437,18 +437,14 @@ "Nonaktifkan VPN" "Putuskan sambungan VPN" "Lihat Kebijakan" - - - - + "Perangkat dikelola oleh %1$s.\n\nAdmin dapat memantau dan mengelola setelan, akses perusahaan, aplikasi, data yang terkait dengan perangkat, dan informasi lokasi perangkat.\n\nUntuk informasi selengkapnya, hubungi admin." + "Perangkat dikelola oleh organisasi.\n\nAdmin dapat memantau dan mengelola setelan, akses perusahaan, aplikasi, data yang terkait dengan perangkat, dan informasi lokasi perangkat.\n\nUntuk informasi selengkapnya, hubungi admin." "Organisasi Anda menginstal otoritas sertifikat di perangkat ini. Traffic jaringan aman Anda mungkin dipantau atau diubah." "Organisasi Anda menginstal otoritas sertifikat di profil kerja. Traffic jaringan aman Anda mungkin dipantau atau diubah." "Otoritas sertifikat diinstal di perangkat. Traffic jaringan aman Anda mungkin dipantau atau diubah." "Admin telah mengaktifkan pencatatan jaringan, yang memantau traffic di perangkat." - - - - + "Anda tersambung ke %1$s, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web." + "Anda tersambung ke %1$s dan %2$s, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web." "Profil kerja Anda tersambung ke %1$s, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs." "Profil pribadi Anda tersambung ke %1$s, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs." "Perangkat dikelola oleh %1$s." @@ -470,6 +466,8 @@ "Anda tersambung ke %1$s, yang dapat memantau aktivitas jaringan pribadi, termasuk email, aplikasi, dan situs web.." "Profil kerja Anda dikelola oleh %1$s. Profil tersambung ke %2$s, yang dapat memantau aktivitas jaringan kerja, termasuk email, aplikasi, dan situs.\n\nHubungi admin untuk mendapatkan informasi lebih lanjut." "Profil kerja Anda dikelola oleh %1$s. Profil tersambung ke %2$s, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs.\n\nAnda juga tersambung ke %3$s, yang dapat memantau aktivitas jaringan pribadi." + + "Perangkat akan tetap terkunci hingga Anda membukanya secara manual" "Dapatkan pemberitahuan lebih cepat" "Lihat sebelum membuka kunci" @@ -703,6 +701,8 @@ "Notifikasi %1$s: %2$s" "Aplikasi mungkin tidak berfungsi dengan layar terpisah." "App tidak mendukung layar terpisah." + "Aplikasi mungkin tidak berfungsi pada layar sekunder." + "Aplikasi tidak mendukung peluncuran pada layar sekunder." "Buka setelan." "Buka setelan cepat." "Tutup setelan cepat." @@ -752,8 +752,7 @@ "Aplikasi Instan" "Aplikasi instan tidak perlu diinstal." "Info aplikasi" - - + "Buka di web" "Data seluler" "Wi-Fi nonaktif" "Bluetooth nonaktif" diff --git a/packages/SystemUI/res/values-in/strings_car.xml b/packages/SystemUI/res/values-in/strings_car.xml index cc23ecf112e557140f4827f7f8e2453d386caa58..8f640accb9ba5b2194b749fae509f507d8b4bbee 100644 --- a/packages/SystemUI/res/values-in/strings_car.xml +++ b/packages/SystemUI/res/values-in/strings_car.xml @@ -19,6 +19,5 @@ - "Hati-hati saat berkendara" - "Tetap perhatikan keadaan saat mengemudi dan selalu patuhi peraturan yang berlaku. Petunjuk arah mungkin tidak akurat, tidak lengkap, berbahaya, tidak cocok, terlarang, atau dapat melewati wilayah administratif. Informasi bisnis juga mungkin tidak akurat atau tidak lengkap. Data tidak dalam waktu nyata dan keakuratan lokasi tidak dijamin. Jangan menggunakan perangkat seluler atau aplikasi yang tidak berkaitan dengan Android Auto saat mengemudi." + "Tidak diketahui" diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 3fbd7cb7921936566ff3ce9e3a8fd32e524752e7..1e8db5d6937fb94c01c35cb64d5861f542187ec1 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -157,6 +157,7 @@ "Slökkt á farsímagögnum" "Tjóðrun með Bluetooth." "Flugstilling" + "Kveikt á VPN." "Ekkert SIM-kort." "Skipt um farsímakerfi." "Opna upplýsingar um rafhlöðu" @@ -427,8 +428,7 @@ "Vinnusnið er tengt við %1$s" "Einkaprófíll er tengdur við %1$s" "Tæki er tengt við %1$s" - - + "Tækjastjórnun" "Fylgst með sniði" "Neteftirlit" "VPN" @@ -437,18 +437,14 @@ "Slökkva á VPN" "Aftengja VPN-net" "Skoða stefnur" - - - - + "%1$s stjórnar tækinu þínu.\n\nKerfisstjórinn getur fylgst með og breytt stillingum, fyrirtækjaaðgangi, forritum, gögnum sem tengjast tækinu þínu og staðsetningarupplýsingum tækisins.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar." + "Fyrirtækið þitt stjórnar tækinu þínu.\n\nKerfisstjórinn getur fylgst með og breytt stillingum, fyrirtækjaaðgangi, forritum, gögnum sem tengjast tækinu þínu og staðsetningarupplýsingum tækisins.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar." "Fyrirtækið þitt setti upp CA-vottorð á þessu tæki. Eftirlit kann að vera haft með öruggri netnotkun þinni eða henni kann að vera breytt." "Fyrirtækið þitt setti upp CA-vottorð á vinnusniðinu þínu. Eftirlit kann að vera haft með öruggri netnotkun þinni eða henni kann að vera breytt." "CA-vottorð er uppsett á þessu tæki. Eftirlit kann að vera haft með öruggri netnotkun þinni eða henni kann að vera breytt." "Kerfisstjóri hefur kveikt á eftirliti netkerfa, sem fylgist með netumferð á tækinu þínu." - - - - + "Þú ert með tengingu við %1$s, sem getur fylgst með netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum." + "Þú ert með tengingu við %1$s og %2$s, sem geta fylgst með netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum." "Vinnusniðið þitt er tengt %1$s, sem getur fylgst með netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum." "Einkaprófíllinn þinn er tengdur við %1$s, sem getur fylgst með netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum." "Þessu tæki er stýrt af %1$s." @@ -470,6 +466,8 @@ "Þú ert með tengingu við %1$s, sem getur fylgst með persónulegri netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum." "Vinnusniðinu þínu er stýrt af %1$s. Sniðið er tengt %2$s, sem getur fylgst með netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum\n\nFrekari upplýsingar fást hjá kerfisstjóra." "Vinnusniðinu þínu er stýrt af %1$s. Sniðið er tengt %2$s, sem getur fylgst með netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum\n\nÞú ert einnig með tengingu við %3$s, sem getur fylgst með persónulegri netnotkun þinni." + + "Tækið verður læst þar til þú opnar það handvirkt" "Fáðu tilkynningar hraðar" "Sjáðu þær áður en þú opnar" @@ -703,6 +701,8 @@ "%1$s tilkynning: %2$s" "Hugsanlega virkar forritið ekki ef skjánum er skipt upp." "Forritið styður ekki að skjánum sé skipt." + "Hugsanlegt er að forritið virki ekki á öðrum skjá." + "Forrit styður ekki opnun á öðrum skjá." "Opna stillingar." "Opna flýtistillingar." "Loka flýtistillingum." @@ -752,8 +752,7 @@ "Skyndiforrit" "Skyndiforrit þurfa ekki uppsetningu." "Forritsupplýsingar" - - + "Fara á vefinn" "Farsímagögn" "Slökkt á Wi-Fi" "Slökkt á Bluetooth" diff --git a/packages/SystemUI/res/values-is/strings_car.xml b/packages/SystemUI/res/values-is/strings_car.xml index 65117bec515734b7c2fea2cf6ce059eca9c984f7..43c4cbb56d5314ad443c732edcee6febe1a8df36 100644 --- a/packages/SystemUI/res/values-is/strings_car.xml +++ b/packages/SystemUI/res/values-is/strings_car.xml @@ -19,6 +19,5 @@ - "Aktu varlega" - "Vertu vakandi fyrir akstursskilyrðum hverju sinni og farðu ævinlega eftir gildandi lögum. Leiðarlýsing kann að vera ónákvæm, ófullkomin, ekki við hæfi, bönnuð eða fela í sér ferðir um opinber svæði. Upplýsingar um fyrirtæki kunna einnig að vera ónákvæmar eða ófullkomnar. Gögn eru ekki í rauntíma og ekki er hægt að tryggja nákvæmni staðsetningarupplýsinga. Ekki handleika fartækið þitt meðan á akstri stendur eða nota forrit sem ekki eru hugsuð fyrir Android Auto." + "Óþekkt" diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index f0a7ef33abbbda3c9db051887003b1999ecbcb13..4559d1717bab779bf26923aa7ee7a6b5aa34d5d2 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -157,6 +157,7 @@ "Dati mobili disattivati" "Tethering Bluetooth." "Modalità aereo." + "VPN attiva." "Nessuna SIM presente." "Cambio rete operatore." "Visualizza i dettagli relativi alla batteria" @@ -429,8 +430,7 @@ "Profilo di lavoro collegato a %1$s" "Profilo personale collegato a %1$s" "Dispositivo collegato a %1$s" - - + "Gestione dei dispositivi" "Monitoraggio del profilo" "Monitoraggio rete" "VPN" @@ -439,18 +439,14 @@ "Disattiva VPN" "Scollega VPN" "Visualizza le norme" - - - - + "Il dispositivo è gestito da %1$s.\n\nL\'amministratore può monitorare e gestire impostazioni, accesso aziendale, app, dati associati al dispositivo e informazioni sulla posizione del dispositivo.\n\nPer ulteriori informazioni, contatta l\'amministratore." + "Il dispositivo è gestito dalla tua organizzazione.\n\nL\'amministratore può monitorare e gestire impostazioni, accesso aziendale, app, dati associati al dispositivo e informazioni sulla posizione del dispositivo.\n\nPer ulteriori informazioni, contatta l\'amministratore." "La tua organizzazione ha installato un\'autorità di certificazione sul dispositivo. Il tuo traffico di rete protetto potrebbe essere monitorato o modificato." "La tua organizzazione ha installato un\'autorità di certificazione nel tuo profilo di lavoro. Il tuo traffico di rete protetto potrebbe essere monitorato o modificato." "Sul dispositivo è installata un\'autorità di certificazione. Il tuo traffico di rete protetto potrebbe essere monitorato o modificato." "L\'amministratore ha attivato i log di rete, che consentono di monitorare il traffico sul dispositivo." - - - - + "Sei connesso a %1$s, che consente di monitorare le attività di rete, inclusi siti web, email e app." + "Sei connesso a %1$s e %2$s, che consentono di monitorare le attività di rete, inclusi siti web, email e app." "Il tuo profilo di lavoro è collegato a %1$s, da cui è possibile monitorare la tua attività di rete, inclusi siti web, email e app." "Il tuo profilo personale è collegato a %1$s, da cui è possibile monitorare la tua attività di rete, inclusi siti web, email e app." "Il dispositivo è gestito dall\'app %1$s." @@ -472,6 +468,8 @@ "Sei collegato a %1$s, che consente di monitorare la tua attività di rete personale, inclusi siti web, email e app." "Il tuo profilo di lavoro è gestito da %1$s ed è collegato a %2$s, da cui è possibile monitorare la tua attività di rete lavorativa, inclusi siti web, email e app.\n\nPer ulteriori informazioni, contatta l\'amministratore." "Il tuo profilo di lavoro è gestito da %1$s ed è collegato a %2$s, da cui è possibile monitorare la tua attività di rete lavorativa, inclusi siti web, email e app.\n\nSei collegato anche a %3$s, da cui è possibile monitorare la tua attività di rete personale." + + "Il dispositivo resterà bloccato fino allo sblocco manuale" "Ricevi notifiche più velocemente" "Visualizza prima di sbloccare" @@ -705,6 +703,8 @@ "Notifica di %1$s: %2$s" "L\'app potrebbe non funzionare con lo schermo diviso." "L\'app non supporta la modalità Schermo diviso." + "L\'app potrebbe non funzionare su un display secondario." + "L\'app non supporta l\'avvio su display secondari." "Apri le impostazioni." "Apri le impostazioni rapide." "Chiudi le impostazioni rapide." @@ -754,8 +754,7 @@ "App istantanee" "Le app istantanee non richiedono l\'installazione." "Informazioni app" - - + "Vai sul Web" "Dati mobili" "Wi-Fi disattivato" "Bluetooth non attivo" diff --git a/packages/SystemUI/res/values-it/strings_car.xml b/packages/SystemUI/res/values-it/strings_car.xml index 19c4e2b02ad01e7067f4db3c360aa7fc522953e1..869960afcbd7bebfe3b8de05a11c840bd704be20 100644 --- a/packages/SystemUI/res/values-it/strings_car.xml +++ b/packages/SystemUI/res/values-it/strings_car.xml @@ -19,6 +19,5 @@ - "Guida in modo sicuro" - "È necessario essere sempre pienamente informati sulle condizioni della strada e rispettare la legislazione vigente. Le indicazioni stradali potrebbero essere imprecise, incomplete, pericolose, inadatte, vietate o richiedere l\'attraversamento di aree amministrative. Anche le informazioni sugli esercizi commerciali potrebbero essere imprecise o incomplete. I dati forniti non sono aggiornati in tempo reale e non è possibile garantire la precisione della geolocalizzazione. Non maneggiare dispositivi mobili e app non destinate ad Android Auto durante la guida." + "Sconosciuto" diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 3d3b38de3b6a214cdbcbb2c6b6713226c741d22a..34184b7cb540bd0aacd1bc3edc6e831a56670d11 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -154,14 +154,12 @@ "קצה" "Wi-Fi" "‏אין כרטיס SIM." - - - - - - + "חבילת גלישה" + "חבילת הגלישה פועלת" + "חבילת הגלישה כבויה" "‏שיתוף אינטרנט דרך Bluetooth" "מצב טיסה" + "‏VPN פועל." "‏אין כרטיס SIM." "רשת ספק משתנה." "פתיחת פרטי סוללה" @@ -244,11 +242,9 @@ "הסוללה נטענת" "‏השימוש בנתוני 2G-3G מושהה" "‏השימוש בנתוני 4G מושהה" - - + "חבילת הגלישה מושהה" "השימוש בנתונים מושהה" - - + "הגעת למגבלת הנתונים שהגדרת. אתה כבר לא משתמש בחבילת גלישה.\n\nאם תמשיך, ייתכנו חיובים על שימוש בנתונים." "המשך" "אין חיבור לאינטרנט" "‏Wi-Fi מחובר" @@ -313,7 +309,7 @@ "אין מכשירים זמינים" "בהירות" "אוטומטי" - "הפוך צבעים" + "היפוך צבעים" "מצב תיקון צבע" "הגדרות נוספות" "בוצע" @@ -323,8 +319,7 @@ "נקודה לשיתוף אינטרנט" "הודעות" "פנס" - - + "חבילת גלישה" "שימוש בנתונים" "מכסת נתונים נותרת" "חריגה מההגבלה" @@ -361,9 +356,9 @@ "חיפוש" "הסט למעלה כדי להציג %s." "הסט שמאלה כדי להציג %s." - "צלילים ורטט לא יופעלו, פרט להתראות, תזכורות, אירועים ומתקשרים שתציין." - "התאם אישית" - "פעולה זו מבטלת את כל הצלילים והרטט, כולל צלילים ורטט שמקורם בהתראות, מוזיקה, סרטונים ומשחקים. תוכל עדיין להתקשר." + "צלילים ורטט לא יופעלו, פרט להתראות, תזכורות, אירועים ואנשים מסוימים שמתקשרים אליך, אם יש כאלה שציינת." + "התאמה אישית" + "פעולה זו מבטלת את כל הצלילים והרטט, כולל צלילים ורטט שמקורם בהתראות, מוזיקה, סרטונים ומשחקים. בכל מקרה, עדיין אפשר להתקשר." "פעולה זו מבטלת את כל הצלילים והרטט, כולל בהתראות, מוזיקה, סרטונים ומשחקים." "+%d" "הודעות בדחיפות נמוכה יותר בהמשך" @@ -437,8 +432,7 @@ "פרופיל העבודה מחובר לאפליקציה %1$s" "הפרופיל האישי מחובר לאפליקציה %1$s" "המכשיר מחובר לאפליקציה %1$s" - - + "ניהול מכשירים" "מעקב אחר פרופיל" "מעקב אחר פעילות ברשת" "VPN" @@ -447,18 +441,14 @@ "‏השבת VPN" "‏נתק את ה-VPN" "הצג מדיניות" - - - - + "המכשיר שלך מנוהל על ידי %1$s.\n\nמנהל המערכת יכול לנטר ולנהל הגדרות, גישה ארגונית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר.\n\nלמידע נוסף, פנה למנהל המערכת." + "המכשיר מנוהל על ידי הארגון שלך.\n\nמנהל המערכת יכול לנטר ולנהל הגדרות, גישה ארגונית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר.\n\nלמידע נוסף, פנה למנהל המערכת." "הארגון שלך התקין רשות אישורים במכשיר. ניתן לעקוב אחר התנועה ברשת המאובטחת או לשנות אותה." "הארגון שלך התקין רשות אישורים בפרופיל העבודה. ניתן לעקוב אחר התנועה ברשת המאובטחת או לשנות אותה." "במכשיר זה מותקנת רשות אישורים. ניתן לעקוב אחר התנועה ברשת המאובטחת או לשנות אותה." "מנהל המערכת הפעיל את התכונה \'רישום התנועה ברשת\', שמנטרת את תנועת הנתונים במכשיר." - - - - + "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים." + "אתה מחובר לאפליקציות %1$s ו-%2$s, שיכולות לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים." "פרופיל העבודה שלך מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים." "הפרופיל האישי שלך מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים." "המכשיר שלך מנוהל על ידי %1$s." @@ -480,6 +470,8 @@ "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית, כולל הודעות אימייל, אפליקציות ואתרים." "פרופיל העבודה שלך מנוהל על ידי %1$s. הפרופיל מחובר לאפליקציה %2$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה למנהל המערכת." "פרופיל העבודה שלך מנוהל על ידי %1$s. הפרופיל מחובר לאפליקציה %2$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nהפרופיל מחובר גם לאפליקציה %3$s, שיכולה לעקוב אחר הפעילות שלך ברשת." + + "המכשיר יישאר נעול עד שתבטל את נעילתו באופן ידני" "קבל התראות מהר יותר" "צפה בהן לפני שתבטל נעילה" @@ -577,15 +569,12 @@ %1$s‏, %2$s ו-%3$d אחרים %1$s‏, %2$s ו-%3$d אחר - - - - - - + "פקדי ההודעות של %1$s נפתחו" + "פקדי ההודעות של %1$s נסגרו" + "התר הודעות מערוץ זה" "כל הקטגוריות" "הגדרות נוספות" - "התאם אישית: %1$s" + "התאמה אישית: %1$s" "סיום" "%1$s %2$s" "בקרת הודעות" @@ -627,7 +616,7 @@ "מקלדת נומרית %1$s" "מערכת" "דף הבית" - "אחרונים" + "מהזמן האחרון" "הקודם" "הודעות" "מקשי קיצור במקלדת" @@ -650,7 +639,7 @@ "אוזניות" "אוזניות מחוברות" "אוזניות מחוברות" - "‏חוסך הנתונים (Data Saver)" + "‏חוסך הנתונים<br>(Data Saver)" "‏חוסך הנתונים (Data Saver) פועל" "‏חוסך הנתונים (Data Saver) כבוי" "פועל" @@ -682,7 +671,7 @@ "קוד מפתח ימני" "סמל שמאלי" "סמל ימני" - "גרור כדי להוסיף משבצות" + "ניתן לגרור כדי להוסיף או להסיר משבצות" "גרור לכאן כדי להסיר" "ערוך" "שעה" @@ -720,6 +709,8 @@ "הודעת %1$s: %2$s" "ייתכן שהיישום לא יפעל עם מסך מפוצל." "האפליקציה אינה תומכת במסך מפוצל." + "ייתכן שהאפליקציה לא תפעל במסך משני." + "האפליקציה אינה תומכת בהפעלה במסכים משניים." "פתיחת הגדרות." "פתיחה של \'הגדרות מהירות\'." "סגירה של \'הגדרות מהירות\'." @@ -738,14 +729,10 @@ "תפריט \'תמונה בתוך תמונה\'" "%s במצב תמונה בתוך תמונה" "אם אינך רוצה שהתכונה הזו תשמש את %s, הקש כדי לפתוח את ההגדרות ולכבות את התכונה." - - - - - - - - + "הפעל" + "השהה" + "דלג אל הבא" + "דלג אל הקודם" "הטלפון כבה עקב התחממות" "הטלפון פועל כרגיל עכשיו" "הטלפון שלך התחמם יותר מדי וכבה כדי להתקרר. הטלפון פועל כרגיל עכשיו.\n\nייתכן שהטלפון יתחמם יותר מדי אם:\n • תשתמש באפליקציות עתירות משאבים (כגון משחקים, אפליקציות וידאו או אפליקציות ניווט)\n • תוריד או תעלה קבצים גדולים\n • תשתמש בטלפון בטמפרטורות גבוהות" @@ -773,8 +760,7 @@ "אפליקציות אינסטנט" "אפליקציות אינסטנט לא דורשות התקנה." "פרטי אפליקציה" - - + "התחבר לאינטרנט" "נתונים סלולריים" "‏Wi-Fi כבוי" "‏Bluetooth כבוי" diff --git a/packages/SystemUI/res/values-iw/strings_car.xml b/packages/SystemUI/res/values-iw/strings_car.xml index 4b7ba97ecfb2f4ba07c96e04a6bf6f4ff5963017..5d5b91dbc36e77aa18a075d7fb63be267cf0802a 100644 --- a/packages/SystemUI/res/values-iw/strings_car.xml +++ b/packages/SystemUI/res/values-iw/strings_car.xml @@ -19,6 +19,5 @@ - "נסיעה בטוחה" - "‏שמור על עירנות לתנאי הנסיעה וציית תמיד לכללים והחוקים. ייתכן שהמסלול לא מדויק, לא שלם, מסוכן, לא מתאים, אסור למעבר או כרוך בחציית אזורים מנהליים. ייתכן גם שחלק מהמידע העסקי לא מדויק או לא שלם. הנתונים אינם מדווחים בזמן אמת ולא ניתן להבטיח דיוק במיקום. אל תתעסק במכשיר הנייד ואל תשתמש באפליקציות שאינן מיועדות ל-Android Auto בזמן הנהיגה." + "לא ידוע" diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 980ad5bec36cf216f5c5f1000346140013b9641f..4917e323c7c23a06c7222a89d80fc241e0fe3bd0 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -157,6 +157,7 @@ "モバイルデータ OFF" "Bluetoothテザリング。" "機内モード。" + "VPN は ON です。" "SIMカードが挿入されていません。" "携帯通信会社のネットワークを変更します。" "電池の詳細情報を開きます" @@ -429,8 +430,7 @@ "仕事用プロファイルは %1$s に接続しています" "個人用プロファイルは %1$s に接続しています" "端末は %1$s に接続しています" - - + "端末管理" "プロファイルの監視" "ネットワーク監視" "VPN" @@ -439,18 +439,14 @@ "VPNを無効にする" "VPNを切断" "ポリシーを見る" - - - - + "この端末は %1$s によって管理されています。\n\n管理者は、この端末に関連付けられた設定、コーポレート アクセス、アプリ、データと、端末の位置情報を監視、管理できます。\n\n詳しくは管理者にお問い合わせください。" + "この端末は組織によって管理されています。\n\n管理者は、この端末に関連付けられた設定、コーポレート アクセス、アプリ、データと、端末の位置情報を監視、管理できます。\n\n詳しくは管理者にお問い合わせください。" "組織によってこの端末に認証局がインストールされました。保護されたネットワーク トラフィックが監視、変更される場合があります。" "組織によって、あなたの仕事用プロファイルに認証局がインストールされました。保護されたネットワーク トラフィックが監視、変更される場合があります。" "この端末には認証局がインストールされています。保護されたネットワーク トラフィックが監視、変更される可能性があります。" "管理者がネットワーク ログを有効にしているため、この端末のトラフィックが監視されています。" - - - - + "%1$s に接続しています。このアプリはあなたのネットワーク アクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。" + "%1$s%2$s に接続しています。これらのアプリは、あなたのネットワーク アクティビティ(メール、アプリ、ウェブサイト)を監視できます。" "この仕事用プロファイルは %1$s に接続しています。このアプリはあなたのネットワーク アクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。" "この個人用プロファイルは %1$s に接続しています。このアプリはあなたのネットワーク アクティビティ(メール、アプリ、ウェブサイト)を監視できます。" "この端末は %1$sで管理されています。" @@ -472,6 +468,8 @@ "「%1$s」に接続しています。このアプリはあなたの個人のネットワーク アクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。" "この仕事用プロファイルは%1$sによって管理され、%2$s に接続しています。このアプリはあなたの仕事のネットワーク アクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n詳しくは管理者にお問い合わせください。" "この仕事用プロファイルは%1$sによって管理され、%2$s に接続しています。このアプリはあなたの仕事のネットワーク アクティビティ(メール、アプリ、ウェブサイトなど)を管理できます。\n\nまた、%3$s にも接続しているため、あなたの個人のネットワーク アクティビティも監視できます。" + + "手動でロックを解除するまでロックされたままとなります" "通知をすばやく確認できます" "ロックを解除する前にご確認ください" @@ -705,6 +703,8 @@ "%1$s の通知: %2$s" "アプリは分割画面では動作しないことがあります。" "アプリで分割画面がサポートされていません。" + "アプリは 2 次画面では動作しないことがあります。" + "アプリは 2 次画面での起動に対応していません" "設定を開きます。" "クイック設定を開きます。" "クイック設定を閉じます。" @@ -754,8 +754,7 @@ "Instant Apps" "Instant Apps はインストールせずに利用できます。" "アプリ情報" - - + "ウェブページを開く" "モバイルデータ" "Wi-Fi は OFF です" "Bluetooth は OFF です" diff --git a/packages/SystemUI/res/values-ja/strings_car.xml b/packages/SystemUI/res/values-ja/strings_car.xml index 667de81b11991b676dba7a9776b1440b1c8d65f8..c40e4309dd96968440468366dcba611ff844fa9c 100644 --- a/packages/SystemUI/res/values-ja/strings_car.xml +++ b/packages/SystemUI/res/values-ja/strings_car.xml @@ -19,6 +19,5 @@ - "安全運転を心がけましょう" - "道路状況に十分気を配り、適用される法律を遵守してください。経路は、不正確、不完全、危険、不適切である場合や、通行が禁止されている、管理区域を通行する必要があるなどの場合があります。ビジネス情報も不正確または不完全である可能性があります。データはリアルタイムではなく、場所の正確性は保証されません。運転中はモバイル端末を手に持って操作したり、Android Auto とは無関係のアプリを使用したりしないでください。" + "不明" diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index d31179f11fa333a851ff9c5aa5330bbd006fb919..b16b51f7c2c0c620a04ed737d317377aac980bcc 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -152,14 +152,12 @@ "Edge" "Wi-Fi" "SIM არ არის." - - - - - - + "მობილური ინტერნეტი" + "მობილური ინტერნეტი ჩართულია" + "მობილური ინტერნეტი გამორთულია" "Bluetooth-ის ჩართვა" "თვითმფრინავის რეჟიმი" + "VPN ჩართულია." "SIM ბარათი არ არის." "ოპერატორის ქსელის შეცვლა" "ბატარეის დეტალების გახსნა" @@ -242,11 +240,9 @@ "იტენება" "2G-3G მონაცემები შეჩერებულია" "4G მონაცემები შეჩერებულია" - - + "მობილური ინტერნეტი დაპაუზებულია" "მონაცემები შეჩერებულია" - - + "მიღწეულია მონაცემთა მოხმარების თქვენ მიერ მითითებული ლიმიტი. ამიტომ, მობილური ინტერნეტის გამოყენება აღარ ხდება.\n\nგანახლების შემთხვევაში, შეიძლება მობილური ინტერნეტის საფასურის გადახდა მოგიწიოთ." "გაგრძელება" "ინტერნეტ კავშირი არ არის" "Wi-Fi დაკავშირებულია" @@ -319,8 +315,7 @@ "წვდომის წერტილი" "შეტყობინებები" "ფანარი" - - + "მობილური ინტერნეტი" "მონაცემთა მოხმარება" "დარჩენილი მონაცემები" "ლიმიტი გადაჭარბებულია" @@ -433,8 +428,7 @@ "სამსახურის პროფილი დაკავშირებულია %1$s-თან" "პირადი პროფილი დაკავშირებულია %1$s-თან" "მოწყობილობა დაკავშირებულია %1$s-თან" - - + "მოწყობილობის მართვა" "პროფილის მონიტორინგი" "ქსელის მონიტორინგი" "VPN" @@ -443,18 +437,14 @@ "VPN-ის გაუქმება" "VPN-ის გათიშვა" "წესების ნახვა" - - - - + "თქვენს მოწყობილობას მართავს %1$s.\n\nთქვენს ადმინისტრატორს შეუძლია მოწყობილობასთან დაკავშირებული პარამეტრების, კორპორაციული წვდომის, აპებისა და მონაცემების (მათ შორის, თქვენი მოწყობილობის მდებარეობის ინფორმაციის) მონიტორინგი და მართვა.\n\nდამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს." + "თქვენს მოწყობილობას მართავს თქვენი ორგანიზაცია.\n\nთქვენს ადმინისტრატორს შეუძლია მოწყობილობასთან დაკავშირებული პარამეტრების, კორპორაციული წვდომის, აპებისა და მონაცემების (მათ შორის, თქვენი მოწყობილობის მდებარეობის ინფორმაციის) მონიტორინგი და მართვა.\n\nდამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს." "თქვენმა ორგანიზაციამ ამ მოწყობილობაზე სერტიფიცირების ორგანო დააინსტალირა. თქვენი ქსელის დაცული ტრაფიკი შეიძლება შეიცვალოს, ან მასზე მონიტორინგი განხორციელდეს." "თქვენმა ორგანიზაციამ სამსახურის პროფილში სერტიფიცირების ორგანო დააინსტალირა. თქვენი ქსელის დაცული ტრაფიკი შეიძლება შეიცვალოს, ან მასზე მონიტორინგი განხორციელდეს." "ამ მოწყობილობაზე დაინსტალირებულია სერტიფიცირების ორგანო. თქვენი ქსელის დაცული ტრაფიკი შეიძლება შეიცვალოს, ან მასზე მონიტორინგი განხორციელდეს." "თქვენმა ადმინისტრატორმა ჩართო ქსელის ჟურნალირება, რომელიც თქვენი მოწყობილობის ტრაფიკის მონიტორინგს ახორციელებს." - - - - + "თქვენ დაკავშირებული ხართ %1$s-თან, რომელსაც შეუძლია თქვენი ქსელის აქტივობის (მათ შორის, ელფოსტის, აპებისა და ვებსაიტების) მონიტორინგი." + "თქვენ დაკავშირებული ხართ %1$s-სა და %2$s-თან, რომელთაც შეუძლია თქვენი ქსელის აქტივობის (მათ შორის, ელფოსტის, აპებისა და ვებსაიტების) მონიტორინგი." "თქვენი სამსახურის პროფილი დაკავშირებულია %1$s-თან, რომელსაც შეუძლია თქვენი ქსელის აქტივობის (მათ შორის, ელფოსტის, აპებისა და ვებსაიტების) მონიტორინგი." "თქვენი პირადი პროფილი დაკავშირებულია %1$s-თან, რომელსაც შეუძლია თქვენი ქსელის აქტივობის (მათ შორის, ელფოსტის, აპებისა და ვებსაიტების) მონიტორინგი." "თქვენს მოწყობილობას მართავს %1$s." @@ -476,6 +466,8 @@ "თქვენ დაუკავშირდით %1$s-ს, რომელსაც თქვენი პირადი ქსელის აქტივობის მონიტორინგი შეუძლია, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების." "თქვენს სამსახურის პროფილს მართავს %1$s. პროფილი დაკავშირებულია %2$s-თან, რომელსაც შეუძლია ქსელში თქვენი სამსახურეობრივი აქტივობის (მათ შორის, ელფოსტის, აპებისა და ვებსაიტების) მონიტორინგი.\n\nდამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს." "თქვენს სამსახურის პროფილს მართავს %1$s. პროფილი დაკავშირებულია %2$s-თან, რომელსაც შეუძლია ქსელში თქვენი სამსახურეობრივი აქტივობის (მათ შორის, ელფოსტის, აპებისა და ვებსაიტების) მონიტორინგი.\n\nგარდა ამისა, თქვენ დაკავშირებული ხართ %3$s-თან, რომელსაც ქსელში თქვენი პირადი აქტივობის მონიტორინგი შეუძლია." + + "მოწყობილობის დარჩება ჩაკეტილი, სანამ ხელით არ გახსნით" "შეტყობინებების უფრო სწრაფად მიღება" "იხილეთ განბლოკვამდე" @@ -569,12 +561,9 @@ %1$s, %2$s და %3$d სხვა %1$s, %2$s და %3$d სხვა - - - - - - + "შეტყობინებების მართვა „%1$s“-ისთვის გახსნილია" + "შეტყობინებების მართვა „%1$s“-ისთვის დახურულია" + "ამ არხიდან შეტყობინებების დაშვება" "ყველა კატეგორია" "დამატებითი პარამეტრები" "მორგება: %1$s" @@ -674,7 +663,7 @@ "მარჯვენა კლავიშის კოდი" "მარცხენა ხატულა" "მარჯვენა ხატულა" - "ფილების დასამატებლად, გადაიტანეთ ჩავლებით" + "ფაილების დასამატებლად, გადაიტანეთ ჩავლებით" "ამოსაშლელად, ჩავლებით გადმოიტანეთ აქ" "რედაქტირება" "დრო" @@ -712,6 +701,8 @@ "%1$s შეტყობინება: %2$s" "აპმა შეიძლება არ იმუშაოს გაყოფილი ეკრანის რეჟიმში." "ეკრანის გაყოფა არ არის მხარდაჭერილი აპის მიერ." + "აპმა შეიძლება არ იმუშაოს მეორეულ ეკრანზე." + "მეორეულ ეკრანზე გაშვება მხარდაუჭერელია აპის მიერ." "პარამეტრების გახსნა." "სწრაფი პარამეტრების გახსნა." "სწრაფი პარამეტრების დახურვა." @@ -730,14 +721,10 @@ "მენიუ „გამოსახულება გამოსახულებაში“" "%s იყენებს რეჟიმს „გამოსახულება გამოსახულებაში“" "თუ არ გსურთ, რომ %s ამ ფუნქციას იყენებდეს, აქ შეხებით შეგიძლიათ გახსნათ პარამეტრები და გამორთოთ." - - - - - - - - + "დაკვრა" + "დაპაუზება" + "შემდეგზე გადასვლა" + "წინაზე გადასვლა" "ტელეფონი გამოირთო გაცხელების გამო" "თქვენი ტელეფონი ახლა ჩვეულებრივად მუშაობს" "თქვენი ტელეფონი გამოირთო გასაგრილებლად, რადგან ის მეტისმეტად გაცხელდა. ახლა ის ჩვეულებრივად მუშაობს.\n\nტელეფონის გაცხელების მიზეზებია:\n • რესურსტევადი აპების გამოყენება (მაგ. სათამაშო, ვიდეო ან ნავიგაციის აპების)\n • დიდი ფაილების ჩამოტვირთვა ან ატვირთვა\n • ტელეფონის გამოყენება მაღალი ტემპერატურისას" @@ -765,8 +752,7 @@ "მყისიერი აპები" "მყისიერი აპები ინსტალაციას არ საჭიროებს." "აპის შესახებ" - - + "ვებზე გადასვლა" "მობილური ინტერნეტი" "Wi-Fi გამორთულია" "Bluetooth გამორთულია" diff --git a/packages/SystemUI/res/values-ka/strings_car.xml b/packages/SystemUI/res/values-ka/strings_car.xml index c8e17dd6f8a9a0172c9431539feab7af0c185124..b5acacd9341027e339ce6c4c0779826e6bf62741 100644 --- a/packages/SystemUI/res/values-ka/strings_car.xml +++ b/packages/SystemUI/res/values-ka/strings_car.xml @@ -19,6 +19,5 @@ - "უსაფრთხოდ მართვის წესები" - "ყოველთვის გულდასმით გაეცანით მდგომარეობას გზებზე და დაიცავით მოქმედი კანონები. შეთავაზებული მიმართულებები შეიძლება იყოს უზუსტო, არასრული, სახიფათო, შეუფერებელი, აკრძალული, ან ადმინისტრაციული ერთეულების გადაკვეთას გულისხმობდეს. ბიზნეს-ინფორმაცია შეიძლება ასევე იყოს უზუსტო ან არასრული. მონაცემების განახლება რეალური დროის რეჟიმში არ ხდება და შესაბამისად, მდებარეობის სიზუსტე გარანტირებული ვერ იქნება. ავტომობილის მართვისას ნუ შეეცდებით თქვენი მობილური მოწყობილობით მანიპულირებას, ან ისეთი აპების გამოყენებას, რომლებიც Android Auto-სთვის შექმნილი არ არის." + "უცნობი" diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 75aa5e3ecb46e8f4ba83a7fcbca23547cebd8fb2..605dec5f39514d872ff7e34451d0b03c6b6b5948 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -157,6 +157,7 @@ "Мобильдік деректер өшірулі" "Bluetooth тетеринг." "Ұшақ режимі." + "VPN қосулы." "SIM картасы жоқ." "Оператор желісі өзгертілуде." "Батарея мәліметтерін ашу" @@ -427,8 +428,7 @@ "Жұмыс профилі %1$s қолданбасына қосылған" "Жеке профиль %1$s қолданбасына қосылған" "Құрылғы %1$s қолданбасына қосылған" - - + "Құрылғыны басқару" "Профильді бақылау" "Желіні бақылау" "VPN (Виртуалды жеке желі)" @@ -437,18 +437,14 @@ "VPN функциясын өшіру" "VPN желісін ажырату" "Саясаттарды көру" - - - - + "Құрылғыңызды %1$s басқарады.\n\nӘкімші параметрлерді, корпоративтік кіру құқығын, қолданбаларды, құрылғыңызбен байланысты деректерді және құрылғыңыздың орналасқан жері туралы ақпаратты бақылай және басқара алады.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз." + "Құрылғыңызды ұйымыңыз басқарады.\n\nӘкімші параметрлерді, корпоративтік кіру құқығын, қолданбаларды, құрылғыңызбен байланысты деректерді және құрылғыңыздың орналасқан жері туралы ақпаратты бақылай және басқара алады.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз." "Ұйымыңыз осы құрылғыда сертификат орнатқан. Қорғалған желі трафигіңіз бақылануы немесе өзгертілуі мүмкін." "Ұйымыңыз жұмыс профиліңізде сертификат орнатқан. Қорғалған желі трафигіңіз бақылануы немесе өзгертілуі мүмкін." "Осы құрылғыда сертификат орнатылған. Қорғалған желі трафигіңіз бақылануы немесе өзгертілуі мүмкін." "Әкімші құрылғыңыздағы трафикті бақылайтын желі журналын жүргізуді қосқан." - - - - + "Желідегі әрекеттеріңізді, соның ішінде электрондық хабарларды, қолданбаларды және вебсайттарды бақылай алатын %1$s желісіне қосылдыңыз." + "Желідегі әрекеттеріңізді, соның ішінде электрондық хабарларды, қолданбаларды және вебсайттарды бақылай алатын %1$s және %2$s желілеріне қосылдыңыз." "Жұмыс профиліңіз желідегі белсенділігіңізді, соның ішінде электрондық хабарларды, қолданбаларды және веб-сайттарды бақылай алатын %1$s қолданбасына қосылған." "Жеке профиліңіз желідегі белсенділігіңізді, соның ішінде электрондық хабарларды, қолданбаларды және веб-сайттарды бақылай алатын %1$s қолданбасына қосылған." "Құрылғыңызды %1$s басқарады." @@ -470,6 +466,8 @@ "Жеке желідегі әрекеттеріңізді, соның ішінде электрондық пошта хабарларын, қолданбаларды және вебсайттарды бақылай алатын %1$s қолданбасына қосылғансыз." "Жұмыс профиліңізді %1$s басқарады. Бұл профиль жұмыс желісіндегі белсенділігіңізді, соның ішінде электрондық хабарларды, қолданбаларды және веб-сайттарды бақылай алатын %2$s қолданбасына қосылған.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз." "Жұмыс профиліңізді %1$s басқарады. Бұл профиль жұмыс желісіндегі белсенділігіңізді, соның ішінде электрондық хабарларды, қолданбаларды және веб-сайттарды бақылай алатын %2$s қолданбасына қосылған.\n\nСондай-ақ сіз жеке желідегі белсенділігіңізді бақылай алатын %3$s қолданбасына қосылғансыз." + + "Қолмен бекітпесін ашқанша құрылғы бекітілген күйде қалады" "Хабарландыруларды тезірек алу" "Бекітпесін ашу алдында оларды көру" @@ -703,6 +701,8 @@ "%1$s хабарландыруы: %2$s" "Қолданба бөлінген экранда жұмыс істемеуі мүмкін." "Қодланба бөлінген экранды қолдамайды." + "Қолданба қосымша дисплейде жұмыс істемеуі мүмкін." + "Қолданба қосымша дисплейлерде іске қосуды қолдамайды." "Параметрлерді ашу." "Жылдам параметрлерді ашу." "Жылдам параметрлерді жабу." @@ -752,8 +752,7 @@ "Instant Apps" "Лездік қолданбаларды орнатудың қажеті жоқ." "Қолданба ақпараты" - - + "Вебке өту" "Мобильдік деректер" "Wi-Fi өшірулі" "Bluetooth өшірулі" diff --git a/packages/SystemUI/res/values-kk/strings_car.xml b/packages/SystemUI/res/values-kk/strings_car.xml index 056b75ca8a9c83a162af4d51eac5472d00428566..c7cddc396f014859f1cba17f52d21e16d1b15613 100644 --- a/packages/SystemUI/res/values-kk/strings_car.xml +++ b/packages/SystemUI/res/values-kk/strings_car.xml @@ -19,6 +19,5 @@ - "Қауіпсіз жүргізу" - "Жүргізу жағдайларын толығымен ұғыныңыз және тиісті заңдарды әрқашан сақтаңыз. Бағыттар дәл емес, толық емес, қауіпті, жарамсыз, тыйым салынған болуы немесе әкімшілік аумақтарды қиып өтуі мүмкін. Іскери ақпарат та дәл емес немесе толық емес болуы мүмкін. Деректер нақты уақыттағы деректер емес және орын дәлдігіне кепілдік берілмейді. Жүргізу кезінде мобильді құрылғыңызды ұстамаңыз немесе Android Auto қолданбасына арналмаған қолданбаларды пайдаланбаңыз." + "Белгісіз" diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index eb351b334f75ea3b9bd265b07c04b5b65bc4d251..95da2baec18ede9db01ef6431d62a7948e9f3220 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -152,14 +152,12 @@ "Edge" "វ៉ាយហ្វាយ" "គ្មាន​ស៊ីម​កាត។" - - - - - - + "ទិន្នន័យ​ទូរសព្ទចល័ត" + "ទិន្នន័យទូរសព្ទចល័តបានបើក" + "ទិន្នន័យទូរសព្ទចល័តបានបិទ" "ការ​ភ្ជាប់​ប៊្លូធូស។" "របៀប​​ពេលជិះ​យន្តហោះ" + "បើក VPN ។" "គ្មានស៊ីមកាតទេ។" "ការប្តូរបណ្តាញក្រុមហ៊ុនផ្តល់សេវា។" "បើកព័ត៌មានលម្អិតអំពីថ្ម" @@ -242,11 +240,9 @@ "កំពុង​សាក​ថ្ម" "ទិន្នន័យ 2G-3G ត្រូវបានផ្អាក" "ទិន្នន័យ 4G ត្រូវបានផ្អាក" - - + "ទិន្នន័យទូរសព្ទចល័តបានផ្អាក" "ទិន្នន័យត្រូវបានផ្អាក" - - + "បានឈានដល់កម្រិតទិន្នន័យដែលអ្នកបានកំណត់ហើយ។ ឥឡូវ​អ្នកមិនប្រើទិន្នន័យទូរសព្ទចល័តទៀតទេ។\n\nអាចនឹងគិតថ្លៃលើការប្រើទិន្នន័យ ប្រសិនបើអ្នកបន្តប្រើឡើងវិញ។" "បន្ត" "គ្មាន​ការ​តភ្ជាប់​អ៊ីនធឺណិត" "បាន​ភ្ជាប់​វ៉ាយហ្វាយ" @@ -319,8 +315,7 @@ "ហតស្ប៉ត" "ការ​ជូនដំណឹង" "ពិល" - - + "ទិន្នន័យ​ទូរសព្ទចល័ត" "ការ​ប្រើ​ទិន្នន័យ" "ទិន្នន័យ​នៅសល់" "លើស​ដែន​កំណត់" @@ -350,16 +345,16 @@ "បាន​បញ្ចូល​ថ្ម​​" - "កំពុង​បញ្ចូល​ថ្ម" + "កំពុងសាក​ថ្ម" "%s រហូត​ដល់ពេញ" "មិន​កំពុង​បញ្ចូល​ថ្ម" "បណ្ដាញ​អាច​\nត្រូវ​បាន​ត្រួតពិនិត្យ​" "ស្វែងរក" "រុញ​ឡើង​លើ​ដើម្បី %s ។" "រុញ​ទៅ​ឆ្វេង​ដើម្បី %s ។" - "អ្នកនឹងមិនរំខានដោយសម្លេង និងរំញ័រឡើយ លើកលែងតែសម្លេងរោទិ៍ ការរំលឹក ព្រឹត្តិការណ៍ និងអ្នកហៅដែលអ្នកបានបញ្ជាក់ប៉ុណ្ណោះ។" + "អ្នកនឹងគ្មានការរំខានដោយសារសំឡេង និងភាពរំញ័រឡើយ លើកលែងតែសំឡេងរោទ៍ ការរំលឹក ព្រឹត្តិការណ៍ និងអ្នកហៅទូរសព្ទដែលអ្នកបានបញ្ជាក់ប៉ុណ្ណោះ។" "ប្ដូរតាមបំណង" - "វារារាំងសំឡេង និងរំញ័រទាំងអស់ ដោយរួមបញ្ចូលទាំងសំឡេងរោទិ៍ តន្ត្រី វីដេអូ និងហ្គេម។ អ្នកនឹងនៅតែអាចធ្វើការហៅទូរស័ព្ទបានដដែល។" + "វារារាំងសំឡេង និងរំញ័រទាំងអស់ ដោយរួមបញ្ចូលទាំងសំឡេងរោទ៍ តន្ត្រី វីដេអូ និងហ្គេម។ អ្នកនឹងនៅតែអាចធ្វើការហៅទូរសព្ទបានដដែល។" "វារារាំងសំឡេង និងរំញ័រទាំងអស់ដែលចេញពីម៉ោងរោទិ៍ តន្ត្រី វីដេអូ និងហ្គេម។" "+%d" "ការ​ជូន​ដំណឹង​​មិន​សូវ​បន្ទាន់​ខាង​ក្រោម" @@ -433,8 +428,7 @@ "កម្រងព័ត៌មាន​ការងារ​ត្រូវបាន​ភ្ជាប់ទៅ %1$s" "កម្រងព័ត៌មាន​ផ្ទាល់ខ្លួន​ត្រូវបាន​ភ្ជាប់​ទៅ %1$s" "ឧបករណ៍​ត្រូវបាន​ភ្ជាប់​ទៅ %1$s" - - + "ការ​គ្រប់គ្រង​ឧបករណ៍" "តាមដានប្រវត្ថិរូប" "ការ​ត្រួតពិនិត្យ​បណ្ដាញ" "VPN" @@ -443,18 +437,14 @@ "បិទ VPN" "ផ្ដាច់ VPN" "មើល​គោលការណ៍" - - - - + "ឧបករណ៍​របស់អ្នក​ស្ថិត​ក្រោម​ការ​គ្រប់គ្រង​របស់ %1$s។\n\nអ្នក​គ្រប់គ្រង​របស់អ្នក​អាចតាមដាន និង​គ្រប់គ្រង​ការកំណត់ ការចូលប្រើជាលក្ខណៈក្រុមហ៊ុន កម្មវិធី ទិន្នន័យ​ដែលពាក់ព័ន្ធ​នឹង​ឧបករណ៍​របស់អ្នក និង​ព័ត៌មាន​ទីតាំង​នៃឧបករណ៍​របស់​អ្នក។\n\nសម្រាប់​ព័ត៌មាន​បន្ថែម សូម​ទាក់ទងអ្នក​គ្រប់គ្រង​របស់​អ្នក។" + "ឧបករណ៍​របស់អ្នក​ស្ថិត​ក្រោម​ការ​គ្រប់គ្រង​របស់ស្ថាប័ន​អ្នក។\n\nអ្នក​គ្រប់គ្រង​របស់អ្នក​អាចតាមដាន និង​គ្រប់គ្រង​ការកំណត់ ការចូលប្រើជាលក្ខណៈក្រុមហ៊ុន កម្មវិធី ទិន្នន័យ​ដែលពាក់ព័ន្ធ​នឹង​ឧបករណ៍​របស់អ្នក និង​ព័ត៌មាន​ទីតាំង​នៃឧបករណ៍​របស់​អ្នក។\n\nសម្រាប់​ព័ត៌មាន​បន្ថែម សូម​ទាក់ទង​អ្នក​គ្រប់គ្រង​របស់​អ្នក។" "ស្ថាប័ន​របស់អ្នក​បានដំឡើង​អាជ្ញាធរវិញ្ញាបនបត្រនៅលើ​ឧបករណ៍​នេះ។ ចរាចរណ៍​បណ្តាញដែលមាន​សុវត្ថិភាព​របស់អ្នក​អាច​ត្រូវបាន​តាមដាន ឬ​កែសម្រួល។" "ស្ថាប័នរបស់អ្នក​បានដំឡើង​អាជ្ញាធរវិញ្ញាបនបត្រ​នៅក្នុង​កម្រងព័ត៌មាន​ការងារ។ ចរាចរណ៍​បណ្តាញដែលមាន​សុវត្ថិភាព​របស់អ្នក​អាច​ត្រូវបាន​តាមដាន ឬ​កែសម្រួល។" "បាន​ដំឡើង​អាជ្ញាធរវិញ្ញាបនបត្រ​នៅលើ​ឧបករណ៍​នេះ។ ចរាចរណ៍​បណ្តាញដែលមានសុវត្ថិភាព​របស់អ្នក​អាច​ត្រូវបាន​តាមដាន ឬ​កែសម្រួល។" "អ្នក​គ្រប់គ្រង​របស់អ្នក​បាន​បើក​ការ​ធ្វើ​កំណត់ហេតុ​បណ្តាញ​ ដែល​នឹង​តាមដាន​ចរាចរណ៍​នៅលើ​ឧបករណ៍​របស់អ្នក។" - - - - + "អ្នកបានភ្ជាប់ទៅ %1$s ដែលអាចតាមដានសកម្មភាពក្នុងបណ្តាញរបស់អ្នក រួមទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រផងដែរ។" + "អ្នកបាន​ភ្ជាប់ទៅ %1$s និង %2$s ដែលអាច​តាមដាន​សកម្មភាព​បណ្តាញ​របស់អ្នក រួមទាំង​អ៊ីមែល កម្មវិធី និង​គេហទំព័រ​ផងដែរ។" "កម្រងព័ត៌មាន​ការងារ​របស់អ្នក​ត្រូវបាន​ភ្ជាប់​ទៅ %1$s ដែលអាច​តាមដាន​សកម្មភាព​បណ្តាញ​របស់អ្នក រួមទាំងអ៊ីមែល កម្មវិធី និង​គេហទំព័រ​ផងដែរ។" "កម្រងព័ត៌មាន​ផ្ទាល់ខ្លួន​របស់អ្នក​ត្រូវបាន​ភ្ជាប់​ទៅ %1$s ដែល​អាច​តាមដាន​សកម្មភាព​បណ្តាញ​របស់អ្នក រួមទាំង​អ៊ីមែល កម្មវិធី និង​គេហទំព័រ​ផងដែរ។" "ឧបករណ៍របស់អ្នកគ្រប់គ្រងដោយ %1$s ។" @@ -476,6 +466,8 @@ "អ្នកត្រូវបានភ្ជាប់ទៅ %1$s ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។" "កម្រង​ព័ត៌មាន​ការងារ​របស់អ្នក​ស្ថិត​ក្រោម​ការ​គ្រប់គ្រង​របស់ %1$s ។ កម្រងព័ត៌មាន​នេះត្រូវ​បាន​ភ្ជាប់ទៅ %2$s ដែលអាច​តាមដាន​សកម្មភាព​បណ្តាញ​របស់អ្នក រួមទាំង​អ៊ីមែល កម្មវិធី និង​គេហទំព័រ​ផងដែរ។\n\nសម្រាប់​ព័ត៌មាន​បន្ថែម សូម​ទាក់ទង​ទៅអ្នក​គ្រប់គ្រង​របស់​អ្នក។" "កម្រងព័ត៌មាន​ការងារ​របស់អ្នក​ស្ថិតក្រោម​គ្រប់គ្រង​របស់ %1$s ។ កម្រង​ព័ត៌មាននេះ​ត្រូវបាន​ភ្ជាប់​ទៅ %2$s ដែលអាច​តាមដាន​សកម្មភាព​បណ្តាញ​របស់អ្នក រួមទាំង​អ៊ីមែល កម្មវិធី និង​គេហទំព័រ​ផងដែរ។\n\nអ្នកក៏ត្រូវបាន​ភ្ជាប់​ទៅ %3$s ដែលអាច​តាមដាន​សកម្មភាព​បណ្តាញ​ផ្ទាល់ខ្លួន​របស់​អ្នក។" + + "ឧបករណ៍​នឹង​ចាក់​សោ​រហូត​ដល់​អ្នក​ដោះ​សោ​ដោយ​ដៃ" "ទទួល​បាន​ការ​ជូន​ដំណឹង​កាន់តែ​លឿន" "ឃើញ​ពួកវា​មុន​ពេល​ដោះ​សោ" @@ -569,12 +561,9 @@ %1$s, %2$s, និង %3$d ផ្សេងទៀត %1$s, %2$s, និង %3$d ផ្សេងទៀត - - - - - - + "ការគ្រប់គ្រងការជូនដំណឹងសម្រាប់ %1$s បានបើក" + "ការគ្រប់គ្រងការជូនដំណឹងសម្រាប់ %1$s បានបិទ" + "អនុញ្ញាតឲ្យមានការជូនដំណឹងពីប៉ុស្តិ៍នេះ" "ប្រភេទ​ទាំងអស់" "ការកំណត់ច្រើនទៀត" "ប្ដូរ​តាម​បំណង៖ %1$s" @@ -712,6 +701,8 @@ "%1$s ការជូនដំណឹង៖ %2$s" "កម្មវិធីអាចនឹងមិនដំណើរការនៅលើអេក្រង់បំបែកទេ" "កម្មវិធីមិនគាំទ្រអេក្រង់បំបែកជាពីរទេ" + "កម្មវិធីនេះ​ប្រហែល​ជាមិនដំណើរការ​នៅលើ​អេក្រង់បន្ទាប់បន្សំទេ។" + "កម្មវិធី​នេះមិន​អាច​ចាប់ផ្តើម​បានទេ ដោយសារ​អេក្រង់បន្ទាប់បន្សំមិនស្គាល់វា។" "បើកការកំណត់" "បើកការកំណត់រហ័ស" "បិទការកំណត់រហ័ស" @@ -730,14 +721,10 @@ "ម៉ឺនុយ​រូបភាព​ក្នុងរូបភាព" "%s ស្ថិតក្នុងមុខងាររូបភាពក្នុងរូបភាព" "ប្រសិនបើ​អ្នក​មិន​ចង់​ឲ្យ %s ប្រើ​មុខងារ​នេះ​ទេ សូមចុច​ដើម្បី​បើក​ការកំណត់ រួច​បិទ​វា។" - - - - - - - - + "លេង" + "ផ្អាក" + "រំលងទៅបន្ទាប់" + "រំលងទៅក្រោយ" "ទូរសព្ទ​បាន​បិទដោយសារ​វា​ឡើងកម្តៅ" "ឥឡូវនេះ​ទូរសព្ទ​របស់អ្នក​កំពុង​ដំណើរការ​ធម្មតា" "ទូរសព្ទ​របស់អ្នក​ក្តៅពេក ដូច្នេះ​វាបាន​បិទ​ដើម្បី​បន្ថយ​កម្តៅ។ ឥឡូវនេះ ​ទូរសព្ទ​របស់អ្នក​កំពុង​ដំណើរការ​ធម្មតា។\n\nទូរសព្ទ​របស់អ្នក​អាចនឹង​ឡើង​កម្តៅ​ខ្លាំងជ្រុល ប្រសិន​បើអ្នក៖\n • ប្រើប្រាស់​កម្មវិធី​ដែល​ប្រើប្រាស់ទិន្នន័យច្រើនក្នុងរយៈពេលខ្លី (ដូចជាហ្គេម វីដេអូ ឬកម្មវិធីរុករក)\n • ទាញយក ឬ​បង្ហោះ​ឯកសារដែលមានទំហំធំ\n • ប្រើប្រាស់​ទូរសព្ទ​របស់អ្នក​នៅកន្លែង​មានសីតុណ្ហភាព​ខ្ពស់" @@ -765,8 +752,7 @@ "កម្មវិធី​ប្រើ​ភ្លាមៗ" "កម្មវិធី​ប្រើ​ភ្លាមៗ​មិន​តម្រូវ​ឲ្យ​មានការ​ដំឡើង​ទេ។" "ព័ត៌មាន​កម្មវិធី" - - + "ចូលទៅកាន់បណ្តាញ" "ទិន្នន័យ​ចល័ត" "Wi-Fi បាន​បិទ" "ប៊្លូធូស​បាន​បិទ" diff --git a/packages/SystemUI/res/values-km/strings_car.xml b/packages/SystemUI/res/values-km/strings_car.xml index 9648a5fb1efadcf2b30105720d71cec90f02eb25..4aec62adcab91d64e5b8adb203f364a6b8e54d40 100644 --- a/packages/SystemUI/res/values-km/strings_car.xml +++ b/packages/SystemUI/res/values-km/strings_car.xml @@ -19,6 +19,5 @@ - "បើកបរដោយសុវត្ថិភាព" - "ត្រូវមានការគ្រប់គ្រងពេញលេញលើស្ថានភាពបើកបរ និងគោរពច្បាប់ដែលត្រូវអនុវត្តជានិច្ច។ ទិសដៅអាចនឹងមិនមានភាពសុក្រិត មិនពេញលេញ គ្រោះថ្នាក់ មិនសមស្រប ឬពាក់ព័ន្ធនឹងការឆ្លងកាត់តំបន់រដ្ឋបាល។ ព័ត៌មានផ្នែកអាជីវកម្មក៏អាចនឹងមិនមានភាពសុក្រិត ឬមិនពេញលេញផងដែរ។ ទិន្នន័យគឺមិនមែនបញ្ជូនបន្តផ្ទាល់នោះទេ ហើយភាពសុក្រិតនៃទីតាំងក៏មិនអាចធានាបានផងដែរ។ កុំកាន់ឧបករណ៍ចល័តរបស់អ្នក ឬប្រើកម្មវិធីដែលមិនមែនសម្រាប់ Android Auto ខណៈពេលកំពុងបើកបរ។" + "មិន​ស្គាល់" diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index f17b3af216e43e81696bca734886ddaf3dfbeede..8ab772cba42f5c3cf3c36e219df91dd4a5c27e8c 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -24,7 +24,7 @@ "ಪಟ್ಟಿಯಿಂದ ತೆಗೆದುಹಾಕು" "ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ" "ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಪರದೆಗಳು ಇಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ" - "ಇತ್ತೀಚಿನ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ವಜಾಗೊಳಿಸು" + "ಇತ್ತೀಚಿನ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ವಜಾಗೊಳಿಸಿ" ಸಮಗ್ರ ನೋಟದಲ್ಲಿರುವ %d ಪರದೆಗಳು ಸಮಗ್ರ ನೋಟದಲ್ಲಿರುವ %d ಪರದೆಗಳು @@ -40,7 +40,7 @@ "ಒದಗಿಸಿರುವ ಚಾರ್ಜರ್ ಮಾತ್ರ ಬಳಸಿ." "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ಬ್ಯಾಟರಿ ಉಳಿತಾಯವನ್ನು ಆನ್ ಮಾಡುವುದೇ?" - "ಆನ್ ಮಾಡು" + "ಆನ್‌ ಮಾಡಿ" "ಬ್ಯಾಟರಿ ಉಳಿತಾಯವನ್ನು ಆನ್ ಮಾಡಿ" "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ವೈ-ಫೈ" @@ -152,14 +152,12 @@ "ಎಡ್ಜ್‌" "ವೈ-ಫೈ" "ಯಾವುದೇ ಸಿಮ್‌ ಇಲ್ಲ." - - - - - - + "ಮೊಬೈಲ್ ಡೇಟಾ" + "ಮೊಬೈಲ್ ಡೇಟಾ ಆನ್" + "ಮೊಬೈಲ್ ಡೇಟಾ ಆಫ್" "ಬ್ಲೂಟೂತ್‌‌ ಟೆಥರಿಂಗ್." "ಏರೋಪ್ಲೇನ್‌ ಮೋಡ್‌" + "ನಲ್ಲಿ VPN" "ಯಾವುದೇ ಸಿಮ್‌ ಇಲ್ಲ." "ವಾಹಕ ನೆಟ್‌ವರ್ಕ್ ಬದಲಾಯಿಸುವಿಕೆ." "ಬ್ಯಾಟರಿ ವಿವರಗಳನ್ನು ತೆರೆಯಿರಿ" @@ -177,7 +175,7 @@ "ಕೆಲಸದ ಮೋಡ್" - "%s ವಜಾಗೊಳಿಸು." + "%s ವಜಾಗೊಳಿಸಿ." "%s ವಜಾಗೊಳಿಸಲಾಗಿದೆ." "ಇತ್ತೀಚಿನ ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ವಜಾಗೊಳಿಸಲಾಗಿದೆ." "%s ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ ತೆರೆಯಿರಿ." @@ -242,17 +240,15 @@ "ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ" "2G-3G ಡೇಟಾವನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ" "4G ಡೇಟಾ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ" - - + "ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ" "ಡೇಟಾ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ" - - + "ಡೇಟಾ ಬಳಕೆಯು ನೀವು ಹೊಂದಿಸಿರುವ ಮಿತಿಯನ್ನು ತಲುಪಿದೆ. ಹೀಗಾಗಿ ನೀವು ಈಗ ಮೊಬೈಲ್ ಡೇಟಾ ಬಳಸುತ್ತಿಲ್ಲ.\n\nನೀವು ಮುಂದುವರಿದರೆ, ಡೇಟಾ ಬಳಕೆಗೆ ಶುಲ್ಕ ತೆರಬೇಕಾಗಬಹುದು." "ಮುಂದುವರಿಸು" "ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವಿಲ್ಲ" "ವೈ-ಫೈ ಸಂಪರ್ಕಗೊಂಡಿದೆ" "GPS ಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ" "ಸ್ಥಾನವನ್ನು GPS ಮೂಲಕ ಹೊಂದಿಸಲಾಗಿದೆ" - "ಸ್ಥಾನ ವಿನಂತಿಗಳು ಸಕ್ರಿಯವಾಗಿವೆ" + "ಸ್ಥಳ ವಿನಂತಿಗಳು ಸಕ್ರಿಯವಾಗಿವೆ" "ಎಲ್ಲಾ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೆರವುಗೊಳಿಸು." "+ %s" @@ -286,8 +282,8 @@ "ಪೋಟ್ರೇಟ್" "ಲ್ಯಾಂಡ್‌ಸ್ಕೇಪ್" "ಇನ್‌ಪುಟ್ ವಿಧಾನ" - "ಸ್ಥಾನ" - "ಸ್ಥಾನ ಆಫ್ ಆಗಿದೆ" + "ಸ್ಥಳ" + "ಸ್ಥಳ ಆಫ್ ಆಗಿದೆ" "ಮಾಧ್ಯಮ ಸಾಧನ" "RSSI" "ತುರ್ತು ಕರೆಗಳು ಮಾತ್ರ" @@ -319,8 +315,7 @@ "ಹಾಟ್‌ಸ್ಪಾಟ್" "ಅಧಿಸೂಚನೆಗಳು" "ಫ್ಲಾಶ್‌ಲೈಟ್‌" - - + "ಮೊಬೈಲ್ ಡೇಟಾ" "ಡೇಟಾ ಬಳಕೆ" "ಉಳಿದಿರುವ ಡೇಟಾ" "ಮಿತಿ ಮೀರಿದೆ" @@ -359,8 +354,8 @@ "%s ಗಾಗಿ ಎಡಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ." "ಅಲಾರಮ್‌ಗಳು, ಜ್ಞಾಪನೆಗಳು, ಈವೆಂಟ್‌ಗಳು ಮತ್ತು ನೀವು ಸೂಚಿಸುವ ಕರೆದಾರರನ್ನು ಹೊರತುಪಡಿಸಿ, ಧ್ವನಿಗಳು ಮತ್ತು ವೈಬ್ರೇಶನ್‌ಗಳಿಂದ ನಿಮಗೆ ತೊಂದರೆ ಆಗುವುದಿಲ್ಲ." "ಕಸ್ಟಮೈಸ್ ಮಾಡು" - "ಇದು ಅಲಾರಮ್‌ಗಳು, ಸಂಗೀತ, ವೀಡಿಯೊಗಳು, ಮತ್ತು ಆಟಗಳು ಸೇರಿದಂತೆ ಎಲ್ಲಾ ಧ್ವನಿಗಳು ಮತ್ತು ವೈಬ್ರೇಶನ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ. ನಿಮಗೆ ಈಗಲೂ ಫೋನ್ ಕರೆಗಳನ್ನು ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ." - "ಇದು ಅಲಾರಮ್‌ಗಳು, ಸಂಗೀತ, ವೀಡಿಯೊಗಳು, ಮತ್ತು ಆಟಗಳು ಸೇರಿದಂತೆ ಎಲ್ಲಾ ಧ್ವನಿಗಳು ಮತ್ತು ವೈಬ್ರೇಶನ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ." + "ಇದು ಅಲಾರಮ್‌ಗಳು, ಸಂಗೀತ, ವೀಡಿಯೊಗಳು, ಮತ್ತು ಗೇಮ್‌ಗಳು ಸೇರಿದಂತೆ ಎಲ್ಲಾ ಧ್ವನಿಗಳು ಮತ್ತು ವೈಬ್ರೇಶನ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ. ನಿಮಗೆ ಈಗಲೂ ಫೋನ್ ಕರೆಗಳನ್ನು ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ." + "ಇದು ಅಲಾರಮ್‌ಗಳು, ಸಂಗೀತ, ವೀಡಿಯೊಗಳು, ಮತ್ತು ಗೇಮ್‌ಗಳು ಸೇರಿದಂತೆ ಎಲ್ಲಾ ಧ್ವನಿಗಳು ಮತ್ತು ವೈಬ್ರೇಶನ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ." "+%d" "ಕೆಳಗೆ ಕಡಿಮೆ ಅವಸರದ ಅಧಿಸೂಚನೆಗಳು" "ತೆರೆಯಲು ಮತ್ತೆ ಟ್ಯಾಪ್‌ ಮಾಡಿ" @@ -433,8 +428,7 @@ "ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ ಅನ್ನು %1$s ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ" "ವೈಯಕ್ತಿಕ ಪ್ರೊಫೈಲ್ ಅನ್ನು %1$s ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ" "%1$s ಗೆ ಸಾಧನವನ್ನು ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ" - - + "ಸಾಧನ ನಿರ್ವಹಣೆ" "ಪ್ರೊಫೈಲ್ ಮೇಲ್ವಿಚಾರಣೆ" "ನೆಟ್‌ವರ್ಕ್‌ ಪರಿವೀಕ್ಷಣೆ" "VPN" @@ -443,18 +437,14 @@ "VPN ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ" "VPN ಸಂಪರ್ಕಕಡಿತಗೊಳಿಸಿ" "ಕಾರ್ಯನೀತಿಗಳನ್ನು ವೀಕ್ಷಿಸಿ" - - - - + "ನಿಮ್ಮ ಸಾಧನವನ್ನು %1$s ನಿರ್ವಹಿಸುತ್ತಿದೆ.\n\nಸೆಟ್ಟಿಂಗ್‌ಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾ ಮತ್ತು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ." + "ನಿಮ್ಮ ಸಾಧನವನ್ನು ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ನಿರ್ವಹಿಸುತ್ತಿದೆ.\n\nಸೆಟ್ಟಿಂಗ್‌ಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾ, ಮತ್ತು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ." "ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ಈ ಸಾಧನದಲ್ಲಿ ಪ್ರಮಾಣಪತ್ರ ಅಂಗೀಕಾರವನ್ನು ಸ್ಥಾಪಿಸಿದೆ. ನಿಮ್ಮ ಸುರಕ್ಷಿತ ನೆಟ್‌ವರ್ಕ್ ಟ್ರಾಫಿಕ್ ಅನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಅಥವಾ ಮಾರ್ಪಡಿಸಬಹುದು." "ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿ ಪ್ರಮಾಣಪತ್ರ ಅಂಗೀಕಾರವನ್ನು ಸ್ಥಾಪಿಸಿದೆ. ನಿಮ್ಮ ಸುರಕ್ಷಿತ ನೆಟ್‌ವರ್ಕ್ ಟ್ರಾಫಿಕ್ ಅನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಅಥವಾ ಮಾರ್ಪಡಿಸಬಹುದು." "ಈ ಸಾಧನದಲ್ಲಿ ಪ್ರಮಾಣಪತ್ರ ಅಂಗೀಕಾರವನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿದೆ. ನಿಮ್ಮ ಸುರಕ್ಷಿತ ನೆಟ್‌ವರ್ಕ್ ಟ್ರಾಫಿಕ್ ಅನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಅಥವಾ ಮಾರ್ಪಡಿಸಬಹುದು." "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನೆಟ್‌ವರ್ಕ್ ಲಾಗಿಂಗ್ ಆನ್ ಮಾಡಿದ್ದಾರೆ. ಇದು ನಿಮ್ಮ ಸಾಧನದ ಟ್ರಾಫಿಕ್ ಅನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುತ್ತದೆ." - - - - + "ನೀವು %1$s ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದ್ದೀರಿ. ಇದು ನಿಮ್ಮ ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳೂ ಸೇರಿದಂತೆ ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು." + "ನೀವು %1$s ಹಾಗೂ %2$s ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದ್ದೀರಿ. ಇವು ನಿಮ್ಮ ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳೂ ಸೇರಿದಂತೆ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು." "ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ %1$s ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ. ಇದು ನಿಮ್ಮ ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳೂ ಸೇರಿದಂತೆ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು." "ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಪ್ರೊಫೈಲ್ %1$s ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ. ಇದು ನಿಮ್ಮ ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳೂ ಸೇರಿದಂತೆ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು." "ನಿಮ್ಮ ಸಾಧನವನ್ನು %1$s ನಿಂದ ನಿರ್ವಹಿಸಲಾಗಿದೆ." @@ -476,6 +466,8 @@ "ನೀವು ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ %1$s ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ." "ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ ಅನ್ನು %1$s ನಿರ್ವಹಿಸುತ್ತಿದೆ. %2$s ಗೆ ಪ್ರೊಫೈಲ್ ಸಂಪರ್ಕಗೊಂಡಿರುವ ಕಾರಣ, ಅದು ನಿಮ್ಮ ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಹಾಗೂ ವೆಬ್‌ಸೈಟ್‌ಗಳೂ ಸೇರಿದಂತೆ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ." "ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ ಅನ್ನು %1$s ನಿರ್ವಹಿಸುತ್ತಿದೆ. %2$s ಗೆ ಪ್ರೊಫೈಲ್ ಸಂಪರ್ಕಗೊಂಡಿರುವ ಕಾರಣ, ಅದು ನಿಮ್ಮ ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳೂ ಸೇರಿದಂತೆ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು.\n\nನೀವು %3$s ಗೆ ಕೂಡಾ ಸಂಪರ್ಕಗೊಂಡಿದ್ದೀರಿ, ಇದು ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು." + + "ನೀವಾಗಿಯೇ ಅನ್‌ಲಾಕ್‌ ಮಾಡುವವರೆಗೆ ಸಾಧನವು ಲಾಕ್‌ ಆಗಿಯೇ ಇರುತ್ತದೆ" "ವೇಗವಾಗಿ ಅಧಿಸೂಚನೆಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಿ" "ನೀವು ಅನ್‌ಲಾಕ್‌ ಮಾಡುವ ಮೊದಲೇ ಅವುಗಳನ್ನು ನೋಡಿ" @@ -495,7 +487,7 @@ "ಮರೆಮಾಡಿ" "ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ ಅನ್ನು ನೀವು ಬಳಸುತ್ತಿರುವಿರಿ" "ಕರೆಮಾಡಿ" - "ಸಿಸ್ಟಮ್" + "ಸಿಸ್ಟಂ" "ರಿಂಗ್" "ಮಾಧ್ಯಮ" "ಅಲಾರಮ್" @@ -510,7 +502,7 @@ "%1$s. ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ." "%s ವಾಲ್ಯೂಮ್ ನಿಯಂತ್ರಣಗಳನ್ನು ತೋರಿಸಲಾಗಿದೆ. ವಜಾಗೊಳಿಸಲು ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ" "ವಾಲ್ಯೂಮ್ ನಿಯಂತ್ರಣಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ" - "ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್" + "ಸಿಸ್ಟಂ UI ಟ್ಯೂನರ್" "ಎಂಬೆಡ್ ಮಾಡಲಾದ ಬ್ಯಾಟರಿ ಶೇಕಡಾ ತೋರಿಸಿ" "ಚಾರ್ಜ್ ಮಾಡದಿರುವಾಗ ಸ್ಥಿತಿ ಪಟ್ಟಿ ಐಕಾನ್ ಒಳಗೆ ಬ್ಯಾಟರಿ ಮಟ್ಟದ ಶೇಕಡಾವನ್ನು ತೋರಿಸಿ" "ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್‍ಗಳು" @@ -533,12 +525,12 @@ "ಹಾಟ್‌ಸ್ಪಾಟ್" "ಕೆಲಸದ ಪ್ರೊಫೈಲ್" "ಕೆಲವರಿಗೆ ಮೋಜು ಆಗಿದೆ ಎಲ್ಲರಿಗೆ ಇಲ್ಲ" - "ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್ ನಿಮಗೆ Android ಬಳಕೆದಾರ ಅಂತರಸಂಪರ್ಕವನ್ನು ಸರಿಪಡಿಸಲು ಮತ್ತು ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ಹೆಚ್ಚುವರಿ ಮಾರ್ಗಗಳನ್ನು ನೀಡುತ್ತದೆ. ಈ ಪ್ರಾಯೋಗಿಕ ವೈಶಿಷ್ಟ್ಯಗಳು ಭವಿಷ್ಯದ ಬಿಡುಗಡೆಗಳಲ್ಲಿ ಬದಲಾಗಬಹುದು, ವಿರಾಮವಾಗಬಹುದು ಅಥವಾ ಕಾಣಿಸಿಕೊಳ್ಳದಿರಬಹುದು. ಎಚ್ಚರಿಕೆಯಿಂದ ಮುಂದುವರಿಯಿರಿ." + "ಸಿಸ್ಟಂ UI ಟ್ಯೂನರ್ ನಿಮಗೆ Android ಬಳಕೆದಾರ ಅಂತರಸಂಪರ್ಕವನ್ನು ಸರಿಪಡಿಸಲು ಮತ್ತು ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ಹೆಚ್ಚುವರಿ ಮಾರ್ಗಗಳನ್ನು ನೀಡುತ್ತದೆ. ಈ ಪ್ರಾಯೋಗಿಕ ವೈಶಿಷ್ಟ್ಯಗಳು ಭವಿಷ್ಯದ ಬಿಡುಗಡೆಗಳಲ್ಲಿ ಬದಲಾಗಬಹುದು, ವಿರಾಮವಾಗಬಹುದು ಅಥವಾ ಕಾಣಿಸಿಕೊಳ್ಳದಿರಬಹುದು. ಎಚ್ಚರಿಕೆಯಿಂದ ಮುಂದುವರಿಯಿರಿ." "ಈ ಪ್ರಾಯೋಗಿಕ ವೈಶಿಷ್ಟ್ಯಗಳು ಭವಿಷ್ಯದ ಬಿಡುಗಡೆಗಳಲ್ಲಿ ಬದಲಾಗಬಹುದು, ವಿರಾಮವಾಗಬಹುದು ಅಥವಾ ಕಾಣಿಸಿಕೊಳ್ಳದಿರಬಹುದು. ಎಚ್ಚರಿಕೆಯಿಂದ ಮುಂದುವರಿಯಿರಿ." "ಅರ್ಥವಾಯಿತು" - "ಅಭಿನಂದನೆಗಳು! ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್ ಅನ್ನು ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಸೇರಿಸಲಾಗಿದೆ" + "ಅಭಿನಂದನೆಗಳು! ಸಿಸ್ಟಂ UI ಟ್ಯೂನರ್ ಅನ್ನು ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಸೇರಿಸಲಾಗಿದೆ" "ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಂದ ತೆಗೆದುಹಾಕಿ" - "ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಂದ ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್ ತೆಗೆದುಹಾಕುವುದೇ ಮತ್ತು ಅದರ ಎಲ್ಲಾ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಬಳಸುವುದನ್ನು ನಿಲ್ಲಿಸುವುದೇ?" + "ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಂದ ಸಿಸ್ಟಂ UI ಟ್ಯೂನರ್ ತೆಗೆದುಹಾಕುವುದೇ ಮತ್ತು ಅದರ ಎಲ್ಲಾ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಬಳಸುವುದನ್ನು ನಿಲ್ಲಿಸುವುದೇ?" "ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿಲ್ಲ" "ಗಡಿಯಾರದ ಸೆಕೆಂಡುಗಳನ್ನು ತೋರಿಸು" "ಸ್ಥಿತಿ ಪಟ್ಟಿಯಲ್ಲಿ ಗಡಿಯಾರ ಸೆಕೆಂಡುಗಳನ್ನು ತೋರಿಸು. ಇದಕ್ಕೆ ಬ್ಯಾಟರಿ ಬಾಳಿಕೆಯು ಪರಿಣಾಮಬೀರಬಹುದು." @@ -547,7 +539,7 @@ "ಪ್ರಾಯೋಗಿಕ" "ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡುವುದೇ?" "ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ ಅನ್ನು ಟ್ಯಾಬ್ಲೆಟ್‌ಗೆ ಸಂಪರ್ಕಿಸಲು, ನೀವು ಮೊದಲು ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ." - "ಆನ್ ಮಾಡು" + "ಆನ್‌ ಮಾಡಿ" "ಸ್ಥಬ್ಧವಾಗಿ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸಿ" "ಎಲ್ಲಾ ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ" "ಮೌನವಾಗಿಸಬೇಡಿ" @@ -569,12 +561,9 @@ %1$s, %2$s, ಮತ್ತು ಇತರ %3$d %1$s, %2$s, ಮತ್ತು ಇತರ %3$d - - - - - - + "%1$s ನ ಅಧಿಸೂಚನೆ ನಿಯಂತ್ರಣಗಳನ್ನು ತೆರೆಯಲಾಗಿದೆ" + "%1$s ನ ಅಧಿಸೂಚನೆ ನಿಯಂತ್ರಣಗಳನ್ನು ಮುಚ್ಚಲಾಗಿದೆ" + "ಈ ಚಾನಲ್‌ನ ಅಧಿಸೂಚನೆಗಳಿಗೆ ಅನುಮತಿ ನೀಡಿ" "ಎಲ್ಲ ವರ್ಗಗಳು" "ಹೆಚ್ಚಿನ ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ಕಸ್ಟಮೈಸ್: %1$s" @@ -700,9 +689,9 @@ "50% ಮೇಲಕ್ಕೆ" "30% ಮೇಲಕ್ಕೆ" "ಕೆಳಗಿನ ಪೂರ್ಣ ಪರದೆ" - "ಸ್ಥಾನ %1$d, %2$s. ಎಡಿಟ್ ಮಾಡಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ." + "ಸ್ಥಳ %1$d, %2$s. ಎಡಿಟ್ ಮಾಡಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ." "%1$s. ಸೇರಿಸಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ." - "ಸ್ಥಾನ %1$d. ಆಯ್ಕೆಮಾಡಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ." + "ಸ್ಥಳ %1$d. ಆಯ್ಕೆಮಾಡಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ." "%1$s ಸರಿಸಿ" "%1$s ತೆಗೆದುಹಾಕಿ" "%2$d ಸ್ಥಾನಕ್ಕೆ %1$s ಸೇರಿಸಲಾಗಿದೆ" @@ -712,6 +701,8 @@ "%1$s ಅಧಿಸೂಚನೆ: %2$s" "ವಿಭಜಿಸಿದ ಪರದೆಯಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ಕೆಲಸ ಮಾಡದೇ ಇರಬಹುದು." "ಅಪ್ಲಿಕೇಶನ್ ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ." + "ಎರಡನೇ ಡಿಸ್‌ಪ್ಲೇಗಳಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್‌ ಕೆಲಸ ಮಾಡದೇ ಇರಬಹುದು." + "ಎರಡನೇ ಡಿಸ್‌ಪ್ಲೇಗಳಲ್ಲಿ ಪ್ರಾರಂಭಿಸುವಿಕೆಯನ್ನು ಅಪ್ಲಿಕೇಶನ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ." "ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ." "ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ." "ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಮುಚ್ಚಿ." @@ -730,14 +721,10 @@ "ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ ಮೆನು" "%s ಚಿತ್ರದಲ್ಲಿನ ಚಿತ್ರದಲ್ಲಿದೆ" "%s ಈ ವೈಶಿಷ್ಟ್ಯ ಬಳಸುವುದನ್ನು ನೀವು ಬಯಸದಿದ್ದರೆ, ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆದು, ಅದನ್ನು ಆಫ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ." - - - - - - - - + "ಪ್ಲೇ" + "ವಿರಾಮಗೊಳಿಸಿ" + "ಮುಂದಕ್ಕೆ ಸ್ಕಿಪ್‌ ಮಾಡಿ" + "ಹಿಂದಕ್ಕೆ ಸ್ಕಿಪ್‌ ಮಾಡಿ" "ಫೋನ್ ಬಿಸಿಯಾಗಿದ್ದರಿಂದ ಆಫ್ ಆಗಿದೆ" "ಈಗ ನಿಮ್ಮ ಫೋನ್ ಎಂದಿನಂತೆ ಕೆಲಸ ಮಾಡುತ್ತಿದೆ" "ನಿಮ್ಮ ಫೋನ್ ತುಂಬಾ ಬಿಸಿಯಾಗಿತ್ತು, ತಣ್ಣಗಾಗಲು ಅದು ತಾನಾಗಿ ಆಫ್ ಆಗಿದೆ. ಈಗ ನಿಮ್ಮ ಫೋನ್ ಎಂದಿನಂತೆ ಕೆಲಸ ಮಾಡುತ್ತಿದೆ.\n\nನಿಮ್ಮ ಫೋನ್ ಬಿಸಿಯಾಗಲು ಕಾರಣಗಳು:\n • ಹೆಚ್ಚು ಸಂಪನ್ಮೂಲ ಉಪಯೋಗಿಸುವ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಬಳಕೆ (ಉದಾ, ಗೇಮಿಂಗ್, ವೀಡಿಯೊ/ನ್ಯಾವಿಗೇಶನ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು)\n • ದೊಡ್ಡ ಫೈಲ್‌ಗಳ ಡೌನ್‌ಲೋಡ್ ಅಥವಾ ಅಪ್‌ಲೋಡ್\n • ಅಧಿಕ ಉಷ್ಣಾಂಶದಲ್ಲಿ ಫೋನಿನ ಬಳಕೆ" @@ -765,8 +752,7 @@ "ತತ್‌ಕ್ಷಣ ಆಪ್‌ಗಳು" "ತತ್‌ಕ್ಷಣ ಆಪ್‌ಗಳಿಗೆ ಸ್ಥಾಪನೆಯ ಅಗತ್ಯವಿಲ್ಲ." "ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ" - - + "ವೆಬ್‌ಗೆ ಹೋಗಿ" "ಮೊಬೈಲ್ ಡೇಟಾ" "ವೈ-ಫೈ ಆಫ್ ಆಗಿದೆ" "ಬ್ಲೂಟೂತ್‌ ಆಫ್ ಆಗಿದೆ" diff --git a/packages/SystemUI/res/values-kn/strings_car.xml b/packages/SystemUI/res/values-kn/strings_car.xml index e8e99c4b7bb1766782e6a7cc2ea6d444fef5f81f..a1e1d89e0e0a5c194e0df5cf0b21c4c646cd3ae0 100644 --- a/packages/SystemUI/res/values-kn/strings_car.xml +++ b/packages/SystemUI/res/values-kn/strings_car.xml @@ -19,6 +19,5 @@ - "ಸುರಕ್ಷಿತವಾಗಿ ಚಾಲನೆ ಮಾಡಿ" - "ಚಾಲನೆ ಸ್ಥಿತಿಗಳ ಕುರಿತು ಸಂಪೂರ್ಣವಾಗಿ ತಿಳಿದುಕೊಳ್ಳಿ ಮತ್ತು ಅನ್ವಯವಾಗುವ ಕಾನೂನುಗಳನ್ನು ಯಾವಾಗಲೂ ಅನುಸರಿಸಿ. ದಿಕ್ಕುಗಳು ಸರಿಯಾಗಿ ಇಲ್ಲದಿರಬಹುದು, ಅಪೂರ್ಣವಾಗಿರಬಹುದು, ಅಪಾಯಕಾರಿಯಾಗಿರಬಹುದು, ಸೂಕ್ತವಾಗಿಲ್ಲದಿರಬಹುದು, ನಿಷೇಧಿಸಿರಬಹುದು ಅಥವಾ ನಿರ್ವಹಣೆ ಪ್ರದೇಶಗಳ ಮೂಲಕ ಹಾದು ಹೋಗಬೇಕಾಗಬಹುದು. ವ್ಯಾಪಾರ ಮಾಹಿತಿಯು ಸಹ ತಪ್ಪಾಗಿರಬಹುದು ಅಥವಾ ಅಪೂರ್ಣವಾಗಿರಬಹುದು. ಡೇಟಾ ನೈಜ ಸಮಯದ್ದಾಗಿರದಿರಬಹುದು ಮತ್ತು ಸ್ಥಳ ನಿಖರತೆಗೆ ಖಾತ್ರಿ ನೀಡಲಾಗುವುದಿಲ್ಲ. ನಿಮ್ಮ ಮೊಬೈಲ್ ಸಾಧನವನ್ನು ನಿರ್ವಹಿಸಬೇಡಿ ಅಥವಾ ಚಾಲನೆ ಮಾಡುತ್ತಿರುವಾಗ Android Auto ಗೆ ಅಲ್ಲದಿರುವ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಬಳಸಬೇಡಿ." + "ಅಪರಿಚಿತ" diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 5db9dc4ec7eada882da8b63b04e49621df69095a..34198861fcc95f8cd1d55ec6363431bcc1f58fd7 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -152,14 +152,12 @@ "Edge" "Wi-Fi" "SIM이 없습니다." - - - - - - + "모바일 데이터" + "모바일 데이터 사용" + "모바일 데이터 사용 중지" "블루투스 테더링입니다." "비행기 모드입니다." + "VPN 켜짐" "SIM 카드가 없습니다." "이동통신사 네트워크가 변경됩니다." "배터리 세부정보 열기" @@ -244,11 +242,9 @@ "충전 중" "2G-3G 데이터 사용 중지됨" "4G 데이터 사용 중지됨" - - + "모바일 데이터가 일시 중지됨" "데이터 사용 중지됨" - - + "설정한 데이터 한도에 도달했습니다. 더 이상 모바일 데이터를 사용하지 않습니다.\n\n계속하면 데이터 사용량에 따른 요금이 부과될 수 있습니다." "재개" "인터넷에 연결되지 않음" "Wi-Fi 연결됨" @@ -321,8 +317,7 @@ "핫스팟" "알림" "손전등" - - + "모바일 데이터" "데이터 사용" "잔여 데이터" "한도 초과" @@ -435,8 +430,7 @@ "직장 프로필이 %1$s에 연결되었습니다." "개인 프로필이 %1$s에 연결되어 있습니다." "기기가 %1$s에 연결되어 있습니다." - - + "기기 관리" "프로필 모니터링" "네트워크 모니터링" "VPN" @@ -445,18 +439,14 @@ "VPN 사용 중지" "VPN 연결 해제" "정책 보기" - - - - + "%1$s에서 관리하는 기기입니다.\n\n관리자는 설정, 기업 액세스, 앱, 기기와 관련된 데이터 및 기기의 위치 정보를 모니터링하고 관리할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요." + "조직에서 관리하는 기기입니다.\n\n관리자는 설정, 기업 액세스, 앱, 기기와 관련된 데이터 및 기기의 위치 정보를 모니터링하고 관리할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요." "조직에서 이 기기에 인증기관을 설치했습니다. 보안 네트워크 트래픽을 모니터링 또는 수정할 수 있습니다." "조직에서 직장 프로필에 인증기관을 설치했습니다. 보안 네트워크 트래픽을 모니터링 또는 수정할 수 있습니다." "이 기기에는 인증기관이 설치되어 있습니다. 보안 네트워크 트래픽을 모니터링 또는 수정할 수 있습니다." "관리자가 기기에서 발생하는 트래픽을 모니터링하는 네트워크 로깅을 사용 설정했습니다." - - - - + "%1$s에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다." + "%1$s%2$s에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다." "직장 프로필이 %1$s에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다." "개인 프로필이 %1$s에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다." "%1$s에서 관리하는 기기입니다." @@ -478,6 +468,8 @@ "%1$s에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 개인 네트워크 활동을 모니터링할 수 있습니다." "직장 프로필은 %1$s에서 관리합니다. 프로필이 %2$s에 연결되어 이메일, 앱, 웹사이트와 같은 직장 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 내용을 확인하려면 관리자에게 문의하세요." "직장 프로필은 %1$s에서 관리합니다. 이 프로필은 %2$s에 연결되어 이메일, 앱, 웹사이트와 같은 직장 네트워크 활동을 모니터링할 수 있습니다.\n\n개인 네트워크 활동을 모니터링할 수 있는 %3$s에도 연결됩니다." + + "수동으로 잠금 해제할 때까지 기기가 잠금 상태로 유지됩니다." "알림을 더욱 빠르게 받기" "잠금 해제하기 전에 알림을 봅니다." @@ -571,12 +563,9 @@ %1$s, %2$s%3$d %1$s, %2$s%3$d - - - - - - + "%1$s 알림 컨트롤을 열었습니다." + "%1$s 알림 컨트롤을 닫았습니다." + "이 채널의 알림을 허용합니다." "전체 카테고리" "설정 더보기" "맞춤설정: %1$s" @@ -714,6 +703,8 @@ "%1$s 알림: %2$s" "앱이 분할 화면에서 작동하지 않을 수 있습니다." "앱이 화면 분할을 지원하지 않습니다." + "앱이 보조 디스플레이에서 작동하지 않을 수도 있습니다." + "앱이 보조 디스플레이에서의 실행을 지원하지 않습니다." "설정 열기" "빠른 설정 열기" "빠른 설정 닫기" @@ -732,14 +723,10 @@ "PIP 메뉴" "%s에서 PIP 사용 중" "%s에서 이 기능이 사용되는 것을 원하지 않는 경우 탭하여 설정을 열고 기능을 사용 중지하세요." - - - - - - - - + "재생" + "일시중지" + "다음으로 건너뛰기" + "이전으로 건너뛰기" "발열로 인해 휴대전화 전원이 종료됨" "휴대전화가 정상적으로 실행 중입니다." "휴대전화가 과열되어 온도를 낮추기 위해 전원이 종료되었습니다. 지금은 휴대전화가 정상적으로 실행 중입니다.\n\n휴대전화가 과열되는 이유는 다음과 같습니다.\n • 리소스를 많이 사용하는 앱 사용(예: 게임, 동영상 또는 내비게이션 앱)\n • 대용량 파일을 다운로드 또는 업로드\n • 온도가 높은 곳에서 휴대폰 사용" @@ -767,8 +754,7 @@ "빠른 실행 앱" "빠른 실행 앱은 설치가 필요하지 않습니다." "앱 정보" - - + "웹으로 이동" "모바일 데이터" "Wi-Fi가 사용 중지됨" "블루투스가 사용 중지됨" diff --git a/packages/SystemUI/res/values-ko/strings_car.xml b/packages/SystemUI/res/values-ko/strings_car.xml index fcc2d7b9bd1940ce6efb56aba5047cdc8ea57f6d..640a1d55c7fef6e3df79d9b6b1f1d5f9325954f0 100644 --- a/packages/SystemUI/res/values-ko/strings_car.xml +++ b/packages/SystemUI/res/values-ko/strings_car.xml @@ -19,6 +19,5 @@ - "안전 운전" - "도로 상황에 주의를 기울이고 관련 법규를 항상 준수하세요. 경로가 정확하지 않거나 불완전하거나 위험하거나 적합하지 않을 수 있으며 금지된 지역이나 여러 행정 구역을 통과할 수 있습니다. 비즈니스 정보 또한 부정확하거나 불완전할 수 있습니다. 데이터는 실시간이 아니며 위치의 정확도를 보증할 수 없습니다. 운전 중에 휴대기기를 조작하거나 Android Auto가 지원되지 않는 앱을 사용해서는 안 됩니다." + "알 수 없음" diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 457df7d04261484d1fe92b3650f8d3ccd4cbb275..a73c52b9b2a9c9992e6b518340a09f77564927c7 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -152,15 +152,13 @@ "Edge" "Wi-Fi" "SIM карта жок." - - - - - - + "Мобилдик Интернет" + "Мобилдик Интернет күйгүзүлгөн" + "Мобилдик Интернет өчүрүлгөн" "Bluetooth аркылуу интернет бөлүшүү." "Учак тартиби." - "SIM-карта жок" + "VPN күйүк." + "SIM карта жок" "Оператор тармагы өзгөртүлүүдө." "Батареянын чоо-жайын ачуу" "Батарея %d пайыз." @@ -200,7 +198,7 @@ "Учак режими күйүк." "Учак режими өчүрүлдү." "Учак режими күйгүзүлдү." - "Тынчымды алба деген күйүк, артыкчылыктуулар гана." + "Тынчымды алба режими иштетилген. Шашылыш эскертмелер гана көрүнөт." "Тынчымды албагыла, жымжырт болсун." "Тынчымды алба деген күйүк, ойготкучтар гана." "Тынчымды алба." @@ -242,11 +240,9 @@ "Кубатталууда" "2G-3G дайындары тындырылды." "4G дайындары тындырылды" - - + "Мобилдик Интернет кызматы тындырылды" "Дайындар тындырылды" - - + "Трафик сиз койгон чекке жетти. Эми мобилдик Интернетти колдоно албайсыз.\n\nЭгер улантсаңыз, дайындарды өткөрүү үчүн акы алынышы мүмкүн." "Улантуу" "Интернет байланыш жок" "Wi-Fi байланышта" @@ -271,7 +267,7 @@ "Көшөгө" "Ethernet" "Тынчымды алба" - "Артыкчылык гана" + "Шашылыш эскертмелер гана" "Ойготкучтар гана" "Тымтырс" "Bluetooth" @@ -319,9 +315,8 @@ "Туташуу чекити" "Эскертмелер" "Кол чырак" - - - "Дайындардын колдонулушу" + "Мобилдик Интернет" + "Дайындардын өткөрүлүшү" "Калган дайындар" "Чектен ашты" "%s колдонулду" @@ -357,10 +352,10 @@ "Издөө" "%s үчүн жогору жылмыштырыңыз." "%s үчүн солго жылмыштырыңыз." - "Көрсөтүлгөн эскертүүлөрдөн, эскерткичтерден, окуялардан жана чалуучулардан тышкары башка үндөр жана дирилдөөлөр тынчыңызды албайт." + "Эскертүүлөрдөн, жылнаамадагы иш-чараларды эстеткичтерден жана белгиленген байланыштардын чалууларынан тышкары башка үндөр жана дирилдөөлөр тынчыңызды албайт." "Ыңгайлаштыруу" - "Ушуну менен эскертүүлөрдүн, музыканын, видеолордун жана оюндардын үндөрү жана дирилдөөлөрү сыяктуу нерселердин баары өчүрүлөт. Бирок телефон чала бересиз." - "Ушуну менен эскертүүлөрдүн, музыканын, видеолордун жана оюндардын үндөрү жана дирилдөөлөрү сыяктуу нерселердин БААРЫ өчүрүлөт." + "Ушуну менен эскертүүлөрдүн, музыканын, видеолордун жана оюндардын үндөрү жана дирилдөөлөрү өчүрүлөт. Бирок телефон менен сүйлөшө бересиз." + "Ушуну менен эскертүүлөрдүн, музыканын, видеолордун жана оюндардын үндөрү жана дирилдөөлөрү өчүрүлөт." "+%d" "Анчейин шашылыш эмес эскертмелер төмөндө" "Ачуу үчүн кайра таптап коюңуз" @@ -372,7 +367,7 @@ "Сүрөтчөнү серпип камерага өтүңүз" "Толук жымжырттык талап кылынат. Бул экрандагыны окугучтарды да тынчтандырат." "Тымтырс" - "Артыкчылык гана" + "Шашылыш эскертмелер гана" "Ойготкучтар гана" "Тым-\nтырс" "Артыкчылыктуу\nгана" @@ -433,8 +428,7 @@ "Жумуш профили %1$s колдонмосуна туташкан" "Жеке профиль %1$s тармагына туташкан" "Түзмөк %1$s тармагына туташкан" - - + "Түзмөктү башкаруу" "Профилди көзөмөлдөө" "Тармакка көз салуу" "VPN" @@ -443,18 +437,14 @@ "VPN\'ди өчүрүү" "VPN\'ди ажыратуу" "Саясаттарды карап көрүү" - - - - + "Түзмөгүңүздү %1$s башкарат.\n\nАдминистраторуңуз жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, түзмөгүңүзгө байланыштуу дайындарды жана түзмөгүңүздүн жайгашкан жери тууралуу маалыматты көзөмөлдөп жана башкара алат.\n\nКөбүрөөк маалымат алуу үчүн администраторуңузга кайрылыңыз." + "Түзмөгүңүздү уюмуңуз башкарат.\n\nАдминистраторуңуз жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, түзмөгүңүзгө байланыштуу дайындарды жана түзмөгүңүздүн жайгашкан жери тууралуу маалыматты көзөмөлдөп жана башкара алат.\n\nКөбүрөөк маалымат алуу үчүн администраторуңузга кайрылыңыз." "Ишканаңыз бул түзмөккө тастыктоочу борборду орнотту. Коопсуз тармагыңыздын трафиги көзөмөлдөнүп же өзгөртүлүшү мүмкүн." "Ишканаңыз жумуш профилиңизге тастыктоочу борборду орнотту. Коопсуз тармагыңыздын трафиги көзөмөлдөнүп же өзгөртүлүшү мүмкүн." "Бул түзмөктө тастыктоочу борбор орнотулган. Коопсуз тармагыңыздын трафиги көзөмөлдөнүп же өзгөртүлүшү мүмкүн." "Администраторуңуз түзмөгүңүздөгү трафикти көзөмөлдөөчү тармактын таржымалын каттоо функциясын иштетти." - - - - + "Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди тескей турган %1$s колдонмосуна туташып турасыз." + "Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди көзөмөлдөй турган %1$s жана %2$s колдонмолоруна туташып турасыз." "Жумуш профилиңиз электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактык аракеттериңизди көзөмөлдөй турган %1$s колдонмосуна туташып турат." "Жеке профилиңиз электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди көзөмөлдөй турган %1$s колдонмосуна туташып турат." "Түзмөгүңүз %1$s тарабынан башкарылат." @@ -476,6 +466,8 @@ "Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы жеке аракеттериңизди тескей турган %1$s колдонмосуна туташып турасыз." "Жумуш профилиңизди %1$s башкарат. Ал электрондук почта, колдонмолор жана вебсайттар сыяктуу жумуш тармагыңыздагы аракеттерди көзөмөлдөй турган %2$s колдонмосуна туташкан.\n\nКөбүрөөк маалымат алуу үчүн администраторуңузга кайрылыңыз." "Жумуш профилиңизди %1$s башкарат. Ал электрондук почта, колдонмолор жана вебсайттар сыяктуу жумуш тармагыңыздагы аракеттерди көзөмөлдөй турган %2$s колдонмосуна туташкан.\n\nМындан тышкары, тармактагы жеке аракеттериңизди көзөмөлдөгөн %3$s колдонмосуна туташып турасыз." + + "Түзмөктүн кулпусу кол менен ачылмайынча кулпуланган бойдон алат" "Эскертмелерди тезирээк алуу" "Аларды кулпудан чыгараардан мурун көрүңүз" @@ -569,12 +561,9 @@ %1$s, %2$s жана дагы %3$d %1$s, %2$s жана дагы %3$d - - - - - - + "%1$s колдонмосу үчүн эскертмени көзөмөлдөө функциялары ачылды" + "%1$s колдонмосу үчүн эскертмени көзөмөлдөө функциялары жабылды" + "Бул каналдан келген эскертмелерге уруксат берүү" "Бардык категориялар" "Дагы жөндөөлөр" "Ыңгайлаштыруу: %1$s" @@ -712,6 +701,8 @@ "%1$s эскертмеси: %2$s" "Колдонмодо экран бөлүнбөшү мүмкүн." "Колдонмодо экран бөлүнбөйт." + "Колдонмо көмөкчү дисплейде иштебей калышы мүмкүн." + "Колдонмо көмөкчү дисплейлерде иштетилбейт." "Жөндөөлөрдү ачуу." "Ыкчам жөндөөлөрдү ачуу." "Ыкчам жөндөөлөрдү жабуу." @@ -730,14 +721,10 @@ "Сүрөт ичиндеги сүрөт менюсу" "%s – сүрөт ичиндеги сүрөт" "Эгер %s колдонмосу бул функцияны пайдаланбасын десеңиз, жөндөөлөрдү ачып туруп, аны өчүрүп коюңуз." - - - - - - - - + "Ойнотуу" + "Тындыруу" + "Кийинкисине өткөрүп жиберүү" + "Мурункусуна өткөрүп жиберүү" "Телефон ысыгандыктан өчүрүлдү" "Телефонуңуз кадимкидей иштеп жатат" "Телефонуңуз өтө ысып кеткендиктен, аны муздатуу үчүн өчүрүлдү. Эми телефонуңуз кадимкидей иштеп жатат.\n\nТелефонуңуз төмөнкү шарттарда ысып кетиши мүмкүн:\n • Ашыкча ресурс короткон колдонмолорду (оюндар, видео же чабыттоо колдонмолору) пайдалансаңыз \n • Ири көлөмдөгү файлдарды жүктөп алсаңыз же берсеңиз\n • Телефонуңузду жогорку температураларда пайдалансаңыз" @@ -765,9 +752,8 @@ "Ыкчам ачылуучу колдонмолор" "Ыкчам ачылуучу колдонмолорду орнотуу талап кылынбайт." "Колдонмо тууралуу" - - - "Мобилдик дайындар" + "Интернетке өтүү" + "Мобилдик Интернет" "Wi-Fi өчүк" "Bluetooth өчүк" "\"Тынчымды алба\" режими өчүк" diff --git a/packages/SystemUI/res/values-ky/strings_car.xml b/packages/SystemUI/res/values-ky/strings_car.xml index 1d99ff225ad272cbe03ca615e33d6690c4891dee..2e76c883edb6a9143a242a02409fb1babe693d67 100644 --- a/packages/SystemUI/res/values-ky/strings_car.xml +++ b/packages/SystemUI/res/values-ky/strings_car.xml @@ -19,6 +19,5 @@ - "Коопсуздук эрежелерин сактаңыз" - "Унаа айдап бара жатканда жолдогу шарттар менен эрежелерге ар дайым көңүл буруңуз. Багыттар так же толук эмес берилип, кесип өтүү үчүн опурталдуу же ылайыксыз болгон административдик аймактар аркылуу өтүшү мүмкүн. Ишканалар тууралуу маалымат да так же толук эмес болушу мүмкүн. Дайындар тез-тез жаңыртылып турбагандыктан, жайгашкан жердин так аныкталгандыгына кепилдик жок. Андыктан унаа айдап бара жатканда, мобилдик түзмөгүңүздү же Android Auto\'го арналбаган колдонмолорду пайдаланбаңыз." + "Белгисиз" diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index f1e0ad0cf13110d5b2f4bab7dd82cf8386186e04..9f8d6726525c334bfea7f11980818b79e635fd4f 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -152,14 +152,12 @@ "Edge" "Wi-Fi" "ບໍ່ມີຊິມ." - - - - - - + "ອິນເຕີເນັດມືຖື" + "ເປີດອິນເຕີເນັດມືຖືແລ້ວ" + "ປິດອິນເຕີເນັດມືຖືແລ້ວ" "ການປ່ອຍສັນຍານ Bluetooth." "ໂໝດໃນຍົນ." + "VPN ເປີດ." "ບໍ່ມີແຜ່ນ SIM." "ການ​ປ່ຽນ​ແປງ​ເຄືອ​ຂ່າຍ​ບໍ​ລ​ິ​ສັດ​ເຄືອ​ຂ່າຍ​ມື​ຖື." "ເປີດລາຍລະອຽດແບັດເຕີຣີ" @@ -242,11 +240,9 @@ "ກຳລັງສາກໄຟ" "ຂໍ້​ມູນ 2G​-3G ຢຸດ​ຊົ່ວ​ຄາວແລ້ວ" "ຂໍ້​ມູນ 4G ຢຸດ​ຊົ່ວ​ຄາວແລ້ວ" - - + "ຢຸດການໃຊ້ອິນເຕີເນັດມືຖືຊົ່ວຄາວແລ້ວ" "ຂໍ້​ມູນ​ຢຸດ​ຊົ່ວ​ຄາວແລ້ວ" - - + "ທ່ານໃຊ້ອິນເຕີເນັດຮອດຈຳນວນທີ່ທ່ານຈຳກັດປະລິມານໄວ້ແລ້ວ. ທ່ານຈະບໍ່ນຳໃຊ້ການເຊື່ອມຕໍ່ຜ່ານເຄືອຂ່າຍມືຖືອີກຕໍ່ໄປ.\n\nຫາກທ່ານສືບຕໍ່ໃຊ້ໄປອີກ, ທ່ານອາດຖືກຮຽກເກັບເງິນຄ່າບໍລິການໄດ້." "ເລີ່ມຕໍ່" "ບໍ່ມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ" "ເຊື່ອມ​ຕໍ່ Wi-​-Fi ແລ້ວ" @@ -319,8 +315,7 @@ "​ຮັອດ​ສະ​ປອດ" "ການແຈ້ງເຕືອນ" "​ໄຟ​ສາຍ" - - + "ອິນເຕີເນັດມືຖື" "​ການ​​ນຳ​ໃຊ້​​ຂໍ້​ມູນ" "​ຂໍ້​ມູນ​ທີ່​ຍັງ​ເຫຼືອ" "​ເກີນ​ຂີດ​ຈຳ​ກັດ" @@ -433,8 +428,7 @@ "ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກເຊື່ອມຕໍ່ຫາ %1$s ແລ້ວ" "ໂປຣໄຟລ໌ສ່ວນຕົວເຊື່ອມຕໍ່ຫາ %1$s ແລ້ວ" "ອຸປະກອນເຊື່ອມຕໍ່ຫາ %1$s ແລ້ວ" - - + "ການຈັດການອຸປະກອນ" "ການ​ຕິດ​ຕາມ​ໂປຣ​ໄຟລ໌" "ການກວດ​ສອບ​ຕິດ​ຕາມ​ເຄືອ​ຂ່າຍ" "VPN" @@ -443,18 +437,14 @@ "ປິດ​ການ​ໃຊ້ VPN" "ຕັດ​ການ​ເຊື່ອມ​ຕໍ່ VPN" "ເບິ່ງນະໂຍບາຍ" - - - - + "ອຸປະກອນຂອງທ່ານແມ່ນຖືກຈັດການໂດຍ %1$s.\n\nຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານສາມາດຕິດຕາມ ແລະ ຈັດການການຕັ້ງຄ່າຕ່າງໆ, ການເຂົ້າເຖິງອົງກອນ, ແອັບ, ຂໍ້ມູນທີ່ເຊື່ອມໂຍງກັບອຸປະກອນ ແລະ ຂໍ້ມູນສະຖານທີ່ຂອງອຸປະກອນທ່ານໄດ້.\n\nສຳລັບຂໍ້ມູນເພີ່ມເຕີມ, ໃຫ້ຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ." + "ອຸປະກອນຂອງທ່ານແມ່ນຖືກຈັດການໂດຍອົງກອນຂອງທ່ານ.\n\nຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານສາມາດຕິດຕາມ ແລະ ຈັດການການຕັ້ງຄ່າຕ່າງໆ, ການເຂົ້າເຖິງອົງກອນ, ແອັບ, ຂໍ້ມູນທີ່ເຊື່ອມໂຍງກັບອຸປະກອນ ແລະ ຂໍ້ມູນສະຖານທີ່ຂອງອຸປະກອນທ່ານໄດ້.\n\nສຳລັບຂໍ້ມູນເພີ່ມເຕີມ, ໃຫ້ຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ." "ອົງກອນຂອງທ່ານຕິດຕັ້ງອຳນາດໃບຮັບຮອງໄວ້ໃນອຸປະກອນນີ້. ທຣາບຟິກເຄືອຂ່າຍທີ່ເຂົ້າລະຫັດໄວ້ຂອງທ່ານອາດຖືກຕິດຕາມ ຫຼື ແກ້ໄຂໄດ້." "ອົງກອນຂອງທ່ານຕິດຕັ້ງອຳນາດໃບຮັບຮອງໄວ້ໃນໂປຣໄຟລ໌ບ່ອນເຮັດວຽກນີ້. ທຣາບຟິກເຄືອຂ່າຍທີ່ເຂົ້າລະຫັດໄວ້ຂອງທ່ານອາດຖືກຕິດຕາມ ຫຼື ແກ້ໄຂໄດ້." "ມີອຳນາດໃບຮັບຮອງຕິດຕັ້ງຢູ່ໃນອຸປະກອນນີ້. ທຣາບຟິກເຄືອຂ່າຍທີ່ເຂົ້າລະຫັດໄວ້ຂອງທ່ານອາດຖືກຕິດຕາມ ຫຼື ແກ້ໄຂໄດ້." "ຜູ້ເບິ່ງແຍງຂອງທ່ານໄດ້ເປີດໃຊ້ການບັນທຶກເຄືອຂ່າຍໄວ້, ເຊິ່ງຈະຕິດຕາມທຣາບຟິກໃນອຸປະກອນຂອງທ່ານ." - - - - + "ທ່ານເຊື່ອມຕໍ່ກັບ %1$s ແລ້ວ, ເຊິ່ງຈະສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍ, ຮວມທັງອີເມວ, ແອັບ ແລະ ເວັບໄຊຕ່າງໆຂອງທ່ານໄດ້." + "ທ່ານເຊື່ອມຕໍ່ກັບ %1$s ແລະ %2$s ແລ້ວ, ເຊິ່ງຈະສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍ, ຮວມທັງອີເມວ, ແອັບ ແລະ ເວັບໄຊຕ່າງໆຂອງທ່ານໄດ້." "ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານເຊື່ອມຕໍ່ຫາ %1$s, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍຂອງທ່ານ, ຮວມເຖິງອີເມວ, ແອັບ ແລະ ເວັບໄຊ." "ໂປຣໄຟລ໌ສ່ວນຕົວຂອງທ່ານເຊື່ອມຕໍ່ກັບ %1$s ແລ້ວ, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍ, ຮວມທັງອີເມວ, ແອັບ ແລະ ເວັບໄຊຕ່າງໆຂອງທ່ານໄດ້." "ອຸປະກອນຂອງທ່ານແມ່ນຈັດການໂດຍ %1$s." @@ -476,6 +466,7 @@ "ທ່ານເຊື່ອມຕໍ່ກັບ %1$s ແລ້ວ, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍສ່ວນຕົວຂອງທ່ານ ຮວມທັງອີເມວ, ​ແອັບ ແລະເວັບໄຊໄດ້." "ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານແມ່ນຖືກຈັດການໂດຍ %1$s. ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກດັ່ງກ່າວເຊື່ອມຕໍ່ຫາ %2$s, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍຂອງທ່ານ, ຮວມທັງອີເມວ, ແອັບ ແລະ ເວັບໄຊໄດ້.\nສຳລັບຂໍ້ມູນເພີ່ມເຕີມ, ໃຫ້ຕິດຕໍ່ຫາຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ\n." "ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານແມ່ນຖືກຈັດການໂດຍ %1$s. ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກດັ່ງກ່າວເຊື່ອມຕໍ່ຫາ %2$s, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍຂອງທ່ານ, ຮວມທັງອີເມວ, ແອັບ ແລະ ເວັບໄຊໄດ້.\n\nນອກຈາກນັ້ນ, ທ່ານຍັງເຊື່ອມຕໍ່ຫາ %3$s, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍສ່ວນຕົວຂອງທ່ານໄດ້." + "ປົດລັອກສຳລັບ %1$s ແລ້ວ" "Device will stay locked until you manually unlock" "ຮັບເອົາການ​ແຈ້ງເຕືອນ​ໄວຂຶ້ນ" "ເບິ່ງພວກ​ມັນກ່ອນ​ທ່ານຈະ​ປົດລັອກ" @@ -569,12 +560,9 @@ %1$s, %2$s ແລະ ອີກ %3$d ຊ່ອງອື່ນໆ %1$s, %2$s ແລະ ອີກ %3$d ຊ່ອງອື່ນໆ - - - - - - + "ເປີດຕົວຄວບຄຸມການແຈ້ງເຕືອນສຳລັບ %1$s ແລ້ວ" + "ປິດຕົວຄວບຄຸມການແຈ້ງເຕືອນສຳລັບ %1$s ແລ້ວ" + "ອະນຸຍາດການແຈ້ງເຕືອນຈາກຊ່ອງນີ້" "ທຸກໝວດໝູ່" "​ການ​ຕັ້ງ​ຄ່າ​ເພີ່ມ​ເຕີມ" "ປັບແຕ່ງ: %1$s" @@ -712,6 +700,8 @@ "ການແຈ້ງເຕືອນ %1$s: %2$s" "ແອັບອາດໃຊ້ບໍ່ໄດ້ກັບການແບ່ງໜ້າຈໍ." "ແອັບບໍ່ຮອງຮັບໜ້າຈໍແບບແຍກກັນ." + "ແອັບອາດຮອງຮັບການເປີດໃນໜ້າຈໍທີສອງ." + "ແອັບບໍ່ຮອງຮັບການເປີດໃນໜ້າຈໍທີສອງ." "ເປີດການຕັ້ງຄ່າ." "ເປີດການຕັ້ງຄ່າດ່ວນ." "ປິດການຕັ້ງຄ່າດ່ວນ." @@ -730,14 +720,10 @@ "ເມນູຊ້ອນຮູບພາບ" "%s ແມ່ນເປັນການສະແດງຜົນຫຼາຍຢ່າງພ້ອມກັນ" "ຫາກທ່ານບໍ່ຕ້ອງການ %s ໃຫ້ໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ແຕະເພື່ອເປີດການຕັ້ງຄ່າ ແລ້ວປິດມັນໄວ້." - - - - - - - - + "ຫຼິ້ນ" + "ຢຸດຊົ່ວຄາວ" + "ຂ້າມໄປລາຍການໜ້າ" + "ຂ້າມໄປລາຍການກ່ອນນີ້" "ປິດໂທລະສັບເນື່ອງຈາກຮ້ອນເກີນໄປ" "ໂທລະສັບຂອງທ່ານຕອນນີ້ເຮັດວຽກປົກກະຕິແລ້ວ" "ໂທລະສັບຂອງທ່ານຮ້ອນເກີນໄປ, ດັ່ງນັ້ນມັນຈຶ່ງຖືກປິດໄວ້ເພື່ອໃຫ້ເຢັນກ່ອນ. ໂທລະສັບຂອງທ່ານຕອນນີ້ເຮັດວຽກປົກກະຕິແລ້ວ.\n\nໂທລະສັບຂອງທ່ານອາດຮ້ອນຫາກວ່າທ່ານ:\n • ໃຊ້ແອັບທີ່ກິນຊັບພະຍາກອນຫຼາຍ (ເຊັ່ນ: ເກມ, ວິດີໂອ ຫຼື ແອັບການນຳທາງ)\n • ດາວໂຫລດ ຫຼື ອັບໂຫລດຮູບພາບຂະໜາດໃຫຍ່\n • ໃຊ້ໂທລະສັບຂອງທ່ານໃນບ່ອນທີ່ມີອຸນຫະພູມສູງ" @@ -765,8 +751,7 @@ "ອິນສະແຕນແອັບ" "ອິນສະແຕນແອັບບໍ່ຈຳເປັນຕ້ອງມີການຕິດຕັ້ງ." "ຂໍ້ມູນແອັບ" - - + "ໄປທີ່ເວັບ" "ອິນເຕີເນັດມືຖື" "Wi-Fi ປິດຢູ່" "Bluetooth ປິດຢູ່" diff --git a/packages/SystemUI/res/values-lo/strings_car.xml b/packages/SystemUI/res/values-lo/strings_car.xml index 3388f54909e31f05ca90b8e9f1bca52c6e135f21..f51074ab0fd72c7f93dc1b2f9e23c61ed141443c 100644 --- a/packages/SystemUI/res/values-lo/strings_car.xml +++ b/packages/SystemUI/res/values-lo/strings_car.xml @@ -19,6 +19,5 @@ - "ຂັບຂີ່ຢ່າງປອດໄພ" - "ຮູ້ຈັກສະພາບການຂັບຂີ່ຢ່າງຄົບຖ້ວນ ແລະ ປະຕິບັດຕາມກົດໝາຍທີ່ນຳໃຊ້ສະເໝີ. ຄຳແນະນຳເສັ້ນທາງອາດຈະບໍ່ຖືກຕ້ອງ, ບໍ່ຄົບຖ້ວນ, ອັນຕະລາຍ, ບໍ່ເໝາະສົມ, ຖືກຫ້າມ ຫຼື ກ່ຽວຂ້ອງກັບການຂ້າມເຂດປົກຄອງ. ຂໍ້ມູນທຸລະກິດອາດຈະບໍ່ຖືກຕ້ອງ ຫຼື ບໍ່ຄົບຖ້ວນ. ຂໍ້ມູນບໍ່ແມ່ນຂໍ້ມູນສົດ ແລະ ບໍ່ສາມາດຮັບປະກັນຄວາມຖືກຕ້ອງຂອງສະຖານທີ່ໄດ້. ຢ່າໃຊ້ອຸປະກອນມືຖືຂອງທ່ານ ຫຼື ໃຊ້ແອັບທີ່ບໍ່ມີໄວ້ສຳລັບ Android Auto ໃນຂະນະທີ່ຂັບຂີ່." + "ບໍ່​ຮູ້ຈັກ" diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 400f5850f7dfb6e338b841516af628907d21f9ed..3bb39a3dac8931a7641659316a83a01b0818dd27 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -154,14 +154,12 @@ "Kraštas" "Wi-Fi" "Nėra SIM kortelės." - - - - - - + "Mobiliojo ryšio duomenys" + "Mobiliojo ryšio duomenys įjungti" + "Mobiliojo ryšio duomenys išjungti" "„Bluetooth“ įrenginio kaip modemo naudojimas." "Lėktuvo režimas." + "VPN įjungtas." "Nėra SIM kortelės." "Keičiamas operatoriaus tinklas." "Atidaryti išsamią akumuliatoriaus informaciją" @@ -244,11 +242,9 @@ "Įkrovimas" "2G–3G duomenys pristabdyti" "4G duomenys pristabdyti" - - + "Mobiliojo ryšio duomenys pristabdyti" "Duomenys pristabdyti" - - + "Pasiektas nustatytas duomenų limitas. Nebenaudojate mobiliojo ryšio duomenų.\n\nJei tęsite, gali būti taikomi duomenų naudojimo mokesčiai." "Atnaujinti" "Nėra interneto ryš." "Prisij. prie „Wi-Fi“" @@ -323,8 +319,7 @@ "Viešosios interneto prieigos taškas" "Pranešimai" "Žibintuvėlis" - - + "Mobiliojo ryšio duomenys" "Duomenų naudojimas" "Likę duomenys" "Viršytas limitas" @@ -437,8 +432,7 @@ "Darbo profilis susietas su programa „%1$s“" "Asmeninis profilis susietas su programa „%1$s“" "Įrenginys susietas su programa „%1$s“" - - + "Įrenginio tvarkymas" "Profilio stebėjimas" "Tinklo stebėjimas" "VPN" @@ -447,18 +441,14 @@ "Išjungti VPN" "Atjungti VPN" "Žr. politiką" - - - - + "Įrenginį tvarko „%1$s“.\n\nAdministratorius gali stebėti ir tvarkyti nustatymus, įmonės prieigą, programas, su įrenginiu susietus duomenis ir įrenginio vietovės informaciją.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi." + "Įrenginį tvarko organizacija.\n\nAdministratorius gali stebėti ir tvarkyti nustatymus, įmonės prieigą, programas, su įrenginiu susietus duomenis ir įrenginio vietovės informaciją.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi." "Jūsų organizacija įdiegė šiame įrenginyje sertifikato įgaliojimą. Jūsų saugaus tinklo srautas gali būti stebimas arba keičiamas." "Jūsų organizacija įdiegė darbo profilyje sertifikato įgaliojimą. Jūsų saugaus tinklo srautas gali būti stebimas arba keičiamas." "Šiame įrenginyje įdiegtas sertifikato įgaliojimas. Jūsų saugaus tinklo srautas gali būti stebimas arba keičiamas." "Administratorius įjungė tinklo duomenų įrašymą į žurnalą. Įjungus šią funkciją stebimas srautas jūsų įrenginyje." - - - - + "Esate prisijungę prie programos „%1$s“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines." + "Esate prisijungę prie programų „%1$s“ ir „%2$s“, kurios gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines." "Darbo profilis susietas su programa „%1$s“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines." "Asmeninis profilis susietas su programa „%1$s“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines." "Įrenginį tvarko „%1$s“." @@ -480,6 +470,8 @@ "Esate prisijungę prie programos „%1$s“, kuri gali stebėti asmeninio tinklo veiklą, įskaitant el. laiškus, programas ir svetaines." "Jūsų darbo profilį tvarko „%1$s“. Profilis susietas su programa „%2$s“, kuri gali stebėti jūsų tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nJei reikia daugiau informacijos, susisiekite su administratoriumi." "Jūsų darbo profilį tvarko „%1$s“. Profilis susietas su programa „%2$s“, kuri gali stebėti jūsų tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nTaip pat esate prisijungę prie programos „%3$s“, kuri gali stebėti asmeninio tinklo veiklą." + + "Įrenginys liks užrakintas, kol neatrakinsite jo neautomatiniu būdu" "Greičiau gaukite pranešimus" "Peržiūrėti prieš atrakinant" @@ -577,12 +569,9 @@ %1$s“, „%2$s“ ir dar %3$d kanalo %1$s“, „%2$s“ ir dar %3$d kanalų - - - - - - + "„%1$s“ pranešimų valdikliai atidaryti" + "„%1$s“ pranešimų valdikliai uždaryti" + "Leisti pranešimus iš šio kanalo" "Visos kategorijos" "Daugiau nustatymų" "Tinkinti: %1$s" @@ -720,6 +709,8 @@ "„%1$s“ pranešimas: %2$s" "Programa gali neveikti naudojant skaidytą ekraną." "Programoje nepalaikomas skaidytas ekranas." + "Programa gali neveikti antriniame ekrane." + "Programa nepalaiko pristatymo antriniuose ekranuose." "Atidaryti nustatymus." "Atidaryti sparčiuosius nustatymus." "Uždaryti sparčiuosius nustatymus." @@ -738,14 +729,10 @@ "Vaizdo vaizde meniu" "%s rodom. vaizdo vaizde" "Jei nenorite, kad %s naudotų šią funkciją, palietę atidarykite nustatymus ir išjunkite ją." - - - - - - - - + "Leisti" + "Pristabdyti" + "Praleisti ir eiti į kitą" + "Praleisti ir eiti į ankstesnį" "Telefonas išjungt., nes įkaito" "Dabar telefonas veikia įprastai" "Telefonas per daug įkaito, todėl buvo išj., kad atvėstų. Dabar telefonas veikia įprastai.\n\nTelefonas gali per daug įkaisti, jei:\n • esate įjungę daug išteklių naudoj. progr. (pvz., žaidimų, vaizdo įr. arba navig. progr.);\n • atsis. arba įkeliate didelius failus;\n • telefoną naudojate aukštoje temper." @@ -773,8 +760,7 @@ "Akimirksniu įkeliamos programėlės" "Akimirksniu įkeliamų programėlių nereikia įdiegti." "Programos informacija" - - + "Eiti į žiniatinklį" "Mobilieji duomenys" "„Wi-Fi“ išjungtas" "„Bluetooth“ išjungtas" diff --git a/packages/SystemUI/res/values-lt/strings_car.xml b/packages/SystemUI/res/values-lt/strings_car.xml index 03d656aae1e4bd1dca6f65d47d465333d6000323..62b6f51df7c787623d482e0ba32bb836c5e5c87e 100644 --- a/packages/SystemUI/res/values-lt/strings_car.xml +++ b/packages/SystemUI/res/values-lt/strings_car.xml @@ -19,6 +19,5 @@ - "Vairuokite saugiai" - "Visada atsižvelkite į vairavimo sąlygas ir laikykitės galiojančių įstatymų. Nuorodos gali būti netikslios, neužbaigtos, pavojingos, netinkamos, draudžiamos ar nukreipiančios per administracines sritis. Įmonių informacija taip pat gali būti netiksli ar neužbaigta. Duomenys nėra teikiami realiuoju laiku ir vietovių tikslumo negalima garantuoti. Vairuodami nenaudokite mobiliojo įrenginio ar programų, kurios nėra skirtos „Android Auto“." + "Nežinoma" diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 1f406867118d56bca5c4044353ec1c92c0753892..bf8b501d937add8433bdddef5c0d9d8545005eda 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -153,14 +153,12 @@ "EDGE" "Wi-Fi" "Nav SIM kartes." - - - - - - + "Mobilie dati" + "Mobilie dati ieslēgti" + "Mobilie dati izslēgti" "Bluetooth piesaiste." "Lidmašīnas režīms." + "VPN ieslēgts" "Nav SIM kartes." "Mobilo sakaru operatora tīkla mainīšana." "Atvērt akumulatora informāciju" @@ -243,11 +241,9 @@ "Notiek uzlāde" "2G–3G datu lietojums ir apturēts" "4G datu lietojums ir apturēts" - - + "Mobilo datu lietojums apturēts" "Datu lietojums ir apturēts" - - + "Ir sasniegts jūsu iestatītais datu ierobežojums. Jūs vairs neizmantojat mobilos datus.\n\nJa atsāksiet, var tikt piemērota maksa par datu lietojumu." "Atsākt" "Nav interneta sav." "Izv. sav. ar Wi-Fi" @@ -321,8 +317,7 @@ "Tīklājs" "Paziņojumi" "Zibspuldze" - - + "Mobilie dati" "Datu lietojums" "Atlikušie dati" "Pārsniegts ierobežojums" @@ -435,8 +430,7 @@ "Darba profilam tika izveidots savienojums ar lietotni %1$s." "Personīgajam profilam ir izveidots savienojums ar lietotni %1$s." "Izveidots savienojums ar lietotni %1$s." - - + "Ierīces pārvaldība" "Profila pārraudzība" "Tīkla pārraudzība" "VPN" @@ -445,18 +439,14 @@ "Atspējot VPN" "Atvienot VPN tīklu" "Skatīt politikas" - - - - + "Jūsu ierīci pārvalda %1$s.\n\nAdministrators var pārraudzīt un pārvaldīt iestatījumus, korporatīvo piekļuvi, lietotnes, ar ierīci saistītos datus un ierīces atrašanās vietas informāciju.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru." + "Jūsu ierīci pārvalda jūsu organizācija.\n\nAdministrators var pārraudzīt un pārvaldīt iestatījumus, korporatīvo piekļuvi, lietotnes, ar ierīci saistītos datus un ierīces atrašanās vietas informāciju.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru." "Jūsu organizācija instalēja sertifikātu šajā ierīcē. Jūsu drošā tīkla datplūsma var tikt uzraudzīta." "Jūsu organizācija instalēja sertifikātu jūsu darba profilā. Jūsu drošā tīkla datplūsma var tikt uzraudzīta." "Šajā ierīcē ir instalēts sertifikāts. Drošā tīkla datplūsma var tikt uzraudzīta." "Administrators ieslēdza tīkla reģistrēšanu, kuru izmanto, lai pārraudzītu datplūsmu jūsu ierīcē." - - - - + "Ir izveidots savienojums ar lietotni %1$s, kas var pārraudzīt jūsu darbības tīklā, tostarp e-pasta ziņojumus, lietotnes un vietnes." + "Ir izveidots savienojums ar lietotnēm %1$s un %2$s, kas var pārraudzīt jūsu darbības tīklā, tostarp e-pasta ziņojumus, lietotnes un vietnes." "Jūsu darba profilam ir izveidots savienojums ar lietotni %1$s, kas var pārraudzīt jūsu darbības tīklā, tostarp saņemtos un nosūtītos e-pasta ziņojumus, instalētās lietotnes un apmeklētās tīmekļa vietnes." "Jūsu personīgais profils ir piesaistīts lietotnei %1$s, kas var pārraudzīt jūsu darbības tīklā, tostarp saņemtos un nosūtītos e-pasta ziņojumus, instalētās lietotnes un apmeklētās tīmekļa vietnes." "Jūsu ierīci pārvalda %1$s." @@ -478,6 +468,8 @@ "Ir izveidots savienojums ar lietotni %1$s, kas var pārraudzīt jūsu tīklā veiktās privātās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes." "Jūsu darba profilu pārvalda %1$s. Profils ir saistīts ar lietotni %2$s, kura var pārraudzīt jūsu tīklā veiktās darbības, tostarp saņemtos un nosūtītos e-pasta ziņojumus, izmantotās lietotnes un apmeklētās tīmekļa vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru." "Jūsu darba profilu pārvalda %1$s. Profils ir saistīts ar lietotni %2$s, kura var pārraudzīt jūsu tīklā veiktās darbības, tostarp saņemtos un nosūtītos e-pasta ziņojumus, instalētās lietotnes un apmeklētās tīmekļa vietnes.\n\nIr izveidots savienojums ar lietotni %3$s, kas var pārraudzīt jūsu tīklā veiktās privātās darbības, tostarp saņemtos un nosūtītos e-pasta ziņojumus, instalētās lietotnes un apmeklētās tīmekļa vietnes." + + "Ierīce būs bloķēta, līdz to manuāli atbloķēsiet." "Saņemiet paziņojumus ātrāk" "Skatiet tos pirms atbloķēšanas." @@ -573,12 +565,9 @@ %1$s, %2$s un vēl %3$d %1$s, %2$s un vēl %3$d - - - - - - + "Lietotnes %1$s paziņojumu vadīklas ir atvērtas" + "Lietotnes %1$s paziņojumu vadīklas ir aizvērtas" + "Atļaut paziņojumus no šī kanāla" "Visas kategorijas" "Citi iestatījumi" "Pielāgot: %1$s" @@ -716,6 +705,8 @@ "%1$s paziņojums: %2$s" "Iespējams, lietotnē nedarbosies ekrāna sadalīšana." "Lietotnē netiek atbalstīta ekrāna sadalīšana." + "Lietotne, iespējams, nedarbosies sekundārajā displejā." + "Lietotnē netiek atbalstīta palaišana sekundārajos displejos." "Atvērt iestatījumus." "Atvērt ātros iestatījumus." "Aizvērt ātros iestatījumus." @@ -734,14 +725,10 @@ "Izvēlne attēlam attēlā" "%s ir attēlā attēlā" "Ja nevēlaties lietotnē %s izmantot šo funkciju, pieskarieties, lai atvērtu iestatījumus un funkciju izslēgtu." - - - - - - - - + "Atskaņot" + "Apturēt" + "Pāriet uz nākamo" + "Pāriet uz iepriekšējo" "Tālrunis izslēgts karstuma dēļ" "Tagad jūsu tālrunis darbojas normāli" "Jūsu tālrunis bija pārkarsis un tika izslēgts. Tagad tas darbojas normāli.\n\nTālrunis var sakarst, ja:\n • tiek izmantotas lietotnes, kas patērē daudz enerģijas (piem., spēles, video lietotnes vai navigācija);\n • tiek lejupielādēti/augšupielādēti lieli faili;\n • tālrunis tiek lietots augstā temperatūrā." @@ -769,8 +756,7 @@ "Tūlītējās lietotnes" "Tūlītējām lietotnēm nav nepieciešama instalēšana." "Lietotnes informācija" - - + "Pāriet uz tīmekli" "Mobilie dati" "Wi-Fi ir izslēgts" "Bluetooth ir izslēgts" diff --git a/packages/SystemUI/res/values-lv/strings_car.xml b/packages/SystemUI/res/values-lv/strings_car.xml index 01716241a21cc16df76277c1117b74da1bd13f04..19b1007d481ae29e6f5a75df4eb5b3a6be5203de 100644 --- a/packages/SystemUI/res/values-lv/strings_car.xml +++ b/packages/SystemUI/res/values-lv/strings_car.xml @@ -19,6 +19,5 @@ - "Droša braukšana" - "Pievērsiet visu uzmanību braukšanas apstākļiem un vienmēr ievērojiet piemērojamos tiesību aktus. Norādes var būt neprecīzas, nepilnīgas, bīstamas, nepiemērotas, aizliegtas vai var ietvert administratīvo teritoriju šķērsošanu. Arī uzņēmumu informācija var būt neprecīza vai nepilnīga. Dati netiek nodrošināti reāllaikā, un netiek garantēta atrašanās vietu precizitāte. Vadot transportlīdzekli, nelietojiet mobilo ierīci rokās un neizmantojiet lietotnes, kas nav paredzētas pakalpojumam Android Auto." + "Nezināms" diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 9bb785ae7dc98e09b3e37de7c058e481a84b64d9..c390a07a8c6a513bdd19af9bc6c445e4d98d6ae1 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -157,6 +157,7 @@ "Мобилниот интернет е исклучен" "Се поврзува со Bluetooth." "Режим на работа во авион." + "VPN е вклучена." "Нема СИМ-картичка" "Променување на мрежата на операторот." "Отвори ги деталите за батеријата" @@ -427,8 +428,7 @@ "Работниот профил е поврзан на %1$s" "Личниот профил е поврзан на %1$s" "Уредот е поврзан на %1$s" - - + "Управување со уреди" "Следење профил" "Следење на мрежата" "VPN" @@ -437,18 +437,14 @@ "Оневозможи ВПН" "Исклучи ВПН" "Прикажи „Политики“" - - - - + "Со уредот управува %1$s.\n\nАдминистраторот може да ги следи и да управува со поставките, корпоративниот пристап, апликациите, податоците поврзани со уредот и информациите за локацијата на уредот.\n\nЗа повеќе информации, контактирајте со администраторот." + "Со уредот управува вашата организација.\n\nАдминистраторот може да ги следи и да управува со поставките, корпоративниот пристап, апликациите, податоците поврзани со уредот и информациите за локацијата на уредот.\n\nЗа повеќе информации, контактирајте со администраторот." "Вашата организација инсталираше авторитет за сертификат на уредов. Сообраќајот на вашата безбедна мрежа можно е да се следи или изменува." "Вашата организација инсталираше авторитет за сертификат на вашиот работен профил. Вашиот безбеден мрежен сообраќај можно е да се следи или изменува." "На уредов е инсталиран авторитет за сертификат. Вашиот безбеден мрежен сообраќај можно е да се следи или изменува." "Вашиот администратор вклучил евиденција на мрежата, што подразбира следење на сообраќајот на вашиот уред." - - - - + "Поврзани сте на %1$s, што може да ја следи вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-сајтовите." + "Поврзани сте на %1$s и %2$s, што може да ја следат вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-сајтовите." "Вашиот работен профил е поврзан на %1$s, што може да ја следи вашата активност на мрежата, заедно со е-пораките, апликациите и веб-сајтовите." "Вашиот личен профил е поврзан на %1$s, што може да ја следи вашата активност на мрежата, заедно со е-пораките, апликациите и веб-сајтовите." "%1$s управува со уредов." @@ -470,6 +466,8 @@ "Поврзани сте на %1$s, којашто може да ја следи вашата лична активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите." "%1$s управува со вашиот работен профил. Профилот е поврзан на %2$s, што може да ја следи вашата работна активност на мрежата, заедно со е-пораките, апликациите и веб-сајтовите.\n\nЗа повеќе информации, контактирајте со вашиот администратор." "%1$s управува со вашиот работен профил. Профилот е поврзан на %2$s, што може да ја следи вашата работна активност на мрежата, заедно со е-пораките, апликациите и веб-сајтовите.\n\nПоврзани сте и на %3$s, што може да ја следи вашата лична активност на мрежата." + + "Уредот ќе остане заклучен додека рачно не го отклучите" "Добивајте известувања побрзо" "Видете ги пред да отклучите" @@ -667,7 +665,7 @@ "Десна икона" "Повлечете за додавање плочки" "Повлечете тука за да се отстрани" - "Уреди" + "Измени" "Време" "Прикажи часови, минути и секунди" @@ -703,6 +701,8 @@ "Известување од %1$s: %2$s" "Апликацијата можеби нема да работи во поделен екран." "Апликацијата не поддржува поделен екран." + "Аппликацијата може да не функционира на второстепен екран." + "Апликацијата не поддржува стартување на второстепени екрани." "Отворете ги поставките." "Отворете ги брзите поставки." "Затворете ги брзите поставки." @@ -752,8 +752,7 @@ "Инстант апликации" "Инстант апликациите нема потреба да се инсталираат." "Информации за апликација" - - + "Одете на интернет" "Мобилен интернет" "Wi-Fi е исклучено" "Bluetooth е исклучен" diff --git a/packages/SystemUI/res/values-mk/strings_car.xml b/packages/SystemUI/res/values-mk/strings_car.xml index f5ed824259892d583876cc355df9ece76128872d..8889bd3929e783b9217c53d960e760b04ed3507a 100644 --- a/packages/SystemUI/res/values-mk/strings_car.xml +++ b/packages/SystemUI/res/values-mk/strings_car.xml @@ -19,6 +19,5 @@ - "Возете безбедно" - "Секогаш бидете известени за условите за возење и почитувајте ги важечките закони. Насоките може да бидат неточни, нецелосни, опасни, несоодветни, забранети или да вклучуваат премин преку административни области. Бизнис информациите исто така може да бидат неточни или нецелосни. Податоците не се даваат во реално време и не може да се гарантира точноста на локацијата. Не ракувајте со вашиот мобилен уред и не користете апликации што не се наменети за Android Auto додека возите." + "Непознато" diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index cc16c772ec8cc38385bb0bd2c78c60563821a57c..cd130868aa0521dfdceb2155e65262ad2d00eaf4 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -50,7 +50,7 @@ "അറിയിപ്പുകൾ" "ബ്ലൂടൂത്ത് ടെതർ ചെയ്‌തു" "ടൈപ്പുചെയ്യൽ രീതികൾ സജ്ജീകരിക്കുക" - "ഭൗതിക കീബോർഡ്" + "ഫിസിക്കൽ കീബോർഡ്" "USB ഉപകരണം ആക്‌സസ്സ് ചെയ്യാൻ %1$s എന്ന അപ്‌ളിക്കേഷനെ അനുവദിക്കണോ?" "USB ആക്‌സസ്സറി ആക്‌സസ്സുചെയ്യാൻ %1$s എന്ന അപ്ലിക്കേഷനെ അനുവദിക്കണോ?" "ഈ USB ഉപകരണം കണക്റ്റുചെയ്‌തിരിക്കുമ്പോൾ %1$s തുറക്കണോ?" @@ -152,14 +152,12 @@ "Edge" "വൈഫൈ" "സിം ഇല്ല." - - - - - - + "മൊബൈൽ ഡാറ്റ" + "മൊബൈൽ ഡാറ്റ ഓണാണ്" + "മൊബൈൽ ഡാറ്റ ഓഫാണ്" "ബ്ലൂടൂത്ത് ടെതറിംഗ്." "ഫ്ലൈറ്റ് മോഡ്." + "VPN ഓണാണ്." "SIM കാർഡൊന്നുമില്ല." "കാരിയർ നെറ്റ്‌വർക്ക് മാറ്റൽ." "ബാറ്ററി വിശദാംശങ്ങൾ തുറക്കുക" @@ -242,11 +240,9 @@ "ചാർജ്ജുചെയ്യുന്നു" "2G-3G ഡാറ്റ താൽക്കാലികമായി നിർത്തി" "4G ഡാറ്റ താൽക്കാലികമായി നിർത്തി" - - + "മൊബൈൽ ഡാറ്റ തല്‍ക്കാലം നിര്‍ത്തിയിരിക്കുന്നു" "ഡാറ്റ താൽക്കാലികമായി നിർത്തി" - - + "നിങ്ങൾ സജ്ജമാക്കിയ ഡാറ്റ പരിധി എത്തിക്കഴിഞ്ഞു. ഇനിയങ്ങോട്ട് നിങ്ങൾക്ക് മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കാൻ സാധിക്കുകയില്ല.\n\nതുടരുകയാണെങ്കിൽ, ഡാറ്റാ ഉപയോഗത്തിന് നിരക്കുകൾ ബാധകമായേക്കാം." "പുനരാരംഭിക്കുക" "ഇന്റർനെറ്റ് കണക്ഷൻ ഇല്ല" "വൈഫൈ കണക്‌റ്റുചെയ്‌തു" @@ -319,8 +315,7 @@ "ഹോട്ട്‌സ്‌പോട്ട്" "അറിയിപ്പുകൾ" "ടോർച്ച്" - - + "മൊബൈൽ ഡാറ്റ" "ഡാറ്റ ഉപയോഗം" "ശേഷിക്കുന്ന ഡാറ്റ" "പരിധി കഴിഞ്ഞു" @@ -433,8 +428,7 @@ "%1$s ആപ്പിലേക്ക് ഔദ്യോഗിക പ്രൊഫൈൽ കണക്റ്റുചെയ്തിരിക്കുന്നു" "%1$s ആപ്പിലേക്ക് വ്യക്തിഗത പ്രൊഫൈൽ കണക്റ്റുചെയ്തിരിക്കുന്നു" "%1$s ആപ്പിലേക്ക് ഉപകരണം കണക്റ്റുചെയ്തിരിക്കുന്നു" - - + "ഉപകരണ മാനേജ്‌മെന്റ്" "പ്രൊഫൈൽ നിരീക്ഷിക്കൽ" "നെറ്റ്‌വർക്ക് നിരീക്ഷിക്കൽ" "VPN" @@ -443,18 +437,14 @@ "VPN പ്രവർത്തനരഹിതമാക്കുക" "VPN വിച്‌ഛേദിക്കുക" "നയങ്ങൾ കാണുക" - - - - + "നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നത് %1$s എന്ന സ്ഥാപനമാണ്. \n\nക്രമീകരണം, കോർപ്പറേറ്റ് ആക്‌സസ്, ആപ്പുകൾ, നിങ്ങളുടെ ഉപകരണവുമായി ബന്ധപ്പെട്ട ഡാറ്റ, ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ‌വിവരങ്ങൾ എന്നിവ കൈകാര്യം ചെയ്യാനും നിരീക്ഷിക്കാനും നിങ്ങളുടെ അഡ്‌മിന് കഴിയും.\n\nകൂടുതൽ വിവരങ്ങൾക്ക് നിങ്ങളുടെ അഡ്‌മിനെ ബന്ധപ്പെടുക." + "നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നത് നിങ്ങളുടെ സ്ഥാപനമാണ്.\n\nക്രമീകരണം, കോർപ്പറേറ്റ് ആക്‌സസ്, ആപ്പുകൾ, നിങ്ങളുടെ ഉപകരണവുമായി ബന്ധപ്പെട്ട ഡാറ്റ, ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ‌വിവരങ്ങൾ എന്നിവ കൈകാര്യം ചെയ്യാനും നിരീക്ഷിക്കാനും നിങ്ങളുടെ അഡ്‌മിന് കഴിയും.\n\nകൂടുതൽ വിവരങ്ങൾക്ക് നിങ്ങളുടെ അഡ്‌മിനെ ബന്ധപ്പെടുക." "ഈ ഉപകരണത്തിൽ നിങ്ങളുടെ സ്ഥാപനമൊരു സർട്ടിഫിക്കറ്റ് അതോറിറ്റി ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്നു. നിങ്ങളുടെ സുരക്ഷിത നെറ്റ്‌വർക്ക് ട്രാഫിക്ക് നിരീക്ഷിക്കപ്പെടുകയോ പരിഷ്കരിക്കപ്പെടുയോ ചെയ്തേക്കാം." "നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലിൽ നിങ്ങളുടെ സ്ഥാപനമൊരു സർട്ടിഫിക്കറ്റ് അതോറിറ്റി ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്നു. നിങ്ങളുടെ സുരക്ഷിത നെറ്റ്‌വർക്ക് ട്രാഫിക്ക് നിരീക്ഷിക്കപ്പെടുകയോ പരിഷ്കരിക്കപ്പെടുയോ ചെയ്തേക്കാം." "നിങ്ങളുടെ ഉപകരണത്തിൽ ഒരു സർട്ടിഫിക്കറ്റ് അതോറിറ്റി ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്നു. നിങ്ങളുടെ സുരക്ഷിത നെറ്റ്‌വർക്ക് ട്രാഫിക്ക് നിരീക്ഷിക്കപ്പെടുകയോ പരിഷ്കരിക്കപ്പെടുയോ ചെയ്തേക്കാം." "നിങ്ങളുടെ അഡ്‌മിൻ, നെറ്റ്‌വർക്ക് ലോഗിംഗ് ഓണാക്കിയിട്ടുണ്ട്, ഇതിന് നിങ്ങളുടെ ഉപകരണത്തിലെ ട്രാഫിക്ക് നിരീക്ഷിക്കാൻ കഴിയും." - - - - + "നിങ്ങൾ %1$s എന്ന ആപ്പിലേക്ക് കണക്റ്റുചെയ്‌തിരിക്കുന്നു, ഇമെയിലുകൾ, ആപ്പുകൾ, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ നെറ്റ്‌വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാൻ ഈ ആപ്പിന് കഴിയും." + "നിങ്ങൾ %1$s, %2$s എന്നീ ആപ്പുകളിലേക്ക് കണക്റ്റുചെയ്‌തിരിക്കുന്നു, ഇമെയിലുകൾ, ആപ്പുകൾ, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ നെറ്റ്‌വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാൻ ഈ ആപ്പിന് കഴിയും." "%1$s ആപ്പിലേക്ക് നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ കണക്റ്റുചെയ്‌തിരിക്കുന്നു, ഇമെയിലുകൾ, ആപ്‌സ്, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ നെറ്റ്‌വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാൻ ഈ ആപ്പിന് കഴിയും." "%1$s ആപ്പിലേക്ക് നിങ്ങളുടെ വ്യക്തിഗത പ്രൊഫൈൽ കണക്റ്റുചെയ്‌തിരിക്കുന്നു, ഇമെയിലുകൾ, ആപ്പുകൾ, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ നെറ്റ്‌വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാൻ ഈ ആപ്പിന് കഴിയും." "നിങ്ങളുടെ ഉപകരണം മാനേജുചെയ്യുന്നത് %1$s ആണ്." @@ -476,6 +466,8 @@ "നിങ്ങൾ %1$s ആപ്പിലേക്ക് കണക്റ്റുചെയ്‌തിരിക്കുന്നു, ഇമെയിലുകൾ, ആപ്‌സ്, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നെറ്റ്‌വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാൻ ഈ ആപ്പിന് കഴിയും." "%1$s ആണ് നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ മാനേജുചെയ്യുന്നത്. %2$s ആപ്പിലേക്ക് പ്രൊഫൈൽ കണക്റ്റുചെയ്‌തിരിക്കുന്നു, അതിന് ഇമെയിലുകൾ, ആപ്പുകൾ, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ ഔദ്യോഗിക നെറ്റ്‌വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാനാകും.\n\nകൂടുതൽ വിവരങ്ങൾക്ക് നിങ്ങളുടെ അഡ്‌മിനെ ബന്ധപ്പെടുക." "%1$s ആണ് നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ മാനേജുചെയ്യുന്നത്. %2$s ആപ്പിലേക്ക് പ്രൊഫൈൽ കണക്റ്റുചെയ്‌തിരിക്കുന്നു, അതിന് ഇമെയിലുകൾ, ആപ്പുകൾ, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ ഔദ്യോഗിക നെറ്റ്‌വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാനാകും.\n\n%3$s ആപ്പിലേക്കും നിങ്ങൾ കണക്റ്റുചെയ്‌തിരിക്കുന്നു, അതിന് നിങ്ങളുടെ വ്യക്തിഗത നെറ്റ്‌വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാനാകും." + + "നിങ്ങൾ സ്വമേധയാ അൺലോക്കുചെയ്യുന്നതുവരെ ഉപകരണം ലോക്കുചെയ്‌തതായി തുടരും" "അറിയിപ്പുകൾ വേഗത്തിൽ സ്വീകരിക്കുക" "അൺലോക്കുചെയ്യുന്നതിന് മുമ്പ് അവ കാണുക" @@ -569,12 +561,9 @@ %1$s, %2$s എന്നിവയും മറ്റ് %3$d എണ്ണവും %1$s, %2$s എന്നിവയും മറ്റ് %3$d എണ്ണവും - - - - - - + "%1$s ആപ്പിന്റെ അറിയിപ്പ് നിയന്ത്രണങ്ങൾ തുറന്നു" + "%1$s ആപ്പിന്റെ അറിയിപ്പ് നിയന്ത്രണങ്ങൾ അടച്ചു" + "ഈ ചാനലിൽ നിന്നുള്ള അറിയിപ്പുകൾ അനുവദിക്കുക" "എല്ലാ വിഭാഗങ്ങളും" "കൂടുതൽ ക്രമീകരണം" "ഇഷ്ടാനുസൃതമാക്കുക: %1$s" @@ -712,6 +701,8 @@ "%1$s അറിയിപ്പ്: %2$s" "സ്പ്ലിറ്റ്-സ്ക്രീനിനൊപ്പം ആപ്പ് പ്രവർത്തിച്ചേക്കില്ല." "സ്പ്ലിറ്റ്-സ്ക്രീനിനെ ആപ്പ് പിന്തുണയ്ക്കുന്നില്ല." + "രണ്ടാം ഡിസ്‌പ്ലേയിൽ ആപ്പ് പ്രവർത്തിച്ചേക്കില്ല." + "രണ്ടാം ഡിസ്‌പ്ലേകളിൽ സമാരംഭിക്കുന്നത് ആപ്പ് അനുവദിക്കുന്നില്ല." "ക്രമീകരണം തുറക്കുക." "ദ്രുത ക്രമീകരണം തുറക്കുക." "ദ്രുത ക്രമീകരണം അടയ്ക്കുക." @@ -730,14 +721,10 @@ "\'ചിത്രത്തിനുള്ളിൽ ചിത്രം\' മെനു" "%s ചിത്രത്തിനുള്ളിലെ ചിത്രത്തിലാണ്" "%s ഈ ഫീച്ചർ ഉപയോഗിക്കുന്നതിൽ നിങ്ങൾക്ക് താൽപ്പര്യമില്ലെങ്കിൽ, ടാപ്പുചെയ്‌ത് ക്രമീകരണം തുറന്ന് അത് ഓഫാക്കുക." - - - - - - - - + "പ്ലേ ചെയ്യുക" + "താൽക്കാലികമായി നിർത്തുക" + "അടുത്തതിലേക്ക് പോകുക" + "മുമ്പത്തേതിലേക്ക് പോകുക" "ചൂട് കൂടിയതിനാൽ ഫോൺ ഓഫാക്കി" "ഫോൺ ഇപ്പോൾ സാധാരണഗതിയിൽ പ്രവർത്തിക്കുന്നു" "ഫോൺ ചൂടായിരിക്കുന്നതിനാൽ തണുക്കാൻ ഓഫാക്കിയിരിക്കുന്നു. ഫോൺ ഇപ്പോൾ സാധാരണഗതിയിൽ പ്രവർത്തിക്കുന്നു.\n\nഫോണിന് ചൂട് കൂടാൻ കാരണം:\n • ഗെയിമിംഗ്, വീഡിയോ അല്ലെങ്കിൽ നാവിഗേഷൻ തുടങ്ങിയ റിസോഴ്സ്-ഇന്റൻസീവായ ആപ്പുകൾ ഉപയോഗിക്കുന്നത്\n • വലിയ ഫയലുകൾ അപ്‌ലോഡോ ഡൗൺലോഡോ ചെയ്യുന്നത്\n • ഉയർന്ന താപനിലയിൽ ഫോൺ ഉപയോഗിക്കുന്നത്" @@ -765,8 +752,7 @@ "ഇൻസ്റ്റന്റ് ആപ്പ്" "ഇൻസ്‌റ്റ‌ന്റ് ആപ്പിന് ഇൻസ്‌റ്റലേഷൻ ആവശ്യമില്ല." "ആപ്പ് വിവരം" - - + "വെബിൽ പോവുക" "മൊബൈൽ ഡാറ്റ" "വൈഫൈ ഓഫാണ്" "Bluetooth ഓഫാണ്" diff --git a/packages/SystemUI/res/values-ml/strings_car.xml b/packages/SystemUI/res/values-ml/strings_car.xml index b53029ca5e5d5b8e6b5eb0355bab9de0d4a9bbcc..e47212324237bab74349d7aa1c89074a38924228 100644 --- a/packages/SystemUI/res/values-ml/strings_car.xml +++ b/packages/SystemUI/res/values-ml/strings_car.xml @@ -19,6 +19,5 @@ - "സുരക്ഷിതമായി ഡ്രൈവ് ചെയ്യുക" - "ഡ്രൈവിംഗ് സാഹചര്യങ്ങളെ കുറിച്ച് നല്ലവണ്ണം അറിഞ്ഞുവയ്ക്കുക, എല്ലായ്പ്പോഴും ബാധകമായ നിയമങ്ങൾ അനുസരിക്കുക. ദിശാസൂചനകൾ കൃത്യമല്ലാത്തതും അപൂർണ്ണവും അപകടകരവും അനുയോജ്യമല്ലാത്തതും നിരോധിക്കപ്പെട്ടതും അഡ്‌മിനിസ്ട്രേറ്റീവ് ഏരിയകൾ അതിലംഘിച്ച് പോകേണ്ടതുമായിരിക്കാം. വിവരങ്ങൾ തത്സമയം എടുത്തിട്ടുള്ളതല്ല, അതിനാൽ ലൊക്കേഷൻ കൃത്യത ഉറപ്പാക്കാൻ കഴിയില്ല. ഡ്രൈവ് ചെയ്യുന്ന സമയത്ത് മൊബൈൽ ഉപകരണങ്ങളോ Android Auto-യ്ക്കായി ഉദ്ദേശിക്കപ്പെട്ടിട്ടില്ലാത്ത ആപ്‌സോ കൈകാര്യം ചെയ്യരുത്" + "അറിഞ്ഞുകൂടാത്തത്" diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 26bd51c088d13b9988ce0d15549d593ac4778802..6e2331316ff5d2f9074b81b95f3940c536af9364 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -150,14 +150,12 @@ "Edge" "Wi-Fi" "SIM байхгүй." - - - - - - + "Мобайл дата" + "Мобайл дата асаалттай байна" + "Мобайл дата унтраалттай байна" "Bluetooth модем болж байна." "Нислэгийн горим" + "VPN асаалттай байна." "SIM карт байхгүй." "Дамжуулагч сүлжээг өөрчилж байна." "Тэжээлийн дэлгэрэнгүй мэдээллийг нээх" @@ -240,11 +238,9 @@ "Цэнэглэж байна" "2G-3G дата-г түр зогсоосон байна" "4G дата-г түр зогсоосон байна" - - + "Мобайл датаг түр зогсоосон" "Дата-г түр зогсоосон байна" - - + "Таны тогтоосон датаны хязгаарт хүрсэн тул мобайл дата ашиглалт зогссон байна.\n\nҮргэлжлүүлсэн тохиолдолд дата ашиглалтын төлбөр гарна." "Үргэлжлүүлэх" "Интернет холболт байхгүй" "Wi-Fi холбогдсон" @@ -317,8 +313,7 @@ "Сүлжээний цэг" "Мэдэгдэл" "Гар чийдэн" - - + "Мобайл дата" "Дата ашиглалт" "Үлдсэн дата" "Хязгаараас хэтэрсэн" @@ -431,8 +426,7 @@ "Ажлын профайл %1$s-д холбогдсон" "Хувийн профайл %1$s-д холбогдсон байна" "Төхөөрөмж %1$s-д холбогдсон байна" - - + "Төхөөрөмжийн удирдлага" "Профайл хяналт" "Сүлжээний хяналт" "VPN" @@ -441,18 +435,14 @@ "VPN идэвхгүйжүүлэх" "VPN таслах" "Удирдамж харах" - - - - + "Таны төхөөрөмжийг %1$s удирддаг.\n\nТаны админ тохиргоо, байгууллагын хандалт, апп, таны төхөөрөмжтэй холбоотой өгөгдөл, төхөөрөмжийн байршлын мэдээллийг хянаж, удирдах боломжтой.\n\nДэлгэрэнгүй мэдээлэл авах бол админтайгаа холбогдоно уу." + "Таны төхөөрөмжийг байгууллага тань удирддаг.\n\nТаны админ тохиргоо, байгууллагын хандалт, апп, таны төхөөрөмжтэй холбоотой өгөгдөл, төхөөрөмжийн байршлын мэдээллийг хянаж, удирдах боломжтой.\n\nДэлгэрэнгүй мэдээлэл авах бол админтайгаа холбогдоно уу." "Таны байгууллага энэ төхөөрөмжид сертификатын зөвшөөрлийг суулгасан байна. Таны аюулгүй сүлжээний ачааллыг өөрчлөх эсвэл хянах боломжтой." "Таны байгууллага таны ажлын профайлд сертификатын зөвшөөрөл суулгасан байна. Таны аюулгүй сүлжээний ачааллыг өөрчлөх эсвэл хянах боломжтой." "Сертификатын зөвшөөрлийг энэ төхөөрөмжид суулгасан байна. Таны аюулгүй сүлжээний ачааллыг өөрчлөх эсвэл хянах боломжтой." "Таны админ төхөөрөмжийн ачааллыг хянадаг сүлжээний логийг асаасан байна." - - - - + "Та имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой %1$s-д холбогдсон байна." + "Та имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой %1$s, %2$s-д холбогдсон байна." "Таны ажлын профайл %1$s-д холбогдсон байна. Энэ нь таны имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой." "Таны хувийн профайлыг имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой %1$s-д холбосон байна." "Таны төхөөрөмжийг %1$s удирддаг." @@ -474,6 +464,8 @@ "Та имэйл, апп, вэб хуудас зэрэг хувийн сүлжээнийхээ үйл ажиллагааг хянах боломжтой %1$s-д холбогдсон байна." "Таны ажлын профайлыг %1$s удирддаг. Энэ нь таны имэйл, апп, вэб хуудас зэрэг ажлын сүлжээний үйл ажиллагааг хянах боломжтой %2$s-д холбогдсон. \n\nДэлгэрэнгүй мэдээллийг авахын тулд админтай холбогдоно уу." "Таны ажлын профайлыг %1$s удирддаг. Энэ нь таны имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой %2$s-тай холбогдсон. \n\nМөн таны сүлжээний хувийн үйл ажиллагааг хянах боломжтой %3$s-д холбогдсон байна." + + "Таныг гараар нээх хүртэл төхөөрөмж түгжээтэй байх болно" "Мэдэгдлийг хурдан авах" "Түгжээг тайлахын өмнө үзнэ үү" @@ -569,12 +561,9 @@ %1$s, %2$s, бусад %3$d %1$s, %2$s, бусад %3$d - - - - - - + "%1$s-н мэдэгдлийн хяналтыг нээсэн" + "%1$s-н мэдэгдлийн хяналтыг хаасан" + "Энэ сувгийн мэдэгдлийг зөвшөөрөх" "Бүх ангилал" "Бусад тохиргоо" "Өөрчлөх: %1$s" @@ -712,6 +701,8 @@ "%1$s мэдэгдэл: %2$s" "Апп хуваагдсан дэлгэцэд ажиллахгүй." "Энэ апп нь дэлгэц хуваах тохиргоог дэмждэггүй." + "Апп хоёрдогч дэлгэцэд ажиллахгүй." + "Аппыг хоёрдогч дэлгэцэд эхлүүлэх боломжгүй." "Тохиргоог нээнэ үү." "Хурдан тохиргоог нээнэ үү." "Хурдан тохиргоог хаана уу." @@ -730,14 +721,10 @@ "Зургийн цэсэнд байгаа зураг" "%s зураг доторх зурганд байна" "Та %s-г энэ онцлогийг ашиглахыг хүсэхгүй байвал тохиргоог нээгээд, үүнийг унтраана уу." - - - - - - - - + "Тоглуулах" + "Түр зогсоох" + "Дараагийн медиад очих" + "Өмнөх медиад очих" "Халснаас үүдэн утас унтарсан" "Таны утас одоо хэвийн ажиллаж байна" "Таны утас хэт халсан тул хөргөхөөр унтраасан болно. Таны утас одоо хэвийн ажиллаж байна.\n\nХэрэв та дараахыг хийвэл таны утас хэт халж болзошгүй:\n • Их хэмжээний нөөц хэрэглээний апп (тоглоом, видео эсвэл шилжилтийн апп зэрэг)\n • Багтаамж ихтэй файл татах, байршуулах\n • Утсаа өндөр температурт ашиглах" @@ -765,8 +752,7 @@ "Шуурхай апп" "Шуурхай аппыг суулгах шаардлагагүй." "Апп-н мэдээлэл" - - + "Вэбэд очих" "Мобайл дата" "Wi-Fi унтраалттай байна" "Bluetooth унтраалттай байна" diff --git a/packages/SystemUI/res/values-mn/strings_car.xml b/packages/SystemUI/res/values-mn/strings_car.xml index d48580fbc00a3f72bff44d4134cbe31a3957196c..d5d359847ee83127885c1717fc210202a063f62c 100644 --- a/packages/SystemUI/res/values-mn/strings_car.xml +++ b/packages/SystemUI/res/values-mn/strings_car.xml @@ -19,6 +19,5 @@ - "Жолооны аюулгүй байдал" - "Жолоодох нөхцөлийн талаар бүрэн ойлгож, холбогдох дүрэм журмыг мөрдөөрэй. Чиглэл нь тодорхой бус, гүйцэт бус, аюултай, тохиромжгүй, хориглосон эсвэл тусгай хамгаалалттай газар нутагт нэвтэрсэн байж болзошгүй. Бизнесийн мэдээлэл мөн адил тохиромжгүй эсвэл гүйцэт бус байна. Өгөгдөл нь тухайн цаг хугацааных биш учир байршлыг зөв тодорхойлсон эсэхийг батлах боломжгүй. Жолоодож байхдаа гар утсаа болон Android Автод зориулаагүй апп-г бүү ашиглаарай." + "Тодорхойгүй" diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 2b16ff10fcfe99a1a747fb64f2a9cbd5b7920d30..ce7bc5e4de901683bc16ae604c34284be6058f86 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -152,14 +152,12 @@ "Edge" "वाय-फाय" "सिम नाही." - - - - - - + "मोबाइल डेटा" + "मोबाइल डेटा चालू आहे" + "मोबाइल डेटा बंद आहे" "ब्लूटुथ टिथरिंग." "विमान मोड." + "VPN चालू." "सिम कार्ड नाही." "वाहक नेटवर्क बदलणे." "बॅटरी तपशील उघडा" @@ -242,11 +240,9 @@ "चार्ज होत आहे" "2G-3G डेटास विराम दिला आहे" "4G डेटास विराम दिला आहे" - - + "मोबाइल डेटा थांबवला आहे" "डेटास विराम दिला आहे" - - + "आपण सेट केलेली डेटा मर्यादा संपली. आता आपले मोबाइल डेटा वापरणे बंद आहे.\n\nआपण ते पुन्हा सुरू केल्यास, डेटा वापरासाठी शुल्क लागू होईल." "पुन्हा सुरु करा" "इंटरनेट कनेक्शन नाही" "वाय-फाय कनेक्ट केले" @@ -319,8 +315,7 @@ "हॉटस्पॉट" "सूचना" "फ्लॅशलाइट" - - + "मोबाइल डेटा" "डेटा वापर" "शिल्लक डेटा" "मर्यादेबाहेर" @@ -433,8 +428,7 @@ "कार्य प्रोफाइल %1$s शी कनेक्ट केलेले आहे" "वैयक्तिक प्रोफाइल %1$s शी कनेक्ट केलेले आहे" "डिव्हाइस %1$s शी कनेक्ट केलेले आहे" - - + "डिव्हाइस व्‍यवस्‍थापन" "प्रोफाईल परीक्षण" "नेटवर्क परीक्षण" "VPN" @@ -443,18 +437,14 @@ "VPN अक्षम करा" "VPN डिस्कनेक्ट करा" "धोरणे पहा" - - - - + "तुमचे डिव्हाइस %1$s व्‍यवस्‍थापित करते.\n\nतुमचा प्रशासक सेटिंग्ज, कॉर्पोरेट अॅक्सेस, अॅप्स, आपल्या डिव्हाइसशी संबंधित डेटा आणि आपल्या डिव्हाइसच्या ठिकाणाची माहिती मॉनिटर करू आणि व्‍यवस्‍थापित करू शकतो.\n\nआणखी माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा." + "तुमचे डिव्हाइस तुमची संस्‍था व्‍यवस्‍थापित करते.\n\nतुमचा प्रशासक सेटिंग्ज, कॉर्पोरेट अॅक्सेस, अॅप्स, आपल्या डिव्हाइसशी संबंधित डेटा आणि आपल्या डिव्हाइसच्या ठिकाणाची माहिती मॉनिटर करू आणि व्‍यवस्‍थापित करू शकतो.\n\nआणखी माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा." "आपल्या संस्थेने या डिव्हाइसवर प्रमाणपत्र अधिकार स्थापित केला आहे. आपल्या सुरक्षित नेटवर्क रहदारीचे परीक्षण केले जाऊ शकते किंवा ती सुधारली जाऊ शकते." "आपल्या संस्थेने आपल्या कार्य प्रोफाइलवर प्रमाणपत्र अधिकार स्थापित केला आहे. आपल्या सुरक्षित नेटवर्क रहदारीचे परीक्षण केले जाऊ शकते किंवा ती सुधारली जाऊ शकते." "या डिव्हाइसवर प्रमाणपत्र अधिकार स्थापित केला आहे. आपल्या सुरक्षित नेटवर्क रहदारीचे परीक्षण केले जाऊ शकते किंवा ती सुधारली जाऊ शकते." "आपल्या प्रशासकाने नेटवर्क लॉगिंग चालू केले आहे, जे आपल्या डिव्हाइसवरील रहदारीचे परीक्षण करते." - - - - + "तुम्‍ही %1$s शी कनेक्‍ट केले आहे, जे ईमेल, अ‍ॅप्स आणि वेबसाइटसहित आपल्‍या नेटवर्क क्रिया मॉनिटर करू शकते." + "तुम्‍ही %1$s आणि %2$s शी कनेक्‍ट केले आहे, जे ईमेल, अ‍ॅप्स आणि वेबसाइटसहित आपल्‍या नेटवर्क क्रिया मॉनिटर करू शकते." "आपले कार्य प्रोफाइल %1$s शी कनेक्‍ट केले आहे, जे ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्‍या नेटवर्क क्रियाकलापाचे परीक्षण करू शकते." "आपले वैयक्तिक प्रोफाइल %1$s शी कनेक्‍ट केले आहे, जे ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्‍या नेटवर्क क्रियाकलापाचे परीक्षण करू शकते." "आपले डिव्हाइस %1$s ने व्यवस्थापित केले आहे." @@ -476,6 +466,8 @@ "आपण %1$s शी कनेक्‍ट केले आहे, जो ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्‍या वैयक्तिक नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो." "आपले कार्य प्रोफाइल %1$s द्वारे व्यवस्थापित केले जाते. प्रोफाइल %2$s शी कनेक्‍ट केले आहे, जे ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्‍या कार्य नेटवर्क क्रियाकलापाचे परीक्षण करू शकते.\n\nअधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा." "आपले कार्य प्रोफाइल %1$s द्वारे व्यवस्थापित केले जाते. प्रोफाइल %2$s शी कनेक्‍ट केले आहे, जे ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्‍या कार्य नेटवर्क क्रियाकलापाचे परीक्षण करू शकते.\n\nआपण %3$s शीदेखील कनेक्‍ट केले आहे, जे आपल्या वैयक्तिक नेटवर्क क्रियाकलापाचे परीक्षण करू शकते." + + "आपण व्यक्तिचलितपणे अनलॉक करेपर्यंत डिव्हाइस लॉक केलेले राहील" "सूचना अधिक जलद मिळवा" "आपण अनलॉक करण्‍यापूर्वी त्यांना पहा" @@ -552,10 +544,10 @@ "सर्व सूचना अवरोधित करा" "शांत करू नका" "शांत किंवा अवरोधित करू नका" - "उर्जा सूचना नियंत्रणे" + "पॉवर सूचना नियंत्रणे" "चालू" "बंद" - "उर्जा सूचना नियंत्रणांसह, आपण अॅपच्या सूचनांसाठी महत्त्व स्तर 0 ते 5 पर्यंत सेट करू शकता. \n\n""स्तर 5"" \n- सूचना सूचीच्या शीर्षस्थानी दर्शवा \n- पूर्ण स्क्रीन व्यत्ययास अनुमती द्या \n- नेहमी डोकावून पहा \n\n""स्तर 4"" \n- पूर्ण स्क्रीन व्यत्ययास प्रतिबंधित करा \n- नेहमी डोकावून पहा \n\n""स्तर 3"" \n- पूर्ण स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n\n""स्तर 2"" \n- पूर्ण स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n- कधीही ध्वनी किंवा कंपन करू नका \n\n""स्तर 1"" \n- पूर्ण स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n- कधीही ध्वनी किंवा कंपन करू नका \n- लॉक स्क्रीन आणि स्टेटस बार मधून लपवा \n- सूचना सूचीच्या तळाशी दर्शवा \n\n""स्तर 0"" \n- अॅपमधील सर्व सूचना अवरोधित करा" + "पॉवर सूचना नियंत्रणांसह, आपण अॅपच्या सूचनांसाठी महत्त्व स्तर 0 ते 5 पर्यंत सेट करू शकता. \n\n""स्तर 5"" \n- सूचना सूचीच्या शीर्षस्थानी दर्शवा \n- पूर्ण स्क्रीन व्यत्ययास अनुमती द्या \n- नेहमी डोकावून पहा \n\n""स्तर 4"" \n- पूर्ण स्क्रीन व्यत्ययास प्रतिबंधित करा \n- नेहमी डोकावून पहा \n\n""स्तर 3"" \n- पूर्ण स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n\n""स्तर 2"" \n- पूर्ण स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n- कधीही ध्वनी किंवा कंपन करू नका \n\n""स्तर 1"" \n- पूर्ण स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n- कधीही ध्वनी किंवा कंपन करू नका \n- लॉक स्क्रीन आणि स्टेटस बार मधून लपवा \n- सूचना सूचीच्या तळाशी दर्शवा \n\n""स्तर 0"" \n- अॅपमधील सर्व सूचना अवरोधित करा" "सूचना" "आपल्याला यापुढे या सूचना प्राप्त होणार नाहीत." "%d सूचना श्रेण्या" @@ -569,12 +561,9 @@ %1$s, %2$s, आणि %3$d इतर %1$s, %2$s, आणि %3$d इतर - - - - - - + "%1$s साठी सूचना नियंत्रणे खुली आहेत" + "%1$s साठी सूचना नियंत्रणे बंद आहेत" + "या चॅनेलकडील सूचनांना मान्यता द्या" "सर्व श्रेण्या" "अधिक सेटिंग्ज" "सानुकूल करा: %1$s" @@ -712,6 +701,8 @@ "%1$s सूचना: %2$s" "अॅप कदाचित विभाजित-स्क्रीनसह कार्य करू शकत नाही." "अॅप स्क्रीन-विभाजनास समर्थन देत नाही." + "दुय्यम डिस्प्लेवर अ‍ॅप कदाचित चालणार नाही." + "दुय्यम डिस्प्लेंवर अ‍ॅप लाँचचे समर्थन करत नाही." "सेटिंग्ज उघडा." "जलद सेटिंग्ज उघडा." "जलद सेटिंग्ज बंद करा." @@ -730,14 +721,10 @@ "चित्र मेनूमधील चित्र" "%s चित्रामध्ये चित्र मध्ये आहे" "%s ने हे वैशिष्ट्य वापरू नये असे आपल्याला वाटत असल्यास, टॅप करून सेटिंग्ज उघडा आणि ते बंद करा." - - - - - - - - + "प्ले करा" + "थांबवा" + "डावलून पुढे जा" + "डावलून मागे जा" "तापल्‍यामुळे फोन बंद झाला" "आपला फोन आता व्‍यवस्थित चालू आहे" "आपला फोन खूप तापलाय, म्हणून तो थंड होण्यासाठी बंद झाला आहे. आपला फोन आता व्‍यवस्थित चालू आहे.\n\nआपण असे केल्यास आपला फोन खूप तापेल:\n •संसाधन केंद्रित अॅप वापरणे (गेमिंग, व्हिडिओ किंवा नेव्हिगेशन अॅप यासारखे)\n •मोठ्या फायली डाउनलोड किंवा अपलोड करणे\n •उच्च तापमानामध्ये आपला फोन वापरणे" @@ -765,8 +752,7 @@ "इन्सटंट अ‍ॅप्स" "इन्सटंट अॅप्सना स्थापनेची आवश्यकता नसते." "अॅप माहिती" - - + "वेबवर जा" "मोबाइल डेटा" "वाय-फाय बंद आहे" "ब्लूटुथ बंद आहे" diff --git a/packages/SystemUI/res/values-mr/strings_car.xml b/packages/SystemUI/res/values-mr/strings_car.xml index 7dc5d178bdcd82846844eb42d49509589ce715a8..a7a43790349ad07afea68c984ebc15dfe326843c 100644 --- a/packages/SystemUI/res/values-mr/strings_car.xml +++ b/packages/SystemUI/res/values-mr/strings_car.xml @@ -19,6 +19,5 @@ - "सुरक्षितपणे वाहन चालवा" - "वाहन चालविण्‍याच्या शर्तींची पूर्णपणे माहिती असू द्या आणि नेहमी लागू असलेल्या कायद्यांचे पालन करा. दिशानिर्देश कदाचित चुकीचे, अपूर्ण, धोकादायक, अनुकूल नसलेले, प्रतिबंधित किंवा प्रशासकीय क्षेत्रांना ओलांडणारे असू शकतात. व्यवसाय माहिती देखील चुकीची किंवा अपूर्ण असू शकते. डेटा हा रिअल-टाइम नसतो आणि स्थान अचूकतेची हमी दिली जाऊ शकत नाही. वाहन चालविताना Android Auto च्या उद्देशासाठी नसलेले आपले मोबाईल डिव्हाइस हाताळू नका किंवा अॅप्स वापरू नका." + "अज्ञात" diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 2241227d8da610c7ee2da65474c20e8ade3f5de0..59fee4c38f6a65e164fb74b7246eaa38623ebecc 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -152,14 +152,12 @@ "Edge" "Wi-Fi" "Tiada SIM." - - - - - - + "Data Mudah Alih" + "Data Mudah Alih Dihidupkan" + "Data Mudah Alih Dimatikan" "Penambatan Bluetooth." "Mod pesawat" + "VPN dihidupkan." "Tiada kad SIM." "Perubahan rangkaian pembawa." "Buka butiran bateri" @@ -242,11 +240,9 @@ "Mengecas" "Data 2G-3G dijeda" "Data 4G dijeda" - - + "Data mudah alih dijeda" "Data dijeda" - - + "Had data yang anda tetapkan telah dicapai. Anda tidak lagi menggunakan data mudah alih.\n\nJika anda menyambung semula, caj mungkin digunakan untuk penggunaan data." "Sambung semula" "Tiada smbg Internet" "Wi-Fi disambungkan" @@ -319,8 +315,7 @@ "Tempat liputan" "Pemberitahuan" "Lampu suluh" - - + "Data mudah alih" "Penggunaan data" "Baki data" "Melebihi had" @@ -433,8 +428,7 @@ "Profil kerja dihubungkan ke %1$s" "Profil peribadi dihubungkan ke %1$s" "Peranti dihubungkan ke %1$s" - - + "Pengurusan peranti" "Pemantauan profil" "Pemantauan rangkaian" "VPN" @@ -443,18 +437,14 @@ "Lumpuhkan VPN" "Putuskan sambungan VPN" "Lihat Dasar" - - - - + "Peranti anda diurus oleh %1$s.\n\nPentadbir anda boleh memantau dan mengurus tetapan, akses korporat, apl, data yang dikaitkan dengan peranti serta maklumat lokasi peranti anda.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda." + "Peranti anda diurus oleh organisasi.\n\nPentadbir anda boleh memantau dan mengurus tetapan, akses korporat, apl, data yang dikaitkan dengan peranti serta maklumat lokasi peranti anda.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda." "Organisasi anda memasang sijil kuasa pada peranti ini. Trafik rangkaian selamat anda mungkin dipantau atau diubah suai." "Organisasi anda memasang sijil kuasa dalam profil kerja anda. Trafik rangkaian selamat anda mungkin dipantau atau diubah suai." "Sijil kuasa dipasang pada peranti ini. Trafik rangkaian selamat anda mungkin dipantau atau diubah suai." "Pentadbir anda telah menghidupkan pengelogan rangkaian yang memantau trafik pada peranti anda." - - - - + "Anda dihubungkan ke %1$s, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web." + "Anda dihubungkan ke %1$s dan %2$s, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web." "Profil kerja anda dihubungkan ke %1$s, yang dapat memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web." "Profil peribadi anda dihubungkan ke %1$s, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web." "Peranti anda diurus oleh %1$s." @@ -476,6 +466,8 @@ "Anda disambungkan ke %1$s, yang boleh memantau aktiviti rangkaian peribadi anda, termasuk e-mel, apl dan tapak web." "Profil kerja anda diurus oleh %1$s. Profil itu dihubungkan ke %2$s, yang boleh memantau aktiviti rangkaian kerja anda, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda." "Profil kerja anda diurus oleh %1$s. Profil itu dihubungkan ke %2$s, yang boleh memantau aktiviti rangkaian kerja anda, termasuk e-mel, apl dan tapak web.\n\nAnda turut dihubungkan ke %3$s, yang boleh memantau aktiviti rangkaian peribadi anda." + + "Peranti akan kekal terkunci sehingga anda membuka kunci secara manual" "Dapatkan pemberitahuan lebih cepat" "Lihat sebelum anda membuka kunci" @@ -569,12 +561,9 @@ %1$s, %2$s dan %3$d yang lain %1$s, %2$s dan %3$d yang lain - - - - - - + "Kawalan pemberitahuan untuk %1$s dibuka" + "Kawalan pemberitahuan untuk %1$s ditutup" + "Benarkan pemberitahuan daripada saluran ini" "Semua Kategori" "Lagi tetapan" "Sesuaikan: %1$s" @@ -712,6 +701,8 @@ "Pemberitahuan %1$s: %2$s" "Apl mungkin tidak berfungsi dengan skrin pisah." "Apl tidak menyokong skrin pisah." + "Apl mungkin tidak berfungsi pada paparan kedua." + "Apl tidak menyokong pelancaran pada paparan kedua." "Buka tetapan." "Buka tetapan pantas." "Tutup tetapan pantas." @@ -730,14 +721,10 @@ "Menu gambar dalam gambar" "%s terdapat dalam gambar dalam gambar" "Jika anda tidak mahu %s menggunakan ciri ini, ketik untuk membuka tetapan dan matikan ciri." - - - - - - - - + "Main" + "Jeda" + "Langkau ke seterusnya" + "Langkau ke sebelumnya" "Telefon dimatikan kerana panas" "Telefon anda kini berjalan seperti biasa" "Telefon anda terlalu panas, jadi telefon itu telah dimatikan untuk menyejuk. Sekarang, telefon anda berjalan seperti biasa.\n\nTelefon anda mungkin menjadi terlalu panas jika anda:\n • Menggunakan apl intensif sumber (seperti permainan, video atau apl navigasi)\n • Memuat turun atau memuat naik fail besar\n • Menggunakan telefon anda dalam suhu tinggi" @@ -765,8 +752,7 @@ "Apl Segera" "Apl segera tidak memerlukan pemasangan." "Maklumat apl" - - + "Pergi ke web" "Data mudah alih" "Wi-Fi dimatikan" "Bluetooth dimatikan" diff --git a/packages/SystemUI/res/values-ms/strings_car.xml b/packages/SystemUI/res/values-ms/strings_car.xml index 392530aef4910bd43da8b425b45eff3386067779..8f640accb9ba5b2194b749fae509f507d8b4bbee 100644 --- a/packages/SystemUI/res/values-ms/strings_car.xml +++ b/packages/SystemUI/res/values-ms/strings_car.xml @@ -19,6 +19,5 @@ - "Pandu dengan selamat" - "Pastikan anda sentiasa sedar sepenuhnya akan keadaan pemanduan dan mematuhi undang-undang yang dikenakan pada sepanjang masa. Arah mungkin tidak tepat, tidak lengkap, berbahaya, tidak sesuai, dilarang atau melibatkan lintasan kawasan pentadbiran. Maklumat perniagaan juga mungkin tidak tepat atau tidak lengkap. Data bukan masa sebenar dan ketepatan lokasi tidak dapat dijamin. Jangan kendalikan peranti mudah alih anda atau gunakan apl yang bukan untuk Android Auto semasa memandu." + "Tidak diketahui" diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 4c50569838df3b47446d15ab5dc134bb54e60c6c..fad3e463ac58f2f1690ce56be23a817d34b84110 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -155,8 +155,9 @@ "မိုဘိုင်းဒေတာ" "မိုဘိုင်းဒေတာကို ဖွင့်ထားပါသည်" "မိုဘိုင်းဒေတာကို ပိတ်ထားပါသည်" - "ဘလူးတုသ်မှတဆင့်ပြန်လည်ချိတ်ဆက်ခြင်း" + "ဘလူးတုသ်ဖြင့်ကွန်ရက်ချိတ်ခြင်း" "လေယာဥ်ပျံပေါ်အသုံးပြုသောစနစ်။" + "VPN ကို ဖွင့်ထားသည်။" "SIM ကဒ် မရှိပါ" "ဝန်ဆောင်မှုဌာန ကွန်ရက် ပြောင်းလဲနေစဉ်။" "ဘက်ထရီ အသေးစိတ် အချက်အလက်များကို ဖွင့်ပါ" @@ -296,7 +297,7 @@ "ကွန်ရက်မရှိပါ" "ဝိုင်ဖိုင်ပိတ်ရန်" "Wi-Fi ကိုဖွင့်ပါ" - "ဝိုင်ဖိုင်ကွန်ရက် မရနိုင်ပါ" + "Wi-Fi ကွန်ရက် မရှိပါ" "Cast" "ကာစ်တင်" "အမည်မတပ် ကိရိယာ" @@ -427,8 +428,7 @@ "အလုပ်ပရိုဖိုင်ကို %1$s သို့ ချိတ်ဆက်ထားသည်" "ကိုယ်ပိုင်ပရိုဖိုင်ကို %1$s သို့ ချိတ်ဆက်ထားပါသည်" "စက်ပစ္စည်းကို %1$s သို့ ချိတ်ဆက်ထားသည်" - - + "စက်ပစ္စည်း စီမံခန့်ခွဲမှု" "ပရိုဖိုင် စောင့်ကြပ်မှု" "ကွန်ရက်ကို စောင့်ကြပ်ခြင်း" "VPN" @@ -437,18 +437,14 @@ "VPN ကို ပိတ်ထားရန်" "VPN ကို အဆက်ဖြတ်ရန်" "မူဝါဒများကို ကြည့်ရန်" - - - - + "သင့်စက်ပစ္စည်းကို %1$s အဖွဲ့အစည်းက စီမံခန့်ခွဲထားပါသည်။\n\nသင်၏ စီမံခန့်ခွဲသူသည် ဆက်တင်များ၊ အဖွဲ့အစည်း အသုံးပြုခွင့်များ၊ အက်ပ်များ၊ စက်ပစ္စည်းနှင့် ဆက်စပ်နေသည့် ဒေတာများနှင့် စက်ပစ္စည်း၏ တည်နေရာအချက်အလက်များကို စောင့်ကြည့်၍ စီမံနိုင်ပါသည်။\n\nနောက်ထပ် အချက်အလက်များအတွက် စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။" + "သင့်စက်ပစ္စည်းကို သင်၏အဖွဲ့အစည်းက စီမံခန့်ခွဲထားပါသည်။\n\nသင်၏ စီမံခန့်ခွဲသူသည် ဆက်တင်များ၊ အဖွဲ့အစည်း အသုံးပြုခွင့်များ၊ အက်ပ်များ၊ စက်ပစ္စည်းနှင့် ဆက်စပ်နေသည့် ဒေတာများနှင့် စက်ပစ္စည်း၏ တည်နေရာအချက်အလက်များကို စောင့်ကြည့်၍ စီမံနိုင်ပါသည်။\n\nနောက်ထပ် အချက်အလက်များအတွက် စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။" "သင်၏ အဖွဲ့အစည်းက ဤစက်ပစ္စည်းတွင် စီမံခန့်ခွဲမှုဆိုင်ရာ အသိအမှတ်ပြုလက်မှတ်ကို ထည့်သွင်းထားပါသည်။ လုံခြုံမှုရှိသော ကွန်ရက်ဒေတာစီးဆင်းမှုကို စောင့်ကြည့်ခြင်း သို့မဟုတ် ပြုပြင်ခြင်းများ ပြုလုပ်နိုင်ပါသည်။" "သင်၏ အဖွဲ့အစည်းသည် သင်၏ အလုပ်ပရိုဖိုင်တွင် စီမံခန့်ခွဲမှုဆိုင်ရာ အသိအမှတ်ပြုလက်မှတ်ကို ထည့်သွင်းထားပါသည်။ လုံခြုံမှုရှိသော ကွန်ရက်ဒေတာစီးဆင်းမှုကို စောင့်ကြည့်ခြင်း သို့မဟုတ် ပြုပြင်ခြင်းများ ပြုလုပ်နိုင်ပါသည်။" "ဤစက်ပစ္စည်းတွင် စီမံခန့်ခွဲမှုဆိုင်ရာ အသိအမှတ်ပြုလက်မှတ်ကို ထည့်သွင်းထားပါသည်။ လုံခြုံမှုရှိသော ကွန်ရက်ဒေတာစီးဆင်းမှုကို စောင့်ကြည့်ခြင်း သို့မဟုတ် ပြုပြင်ခြင်းများ ပြုလုပ်နိုင်ပါသည်။" "စက်ပစ္စည်းပေါ်ရှိ ဒေတာစီးဆင်းမှုများကို စောင့်ကြည့်နိုင်သည့် ကွန်ရက်မှတ်တမ်းတင်ခြင်းစနစ်ကို သင်၏ စီမံခန့်ခွဲသူက ဖွင့်ထားပါသည်။" - - - - + "သင်သည် သင်၏ အီးမေးလ်၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည့် %1$s သို့ ချိတ်ဆက်ထားပါသည်။" + "သင်သည် သင်၏ အီးမေးလ်၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင်၏ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည့် %1$s နှင့် %2$s သို့ ချိတ်ဆက်ထားပါသည်။" "သင်၏အလုပ်ပရိုဖိုင်သည် အီးမေးလ်၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင်၏ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည့် %1$s သို့ ချိတ်ဆက်ထားပါသည်။" "သင်၏ ကိုယ်ပိုင်ပရိုဖိုင်သည် အီးမေးလ်၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင်၏ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည့် %1$s သို့ ချိတ်ဆက်ထားပါသည်။" "သင့်စက်ပစ္စည်းကို %1$s က စီမံခန့်ခွဲထားပါသည်။" @@ -470,6 +466,8 @@ "သင်သည် အီးမေးလ်၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကိုယ်ရေးကိုယ်တာ ကွန်ရက်အသုံးပြုမှုကို စောင့်ကြည့်နိုင်သည့် %1$s သို့ ချိတ်ဆက်ထားပါသည်။" "သင်၏ အလုပ်ပရိုဖိုင်ကို %1$s က စီမံခန့်ခွဲထားပါသည်။ ပရိုဖိုင်သည် အီးမေး၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင်၏ကွန်ရက် လုပ်ဆောင်ချက်များကို စောင့်ကြည့်နိုင်သည့် %2$s သို့ ချိတ်ဆက်ထားပါသည်။\n\nနောက်ထပ် အချက်အလက်များအတွက် သင်၏ စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။" "သင်၏ အလုပ်ပရိုဖိုင်ကို %1$s က စီမံခန့်ခွဲထားသည်။ ပရိုဖိုင်သည် အီးမေး၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင်၏ကွန်ရက် လုပ်ဆောင်ချက်များကို စောင့်ကြည့်နိုင်သည့် %2$s သို့ ချိတ်ဆက်ထားပါသည်။\n\nသင်၏ ကိုယ်ရေးကိုယ်တာ ကွန်ရက်လုပ်ဆောင်ချက်များကို စောင့်ကြည့်နိုင်သည့် %3$s သို့လည်း ချိတ်ဆက်ထားပါသည်။" + + "သင်က လက်ဖြင့် သော့မဖွင့်မချင်း ကိရိယာမှာ သော့ပိတ်လျက် ရှိနေမည်" "အကြောင်းကြားချက်များ မြန်မြန်ရရန်" "မဖွင့်ခင် ၎င်းတို့ကို ကြည့်ပါ" @@ -482,7 +480,7 @@ "မျက်နှာပြင် ပင်ထိုးပြီးပါပြီ" "သင်ပင်မဖြုတ်မခြင်း ၎င်းကို ပြသထားပါမည်။ ပင်ဖြုတ်ရန် Back နှင့် Overview ကို ထိ၍ဖိထားပါ။" "သင်ပင်မဖြုတ်မချင်း ၎င်းကိုပြသထားပါမည်။ ပင်ဖြုတ်ရန် Overview ကိုထိပြီး ဖိထားပါ။" - "အဲဒါ ရပါပြီ" + "ရပါပြီ" "မလိုတော့ပါ" "%1$s ဝှက်မည်လား?" "နောက်တစ်ကြိမ်သင် ချိန်ညှိချက်များဖွင့်လျှင် ၎င်းပေါ်လာပါမည်။" @@ -703,6 +701,8 @@ "%1$s အကြောင်းကြားချက် − %2$s" "မျက်နှာပြင် ခွဲခြမ်းပြသမှုဖြင့် အက်ပ်သည် အလုပ်လုပ်မည် မဟုတ်ပါ။" "အက်ပ်သည် မျက်နှာပြင်ခွဲပြရန် ပံ့ပိုးထားခြင်းမရှိပါ။" + "အက်ပ်သည် ဒုတိယမျက်နှာပြင်ပြသမှုတွင် အလုပ်လုပ်မည် မဟုတ်ပါ။" + "အက်ပ်ကို ဒုတိယဖန်မျက်နှာပြင်ပြသမှုတွင် ဖွင့်ရန်အတွက် ပံ့ပိုးမထားပါ။" "ဆက်တင်များကို ဖွင့်ပါ။" "အမြန်ဆက်တင်များကို ဖွင့်ပါ။" "အမြန်ဆက်တင်များကို ပိတ်ပါ။" @@ -727,7 +727,7 @@ "ယခင်တစ်ခုသို့ ပြန်သွားရန်" "အပူရှိန်ကြောင့်ဖုန်းပိတ်ထားသည်" "သင်၏ဖုန်းသည် ပုံမှန် အလုပ်လုပ်နေပါသည်" - "သင့်ဖုန်းအလွန်ပူနေသည့်အတွက် အေးသွားစေရန် ပိတ်ထားပါသည်။ ယခုပုံမှန် အလုပ်လုပ်ပါပြီ။\n\nအောက်ပါတို့ကိုသုံးလျှင် ပူလာပါမည်-\n • အရင်းအမြစ်များသောအက်ပ်ကို သုံခြင်း (ဥပမာ ဂိမ်းကစားခြင်း၊ ဗီဒီယိုကြည့်ခြင်း (သို့) လမ်းညွှန်အက်ပ်)\n • ကြီးမားသောဖိုင်များ ဒေါင်းလုဒ် (သို့) အပ်လုဒ်လုပ်ခြင်း\n • အပူရှိန်မြင့်သောနေရာတွင် သုံးခြင်း" + "သင့်ဖုန်းအလွန်ပူနေသည့်အတွက် အေးသွားစေရန် ပိတ်ထားပါသည်။ ယခုပုံမှန် အလုပ်လုပ်ပါပြီ။\n\nအောက်ပါတို့ကိုသုံးလျှင် ပူလာပါမည်-\n • အရင်းအမြစ်များသောအက်ပ်ကို သုံးခြင်း (ဥပမာ ဂိမ်းကစားခြင်း၊ ဗီဒီယိုကြည့်ခြင်း (သို့) လမ်းညွှန်အက်ပ်)\n • ကြီးမားသောဖိုင်များ ဒေါင်းလုဒ် (သို့) အပ်လုဒ်လုပ်ခြင်း\n • အပူရှိန်မြင့်သောနေရာတွင် သုံးခြင်း" "ဖုန်း ပူနွေးလာပါပြီ" "ဖုန်းကို အေးအောင်ပြုလုပ်နေစဉ်တွင် အချို့ဝန်ဆောင်မှုများကို ကန့်သတ်ထားပါသည်" "သင့်ဖုန်းသည် အလိုအလျောက် ပြန်အေးသွားပါလိမ့်မည်။ ဖုန်းကို အသုံးပြုနိုင်ပါသေးသည် သို့သော် ပိုနှေးနိုင်ပါသည်။\n\nသင့်ဖုန်း အေးသွားသည်နှင့် ပုံမှန်အတိုင်း ပြန်အလုပ်လုပ်ပါလိမ့်မည်။" @@ -752,8 +752,7 @@ "Instant Apps" "ချက်ခြင်းသုံးအက်ပ်များကို ထည့်သွင်းစရာမလိုပါ။" "အက်ပ်အချက်အလက်" - - + "ဝဘ်သို့ သွားရန်" "မိုဘိုင်းဒေတာ" "Wi-Fi ကို ပိတ်ထားသည်" "ဘလူးတုသ်ကို ပိတ်ထားသည်" diff --git a/packages/SystemUI/res/values-my/strings_car.xml b/packages/SystemUI/res/values-my/strings_car.xml index dd4171391035c5da490be3fb65e7c25c6a08d69b..5f0ab8e649ae72c5f7553580c90c22c14647013c 100644 --- a/packages/SystemUI/res/values-my/strings_car.xml +++ b/packages/SystemUI/res/values-my/strings_car.xml @@ -19,6 +19,5 @@ - "ဘေးကင်းလုံခြုံစွာ မောင်းနှင်ပါ" - "ယာဉ်မောင်းမှုအခြေအနေများကို အပြည့်အဝအာရုံစိုက်ပြီး သက်ဆိုင်ရာဥပဒေများကို အမြဲတမ်းလိုက်နာပါ။ လမ်းညွှန်ချက်များသည် မှန်ကန်မှုမရှိခြင်း၊ မပြည့်စုံခြင်း၊ အန္တရာယ်ရှိခြင်း၊ ကိုက်ညီမှုမရှိခြင်း၊ တားမြစ်ထားခြင်း၊ သို့မဟုတ် လမ်းဖြတ်ကူးခြင်း ကြီးကြပ်ထားသည့်နေရာများ ဖြစ်နေနိုင်ပါသည်။ စီးပွားရေးအချက်အလက်များသည်လည်း မမှန်ကန်ခြင်း သို့မဟုတ် မပြည့်စုံခြင်းများ ရှိနိုင်ပါသည်။ ဒေတာသည် အချိန်နှင့်တစ်ပြေးညီ မဟုတ်ပါ၊ တည်နေရာမှန်ကန်မှုကိုလည်း အာမ မခံနိုင်ပါ။ ယာဉ်မောင်းနှင်နေစဉ် Android Auto အတွက်ရည်ရွယ်ထားခြင်းမဟုတ်သည့် မိုဘိုင်းစက်ပစ္စည်း ကိုမကိုင်တွယ်ပါနှင့် သို့မဟုတ် အက်ပ်များကို အသုံးမပြုပါနှင့်။ိ" + "အမျိုးအမည်မသိ" diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index dd7469a4dcf48ac89153175b72dbed30c88d99fe..db6400119e11cb580c59ed2dceb11c563f9d4bd1 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -157,6 +157,7 @@ "Mobildata er slått av" "Bluetooth-internettdeling." "Flymodus." + "VPN på." "Mangler SIM-kort." "Bytting av operatørnettverk." "Åpne informasjon om batteriet" @@ -296,7 +297,7 @@ "Ingen nettverk" "Wi-Fi er av" "Wi-Fi er på" - "Ingen Wi-Fi-nettverk er tilgjengelige" + "Ingen tilgjengelige Wi-Fi-nettverk" "Cast" "Casting" "Enhet uten navn" @@ -427,8 +428,7 @@ "Jobbprofilen er koblet til %1$s" "Den personlige profilen er koblet til %1$s" "Enheten er koblet til %1$s" - - + "Enhetsadministrasjon" "Profilovervåking" "Nettverksovervåking" "VPN" @@ -437,18 +437,14 @@ "Deaktiver VPN" "Koble fra VPN" "Se retningslinjer" - - - - + "Enheten din administreres av %1$s.\n\nAdministratoren kan overvåke og administrere innstillinger, bedriftstilgang, apper, data som er tilknyttet enheten, og enhetens posisjonsinformasjon.\n\nKontakt administratoren for å få mer informasjon." + "Enheten din administreres av organisasjonen din.\n\nAdministratoren kan overvåke og administrere innstillinger, bedriftstilgang, apper, data som er tilknyttet enheten, og enhetens posisjonsinformasjon.\n\nKontakt administratoren for å få mer informasjon." "Organisasjonen din installerte en sertifiseringsinstans på denne enheten. Den sikre nettverkstrafikken din kan overvåkes eller endres." "Organisasjonen din installerte en sertifiseringsinstans i jobbprofilen din. Den sikre nettverkstrafikken din kan overvåkes eller endres." "En sertifiseringsinstans er installert på denne enheten. Den sikre nettverkstrafikken din kan overvåkes eller endres." "Administratoren din har slått på loggføring av nettverk, som overvåker trafikken på enheten din." - - - - + "Du er koblet til %1$s, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder." + "Du er koblet til %1$s og %2$s, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder." "Jobbprofilen din er koblet til %1$s, som kan overvåke nettverksaktiviteten din, inkludert e-poster, apper og nettsteder." "Den personlige profilen din er koblet til %1$s, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder." "Enheten din administreres av %1$s." @@ -470,6 +466,8 @@ "Enheten er koblet til %1$s, som kan overvåke den personlige nettverksaktiviteten din, inkludert e-post, apper og nettsteder." "Jobbprofilen din administreres av %1$s. Profilen er koblet til %2$s, som kan overvåke nettverksaktiviteten din på jobben, inkludert e-poster, apper og nettsteder.\n\nTa kontakt med administratoren hvis du vil ha mer informasjon." "Jobbprofilen din administreres av %1$s. Profilen er koblet til %2$s, som kan overvåke nettverksaktiviteten din på jobben, inkludert e-poster, apper og nettsteder.\n\nDu er også koblet til %3$s, som kan overvåke den personlige nettverksaktiviteten din." + + "Enheten forblir låst til du låser den opp manuelt" "Motta varsler raskere" "Se dem før du låser opp" @@ -645,7 +643,7 @@ "(standard)" "Utklippstavle" - "Nøkkelkode" + "Tastkode" "Bytteknapp for tastatur" "Ingen" @@ -661,11 +659,11 @@ "Juster bredden på knappen" "Utklippstavle" "Spesialtilpasset navigasjonsknapp" - "Venstre-nøkkelkode" - "Høyre-nøkkelkode" + "Venstre-tastkode" + "Høyre-tastkode" "Venstre-ikon" "Høyre-ikon" - "Dra for å legge til fliser" + "Dra for å legge til felt" "Dra hit for å fjerne" "Endre" "Tid" @@ -703,6 +701,8 @@ "%1$s-varsel: %2$s" "Det kan hende at appen ikke fungerer med delt skjerm." "Appen støtter ikke delt skjerm." + "Appen fungerer kanskje ikke på en sekundær skjerm." + "Appen støtter ikke oppstart på sekundære skjermer." "Åpne innstillingene." "Åpner hurtiginnstillingene." "Lukk hurtiginnstillingene." @@ -752,8 +752,7 @@ "Instant Apps" "Du trenger ikke å installere instant-apper." "Info om appen" - - + "Gå til nettstedet" "Mobildata" "Wi-Fi er av" "Bluetooth er av" diff --git a/packages/SystemUI/res/values-nb/strings_car.xml b/packages/SystemUI/res/values-nb/strings_car.xml index 421420e844ece47fc1c1d01a4f013f8c928b2fb9..17d050d7767d2603bd4f5fabaaab57fe04c9711b 100644 --- a/packages/SystemUI/res/values-nb/strings_car.xml +++ b/packages/SystemUI/res/values-nb/strings_car.xml @@ -19,6 +19,5 @@ - "Kjør forsiktig" - "Ha full oversikt over kjøreforhold, og følg alltid gjeldende lov og rett. Veibeskrivelser kan være unøyaktige, ufullstendige, farlige, upassende, forbudte eller de kan involvere kjøring på administrative områder. Bedriftsinformasjon kan også være unøyaktig eller ufullstendig. Data er ikke i sanntid, og posisjonsnøyaktighet kan ikke garanteres. Ikke bruk mobilenheten din eller apper som ikke er ment for Android Auto, mens du kjører." + "Ukjent" diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index d9f3bb4d8fd0cb05fb2619c36cda4eca7bd50bd4..d33c74d23f5949a4c90b28f12dae05e26c85a7d0 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -152,14 +152,12 @@ "Edge" "Wi-Fi" "SIM छैन।" - - - - - - + "मोबाइल डेटा" + "मोबाइल डेटा सक्रिय छ" + "मोबाइल डेटा निष्क्रिय छ" "ब्लुटुथ टेदर गर्दै।" "हवाइजहाज मोड।" + "VPN सक्रिय छ।" "SIM कार्ड छैन।" "वाहक नेटवर्क परिवर्तन हुँदै।" "ब्याट्री सम्बन्धी विवरणहरूलाई खोल्नुहोस्" @@ -242,11 +240,9 @@ "चार्ज गर्दै" "2G-3G डेटा रोकिएको छ" "4G डेटा रोकिएको छ" - - + "मोबाइल डेटा पज गरिएको छ" "डेटा रोकिएको छ" - - + "तपाईंले सेट गर्नुभएको डेटाको अधिकतम सीमामा पुगिएको छ। तपाईंले अब उप्रान्त मोबाइल डेटाको प्रयोग गर्नुहुने छैन। \n\nतपाईंले प्रयोग जारी राख्नुभयो भने डेटा प्रयोगका शुल्कहरू लाग्न सक्छन्।" "पुनः सुरु गर्नुहोस्" "इन्टरनेट जडान छैन" "Wi-Fi जडित" @@ -319,8 +315,7 @@ "हटस्पट" "अधिसूचनाहरू" "फ्ल्यासलाइट" - - + "मोबाइल डेटा" "डेटाको प्रयोग" "बाँकी डेटा" "सीमाभन्दा बढी" @@ -433,8 +428,7 @@ "कार्य प्रोफाइल %1$s मा जडान छ" "व्यक्तिगत प्रोफाइललाई %1$s मा जडान गरिएको छ" "उक्त यन्त्रलाई %1$s मा जडान गरिएको छ" - - + "यन्त्रको व्यवस्थापन" "प्रोफाइल अनुगमन गर्दै" "सञ्जाल अनुगमन" "VPN" @@ -443,18 +437,14 @@ "VPN असक्षम गर्नुहोस्" "विच्छेद VPN" "नीतिहरू हेर्नुहोस्" - - - - + "%1$s ले तपाईंको यन्त्रको व्यवस्थापन गर्छ।BREAK\n\nतपाईंका प्रशासकले सेटिङहरू, संस्थागत पहुँच, अनुप्रयोगहरू, तपाईंको यन्त्रसँग सम्बन्धित डेटा र तपाईंको यन्त्रको स्थान सम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।" + "तपाईंको संगठनले तपाईंको यन्त्रको व्यवस्थापन गर्छ।\n\nतपाईंका प्रशासकले सेटिङहरू, संस्थागत पहुँच, अनुप्रयोगहरू, तपाईंको यन्त्रसँग सम्बन्धित डेटा र तपाईंको यन्त्रको स्थान सम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।" "तपाईंको संगठनले तपाईंको कार्य प्रोफाइलमा एउटा प्रमाणपत्र सम्बन्धी अख्तियार सुविधा स्थापित गऱ्यो। तपाईंको सुरक्षित नेटवर्क ट्राफिकको अनुगमन वा परिमार्जन हुनसक्छ।" "तपाईंको संगठनले तपाईंको कार्य प्रोफाइलमा एउटा प्रमाणपत्र सम्बन्धी अख्तियार सुविधा स्थापना गरेको छ। तपाईंको सुरक्षित नेटवर्क ट्राफिकको अनुगमन वा परिमार्जन हुनसक्छ।" "यस यन्त्रमा एउटा प्रमाणपत्र सम्बन्धी अख्तियार सुविधा स्थापना गरिएको छ। तपाईंको सुरक्षित नेटवर्कको ट्राफिकको अनुगमन वा परिमार्जन हुनसक्छ।" "तपाईंका प्रशासकले तपाईंको यन्त्रमा ट्राफिकको अनुगमन गर्ने नेटवर्क लग गर्ने प्रक्रियालाई सक्रिय गर्नुभएको छ।" - - - - + "तपाईं इमेल, अनुप्रयोग र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने %1$s मा जडान हुनुहुन्छ।" + "तपाईं इमेल, अनुप्रयोग र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने %1$s%2$s मा जडान हुनुहुन्छ।" "तपाईंको कार्य प्रोफाइल तपाईंका इमेल, अनुप्रयोग र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने %1$s मा जडान छ।" "तपाईंको व्यक्तिगत प्रोफाइल इमेल, अनुप्रयोग र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने %1$s मा जडान छ।" "तपाईंको यन्त्र %1$s द्वारा व्यवस्थापन गरिएको छ।" @@ -476,6 +466,8 @@ "तपाईं %1$s मा जोडिनुभएको छ जसले इमेल, अनुप्रयोग र वेबसाइटहरू लगायतको तपाईंको व्यक्तिगत नेटवर्क सम्बन्धी गतिविधिको अनुगमन गर्न सक्छ।" "%1$s ले तपाईंको कार्य प्रोफाइलको व्यवस्थापन गर्छ। उक्त प्रोफाइल तपाईंका इमेल, अनुप्रयोग र वेवसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने %2$s मा जडान छ।\n\nथप जानकारीका लागि, आफ्ना प्रशासकलाई सम्पर्क गर्नुहोस्।" "%1$s ले तपाईंको कार्य प्रोफाइलको व्यवस्थापन गर्छ। उक्त प्रोफाइल तपाईंका इमेल, अनुप्रयोग र वेवसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने %2$s मा जडान छ। \n\nतपाईं आफ्नो व्यक्तिगत नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने %3$s मा पनि जडान हुनुहुन्छ।" + + "तपाईँले नखोले सम्म उपकरण बन्द रहनेछ" "छिटो सूचनाहरू प्राप्त गर्नुहोस्" "तपाईँले अनलक गर्नअघि तिनीहरूलाई हेर्नुहोस्" @@ -569,12 +561,9 @@ %1$s, %2$s%3$d अन्य %1$s, %2$s%3$d अन्य - - - - - - + "%1$s का सूचना सम्बन्धी नियन्त्रणहरूलाई खोलियो" + "%1$s का सूचना सम्बन्धी नियन्त्रणहरूलाई बन्द गरियो" + "यो च्यानलका सूचनाहरूलाई अनुमति दिनुहोस्" "सबै कोटिहरू" "थप सेटिङहरू" "आफू अनुकूल पार्नुहोस्: %1$s" @@ -712,6 +701,8 @@ "%1$s को सूचना: %2$s" "अनुप्रयोगले विभाजित-स्क्रिनमा काम नगर्न सक्छ।" "अनुप्रयोगले विभाजित-स्क्रिनलाई समर्थन गर्दैन।" + "यो अनुप्रयोगले सहायक प्रदर्शनमा काम नगर्नसक्छ।" + "अनुप्रयोगले सहायक प्रदर्शनहरूमा लोकार्पण गर्ने गतिविधिलाई समर्थन गर्दैन।" "सेटिङहरूलाई खोल्नुहोस्।" "द्रुत सेटिङहरूलाई खोल्नुहोस्।" "द्रुत सेटिङहरूलाई बन्द गर्नुहोस्।" @@ -730,14 +721,10 @@ "तस्बिर मेनुमा तस्बिर" "%s तस्बिरभित्रको तस्बिरमा छ" "तपाईं %s ले यो सुविधा प्रयोग नगरोस् भन्ने चाहनुहुन्छ भने ट्याप गरेर सेटिङहरू खोल्नुहोस् र यसलाई निष्क्रिय पार्नुहोस्।" - - - - - - - - + "प्ले गर्नुहोस्" + "पज गर्नुहोस्" + "अर्कोमा जानुहोस्" + "अघिल्लोमा जानुहोस्" "फोन अति नै तातिएकाले चिसिन बन्द भयो" "तपाईंको फोन अब सामान्य ढंगले चल्दै छ" "तपाईंको फोन अति नै तातिएकाले चिसिन बन्द भयो। तपाईंको फोन अब सामान्य ढंगले चल्दै छ।\n\nतपाईंले निम्न कुराहरू गर्नुभयो भने तपाईंको फोन अत्यन्त तातो हुनसक्छ:\n • धेरै संसाधन खपत गर्ने अनुप्रयोगहरूको प्रयोग (जस्तै गेमिङ, भिडियो वा नेभिगेसन अनुप्रयोगहरू)\n • ठूला फाइलहरूको डाउनलोड वा अपलोड\n • उच्च तापक्रममा फोनको प्रयोग" @@ -765,8 +752,7 @@ "तात्कालिक अनुप्रयोगहरू" "तात्कालिक अनुप्रयोगहरूलाई स्थापना गर्नु पर्दैन|" "अनुप्रयोगका बारे जानकारी" - - + "वेबमा जानुहोस्" "मोबाइल डेटा" "Wi‑Fi निष्क्रिय छ" "ब्लुटुथ निष्क्रिय छ" diff --git a/packages/SystemUI/res/values-ne/strings_car.xml b/packages/SystemUI/res/values-ne/strings_car.xml index 1a4f8ef9e55a07f1f4d2cef9d46483b17e5aaf0b..a7a43790349ad07afea68c984ebc15dfe326843c 100644 --- a/packages/SystemUI/res/values-ne/strings_car.xml +++ b/packages/SystemUI/res/values-ne/strings_car.xml @@ -19,6 +19,5 @@ - "सुरक्षित तरिकाले सवारी चलाउनुहोस्" - "ड्राइभिङ सर्तहरूका बारे पूर्ण सजग रहनुहोस् र जहिले पनि लागू हुने नियमहरूको पालना गर्नुहोस्। दिशा निर्देशनहरू अशुद्ध, अपूर्ण, खतरनाक, अनुपयुक्त, निषेधित वा प्रशासनिक क्षेत्र पार गर्ने हुन सक्छ। व्यवसायिक जानकारी अशुद्ध वा अपूर्ण पनि हुन सक्छ। डेटा वास्तविक समयको हुँदैन र स्थान सटीकताको ग्यारेन्टी गर्न सकिँदैन। आफ्नो मोबाइल यन्त्र ह्याण्डल गर्ने वा सवारी चलाएको बेलामा Android स्वतःको लागि लक्षित नगरिएका अनुप्रयोगहरूको प्रयोग गर्ने नगर्नुहोस्।" + "अज्ञात" diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index bccf148cbfcb4b42a2b29d18f2d74ffb46ff9caf..9c0e578d5880316d65fa90675ae274672d24c320 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -152,14 +152,12 @@ "Edge" "Wifi" "Geen simkaart." - - - - - - + "Mobiele data" + "Mobiele data aan" + "Mobiele data uit" "Bluetooth-tethering." "Vliegtuigmodus." + "VPN ingeschakeld." "Geen simkaart." "Netwerk van provider wordt gewijzigd." "Accudetails openen" @@ -195,7 +193,7 @@ "Wifi uitgeschakeld." "Wifi ingeschakeld." "Mobiel %1$s. %2$s. %3$s." - "Accu: %s." + "Batterij: %s." "Vliegtuigmodus uit." "Vliegtuigmodus aan." "Vliegtuigmodus uitgeschakeld." @@ -242,11 +240,9 @@ "Opladen" "2G/3G-data zijn onderbroken" "4G-data zijn onderbroken" - - + "Mobiele data zijn onderbroken" "Gegevens zijn onderbroken" - - + "De datalimiet die je hebt ingesteld, is bereikt. Je gebruikt geen mobiele data meer.\n\nAls je hervat, kunnen er kosten voor datagebruik in rekening worden gebracht." "Hervatten" "Geen internetverbinding" "Verbonden via wifi" @@ -279,7 +275,7 @@ "Bluetooth uit" "Geen gekoppelde apparaten beschikbaar" "Helderheid" - "Automatische rotatie" + "Automatisch draaien" "Scherm automatisch draaien" "Modus voor %s" "Rotatie vergrendeld" @@ -319,8 +315,7 @@ "Hotspot" "Meldingen" "Zaklamp" - - + "Mobiele data" "Datagebruik" "Resterende gegevens" "Limiet overschreden" @@ -363,7 +358,7 @@ "Hiermee worden ALLE geluiden en trillingen geblokkeerd, waaronder die voor alarmen, muziek, video\'s en games." "+%d" "Minder urgente meldingen onderaan" - "Tik nogmaals om te openen" + "Tik nog eens om te openen" "Veeg omhoog om te ontgrendelen" "Dit apparaat wordt beheerd door je organisatie" "Dit apparaat wordt beheerd door %s" @@ -433,8 +428,7 @@ "Werkprofiel verbonden met %1$s" "Persoonlijk profiel verbonden met %1$s" "Apparaat verbonden met %1$s" - - + "Apparaatbeheer" "Profielcontrole" "Netwerkcontrole" "VPN" @@ -443,18 +437,14 @@ "VPN uitschakelen" "Verbinding met VPN verbreken" "Beleid bekijken" - - - - + "Je apparaat wordt beheerd door %1$s.\n\nJe beheerder kan instellingen, zakelijke toegang, apps, aan je apparaat gekoppelde gegevens en de locatiegegevens van je apparaat controleren en beheren.\n\nNeem contact op met je beheerder voor meer informatie." + "Je apparaat wordt beheerd door je organisatie.\n\nJe beheerder kan instellingen, zakelijke toegang, apps, aan je apparaat gekoppelde gegevens en de locatiegegevens van je apparaat controleren en beheren.\n\nNeem contact op met je beheerder voor meer informatie." "Je organisatie heeft een certificeringsinstantie geïnstalleerd op dit apparaat. Je beveiligde netwerkverkeer kan worden bijgehouden of aangepast." "Je organisatie heeft een certificeringsinstantie geïnstalleerd in je werkprofiel. Je beveiligde netwerkverkeer kan worden bijgehouden of aangepast." "Er is een certificeringsinstantie geïnstalleerd op dit apparaat. Je beveiligde netwerkverkeer kan worden bijgehouden of aangepast." "Je beheerder heeft netwerkregistratie ingeschakeld, waarmee het verkeer op je apparaat wordt bijgehouden." - - - - + "Je bent verbonden met %1$s, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden gecontroleerd." + "Je bent verbonden met %1$s en %2$s, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden bijgehouden." "Je werkprofiel is verbonden met %1$s, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden bijgehouden." "Je persoonlijke profiel is verbonden met %1$s, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden bijgehouden." "Je apparaat wordt beheerd door %1$s." @@ -476,6 +466,8 @@ "Je bent verbonden met %1$s, waarmee je persoonlijke netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites." "Je werkprofiel wordt beheerd door %1$s. Het profiel is verbonden met %2$s, waarmee je werkgerelateerde netwerkactiviteit (waaronder e-mails, apps en websites) kan worden bijgehouden.\n\nNeem contact op met je beheerder voor meer informatie." "Je werkprofiel wordt beheerd door %1$s. Het profiel is verbonden met %2$s, waarmee je werkgerelateerde netwerkactiviteit (waaronder e-mails, apps en websites) kan worden bijgehouden.\n\nJe bent ook verbonden met %3$s, waarmee je persoonlijke netwerkactiviteit kan worden bijgehouden." + + "Het apparaat blijft vergrendeld totdat u het handmatig ontgrendelt" "Sneller meldingen ontvangen" "Weergeven voordat u ontgrendelt" @@ -569,12 +561,9 @@ %1$s, %2$s en %3$d andere %1$s, %2$s en %3$d andere - - - - - - + "Beheeropties voor meldingen voor %1$s geopend" + "Beheeropties voor meldingen voor %1$s gesloten" + "Meldingen van dit kanaal toestaan" "Alle categorieën" "Meer instellingen" "Aanpassen: %1$s" @@ -589,7 +578,7 @@ "Snoozefunctie %1$s actief" "Accugebruik" "Accubesparing niet beschikbaar tijdens opladen" - "Accubesparing" + "Batterijbesparing" "Vermindert de prestaties en achtergrondgegevens" "Knop %1$s" "Home" @@ -637,7 +626,7 @@ "Niet storen" "Volumeknoppen als sneltoets" "\'Niet storen\' afsluiten bij volume omhoog" - "Accu" + "Batterij" "Klok" "Headset" "Hoofdtelefoon aangesloten" @@ -712,6 +701,8 @@ "%1$s-melding: %2$s" "App werkt mogelijk niet met gesplitst scherm." "App biedt geen ondersteuning voor gesplitst scherm." + "App werkt mogelijk niet op een secundair display." + "App biedt geen ondersteuning voor lancering op secundaire displays." "Instellingen openen." "Snelle instellingen openen." "Snelle instellingen sluiten." @@ -730,14 +721,10 @@ "Beeld-in-beeld-menu" "%s is in beeld-in-beeld" "Als je niet wilt dat %s deze functie gebruikt, tik je om de instellingen te openen en schakel je de functie uit." - - - - - - - - + "Afspelen" + "Onderbreken" + "Doorgaan naar volgende" + "Teruggaan naar vorige" "Telefoon uitgezet wegens hitte" "Je telefoon presteert nu weer zoals gebruikelijk" "Je telefoon was te warm en is uitgeschakeld om af te koelen. Je telefoon presteert nu weer zoals gebruikelijk.\n\nJe telefoon kan warm worden als je:\n • bronintensieve apps gebruikt (zoals game-, video-, of navigatie-apps),\n • grote bestanden up- of downloadt,\n • je telefoon gebruikt bij hoge temperaturen." @@ -765,8 +752,7 @@ "Instant-apps" "Instant-apps hoeven niet te worden geïnstalleerd." "App-info" - - + "Ga naar internet" "Mobiele data" "Wifi is uitgeschakeld" "Bluetooth is uitgeschakeld" diff --git a/packages/SystemUI/res/values-nl/strings_car.xml b/packages/SystemUI/res/values-nl/strings_car.xml index be66e019817242d0f87f12319e54c0ac529ef869..a8f600e81e778029c100730d56374d8101c5dc84 100644 --- a/packages/SystemUI/res/values-nl/strings_car.xml +++ b/packages/SystemUI/res/values-nl/strings_car.xml @@ -19,6 +19,5 @@ - "Rijd veilig" - "Blijf je volledig bewust van de rijomstandigheden en houd je altijd aan de wet. Aanwijzingen kunnen onnauwkeurig, onvolledig, gevaarlijk, ongeschikt of verboden zijn of het doorkruisen van overheidszones vereisen. Bedrijfsinformatie kan ook onnauwkeurg of onvolledig zijn. De gegevens worden niet in realtime verstrekt en de nauwkeurigheid van een locatie kan niet worden gegarandeerd. Bedien tijdens het rijden je mobiele apparaat niet en gebruik geen apps die niet bedoeld zijn voor Android Auto." + "Onbekend" diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 3793bbf028c62978a51e5a87e9306dbded499d52..5492b19d00c70ab16f71670448a71a3aee148533 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -152,14 +152,12 @@ "ਕਿਨਾਰਾ" "Wi-Fi" "ਕੋਈ SIM ਨਹੀਂ।" - - - - - - + "ਮੋਬਾਈਲ ਡੈਟਾ" + "ਮੋਬਾਈਲ ਡੈਟਾ ਚਾਲੂ ਹੈ" + "ਮੋਬਾਈਲ ਡੈਟਾ ਬੰਦ ਹੈ" "Bluetooth ਟੀਥਰਿੰਗ।" "ਏਅਰਪਲੇਨ ਮੋਡ।" + "VPN ਚਾਲੂ ਹੈ।" "ਕੋਈ SIM ਕਾਰਡ ਨਹੀਂ।" "ਕੈਰੀਅਰ ਨੈੱਟਵਰਕ ਪਰਿਵਰਤਨ।" "ਬੈਟਰੀ ਵੇਰਵੇ ਖੋਲ੍ਹੋ" @@ -242,11 +240,9 @@ "ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ" "2G-3G ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ" "4G ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ" - - + "ਮੋਬਾਈਲ ਡੈਟਾ ਰੋਕ ਦਿੱਤਾ ਗਿਆ ਹੈ" "ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ" - - + "ਤੁਸੀਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਸੈੱਟ ਕੀਤੀ ਗਈ ਡੈਟਾ ਸੀਮਾ \'ਤੇ ਪਹੁੰਚ ਚੁੱਕੇ ਹੋ। ਤੁਸੀਂ ਹੁਣ ਮੋਬਾਈਲ ਡੈਟੇ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰ ਰਹੇ ਹੋ।\n\nਜੇਕਰ ਤੁਸੀਂ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਦੇ ਹੋ, ਤਾਂ ਡੈਟਾ ਵਰਤੋਂ ਲਈ ਖਰਚੇ ਲਾਗੂ ਹੋ ਸਕਦੇ ਹਨ।" "ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਕਰੋ" "ਕੋਈ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਨਹੀਂ" "Wi-Fi ਕਨੈਕਟ ਕੀਤਾ" @@ -319,8 +315,7 @@ "ਹੌਟਸਪੌਟ" "ਸੂਚਨਾਵਾਂ" "ਫਲੈਸ਼ਲਾਈਟ" - - + "ਮੋਬਾਈਲ ਡੈਟਾ" "ਡੈਟਾ ਉਪਯੋਗ" "ਬਾਕੀ ਡੈਟਾ" "ਸੀਮਾ ਤੋਂ ਵੱਧ" @@ -433,8 +428,7 @@ "ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ %1$s ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ" "ਨਿੱਜੀ ਪ੍ਰੋਫਾਈਲ %1$s ਨਾਲ ਕਨੈਕਟ ਹੈ" "ਡੀਵਾਈਸ %1$s ਨਾਲ ਕਨੈਕਟ ਹੈ" - - + "ਡੀਵਾਈਸ ਪ੍ਰਬੰਧਨ" "ਪ੍ਰੋਫਾਈਲ ਦਾ ਨਿਰੀਖਣ ਕਰਨਾ" "ਨੈੱਟਵਰਕ ਨਿਰੀਖਣ ਕਰ ਰਿਹਾ ਹੈ" "VPN" @@ -443,18 +437,14 @@ "VPN ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ" "VPN ਨੂੰ ਡਿਸਕਨੈਕਟ ਕਰੋ" "ਨੀਤੀਆਂ ਵੇਖੋ" - - - - + "ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ %1$s ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਨਾਲ ਸਬੰਧਿਤ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਾਂ, ਡੈਟੇ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਦੀ ਨਿਗਰਾਨੀ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।" + "ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਨਾਲ ਸਬੰਧਿਤ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਾਂ, ਡੈਟੇ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।" "ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਇੱਕ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਟੀ ਸਥਾਪਤ ਕੀਤੀ ਗਈ ਹੈ। ਤੁਹਾਡੇ ਸੁਰੱਖਿਅਤ ਨੈੱਟਵਰਕ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ ਜਾਂ ਉਸਨੂੰ ਸੋਧਿਆ ਜਾ ਸਕਦਾ ਹੈ।" "ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਇੱਕ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਟੀ ਸਥਾਪਤ ਕੀਤੀ ਗਈ ਹੈ। ਤੁਹਾਡੇ ਸੁਰੱਖਿਅਤ ਨੈੱਟਵਰਕ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ ਜਾਂ ਉਸਨੂੰ ਸੋਧਿਆ ਜਾ ਸਕਦਾ ਹੈ।" "ਇੱਕ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਟੀ ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਸਥਾਪਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਤੁਹਾਡੇ ਸੁਰੱਖਿਅਤ ਨੈੱਟਵਰਕ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ ਜਾਂ ਉਸਨੂੰ ਸੋਧਿਆ ਜਾ ਸਕਦਾ ਹੈ।" "ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਨੈੱਟਵਰਕ ਲੌਗਿੰਗ ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਹੋਇਆ ਹੈ, ਜੋ ਤੁਹਾਡੀ ਡੀਵਾਈਸ \'ਤੇ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕਰਦਾ ਹੈ।" - - - - + "ਤੁਸੀਂ %1$s ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।" + "ਤੁਸੀਂ %1$s ਅਤੇ %2$s ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀਆਂ ਹਨ।" "ਤੁਹਾਡਾ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ %1$s ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।" "ਤੁਹਾਡਾ ਨਿੱਜੀ ਪ੍ਰੋਫਾਈਲ %1$s ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।" "ਤੁਹਾਡੀ ਡੀਵਾਈਸ %1$s ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।" @@ -476,6 +466,8 @@ "ਤੁਸੀਂ %1$s ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।" "ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ ਦਾ ਪ੍ਰਬੰਧਨ %1$s ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਇਹ ਪ੍ਰੋਫ਼ਾਈਲ %2$s ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਕਾਰਜ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।" "ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਦਾ ਪ੍ਰਬੰਧਨ %1$s ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਪ੍ਰੋਫਾਈਲ %2$s ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ ਹੈ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਕਾਰਜ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।\n\nਤੁਸੀਂ %3$s ਨਾਲ ਵੀ ਕਨੈਕਟ ਹੋਂ, ਜੋ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।" + + "ਡੀਵਾਈਸ ਲੌਕ ਰਹੇਗੀ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਮੈਨੂਅਲੀ ਅਨਲੌਕ ਨਹੀਂ ਕਰਦੇ" "ਤੇਜ਼ੀ ਨਾਲ ਸੂਚਨਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋ" "ਅਨਲੌਕ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਉਹਨਾਂ ਨੂੰ ਦੇਖੋ" @@ -569,12 +561,9 @@ %1$s, %2$s, ਅਤੇ %3$d ਹੋਰ %1$s, %2$s, ਅਤੇ %3$d ਹੋਰ - - - - - - + "%1$s ਲਈ ਸੂਚਨਾ ਕੰਟਰੋਲਾਂ ਨੂੰ ਖੋਲ੍ਹਿਆ ਗਿਆ" + "%1$s ਲਈ ਸੂਚਨਾ ਕੰਟਰੋਲਾਂ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ" + "ਇਸ ਚੈਨਲ ਤੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਇਜਾਜ਼ਤ ਦਿਓ" "ਸਭ ਸ਼੍ਰੇਣੀਆਂ" "ਹੋਰ ਸੈਟਿੰਗਾਂ" "ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ ਕਰੋ: %1$s" @@ -712,6 +701,8 @@ "%1$s ਸੂਚਨਾ: %2$s" "ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਐਪ ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਨਾਲ ਕੰਮ ਨਾ ਕਰੇ।" "ਐਪ ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਨੂੰ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ।" + "ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਐਪ ਸੈਕੰਡਰੀ ਡਿਸਪਲੇ \'ਤੇ ਕੰਮ ਨਾ ਕਰ ਸਕੇ।" + "ਐਪ ਸੈਕੰਡਰੀ ਡਿਸਪਲੇਆਂ \'ਤੇ ਲਾਂਚ ਕਰਨ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ।" "ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ।" "ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ ਨੂੰ ਖੋਲ੍ਹੋ।" "ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ ਨੂੰ ਬੰਦ ਕਰੋ।" @@ -730,14 +721,10 @@ "ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ ਮੀਨੂ" "%s ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ \'ਚ ਹੈ" "ਜੇ ਤੁਸੀਂ ਨਹੀਂ ਚਾਹੁੰਦੇ ਕਿ %s ਐਪ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੇ, ਤਾਂ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।" - - - - - - - - + "ਚਲਾਓ" + "ਵਿਰਾਮ ਦਿਓ" + "ਅਗਲੇ \'ਤੇ ਜਾਓ" + "ਪਿਛਲੇ \'ਤੇ ਜਾਓ" "ਗਰਮ ਹੋਣ ਕਾਰਨ ਫ਼ੋਨ ਬੰਦ ਹੋ ਗਿਆ" "ਤੁਹਾਡਾ ਫ਼ੋਨ ਹੁਣ ਸਹੀ ਚੱਲ ਰਿਹਾ ਹੈ" "ਤੁਹਾਡਾ ਫ਼ੋਨ ਬਹੁਤ ਗਰਮ ਸੀ, ਇਸ ਲਈ ਇਹ ਠੰਡਾ ਹੋਣ ਵਾਸਤੇ ਬੰਦ ਹੋ ਗਿਆ ਸੀ। ਤੁਹਾਡਾ ਫ਼ੋਨ ਹੁਣ ਸਹੀ ਚੱਲ ਰਿਹਾ ਹੈ।\n\nਤੁਹਾਡਾ ਫ਼ੋਨ ਬਹੁਤ ਗਰਮ ਹੋ ਸਕਦਾ ਹੈ ਜੇ:\n • ਤੁਸੀਂ ਸਰੋਤਾਂ ਦੀ ਵੱਧ ਵਰਤੋਂ ਵਾਲੀਆਂ ਐਪਾਂ (ਜਿਵੇਂ ਗੇਮਿੰਗ, ਵੀਡੀਓ, ਜਾਂ ਆਵਾਗੌਣ ਐਪਾਂ) ਵਰਤਦੇ ਹੋ \n • ਵੱਡੀਆਂ ਫ਼ਾਈਲਾਂ ਡਾਊਨਲੋਡ ਜਾਂ ਅੱਪਲੋਡ ਕਰਦੇ ਹੋ\n • ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਉੱਚ ਤਾਪਮਾਨਾਂ ਵਿੱਚ ਵਰਤਦੇ ਹੋ" @@ -765,8 +752,7 @@ "ਤਤਕਾਲ ਐਪਾਂ" "ਤਤਕਾਲ ਐਪਾਂ ਨੂੰ ਸਥਾਪਨਾ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ।" "ਐਪ ਜਾਣਕਾਰੀ" - - + "ਵੈੱਬ \'ਤੇ ਜਾਓ" "ਮੋਬਾਈਲ ਡੈਟਾ" "Wi-Fi ਬੰਦ ਹੈ" "ਬਲੂਟੁੱਥ ਬੰਦ ਹੈ" diff --git a/packages/SystemUI/res/values-pa/strings_car.xml b/packages/SystemUI/res/values-pa/strings_car.xml index ac38625d8250c563f77a81a2fa8d67c9026dce0f..ff68d0e90dbdab4f648d455687f82f9781c5ede2 100644 --- a/packages/SystemUI/res/values-pa/strings_car.xml +++ b/packages/SystemUI/res/values-pa/strings_car.xml @@ -19,6 +19,5 @@ - "ਸੁਰੱਖਿਅਤ ਢੰਗ ਨਾਲ ਗੱਡੀ ਚਲਾਓ" - "ਗੱਡੀ ਚਲਾਉਣ ਦੇ ਹਾਲਾਤਾਂ ਤੋਂ ਪੂਰੀ ਤਰ੍ਹਾਂ ਜਾਣੂ ਰਹੋ ਅਤੇ ਸਦਾ ਲਾਗੂ ਕਾਨੂੰਨਾਂ ਦੀ ਪਾਲਣਾ ਕਰੋ। ਦਿਸ਼ਾਵਾਂ ਗਲਤ, ਅਧੂਰੀਆਂ, ਖ਼ਤਰਨਾਕ, ਢੁੱਕਵੀਆਂ ਨਹੀਂ, ਪ੍ਰਤਿਬੰਧਿਤ ਹੋ ਸਕਦੀਆਂ ਹਨ ਜਾਂ ਪ੍ਰਸ਼ਾਸਕੀ ਖੇਤਰਾਂ ਵਿੱਚੋਂ ਲੰਘਣਾ ਸ਼ਾਮਲ ਹੋ ਸਕਦਾ ਹੈ। ਵਪਾਰਕ ਜਾਣਕਾਰੀ ਵੀ ਗਲਤ ਜਾਂ ਅਧੂਰੀ ਹੋ ਸਕਦੀ ਹੈ। ਡੈਟਾ ਰੀਅਲ-ਟਾਈਮ ਨਹੀਂ ਹੈ ਅਤੇ ਟਿਕਾਣਾ ਸਟੀਕਤਾ ਗਾਰੰਟੀਸ਼ੁਦਾ ਨਹੀਂ ਹੋ ਸਕਦੀ ਹੈ। ਗੱਡੀ ਚਲਾਉਣ ਦੌਰਾਨ ਆਪਣੀ ਮੋਬਾਈਲ ਡੀਵਾਈਸ ਜਾਂ ਉਹਨਾਂ ਐਪਾਂ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰੋ ਜੋ ਕਿ Android Auto ਲਈ ਨਹੀਂ ਬਣੀਆਂ ਹਨ।" + "ਅਗਿਆਤ" diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 528f7c2c5202abc81b32f6e7ce85b350105b8455..2f53988a5040a7a9a9c77b17c922b85d570794f7 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -154,14 +154,12 @@ "Edge" "Wi-Fi" "Brak karty SIM." - - - - - - + "Mobilna transmisja danych" + "Mobilna transmisja danych włączona" + "Mobilna transmisja danych wyłączona" "Powiązanie Bluetooth." "Tryb samolotowy." + "Sieć VPN włączona." "Brak karty SIM." "Zmiana sieci operatora." "Zobacz szczegóły baterii" @@ -244,11 +242,9 @@ "Ładowanie" "Transmisja danych 2G-3G została wstrzymana" "Transmisja danych 4G została wstrzymana" - - + "Mobilna transmisja danych jest wstrzymana" "Transmisja danych została wstrzymana" - - + "Osiągnięto ustawiony limit danych. Nie korzystasz już z komórkowej transmisji danych.\n\nJeśli włączysz ją ponownie, może zostać naliczona opłata za transmisję danych." "Wznów" "Brak internetu" "Wi-Fi: połączono" @@ -323,8 +319,7 @@ "Hotspot" "Powiadomienia" "Latarka" - - + "Mobilna transmisja danych" "Użycie danych" "Pozostały limit" "Przekroczono limit" @@ -363,7 +358,7 @@ "Przesuń w lewo: %s." "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." "Dostosuj" - "To zablokuje WSZYSTKIE dźwięki i wibracje, w tym alarmy, muzykę, filmy i gry. Nadal będzie można wykonywać połączenia." + "To zablokuje WSZYSTKIE dźwięki i wibracje, w tym alarmy, muzykę, filmy i gry. Nadal będzie można wykonywać połączenia." "To zablokuje WSZYSTKIE dźwięki i wibracje – w tym alarmy, muzykę, filmy i gry." "+%d" "Poniżej widać mniej pilne powiadomienia" @@ -437,8 +432,7 @@ "Profil do pracy połączony z aplikacją %1$s" "Profil osobisty połączony z aplikacją %1$s" "Urządzenie połączone z aplikacją %1$s" - - + "Zarządzanie urządzeniami" "Monitorowanie profilu" "Monitorowanie sieci" "VPN" @@ -447,18 +441,14 @@ "Wyłącz VPN" "Rozłącz z VPN" "Zobacz zasady" - - - - + "Urządzeniem zarządza %1$s.\n\nAdministrator może monitorować ustawienia, firmowe uprawnienia dostępu, aplikacje, dane dotyczące urządzenia i lokalizacji oraz nimi zarządzać.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem." + "Urządzeniem zarządza Twoja organizacja.\n\nAdministrator może monitorować ustawienia, firmowe uprawnienia dostępu, aplikacje, dane dotyczące urządzenia i lokalizacji oraz nimi zarządzać.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem." "Twoja organizacja zainstalowała urząd certyfikacji na tym urządzeniu. Zabezpieczony ruch w sieci może być monitorowany i zmieniany." "Twoja organizacja zainstalowała urząd certyfikacji w Twoim profilu do pracy. Zabezpieczony ruch w sieci może być monitorowany i zmieniany." "Urząd certyfikacji zainstalowany na tym urządzeniu. Twój zabezpieczony ruch w sieci może być monitorowany i zmieniany." "Administrator włączył rejestrowanie sieciowe, które pozwala monitorować ruch na Twoim urządzeniu." - - - - + "Łączysz się z aplikacją %1$s, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe." + "Łączysz się z aplikacjami %1$s%2$s, które mogą monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe." "Twój profil do pracy jest połączony z aplikacją %1$s, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe." "Twój profil osobisty jest połączony z aplikacją %1$s, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe." "Twoim urządzeniem zarządza %1$s." @@ -480,6 +470,7 @@ "Masz połączenie z aplikacją %1$s, która może monitorować Twoją prywatną aktywność w sieci, w tym e-maile, aplikacje i strony internetowe." "Organizacja %1$s zarządza Twoim profilem do pracy. Profil jest połączony z aplikacją %2$s, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe.\n\nSkontaktuj się z administratorem, aby uzyskać więcej informacji." "Organizacja %1$s zarządza Twoim profilem do pracy. Profil jest połączony z aplikacją %2$s, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe.\n\nMasz też połączenie z aplikacją %3$s, która może monitorować Twoją osobistą aktywność w sieci." + "Odblokowano dla: %1$s" "Urządzenie pozostanie zablokowane, aż odblokujesz je ręcznie" "Szybszy dostęp do powiadomień" "Zobacz powiadomienia, jeszcze zanim odblokujesz ekran" @@ -577,12 +568,9 @@ %1$s, %2$s%3$d innego %1$s, %2$s%3$d inny - - - - - - + "Sterowanie powiadomieniami aplikacji %1$s otwarte" + "Sterowanie powiadomieniami aplikacji %1$s zamknięte" + "Zezwól na powiadomienia z tego kanału" "Wszystkie kategorie" "Więcej ustawień" "Dostosuj: %1$s" @@ -720,6 +708,8 @@ "Powiadomienie z aplikacji %1$s: %2$s" "Aplikacja może nie działać przy podzielonym ekranie." "Aplikacja nie obsługuje dzielonego ekranu." + "Aplikacja może nie działać na ekranie dodatkowym." + "Aplikacja nie obsługuje uruchamiania na ekranach dodatkowych." "Otwórz ustawienia." "Otwórz szybkie ustawienia." "Zamknij szybkie ustawienia." @@ -738,14 +728,10 @@ "Menu funkcji Obraz w obrazie" "Aplikacja %s działa w trybie obraz w obrazie" "Jeśli nie chcesz, by aplikacja %s korzystała z tej funkcji, otwórz ustawienia i ją wyłącz." - - - - - - - - + "Odtwórz" + "Wstrzymaj" + "Dalej" + "Wstecz" "Telefon wyłączony: przegrzanie" "Telefon działa teraz normalnie" "Telefon był zbyt gorący i wyłączył się, by obniżyć temperaturę. Urządzenie działa teraz normalnie.\n\nTelefon może się przegrzać, gdy:\n • Używasz aplikacji zużywających dużo zasobów (np. gier, nawigacji czy odtwarzaczy filmów)\n • Pobierasz lub przesyłasz duże pliki\n • Używasz telefonu w wysokiej temperaturze" @@ -773,8 +759,7 @@ "Aplikacje błyskawiczne" "Aplikacji błyskawicznych nie trzeba instalować." "O aplikacji" - - + "Wejdź na stronę internetową" "Komórkowa transmisja danych" "Wi-Fi jest wyłączone" "Bluetooth jest wyłączony" diff --git a/packages/SystemUI/res/values-pl/strings_car.xml b/packages/SystemUI/res/values-pl/strings_car.xml index dbb0373e161f449ddb05140149a693c79620c629..5a52fb672de8d2dbd3c5a21d1398594fa3f3b5c7 100644 --- a/packages/SystemUI/res/values-pl/strings_car.xml +++ b/packages/SystemUI/res/values-pl/strings_car.xml @@ -19,6 +19,5 @@ - "Jedź bezpiecznie" - "Uważnie obserwuj warunki na drodze i zawsze przestrzegaj obowiązującego prawa. Wskazówki mogą być niedokładne, niekompletne, niebezpieczne, nieprzydatne lub niezgodne z prawem, mogą też obejmować przekraczanie obszarów administracyjnych. Informacje o firmach również mogą być niedokładne lub niekompletne. Dane nie są podawane w czasie rzeczywistym. Nie ma gwarancji, że dane o lokalizacji są dokładne. Podczas prowadzenia samochodu nie obsługuj urządzenia mobilnego ani nie używaj aplikacji nieprzeznaczonych na Androida Auto." + "Brak informacji" diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 669256086ab4c313ffcfad351d01f7c3debe29ec..7f49bcf3812d37df188638d6916171b0fe62923a 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -157,6 +157,7 @@ "Dados móveis desativados" "Tethering Bluetooth." "Modo avião." + "VPN ativada." "Sem cartão SIM." "Alteração de rede de operadora." "Abrir detalhes da bateria" @@ -429,8 +430,7 @@ "Perfil de trabalho conectado a %1$s" "Perfil pessoal conectado a %1$s" "O dispositivo está conectado a %1$s" - - + "Gerenciamento de dispositivos" "Monitoramento de perfis" "Monitoramento de rede" "VPN" @@ -439,18 +439,14 @@ "Desativar VPN" "Desconectar VPN" "Ver políticas" - - - - + "Seu dispositivo é gerenciado por %1$s.\n\nO administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e informações de localização do dispositivo.\n\nPara ver mais informações, entre em contato com o administrador." + "Seu dispositivo é gerenciado pela sua organização.\n\nO administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e informações de localização do dispositivo.\n\nPara ver mais informações, entre em contato com o administrador." "Sua organização instalou uma autoridade de certificação neste dispositivo. É possível monitorar ou modificar seu tráfego de rede seguro." "Sua organização instalou uma autoridade de certificação no seu perfil de trabalho. É possível monitorar ou modificar seu tráfego de rede seguro." "Uma autoridade de certificação foi instalada neste dispositivo. É possível monitorar ou modificar seu tráfego de rede seguro." "Seu administrador ativou o registro de rede, que monitora o tráfego no seu dispositivo." - - - - + "Você está conectado a %1$s, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites." + "Você está conectado a %1$s e %2$s, que podem monitorar sua atividade de rede, incluindo e-mails, apps e websites." "Seu perfil de trabalho está conectado a %1$s, que pode monitorar sua atividade de rede, incluindo e-mails, apps e websites." "Seu perfil pessoal está conectado a %1$s, que pode monitorar sua atividade de rede, incluindo e-mails, apps e websites." "Seu dispositivo é gerenciado por %1$s." @@ -472,6 +468,8 @@ "Você está conectado a %1$s, que pode monitorar sua atividade pessoal na rede, incluindo e-mails, apps e websites." "Seu perfil de trabalho é gerenciado por %1$s. O perfil está conectado a %2$s, que pode monitorar sua atividade profissional de rede, incluindo e-mails, apps e websites.\n\nPara saber mais informações, entre em contato com seu administrador." "Seu perfil de trabalho é gerenciado por %1$s. O perfil está conectado a %2$s, que pode monitorar sua atividade profissional de rede, incluindo e-mails, apps e websites.\n\nVocê também está conectado a %3$s, que pode monitorar sua atividade pessoal de rede." + + "O dispositivo permanecerá bloqueado até que você o desbloqueie manualmente" "Receba notificações mais rápido" "Veja-as antes de desbloquear" @@ -705,6 +703,8 @@ "Notificação do %1$s: %2$s" "É possível que o app não funcione com o recurso de divisão de tela." "O app não é compatível com a divisão de tela." + "É possível que o app não funcione em uma tela secundária." + "O app não é compatível com a inicialização em telas secundárias." "Abrir configurações." "Abrir as configurações rápidas." "Fechar as configurações rápidas." @@ -754,8 +754,7 @@ "Instant Apps" "Os Instant Apps não requerem instalação." "Informações do app" - - + "Acessar a Web" "Dados móveis" "O Wi-Fi está desativado" "Bluetooth desativado" diff --git a/packages/SystemUI/res/values-pt-rBR/strings_car.xml b/packages/SystemUI/res/values-pt-rBR/strings_car.xml index 5d754ef5766c3c2e283a5c86c072b0958a237269..a00f6ae7e15cd95c475f75a2c31b9d1e5cf4c34b 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings_car.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings_car.xml @@ -19,6 +19,5 @@ - "Dirija com segurança" - "Mantenha-se atento às condições da estrada e sempre obedeça às leis aplicáveis. As instruções podem ser imprecisas, incompletas, perigosas, inadequadas, proibidas ou envolver o cruzamento de áreas administrativas. As informações comerciais também podem ser imprecisas ou incompletas. Os dados não são exibidos em tempo real, e a precisão da localização não pode ser garantida. Enquanto dirige, não manuseie seu dispositivo móvel nem use apps que não tenham sido criados para o Android Auto." + "Desconhecido" diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 845a48c1c24d578fc29cd7fe369e8aaf15718355..065e7f703cb20ceb8c20c18a78fd29add60c33cc 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -157,6 +157,7 @@ "Dados móveis desativados" "Ligação Bluetooth via telemóvel." "Modo de avião" + "VPN ativada." "Nenhum cartão SIM." "Rede do operador em mudança." "Abrir detalhes da bateria" @@ -427,8 +428,7 @@ "Perfil de trabalho ligado à rede %1$s" "Perfil pessoal ligado à rede %1$s" "Dispositivo ligado à rede %1$s" - - + "Gestão de dispositivos" "Monitorização de perfis" "Monitorização da rede" "VPN" @@ -437,18 +437,14 @@ "Desativar a VPN" "Desligar VPN" "Ver Políticas" - - - - + "O dispositivo é gerido pela %1$s.\n\nO administrador pode monitorizar e gerir definições, acesso empresarial, aplicações, dados associados ao dispositivo e informações de localização do dispositivo.\n\nContacte o administrador para obter mais informações." + "O dispositivo é gerido pela sua entidade.\n\nO administrador pode monitorizar e gerir definições, acesso empresarial, aplicações, dados associados ao dispositivo e informações de localização do dispositivo.\n\nContacte o administrador para obter mais informações." "A sua entidade instalou uma autoridade de certificação neste dispositivo. O tráfego da sua rede segura pode ser monitorizado ou alterado." "A sua entidade instalou uma autoridade de certificação no seu perfil de trabalho. O tráfego da sua rede segura pode ser monitorizado ou alterado." "Está instalada uma autoridade de certificação neste dispositivo. O tráfego da sua rede segura pode ser monitorizado ou alterado." "O administrador ativou os registos de rede, que monitorizam o tráfego no seu dispositivo." - - - - + "Está ligado à rede %1$s, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites." + "Está ligado às redes %1$s e %2$s, que podem monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites." "O seu perfil de trabalho está ligado à rede %1$s, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites." "O seu perfil pessoal está ligado à rede %1$s, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites." "O seu dispositivo é gerido pelo %1$s." @@ -470,6 +466,8 @@ "Está ligado ao %1$s, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Websites." "O seu perfil de trabalho é gerido pela %1$s. O perfil está associado à aplicação %2$s, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Websites.\n\nContacte o administrador para obter mais informações." "O seu perfil de trabalho é gerido pela %1$s. O perfil está associado à aplicação %2$s, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Websites.\n\nTambém está associado à aplicação %3$s, que pode monitorizar a atividade da rede pessoal." + + "O dispositivo permanecerá bloqueado até ser desbloqueado manualmente" "Receber notificações mais rapidamente" "Ver antes de desbloquear" @@ -703,6 +701,8 @@ "Notificação do %1$s: %2$s" "A aplicação pode não funcionar com o ecrã dividido." "A aplicação não é compatível com o ecrã dividido." + "A aplicação pode não funcionar num ecrã secundário." + "A aplicação não é compatível com o início em ecrãs secundários." "Abrir as definições." "Abrir as definições rápidas." "Fechar as definições rápidas." @@ -752,8 +752,7 @@ "Aplicações instantâneas" "As Aplicações instantâneas não requerem instalação." "Informações da aplicação" - - + "Aceder à Web" "Dados móveis" "Wi-Fi desativado" "Bluetooth desativado" diff --git a/packages/SystemUI/res/values-pt-rPT/strings_car.xml b/packages/SystemUI/res/values-pt-rPT/strings_car.xml index afb030a683d194863afffcedb0b1b80508c004c5..a00f6ae7e15cd95c475f75a2c31b9d1e5cf4c34b 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings_car.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings_car.xml @@ -19,6 +19,5 @@ - "Conduza com segurança" - "Mantenha-se completamente atento às condições de condução e respeite sempre as leis aplicáveis. As direções podem ser imprecisas, incompletas, perigosas, inadequadas, proibidas ou envolver a travessia de áreas administrativas. Os dados das empresas também podem ser imprecisos ou incompletos. Os dados não são fornecidos em tempo real e não é possível garantir a precisão da localização. Não manuseie o dispositivo móvel nem utilize aplicações não destinadas ao Android Auto durante a condução." + "Desconhecido" diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 669256086ab4c313ffcfad351d01f7c3debe29ec..7f49bcf3812d37df188638d6916171b0fe62923a 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -157,6 +157,7 @@ "Dados móveis desativados" "Tethering Bluetooth." "Modo avião." + "VPN ativada." "Sem cartão SIM." "Alteração de rede de operadora." "Abrir detalhes da bateria" @@ -429,8 +430,7 @@ "Perfil de trabalho conectado a %1$s" "Perfil pessoal conectado a %1$s" "O dispositivo está conectado a %1$s" - - + "Gerenciamento de dispositivos" "Monitoramento de perfis" "Monitoramento de rede" "VPN" @@ -439,18 +439,14 @@ "Desativar VPN" "Desconectar VPN" "Ver políticas" - - - - + "Seu dispositivo é gerenciado por %1$s.\n\nO administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e informações de localização do dispositivo.\n\nPara ver mais informações, entre em contato com o administrador." + "Seu dispositivo é gerenciado pela sua organização.\n\nO administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e informações de localização do dispositivo.\n\nPara ver mais informações, entre em contato com o administrador." "Sua organização instalou uma autoridade de certificação neste dispositivo. É possível monitorar ou modificar seu tráfego de rede seguro." "Sua organização instalou uma autoridade de certificação no seu perfil de trabalho. É possível monitorar ou modificar seu tráfego de rede seguro." "Uma autoridade de certificação foi instalada neste dispositivo. É possível monitorar ou modificar seu tráfego de rede seguro." "Seu administrador ativou o registro de rede, que monitora o tráfego no seu dispositivo." - - - - + "Você está conectado a %1$s, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites." + "Você está conectado a %1$s e %2$s, que podem monitorar sua atividade de rede, incluindo e-mails, apps e websites." "Seu perfil de trabalho está conectado a %1$s, que pode monitorar sua atividade de rede, incluindo e-mails, apps e websites." "Seu perfil pessoal está conectado a %1$s, que pode monitorar sua atividade de rede, incluindo e-mails, apps e websites." "Seu dispositivo é gerenciado por %1$s." @@ -472,6 +468,8 @@ "Você está conectado a %1$s, que pode monitorar sua atividade pessoal na rede, incluindo e-mails, apps e websites." "Seu perfil de trabalho é gerenciado por %1$s. O perfil está conectado a %2$s, que pode monitorar sua atividade profissional de rede, incluindo e-mails, apps e websites.\n\nPara saber mais informações, entre em contato com seu administrador." "Seu perfil de trabalho é gerenciado por %1$s. O perfil está conectado a %2$s, que pode monitorar sua atividade profissional de rede, incluindo e-mails, apps e websites.\n\nVocê também está conectado a %3$s, que pode monitorar sua atividade pessoal de rede." + + "O dispositivo permanecerá bloqueado até que você o desbloqueie manualmente" "Receba notificações mais rápido" "Veja-as antes de desbloquear" @@ -705,6 +703,8 @@ "Notificação do %1$s: %2$s" "É possível que o app não funcione com o recurso de divisão de tela." "O app não é compatível com a divisão de tela." + "É possível que o app não funcione em uma tela secundária." + "O app não é compatível com a inicialização em telas secundárias." "Abrir configurações." "Abrir as configurações rápidas." "Fechar as configurações rápidas." @@ -754,8 +754,7 @@ "Instant Apps" "Os Instant Apps não requerem instalação." "Informações do app" - - + "Acessar a Web" "Dados móveis" "O Wi-Fi está desativado" "Bluetooth desativado" diff --git a/packages/SystemUI/res/values-pt/strings_car.xml b/packages/SystemUI/res/values-pt/strings_car.xml index 5d754ef5766c3c2e283a5c86c072b0958a237269..a00f6ae7e15cd95c475f75a2c31b9d1e5cf4c34b 100644 --- a/packages/SystemUI/res/values-pt/strings_car.xml +++ b/packages/SystemUI/res/values-pt/strings_car.xml @@ -19,6 +19,5 @@ - "Dirija com segurança" - "Mantenha-se atento às condições da estrada e sempre obedeça às leis aplicáveis. As instruções podem ser imprecisas, incompletas, perigosas, inadequadas, proibidas ou envolver o cruzamento de áreas administrativas. As informações comerciais também podem ser imprecisas ou incompletas. Os dados não são exibidos em tempo real, e a precisão da localização não pode ser garantida. Enquanto dirige, não manuseie seu dispositivo móvel nem use apps que não tenham sido criados para o Android Auto." + "Desconhecido" diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 5b66fe231c406bd79a89401b2b4b93e2516ebc3c..d98aabb494175bbfd62178110aae68c1c13eea42 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -158,6 +158,7 @@ "Date mobile dezactivate" "Conectarea ca modem prin Bluetooth." "Mod Avion." + "Rețea VPN activată" "Fără SIM." "Se schimbă rețeaua operatorului." "Deschideți detaliile privind bateria" @@ -431,8 +432,7 @@ "Profilul de serviciu este conectat la %1$s" "Profil personal conectat la %1$s" "Dispozitiv conectat la %1$s" - - + "Gestionarea dispozitivului" "Monitorizarea profilului" "Monitorizarea rețelei" "VPN" @@ -441,18 +441,14 @@ "Dezactivați conexiunea prin VPN" "Deconectați rețeaua VPN" "Afișați politicile" - - - - + "Dispozitivul este gestionat de %1$s.\n\nAdministratorul dvs. poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactați administratorul." + "Dispozitivul este gestionat de organizația dvs.\n\nAdministratorul dvs. poate să monitorizeze și să gestioneze setările, accesul la nivelul companiei, aplicațiile, datele asociate dispozitivului și informațiile despre locația dispozitivului.\n\nPentru mai multe informații, contactați administratorul." "Organizația dvs. a instalat un certificat CA pe acest dispozitiv. Traficul dvs. sigur de rețea poate fi monitorizat sau modificat." "Organizația dvs. a instalat un certificat CA în profilul dvs. de serviciu. Traficul dvs. sigur de rețea poate fi monitorizat sau modificat." "Pe acest dispozitiv este instalat un certificat CA. Traficul dvs. sigur de rețea poate fi monitorizat sau modificat." "Administratorul dvs. a activat înregistrarea în jurnal pentru rețea, funcție ce monitorizează traficul de pe dispozitivul dvs." - - - - + "V-ați conectat la aplicația %1$s, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate." + "V-ați conectat la %1$s și la %2$s, care vă pot monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate." "Profilul dvs. de serviciu este conectat la %1$s, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate." "Profilul dvs. personal este conectat la %1$s, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate." "Dispozitivul dvs. este gestionat de %1$s." @@ -474,6 +470,8 @@ "V-ați conectat la aplicația %1$s, care vă poate monitoriza activitatea personală în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate." "Profilul de serviciu este gestionat de %1$s. Profilul este conectat la %2$s, care vă poate monitoriza activitatea în rețeaua de serviciu, inclusiv e-mailurile, aplicațiile și site-urile accesate.\n\nPentru mai multe informații, contactați administratorul." "Profilul de serviciu este gestionat de %1$s. Profilul este conectat la %2$s, care vă poate monitoriza activitatea în rețeaua de serviciu, inclusiv e-mailurile, aplicațiile și site-urile accesate.\n\nDe asemenea, v-ați conectat la %3$s, care vă poate monitoriza activitatea în rețeaua personală." + + "Dispozitivul va rămâne blocat până când îl deblocați manual" "Obțineți notificări mai rapid" "Doresc să se afișeze înainte de deblocare" @@ -709,6 +707,8 @@ "Notificare %1$s: %2$s" "Este posibil ca aplicația să nu funcționeze cu ecranul împărțit." "Aplicația nu acceptă ecranul împărțit." + "Este posibil ca aplicația să nu funcționeze pe un afișaj secundar." + "Aplicația nu acceptă lansare pe afișaje secundare." "Deschideți setările." "Deschideți setările rapide." "Închideți setările rapide." @@ -758,8 +758,7 @@ "Aplicații instantanee" "Aplicațiile instantanee nu necesită instalare." "Informații despre aplicație" - - + "Accesați pe web" "Date mobile" "Conexiunea Wi-Fi este dezactivată" "Funcția Bluetooth este dezactivată" diff --git a/packages/SystemUI/res/values-ro/strings_car.xml b/packages/SystemUI/res/values-ro/strings_car.xml index 54d8585b57036d97ae8bd9386dc3bf9965e02f14..e3cc04226c5ac5e3c41902add6c0a32b73fa9358 100644 --- a/packages/SystemUI/res/values-ro/strings_car.xml +++ b/packages/SystemUI/res/values-ro/strings_car.xml @@ -19,6 +19,5 @@ - "Conduceți atent" - "Aflați mereu condițiile de trafic și respectați întotdeauna legislația aplicabilă. Indicațiile de orientare pot fi inexacte, incomplete, periculoase, neadecvate, interzise sau pot implica trecerea prin zone administrative. Informațiile despre companii pot fi, de asemenea, inexacte sau incomplete. Datele nu sunt în timp real și nu se poate garanta exactitatea locației. Nu manipulați dispozitivul mobil și nu folosiți aplicații neconcepute pentru Android Auto când sunteți la volan." + "Necunoscut" diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 7b85e2e0dd608ecd1bd5070bec73cc87ed5dd16b..dd12688c733bdd0a836c9e7704b06d503351c6ed 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -159,6 +159,7 @@ "Мобильный Интернет отключен" "Bluetooth-модем" "Режим полета." + "Режим VPN включен." "Нет SIM-карты." "Сменить сеть" "Сведения о расходе заряда батареи" @@ -278,7 +279,7 @@ "Bluetooth" "Bluetooth (%d)" "Bluetooth выкл." - "Нет доступных подключенных устройств" + "Нет доступных сопряженных устройств" "Яркость" "Автоповорот" "Автоповорот экрана" @@ -403,7 +404,7 @@ "Выход от имени пользователя" "ВЫЙТИ ОТ ИМЕНИ ПОЛЬЗОВАТЕЛЯ" "Добавить пользователя?" - "После создания профиля его потребуется настроить.\n\nЛюбой пользователь устройства может обновлять приложения для всех аккаунтов." + "Когда вы добавите пользователя, ему потребуется настроить профиль.\n\nЛюбой пользователь устройства может обновлять приложения для всех аккаунтов." "Удалить аккаунт?" "Все приложения и данные этого пользователя будут удалены." "Удалить" @@ -433,8 +434,7 @@ "В рабочем профиле запущено приложение \"%1$s\"" "В личном профиле запущено приложение \"%1$s\"" "На устройстве запущено приложение \"%1$s\"" - - + "Управление устройством" "Мониторинг профиля" "Отслеживание сетей" "Настройки VPN" @@ -443,18 +443,14 @@ "Отключить VPN" "Отключить VPN" "Просмотреть политику" - - - - + "Вашим устройством управляет организация \"%1$s\".\n\nАдминистратор может контролировать настройки, приложения и параметры доступа к корпоративным ресурсам на этом устройстве, а также связанные с ним данные (например, сведения о местоположении).\n\nЗа подробной информацией обращайтесь к администратору." + "Этим устройством управляет ваша организация.\n\nАдминистратор может контролировать настройки, приложения и параметры доступа к корпоративным ресурсам на этом устройстве, а также связанные с ним данные (например, сведения о местоположении).\n\nЗа подробной информацией обращайтесь к администратору." "Ваша организация установила сертификат ЦС на устройство. Она может отслеживать и изменять защищенный сетевой трафик." "Ваша организация установила сертификат ЦС в рабочем профиле. Она может отслеживать и изменять защищенный сетевой трафик." "На устройстве установлен сертификат ЦС. Ваш защищенный сетевой трафик могут отслеживать и изменять." "Администратор включил ведение сетевого журнала, чтобы отслеживать трафик на вашем устройстве." - - - - + "Запущено приложение \"%1$s\". Оно может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и сайтами." + "Запущены приложения \"%1$s\" и \"%2$s\". Они могут отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и сайтами." "В рабочем профиле запущено приложение \"%1$s\", которое может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и веб-сайтами." "В личном профиле запущено приложение \"%1$s\", которое может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и сайтами." "Этим устройством управляет приложение \"%1$s\"" @@ -476,6 +472,8 @@ "Запущено приложение \"%1$s\", которое может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и веб-сайтами." "Вашим рабочим профилем управляет организация \"%1$s\". Приложение \"%2$s\" может отслеживать ваши действия в корпоративной сети, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nЧтобы получить подробную информацию, обратитесь к администратору." "Вашим рабочим профилем управляет организация \"%1$s\". Приложение \"%2$s\" может отслеживать ваши действия в корпоративной сети, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nТакже запущено приложение \"%3$s\", которое может отслеживать ваши действия в сети, выполняемые в личном профиле." + + "Устройство необходимо будет разблокировать вручную" "Быстрый доступ к уведомлениям" "Просматривайте уведомления на заблокированном экране." @@ -713,6 +711,8 @@ "Уведомление %1$s: %2$s" "Приложение не поддерживает разделение экрана." "Приложение не поддерживает разделение экрана." + "Приложение может не работать на дополнительном экране." + "Приложение не поддерживает запуск на дополнительных экранах." "Открыть настройки." "Развернуть быстрые настройки." "Скрыть быстрые настройки." @@ -762,8 +762,7 @@ "Приложения с мгновенным запуском" "Приложения с мгновенным запуском не требуется устанавливать." "О приложении" - - + "Перейти в браузер" "Моб. Интернет" "Модуль Wi-Fi отключен" "Модуль Bluetooth отключен" diff --git a/packages/SystemUI/res/values-ru/strings_car.xml b/packages/SystemUI/res/values-ru/strings_car.xml index cbdb8d7475bc2cf1c3d3e661fdc1a7ecb431fd11..df03e5dead3317693a2984249c69914e05e078a8 100644 --- a/packages/SystemUI/res/values-ru/strings_car.xml +++ b/packages/SystemUI/res/values-ru/strings_car.xml @@ -19,6 +19,5 @@ - "Безопасность движения" - "Всегда учитывайте дорожную обстановку и соблюдайте правила. Маршруты могут быть неточными, неполными, проходить по опасным, неподходящим или запрещенным для движения участкам или пересекать границы. Сведения об организациях также могут быть неточными и неполными. Данные не обновляются в режиме реального времени, и точность определения местоположения не гарантируется. Не пользуйтесь мобильным устройством и не используйте приложения, не предназначенные для Android Auto, управляя автомобилем." + "Неизвестный пользователь" diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index d539d1c0c68794ea44c819b432e5bbdea7a53e06..4820d5ee0f19e7baa2da9cacff21b316b528a783 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -152,14 +152,12 @@ "Edge" "Wi-Fi" "SIM නැත." - - - - - - + "ජංගම දත්ත" + "ජංගම දත්ත ක්‍රියාත්මකයි" + "ජංගම දත්ත ක්‍රියාවිරහිතයි" "බ්ලූටූත් ටෙදරින්." "අහස්යානා ආකාරය." + "VPN ක්‍රියාත්මකයි." "SIM කාඩ්පත නැත." "වාහක ජාලය වෙනස් වේ." "බැටරි විස්තර විවෘත කරන්න" @@ -242,11 +240,9 @@ "ආරෝපණය වෙමින්" "2G-3G දත්ත විරාම කර ඇත" "4G දත්ත විරාම කර ඇත" - - + "ජංගම දත්ත විරාම කර ඇත" "දත්ත විරාම කර ඇත" - - + "ඔබ සැකසූ දත්ත සීමාව ළඟා වී ඇත. ඔබ තවදුරටත් ජංගම දත්ත භාවිත නොකරයි. \n\nඔබ නැවත ආරම්භ කළහොත්, දත්ත භාවිතය සඳහා ගාස්තු අදාළ විය හැකිය." "නැවත පටන්ගන්න" "අන්තර්ජාල සම්බන්ධතාවයක් නැත" "Wi-Fi සම්බන්ධිතයි" @@ -319,8 +315,7 @@ "හොට්ස්පොට්" "දැනුම්දීම්" "සැණෙළි ආලෝකය" - - + "ජංගම දත්ත" "දත්ත භාවිතය" "ඉතිරි ඇති දත්ත" "සීමාවට වඩා වැඩිය" @@ -433,8 +428,7 @@ "කාර්යාල පැතිකඩ %1$s වෙත සම්බන්ධ වුණි" "පුද්ගලික පැතිකඩ %1$s වෙත සම්බන්ධ වුණි" "උපාංගය %1$s වෙත සම්බන්ධ වුණි" - - + "උපාංග කළමනාකරණය" "පැතිකඩ නිරීක්ෂණය කිරීම" "ජාල නිරීක්ෂණය" "VPN" @@ -443,18 +437,14 @@ "VPN අබල කරන්න." "VPN විසන්ධි කරන්න" "ප්‍රතිපත්ති පෙන්වන්න" - - - - + "ඔබගේ උපාංගය ඔබගේ %1$s විසින් කළමනාකරණය කරනු ලැබේ. \n\nඔබේ පරිපාලකට ඔබේ උපාංගය හා සම්බන්ධිත සැකසීම්, ආයතනික ප්‍රවේශය, යෙදුම්, දත්ත සහ ඔබේ උපාංග ස්ථාන තොරතුරු නිරීක්ෂණය සහ කළමනාකරණය කිරීමට හැකිය.\n\nවැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න." + "ඔබගේ උපාංගය ඔබගේ සංවිධානය විසින් කළමනාකරණය කරනු ලැබේ.\n\nඔබේ පරිපාලකට ඔබේ උපාංගය හා සම්බන්ධිත සැකසීම්, ආයතනික ප්‍රවේශය, යෙදුම්, දත්ත සහ ඔබේ උපාංග ස්ථාන තොරතුරු නිරීක්ෂණය සහ කළමනාකරණය කිරීමට හැකිය.\n\nවැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න." "ඔබගේ සංවිධානය ඔබගේ උපාංගය තුළ සහතික අධිකාරියක් ස්ථාපනය කර තිබේ. ඔබගේ ආරක්ෂක ජාල තදබදය නිරීක්ෂණය හෝ වෙනස් කිරීමට පුළුවනි." "ඔබගේ සංවිධානය ඔබගේ කාර්යාල පැතිකඩ තුළ සහතික අධිකාරියක් ස්ථාපනය කර තිබේ. ඔබගේ ආරක්ෂක ජාල තදබදය නිරීක්ෂණය හෝ වෙනස් කිරීමට පුළුවනි." "මෙම උපාංගය තුළ සහතික අධිකාරියක් ස්ථාපනය කර තිබේ. ඔබගේ ආරක්ෂක ජාල තදබදය නිරීක්ෂණය හෝ වෙනස් කිරීමට පුළුවනි." "ඔබගේ පරිපාලක ඔබගේ උපාංගය මත තදබදය නිරීක්ෂණය කරන ජාල ලොග් කිරීම ක්‍රියාත්මක කර ඇත." - - - - + "ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි %1$s, වෙත ඔබ සම්බන්ධ වී ඇත." + "ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි %1$s සහ %2$s වෙත ඔබ සම්බන්ධ වී ඇත." "ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි %1$s, වෙත ඔබේ කාර්යාල පැතිකඩ සම්බන්ධ වී ඇත." "ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි %1$s වෙත ඔබේ පුද්ගලික පැතිකඩ සම්බන්ධ වී ඇත." "ඔබගේ උපාංගය %1$s මගින් කළමනාකරණය කෙරේ." @@ -476,6 +466,8 @@ "ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ පෞද්ගලික ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %1$s වෙත ඔබ සම්බන්ධ වී ඇත." "ඔබේ කාර්ය පැතිකඩ කළමනාකරණය කරන්නේ %1$s මගිනි. ඔබේ ඊ-තැපැල්, යෙදුම්, සහ වෙබ් අඩවි ඇතුළු, ඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %2$s වෙත පැතිකඩ සම්බන්ධය.\n\nවැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න." "ඔබේ කාර්යාල පැතිකඩ කළමනාකරණය කරන්නේ %1$s විසිනි. ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ කාර්යාල ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %2$s, වෙත පැතිකඩ සම්බන්ධ වී ඇත.\n\nඔබ ඔබේ පෞද්ගලික ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %3$s වෙතද සම්බන්ධ වී ඇත." + + "ඔබ අතින් අගුළු අරින තුරු උපකරණය අගුළු වැටි තිබේ" "දැනුම්දීම් ඉක්මනින් ලබාගන්න" "ඔබ අඟුළු හැරීමට කලින් ඒවා බලන්න" @@ -569,12 +561,9 @@ %1$s, %2$s, සහ තවත් %3$dක් %1$s, %2$s, සහ තවත් %3$dක් - - - - - - + "%1$s සඳහා දැනුම්දීම් පාලන විවෘත කරන ලදී" + "%1$s සඳහා දැනුම්දීම් පාලන වසන ලදී" + "මෙම නාලිකාව වෙතින් දැනුම්දීම් සඳහා ඉඩ දෙන්න" "සියලු ප්‍රවර්ග" "තව සැකසීම්" "අභිමත කරන්න: %1$s" @@ -712,6 +701,8 @@ "%1$s දැනුම්දීම: %2$s" "යෙදුම බෙදුම්-තිරය සමග ක්‍රියා නොකළ හැකිය." "යෙදුම බෙදුණු-තිරය සඳහා සහාය නොදක්වයි." + "යෙදුම ද්විතියික සංදර්ශකයක ක්‍රියා නොකළ හැකිය." + "යෙදුම ද්විතීයික සංදර්ශක මත දියත් කිරීම සඳහා සහාය නොදක්වයි." "සැකසීම් විවෘත කරන්න." "ඉක්මන් සැකසීම් විවෘත කරන්න." "ඉක්මන් සැකසීම් වසන්න." @@ -730,14 +721,10 @@ "පින්තූරය තුළ පින්තූරය මෙනුව" "%s පින්තූරය-තුළ-පින්තූරය තුළ වේ" "ඔබට %s මෙම විශේෂාංගය භාවිත කිරීමට අවශ්‍ය නැති නම්, සැකසීම් විවෘත කිරීමට තට්ටු කර එය ක්‍රියාවිරහිත කරන්න." - - - - - - - - + "ධාවනය කරන්න" + "විරාම කරන්න" + "ඊළඟ එකට පනින්න" + "පෙර එකට පනින්න" "දුරකථනය රත් වීම නිසා ක්‍රියාවිරහිත කරන ලදී" "ඔබගේ දුරකථනය දැන් සාමාන්‍ය ලෙස ධාවනය වේ" "ඔබේ දුරකථනය ඉතාම උණුසුම්ය, එම නිසා එය සිසිල් වීමට ක්‍රියාවිරහිත කරන ලදී. ධැන් ඔබේ දුරකථනය සාමාන්‍ය පරිදි ධාවනය වේ.\n\nඔබ පහත දේවල් සිදු කළහොත් ඔබේ දුරකථනය ඉතාම උණුසුම් විය හැකිය:\n • සම්පත්-දැඩි සත්කාරක යෙදුම් භාවිතය (ක්‍රීඩා, වීඩියෝ, හෝ සංචලන යෙදුම් යනාදී)\n • විශාල ගොනු බාගැනීම හෝ උඩුගත කිරීම\n • ඔබේ දුරකථනය අධික උෂ්ණත්වයේදී භාවිත කිරීම" @@ -765,8 +752,7 @@ "ක්ෂණික යෙදුම්" "ක්ෂණික යෙදුම් ස්ථාපනය කිරීම අවශ්‍ය නොවේ." "යෙදුම් තොරතුරු" - - + "වෙබය වෙත යන්න" "ජංගම දත්ත" "Wi-Fi ක්‍රියා විරහිතයි" "බ්ලූටූත් ක්‍රියා විරහිතයි" diff --git a/packages/SystemUI/res/values-si/strings_car.xml b/packages/SystemUI/res/values-si/strings_car.xml index 549e89b250027e160769b04f7bd19146685e22c1..723b4da7efd20f231b5eee3f2edb6dc6ca14a240 100644 --- a/packages/SystemUI/res/values-si/strings_car.xml +++ b/packages/SystemUI/res/values-si/strings_car.xml @@ -19,6 +19,5 @@ - "ආරක්ෂිතව රිය පදවන්න" - "රිය පැදවීම් තත්ත්වයන් ගැන පූර්ණ අවධානයෙන් සිටින්න, සැම විටම අදාළ සියලු නීතිවලට ගරු කරන්න. මග පෙන්වීම් නිවැරදි නොවීමට, අසම්පූර්ණ වීමට, භයානක වීමට, නුසුදුසු වීමට, තහනම් ඒවා වීමට, හෝ පරිපාලන ප්‍රදේශ තරණයට අදාළ ඒවා වීමට හැකිය. දත්ත තථ්‍ය කාල නොවීමට හැකි අතර, ස්ථාන නිරවද්‍යතාව සහතික කළ නොහැකිය. රිය පදවන අතරතුර ඔබේ ජංගම උපාංගය භාවිත කිරීම හෝ Android Auto සඳහා නිපදවා නැති යෙදුම් භාවිත කිරීම නොකරන්න." + "නොදනී" diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index a1af259a6c0df301c4ec1d419f36825b0aeccca5..efcb1d025a5da420dd5fc0f0aa901f8f20c09665 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -159,6 +159,7 @@ "Mobilné dáta sú vypnuté" "Pripojenie cez Bluetooth." "Režim v lietadle." + "VPN je zapnuté." "Žiadna SIM karta." "Zmena siete operátora" "Otvoriť podrobnosti o batérii" @@ -233,8 +234,8 @@ "Mobilný hotspot je vypnutý." "Mobilný hotspot je zapnutý." "Prenášanie bolo zastavené." - "Pracovný režim – vyp." - "Pracovný režim – zap." + "Pracovný režim vypnutý" + "Pracovný režim zapnutý" "Pracovný režim je vypnutý." "Pracovný režim je zapnutý." "Šetrič dát bol vypnutý." @@ -316,7 +317,7 @@ "Hotovo" "Pripojené" "Pripája sa..." - "Zdieľanie dátového pripojenia" + "Zdieľané pripojenie" "Hotspot" "Upozornenia" "Baterka" @@ -357,9 +358,9 @@ "Vyhľadávanie" "Prejdite prstom nahor: %s." "Prejdite prstom doľava: %s." - "Nebudú vás rušiť zvuky ani vibrácie s výnimkou budíkov, pripomenutí, udalostí a volajúcich, ktoré špecifikujete." + "Nebudú vás rušiť zvuky ani vibrácie s výnimkou budíkov, pripomenutí, udalostí a vybraných volajúcich." "Prispôsobiť" - "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ť." + "Budú zablokované všetky zvuky a vibrácie vrátane budíkov, hudby, videí a hier. Stále však budete môcť telefonovať." "Zablokujú sa tým VŠETKY zvuky a vibrácie vrátane zvukov budíkov, hudby, videí a hier." "+%d" "Menej naliehavé upozornenia sa nachádzajú nižšie" @@ -433,8 +434,7 @@ "Pracovný profil je pripojený k aplikácii %1$s" "Osobný profil je pripojený k aplikácii %1$s" "Zariadenie je pripojené k aplikácii %1$s" - - + "Správa zariadení" "Monitorovanie profilu" "Sledovanie siete" "VPN" @@ -443,18 +443,14 @@ "Deaktivovať VPN" "Odpojiť sieť VPN" "Zobraziť pravidlá" - - - - + "Zariadenie spravuje organizácia %1$s.\n\nSprávca môže sledovať a spravovať nastavenia, firemný prístup, aplikácie a údaje súvisiace s týmto zariadením vrátane informácií o polohe vášho zariadenia.\n\nĎalšie informácie vám poskytne správca." + "Zariadenie spravuje vaša organizácia.\n\nSprávca môže sledovať a spravovať nastavenia, firemný prístup, aplikácie a údaje súvisiace s týmto zariadením vrátane informácií o polohe vášho zariadenia.\n\nĎalšie informácie vám poskytne správca." "Organizácia nainštalovala pre toto zariadenie certifikačnú autoritu. Zabezpečená sieťová premávka môže byť sledovaná či upravená." "Organizácia nainštalovala pre váš pracovný profil certifikačnú autoritu. Zabezpečená sieťová premávka môže byť sledovaná či upravená." "V tomto zariadení je nainštalovaná certifikačná autorita. Zabezpečená sieťová premávka môže byť sledovaná či upravená." "Správca aktivoval zapisovanie do denníka siete, ktoré sleduje premávku na vašom zariadení." - - - - + "Pripojili ste sa k aplikácii %1$s, ktorá môže sledovať vašu aktivitu v sieti, vrátane správ, aplikácií a webových stránok." + "Pripojili ste sa k aplikáciám %1$s%2$s, ktoré môžu sledovať vašu aktivitu v sieti, vrátane správ, aplikácií a webových stránok." "Váš pracovný profil je pripojený k aplikácii %1$s, ktorá môže sledovať vašu aktivitu v sieti vrátane správ, aplikácií a webových stránok." "Váš osobný profil je pripojený k aplikácii %1$s, ktorá môže sledovať vašu aktivitu v sieti vrátane správ, aplikácií a webových stránok." "Vaše zariadenie spravuje aplikácia %1$s." @@ -476,6 +472,8 @@ "Ste pripojený/-á k aplikácii %1$s, ktorá môže sledovať vašu osobnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok." "Váš pracovný profil spravuje organizácia %1$s. Je pripojený k aplikácii %2$s, ktorá môže sledovať vašu pracovnú aktivitu v sieti vrátane správ, aplikácií a webových stránok.\n\nĎalšie informácie vám poskytne správca." "Váš pracovný profil spravuje organizácia %1$s. Je pripojený k aplikácii %2$s, ktorá môže sledovať vašu pracovnú aktivitu v sieti vrátane správ, aplikácií a webových stránok.\n\nPripojili ste sa k aplikácii %3$s, ktorá môže sledovať vašu osobnú aktivitu v sieti." + + "Zariadenie zostane uzamknuté, dokým ho ručne neodomknete." "Získavať upozornenia rýchlejšie" "Zobraziť pred odomknutím" @@ -713,11 +711,13 @@ "Upozornenie %1$s: %2$s" "Aplikácia nemusí fungovať so zapnutou rozdelenou obrazovkou." "Aplikácia nepodporuje rozdelenú obrazovku." + "Aplikácia nemusí fungovať na sekundárnej obrazovke." + "Aplikácia nepodporuje spúšťanie na sekundárnych obrazovkách." "Otvoriť nastavenia" "Otvoriť rýchle nastavenia" "Zavrieť rýchle nastavenia" "Budík bol nastavený." - "Prihlásený/-á ako %s" + "Prihlásený používateľ %s" "Žiadny internet" "Otvoriť podrobnosti" "Otvoriť nastavenia %s" @@ -745,7 +745,7 @@ "Pravá skratka" "Ľavá skratka tiež odomkne" "Pravá skratka tiež odomkne" - "Žiadne" + "Žiadna" "Spustiť aplikáciu %1$s" "Ďalšie aplikácie" "Kruh" @@ -762,9 +762,8 @@ "Okamžité aplikácie" "Okamžité aplikácie nevyžadujú inštaláciu." "Info o aplikácii" - - - "Mobilné dátové prenosy" + "Prejsť na internet" + "Mobilné dáta" "Pripojenie Wi-Fi je vypnuté" "Rozhranie Bluetooth je vypnuté" "Nastavenie Nerušiť je vypnuté" diff --git a/packages/SystemUI/res/values-sk/strings_car.xml b/packages/SystemUI/res/values-sk/strings_car.xml index bd9410da9e81848d0d9e0ba131e659080d2a349c..3559bb025b4da643e64ce78ccc629e99ebdb2493 100644 --- a/packages/SystemUI/res/values-sk/strings_car.xml +++ b/packages/SystemUI/res/values-sk/strings_car.xml @@ -19,6 +19,5 @@ - "Jazdite bezpečne" - "Zachovajte si úplný prehľad o jazdných podmienkach a vždy dodržiavajte príslušné zákony. Trasy môžu byť nepresné, neúplné, nebezpečné, nevhodné, zakázané alebo môžu zahŕňať cestu cez rôzne správne oblasti. Obchodné informácie môžu byť tiež nepresné alebo neúplné. Údaje nie sú aktualizované v reálnom čase a presnosť polohy nemôžeme zaručiť. Počas jazdy nemanipulujte s mobilným zariadením ani nepoužívajte aplikácie, ktoré nie sú určené pre funkciu Android Auto." + "Neznáme" diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 3edd141ed69abf0f6a81c4c0619a76fb2d9ff688..4b4982907268678e1b3b14866334fa38f8814067 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -154,14 +154,12 @@ "Edge" "Wi-Fi" "Ni kartice SIM." - - - - - - + "Prenos podatkov v mobilnem omrežju" + "Prenos podatkov v mobilnem omrežju je vklopljen" + "Prenos podatkov v mobilnem omrežju je izklopljen" "Internet prek Bluetootha." "Način za letalo." + "Omrežje VPN je vklopljeno." "Ni kartice SIM." "Spreminjanje omrežja operaterja." "Odpiranje podrobnosti o akumulatorju" @@ -222,7 +220,7 @@ "Poročanje o lokaciji je vklopljeno." "Poročanje o lokaciji je izklopljeno." "Poročanje o lokaciji je vklopljeno." - "Alarm je nastavljen na %s." + "Alarm je nastavljen čez: %s." "Zapri podokno." "Daljši čas." "Krajši čas." @@ -246,11 +244,9 @@ "Polnjenje" "Prenos podatkov v omrežju 2G/3G je zaustavljen" "Prenos podatkov v omrežju 4G je zaustavljen" - - + "Prenos podatkov v mobil. omrežju je zaustavljen" "Prenos podatkov je zaustavljen" - - + "Dosegli ste nastavljeno omejitev porabe podatkov. Prenosa podatkov v mobilnem omrežju ne uporabljate več.\n\nČe nadaljujete, lahko nastanejo stroški prenosa podatkov." "Nadaljuj" "Ni internetne povez." "Wi-Fi povezan" @@ -325,8 +321,7 @@ "Dostopna točka" "Obvestila" "Svetilka" - - + "Prenos podatkov v mobilnem omrežju" "Poraba podatkov" "Preostala količina podatkov" "Omejitev prekoračena" @@ -439,8 +434,7 @@ "Delovni profil je povezan z aplikacijo %1$s" "Osebni profil je povezan z aplikacijo %1$s" "Naprava je povezana z aplikacijo %1$s" - - + "Upravljanje naprav" "Nadzor nad profilom" "Nadzor omrežja" "VPN" @@ -449,18 +443,14 @@ "Onemogoči VPN" "Prekini povezavo z VPN-jem" "Prikaži pravilnike" - - - - + "Napravo upravlja organizacija %1$s.\n\nSkrbnik lahko nadzira in upravlja nastavitve, dostop za podjetje, aplikacije, z napravo povezane podatke in podatke o lokaciji naprave.\n\nZa več informacij se obrnite na skrbnika." + "Napravo upravlja vaša organizacija.\n\nSkrbnik lahko nadzira in upravlja nastavitve, dostop za podjetje, aplikacije, z napravo povezane podatke in podatke o lokaciji naprave.\n\nZa več informacij se obrnite na skrbnika." "Vaša organizacija je v to napravo namestila overitelja potrdil. Varni omrežni promet se lahko nadzira ali spreminja." "Vaša organizacija je v vaš delovni profil namestila overitelja potrdil. Varni omrežni promet se lahko nadzira ali spreminja." "V tej napravi je nameščen overitelj potrdil. Varni omrežni promet se lahko nadzira ali spreminja." "Skrbnik je vklopil beleženje omrežnega prometa, ki nadzira promet v napravi." - - - - + "Povezani ste z aplikacijo %1$s, ki lahko nadzira omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti." + "Povezani ste z aplikacijama %1$s in %2$s, ki lahko nadzirata omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti." "Delovni profil je povezan z aplikacijo %1$s, ki lahko nadzira omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti." "Osebni profil je povezan z aplikacijo %1$s, ki lahko nadzira omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti." "Napravo upravlja aplikacija %1$s." @@ -482,6 +472,8 @@ "Povezani ste z aplikacijo %1$s, ki lahko nadzira vašo osebno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti." "Delovni profil upravlja organizacija %1$s. Profil je povezan z aplikacijo %2$s, ki lahko nadzira vašo delovno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nZa več informacij se obrnite na skrbnika." "Delovni profil upravlja organizacija %1$s. Profil je povezan z aplikacijo %2$s, ki lahko nadzira vašo delovno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nPovezani ste tudi z aplikacijo %3$s, ki lahko nadzira vašo osebno omrežno dejavnost." + + "Naprava bo ostala zaklenjena, dokler je ročno ne odklenete." "Hitrejše prejemanje obvestil" "Oglejte si jih pred odklepanjem" @@ -579,12 +571,9 @@ %1$s, %2$s in %3$d drugi %1$s, %2$s in %3$d drugih - - - - - - + "Kontrolniki obvestil za aplikacijo %1$s so odprti" + "Kontrolniki obvestil za aplikacijo %1$s so zaprti" + "Dovoli obvestila iz tega kanala" "Vse kategorije" "Več nastavitev" "Prilagodi: %1$s" @@ -722,6 +711,8 @@ "Obvestilo za %1$s: %2$s" "Aplikacija morda ne deluje v načinu razdeljenega zaslona." "Aplikacija ne podpira načina razdeljenega zaslona." + "Aplikacija morda ne bo delovala na sekundarnem zaslonu." + "Aplikacija ne podpira zagona na sekundarnih zaslonih." "Odpri nastavitve." "Odpri hitre nastavitve." "Zapri hitre nastavitve." @@ -740,14 +731,10 @@ "Meni za sliko v sliki" "%s je v načinu slika v sliki" "Če ne želite, da aplikacija %s uporablja to funkcijo, se dotaknite, da odprete nastavitve, in funkcijo izklopite." - - - - - - - - + "Predvajaj" + "Začasno ustavi" + "Preskoči na naslednjega" + "Preskoči na prejšnjega" "Tel. izklopljen zaradi vročine" "Zdaj telefon normalno deluje" "Telefon je bil prevroč, zato se je izklopil, da se ohladi. Zdaj normalno deluje.\n\nTelefon lahko postane prevroč ob:\n • uporabi aplikacij, ki intenzivno porabljajo sredstva (npr. za igranje iger, videoposnetke ali navigacijo)\n • prenosu ali nalaganju velikih datotek\n • uporabi telefona pri visokih temp." @@ -775,8 +762,7 @@ "Aplikacije brez nameščanja" "Aplikacij brez nameščanja ni treba namestiti." "Podatki o aplikaciji" - - + "Pojdi v splet" "Mobilni podatki" "Wi-Fi je izklopljen" "Bluetooth je izklopljen" diff --git a/packages/SystemUI/res/values-sl/strings_car.xml b/packages/SystemUI/res/values-sl/strings_car.xml index 0102799a4b3e2fdc5d6c3a8f55388698fee661e1..cdc0ba5d5618a7fc73b1a54ac5f8f076b91e5d2d 100644 --- a/packages/SystemUI/res/values-sl/strings_car.xml +++ b/packages/SystemUI/res/values-sl/strings_car.xml @@ -19,6 +19,5 @@ - "Varna vožnja" - "Bodite pozorni na vozne razmere in vselej upoštevajte veljavno zakonodajo. Navodila za pot so morda nenatančna, nepopolna, nevarna, neprimerna ali prepovedana oziroma vključujejo prečkanje upravnih območij. Prav tako nenatančni ali nepopolni so lahko podatki o podjetjih. Podatki niso sprotni in natančnosti lociranja ni mogoče zagotoviti. Med vožnjo ne uporabljajte mobilne naprave ali aplikacij, ki niso namenjene za Android Auto." + "Neznano" diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 18aaa2741581c08e3afe7f61819310b84868b9ac..061a4d6bc9118dd28f5d0b61dacc2bbd3a045cec 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -157,6 +157,7 @@ "Të dhënat celulare janë joaktive" "Po lidhet me \"bluetooth\"." "modaliteti i aeroplanit" + "VPN-ja është aktive." "Nuk ka kartë SIM." "Rrjeti i operatorit celular po ndryshohet." "Hap detajet e baterisë" @@ -427,8 +428,7 @@ "Profili i punës është i lidhur me %1$s" "Profili personal është i lidhur me %1$s" "Pajisja është e lidhur me %1$s" - - + "Menaxhimi i pajisjes" "Monitorimi i profilit" "Monitorimi i rrjetit" "VPN" @@ -437,18 +437,14 @@ "Çaktivizo VPN-në" "Shkëput VPN-në" "Shiko politikat" - - - - + "Pajisja jote menaxhohet nga %1$s.\n\nAdministratori mund të monitorojë dhe menaxhojë cilësimet, qasjen e korporatës, aplikacionet, të dhënat e lidhura me pajisjen tënde, si dhe informacionet e vendndodhjes së pajisjes tënde.\n\nPër më shumë informacione, kontakto me administratorin." + "Pajisja jote menaxhohet nga organizata jote.\n\nAdministratori mund të monitorojë dhe menaxhojë cilësimet, qasjen e korporatës, aplikacionet, të dhënat e lidhura me pajisjen tënde, si dhe informacionet e vendndodhjes së pajisjes tënde.\n\nPër më shumë informacione, kontakto me administratorin." "Organizata jote instaloi një autoritet certifikate në këtë pajisje. Trafiku i rrjetit tënd të sigurt mund të monitorohet ose modifikohet." "Organizata jote instaloi një autoritet certifikate në profilin tënd të punës. Trafiku i rrjetit tënd të sigurt mund të monitorohet ose modifikohet." "Në këtë pajisje është instaluar një autoritet certifikate. Trafiku i rrjetit tënd të sigurt mund të monitorohet ose modifikohet." "Administratori ka aktivizuar regjistrimin e rrjetit, i cili monitoron trafikun në pajisjen tënde." - - - - + "Je lidhur me aplikacionin %1$s, i cili mund të monitorojë aktivitetin tënd në rrjet, duke përfshirë mail-et, aplikacionet dhe sajtet e uebit." + "Je lidhur me aplikacionet %1$s dhe %2$s, të cilat mund të monitorojnë aktivitetin tënd në rrjet, duke përfshirë mail-et, aplikacionet dhe sajtet e uebit." "Profili yt i punës është i lidhur me %1$s, i cili mund të monitorojë aktivitetin tënd në rrjet, duke përfshirë mail-et, aplikacionet dhe sajtet e uebit." "Profili yt personal është i lidhur me %1$s, i cili mund të monitorojë aktivitetin tënd në rrjet, duke përfshirë mail-et, aplikacionet dhe sajtet e uebit." "Pajisja jote menaxhohet nga %1$s." @@ -470,6 +466,8 @@ "Je i lidhur me aplikacionin %1$s, i cili mund të monitorojë aktivitetin tënd personal në rrjet, përfshirë mailet, aplikacionet dhe sajtet e uebit." "Profili yt i punës menaxhohet nga %1$s. Profili është i lidhur me %2$s, i cili mund të monitorojë aktivitetin tënd të punës në rrjet, duke përfshirë mail-et, aplikacionet dhe sajtet e uebit.\n\nPër më shumë informacione, kontakto me administratorin." "Profili yt i punës menaxhohet nga %1$s. Profili është i lidhur me %2$s, i cili mund të monitorojë aktivitetin tënd të punës në rrjet, duke përfshirë mail-et, aplikacionet dhe sajtet e uebit.\n\nJe lidhur gjithashtu edhe me %3$s, i cili mund të monitorojë aktivitetin tënd personal në rrjet." + + "Pajisje do të qëndrojë e kyçur derisa ta shkyçësh manualisht" "Merr njoftime më shpejt" "Shikoji para se t\'i shkyçësh" @@ -619,7 +617,7 @@ "Asistenti" "Shfletuesi" "Kontaktet" - "Mail-i" + "Email-i" "SMS" "Muzikë" "YouTube" @@ -703,6 +701,8 @@ "Njoftim nga %1$s: %2$s" "Aplikacioni mund të mos funksionojë me ekranin e ndarë." "Aplikacioni nuk mbështet ekranin e ndarë." + "Aplikacioni mund të mos funksionojë në një ekran dytësor." + "Aplikacioni nuk mbështet nisjen në ekrane dytësore." "Hap cilësimet." "Hap cilësimet e shpejta." "Mbyll cilësimet e shpejta." @@ -752,8 +752,7 @@ "Aplikacionet e çastit" "Aplikacionet e çastit nuk kërkojnë instalim." "Informacioni mbi aplikacionin" - - + "Shko në ueb" "Të dhënat celulare" "Wi-Fi është joaktiv" "Bluetooth-i është joaktiv" diff --git a/packages/SystemUI/res/values-sq/strings_car.xml b/packages/SystemUI/res/values-sq/strings_car.xml index 2e638776162c61cc2791e7f09d54e4be9ed4ee94..b318aff1ac8e5cd5c53209a5ab597f9544a8a94e 100644 --- a/packages/SystemUI/res/values-sq/strings_car.xml +++ b/packages/SystemUI/res/values-sq/strings_car.xml @@ -19,6 +19,5 @@ - "Drejtoje makinën në mënyrë të sigurt" - "Ji plotësisht i vetëdijshëm për kushtet e lëvizjes me makinë dhe respekto gjithmonë ligjet përkatëse. Udhëzimet mund të jenë të pasakta, jo të plota, të rrezikshme, të papërshtatshme, të ndaluara ose mund të përfshijnë kalimin në zona administrative. Informacionet e biznesit mund të jenë po ashtu të pasakta ose jo të plota. Të dhënat nuk janë në kohë reale dhe saktësia e vendndodhjes nuk mund të garantohet. Gjatë drejtimit të makinës mos e përdor pajisjen celulare ose mos përdor aplikacionet që nuk janë të planifikuara për Android Auto." + "E panjohur" diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 5eee968f3e56cccd1b24330f92605dfaedf12ce5..2799782d3f65c9cfe4b595c2000d3dbb198d34f4 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -158,6 +158,7 @@ "Мобилни подаци су искључени" "Bluetooth привезивање." "Режим рада у авиону." + "VPN је укључен." "Нема SIM картице." "Промена мреже мобилног оператера." "Отвори детаље о батерији" @@ -429,8 +430,7 @@ "Профил за Work је повезан са апликацијом %1$s" "Лични профил је повезан са апликацијом %1$s" "Уређај је повезан са апликацијом %1$s" - - + "Управљање уређајима" "Надгледање профила" "Надгледање мреже" "VPN" @@ -439,18 +439,14 @@ "Онемогући VPN" "Прекини везу са VPN-ом" "Прикажи смернице" - - - - + "Уређајем управља %1$s.\n\nАдминистратор може да надгледа подешавања, корпоративни приступ, апликације, податке повезане са уређајем и информације о локацији уређаја, као и да управља њима.\n\nВише информација потражите од администратора." + "Уређајем управља организација.\n\nАдминистратор може да надгледа подешавања, корпоративни приступ, апликације, податке повезане са уређајем и информације о локацији уређаја, као и да управља њима.\n\nВише информација потражите од администратора." "Организација је на овом уређају инсталирала ауторитет за издавање сертификата. Безбедни мрежни саобраћај може да се прати или мења." "Организација је на профилу за Work инсталирала ауторитет за издавање сертификата. Безбедни мрежни саобраћај може да се прати или мења." "На овом уређају је инсталиран ауторитет за издавање сертификата. Безбедни мрежни саобраћај може да се прати или мења." "Администратор је укључио евидентирање мреже, које прати саобраћај на уређају." - - - - + "Повезани сте са апликацијом %1$s, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове." + "Повезани сте са апликацијама %1$s и %2$s, које могу да надгледају активности на мрежи, укључујући имејлове, апликације и веб-сајтове." "Профил за Work је повезан са апликацијом %1$s, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове." "Лични профил је повезан са апликацијом %1$s, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове." "Уређајем управља %1$s." @@ -472,6 +468,8 @@ "Повезани сте са апликацијом %1$s, која може да надгледа активности на личној мрежи, укључујући имејлове, апликације и веб-сајтове." "Профилом за Work управља %1$s. Повезан је са апликацијом %2$s, која може да надгледа активности на пословној мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nВише информација потражите од администратора." "Профилом за Work управља %1$s. Повезан је са апликацијом %2$s, која може да надгледа активности на пословној мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nПовезани сте и са апликацијом %3$s, која може да надгледа активности на личној мрежи." + + "Уређај ће остати закључан док га не откључате ручно" "Брже добијајте обавештења" "Прегледајте их пре откључавања" @@ -707,6 +705,8 @@ "Обавештења за %1$s: %2$s" "Апликација можда неће функционисати са подељеним екраном." "Апликација не подржава подељени екран." + "Апликација можда неће функционисати на секундарном екрану." + "Апликација не подржава покретање на секундарним екранима." "Отвори Подешавања." "Отвори Брза подешавања." "Затвори Брза подешавања." @@ -756,8 +756,7 @@ "Инстант апликације" "Инстант апликације не захтевају инсталацију." "Информације о апликацији" - - + "Иди на веб" "Мобилни подаци" "Wi-Fi је искључен" "Bluetooth је искључен" diff --git a/packages/SystemUI/res/values-sr/strings_car.xml b/packages/SystemUI/res/values-sr/strings_car.xml index 7f9912021c80c89f1cc975d2c1a77cc79e1df685..8889bd3929e783b9217c53d960e760b04ed3507a 100644 --- a/packages/SystemUI/res/values-sr/strings_car.xml +++ b/packages/SystemUI/res/values-sr/strings_car.xml @@ -19,6 +19,5 @@ - "Возите безбедно" - "Увек водите рачуна о условима вожње и увек поштујте примењиве законе. Упутства могу да буду нетачна, непотпуна, опасна, неприкладна или забрањена, односно да подразумевају прелазак између административних области. И подаци о предузећу могу да буду нетачни или непотпуни. Подаци не настају у реалном времену и не можемо да гарантујемо прецизност локације. Немојте да употребљавате мобилни уређај нити да користите апликације које нису намењене за Android Auto током вожње." + "Непознато" diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index a5f5ae5a38e7fc4cf22f61b568c196d45b3d21f5..dfc1cbb1c41eac731b8c50686bcada1aa64e5c35 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -157,6 +157,7 @@ "Mobildata har inaktiverats" "Internetdelning via Bluetooth" "Flygplansläge" + "VPN har aktiverats." "Inget SIM-kort." "Byter leverantörsnätverk." "Visa uppgifter om batteri" @@ -427,8 +428,7 @@ "Jobbprofilen är ansluten till %1$s" "Den personliga profilen är ansluten till %1$s" "Enheten är ansluten till %1$s" - - + "Enhetshantering" "Profilövervakning" "Nätverksövervakning" "VPN" @@ -437,18 +437,14 @@ "Inaktivera VPN" "Koppla från VPN" "Visa policyer" - - - - + "Din enhet hanteras av %1$s.\n\nAdministratören kan övervaka och hantera inställningar, företagsåtkomst, appar, data med koppling till enheten och enhetens plats.\n\nKontakta administratören om du vill veta mer." + "Din enhet hanteras av organisationen.\n\nAdministratören kan övervaka och hantera inställningar, företagsåtkomst, appar, data med koppling till enheten och enhetens plats.\n\nKontakta administratören om du vill veta mer." "Organisationen har installerat en certifikatutfärdare på enheten. Din säkra nätverkstrafik kan övervakas och ändras." "Organisationen har installerat en certifikatutfärdare i jobbprofilen. Din säkra nätverkstrafik kan övervakas och ändras." "En certifikatutfärdare är installerad på enheten. Din säkra nätverkstrafik kan övervakas och ändras." "Administratören har aktiverat nätverksloggning som övervakar trafik på enheten." - - - - + "Du är ansluten till %1$s som kan övervaka din nätverksaktivitet, inklusive e-postmeddelanden, appar och webbplatser." + "Du är ansluten till %1$s och %2$s som kan övervaka din nätverksaktivitet, inklusive e-postmeddelanden, appar och webbplatser." "Jobbprofilen är ansluten till %1$s som kan övervaka din nätverksaktivitet, exempelvis e-post, appar och webbplatser." "Din personliga profil är ansluten till %1$s som kan övervaka din nätverksaktivitet, exempelvis e-post, appar och webbplatser." "Enheten hanteras av %1$s." @@ -470,6 +466,8 @@ "Du är ansluten till %1$s som kan övervaka din privata aktivitet på nätverket, inklusive e-postmeddelanden, appar och webbplatser." "Jobbprofilen hanteras av %1$s. Profilen är ansluten till %2$s som kan bevaka din nätverksaktivitet, exempelvis e-post, appar och webbplatser.\n\nKontakta administratören om du vill veta mer." "Jobbprofilen hanteras av %1$s. Profilen är ansluten till %2$s som kan bevaka din nätverksaktivitet på jobbet, exempelvis e-post, appar och webbplatser.\n\nDu är även ansluten till %3$s som kan bevaka din privata nätverksaktivitet." + + "Enheten förblir låst tills du låser upp den manuellt" "Få aviseringar snabbare" "Visa dem innan du låser upp" @@ -703,6 +701,8 @@ "%1$s-avisering: %2$s" "Appen kanske inte fungerar med delad skärm." "Appen har inte stöd för delad skärm." + "Appen kanske inte fungerar på en sekundär skärm." + "Appen kan inte köras på en sekundär skärm." "Öppna inställningarna." "Öppna snabbinställningarna." "Stäng snabbinställningarna" @@ -752,8 +752,7 @@ "Instant Apps" "Snabbappar behöver inte installeras." "Info om appen" - - + "Öppna webbplatsen" "Mobildata" "Wi-Fi är inaktiverat" "Bluetooth är inaktiverat" diff --git a/packages/SystemUI/res/values-sv/strings_car.xml b/packages/SystemUI/res/values-sv/strings_car.xml index 0c03fb67663b201ac5cd8272b00344d3ff356fc6..f6d86e9cecfa9a5ce898e194969a4f248e223437 100644 --- a/packages/SystemUI/res/values-sv/strings_car.xml +++ b/packages/SystemUI/res/values-sv/strings_car.xml @@ -19,6 +19,5 @@ - "Kör försiktigt" - "Håll koll på trafik- och körförhållanden och följ gällande lagar. Det kan hända att vägbeskrivningen inte stämmer, att den är ofullständig, farlig, olämplig, förbjuden eller att den innebär att du måste korsa en administrativ enhet. Det kan även hända att företagsuppgifter är felaktiga eller ofullständiga. Uppgifter visas inte i realtid och det går inte att garantera att platsen är korrekt. Hantera inte din mobila enhet och använd inte appar som inte är ämnade för Android Auto medan du kör." + "Okänt" diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 68728c2d3f69cd1eaa95e716ca61071c72aa0f7f..bb34bb99ced58d31af85286fb4daf0863ea6c86a 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -156,7 +156,8 @@ "Data ya Simu Imewashwa" "Data ya Simu Imezimwa" "Shiriki intaneti kwa Bluetooth." - "Hali ya ndege." + "Hali ya ndegeni." + "VPN imewashwa." "Hakuna SIM kadi." "Mabadiliko ya mtandao wa mtoa huduma." "Fungua maelezo ya betri" @@ -215,7 +216,7 @@ "Programu ya kuonyesha mahali ulipo imewashwa." "Programu ya Kuonyesha mahali ulipo imezimwa." "Programu ya Kuonyesha mahali ulipo imewashwa." - "Kengele imewekwa %s." + "Kengele imewashwa na italia %s." "Funga paneli." "Muda zaidi." "Muda kidogo" @@ -352,8 +353,8 @@ "Sogeza juu kwa %s ." "Sogeza kushoto kwa %s ." "Hutasumbuliwa na sauti na mitetemo, isipokuwa kengele, vikumbusho, matukio na wapigaji simu utakaobainisha." - "Badilisha kukufaa" - "Hatua hii huzuia sauti na mitetemo YOTE, ikiwa na pamoja na ile inayotokana na kengele, muziki, video na michezo. Bado utaweza kupiga simu." + "Badilisha upendavyo" + "Hatua hii huzuia sauti na mitetemo YOTE, ikiwa ni pamoja na ile inayotokana na kengele, muziki, video na michezo. Bado utaweza kupiga simu." "Hatua hii huzuia sauti na mitetemo YOTE, ikiwa ni pamoja na ile inayotokana na kengele, muziki, video na michezo." "%d+" "Arifa zisizo za dharura sana ziko hapo chini" @@ -397,7 +398,7 @@ "Mwondoe mtumiaji wa sasa" "ONDOA MTUMIAJI" "Ungependa kuongeza mtumiaji?" - "Mtumiaji mpya unayemwongeza anahitaji kuongeza akaunti yake.\n\nMtumiaji yoyote anaweza kusasisha programu kwa niaba ya watumiaji wengine wote." + "Mtumiaji mpya utakayemwongeza atahitaji kuongeza akaunti yake.\n\nMtumiaji yoyote anaweza kusasisha programu kwa niaba ya wengine wote." "Je, ungependa kuondoa mtumiaji?" "Programu na data yote ya mtumiaji huyu itafutwa." "Ondoa" @@ -427,8 +428,7 @@ "Wasifu wa kazini umeunganishwa kwenye %1$s" "Wasifu wa binafsi umeunganishwa kwenye %1$s" "Kifaa kimeunganishwa kwenye %1$s" - - + "Udhibiti wa kifaa" "Ufuatiliaji wasifu" "Ufuatiliaji wa mtandao" "VPN" @@ -437,18 +437,14 @@ "Zima VPN" "Ondoa VPN" "Angalia Sera" - - - - + "Kifaa chako kinadhibitiwa na %1$s.\n\nMsimamizi wako anaweza kufuatilia na kudhibiti mipangilio, ufikiaji wa maudhui ya shirika, programu, data inayohusiana na kifaa chako na maelezo kuhusu mahali kifaa kipo.\n\nKwa maelezo zaidi, wasiliana na msimamizi wako." + "Kifaa chako kinadhibitiwa na shirika lako.\n\nMsimamizi wako anaweza kufuatilia na kudhibiti mipangilio, ufikiaji wa maudhui ya shirika, programu, data inayohusiana na kifaa chako na maelezo kuhusu mahali kifaa kipo.\n\nKwa maelezo zaidi, wasiliana na msimamizi wako." "Shirika lako limesakinisha mamlaka ya cheti kwenye kifaa hiki. Huenda shughuli kwenye mtandao wako salama zikafuatiliwa au kubadilishwa." "Shirika lako limesakinisha mamlaka ya cheti katika wasifu wako wa kazini. Huenda shughuli kwenye mtandao wako salama zikafuatiliwa au kubadilishwa." "Mamlaka ya cheti imesakinishwa kwenye kifaa hiki. Huenda shughuli kwenye mtandao wako salama zikafuatiliwa au kubadilishwa." "Msimamizi wako amewasha kumbukumbu ya kuingia mtandaoni, ambayo hufuatilia shughuli kwenye kifaa chako." - - - - + "Umeunganishwa kwenye %1$s, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti." + "Umeunganishwa kwenye %1$s na %2$s, ambazo zinaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti." "Wasifu wako wa kazini umeunganishwa kwenye %1$s, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti." "Wasifu wako wa binafsi umeunganishwa kwenye %1$s, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti." "Kifaa chako kinadhibitiwa na %1$s." @@ -470,6 +466,8 @@ "Umeunganishwa kwenye %1$s, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti." "Wasifu wako wa kazini unasimamiwa na %1$s. Wasifu umeunganishwa kwenye %2$s, ambayo inaweza kufuatilia shughuli za mtandao wako wa kazini, ikiwa ni pamoja na barua pepe, programu na tovuti.\n\n Wasiliana na msimamizi wako kwa maelezo zaidi." "Wasifu wako wa kazini unasimamiwa na %1$s. Wasifu umeunganishwa kwenye %2$s, ambayo inaweza kufuatilia shughuli zako kwenye mtandao wa kazini, ikiwa ni pamoja na barua pepe, programu na tovuti.\n\n Umeunganishwa pia kwenye %3$s, ambayo inaweza kufuatilia shughuli zako kwenye mtandao wa binafsi." + + "Kifaa kitaendelea kuwa katika hali ya kufungwa hadi utakapokifungua mwenyewe" "Pata arifa kwa haraka" "Zitazame kabla hujafungua" @@ -614,9 +612,9 @@ "Nyuma" "Arifa" "Mikato ya Kibodi" - "Badilisha mbinu ya kuingiza data" + "Kubadili mbinu ya kuingiza data" "Programu" - "Programu ya maagizo ya sauti" + "Programu ya usaidizi" "Kivinjari" "Anwani" "Barua pepe" @@ -703,6 +701,8 @@ "Arifa kutoka %1$s: %2$s" "Huenda programu isifanye kazi kwenye skrini inayogawanywa." "Programu haiwezi kutumia skrini iliyogawanywa." + "Huenda programu isifanye kazi kwenye dirisha lingine." + "Programu haiwezi kutumia kipengele cha uzinduzi kwenye madirisha mengine." "Fungua mipangilio." "Fungua mipangilio ya haraka." "Funga mipangilio ya haraka." @@ -752,8 +752,7 @@ "Programu Zinazofunguka Papo Hapo" "Huhitaji kusakinisha programu zinazofunguka papo hapo." "Maelezo ya programu" - - + "Nenda kwenye wavuti" "Data ya simu" "Wi-Fi imezimwa" "Bluetooth imezimwa" diff --git a/packages/SystemUI/res/values-sw/strings_car.xml b/packages/SystemUI/res/values-sw/strings_car.xml index e4bb25c4365819191f2cbdfeb00651f575a1723c..bd7ee80ae039da7a18fa3198d632c9e8797cec1b 100644 --- a/packages/SystemUI/res/values-sw/strings_car.xml +++ b/packages/SystemUI/res/values-sw/strings_car.xml @@ -19,6 +19,5 @@ - "Endesha gari kwa usalama" - "Jifahamishe kikamilifu kuhusu masharti ya kuendesha gari na utii kila wakati sheria zilizopo. Huenda maelekezo yasiwe sahihi, hayajakamilika, ni hatari, hayafai, hayaruhusiwi au yanahusisha kuvuka maeneo ya kiutawala. Huenda pia maelezo ya biashara yasiwe sahihi au hayajakamilika. Data si ya wakati halisi na hatuwezi kukupa hakikisho kuhusu usahihi wa mahali. Usitumie kifaa chako cha mkononi au programu zisizo za Android Auto wakati unapoendesha gari." + "Haijulikani" diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index ef637c47b12431fd51c61a5708c56a5e6106b664..4e294e09d3e1c6c83def209283c7abba03544a3a 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -157,6 +157,7 @@ "மொபைல் தரவு முடக்கப்பட்டது" "புளூடூத் டெதெரிங்." "விமானப் பயன்முறை." + "VPN இயக்கத்தில் உள்ளது." "சிம் கார்டு இல்லை." "மொபைல் நிறுவன மாற்றம்." "பேட்டரி விவரங்களைத் திறக்கும்" @@ -427,8 +428,7 @@ "%1$s உடன் பணிவிவரம் இணைக்கப்பட்டுள்ளது" "தனிப்பட்ட சுயவிவரம் %1$s உடன் இணைக்கப்பட்டுள்ளது" "சாதனம் %1$s உடன் இணைக்கப்பட்டுள்ளது" - - + "சாதன நிர்வாகம்" "சுயவிவரத்தைக் கண்காணித்தல்" "நெட்வொர்க்கைக் கண்காணித்தல்" "VPN" @@ -437,18 +437,14 @@ "VPNஐ முடக்கு" "VPNஐத் துண்டி" "கொள்கைகளைக் காட்டு" - - - - + "சாதனத்தை %1$s நிர்வகிக்கிறது.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், பயன்பாடுகள், உங்கள் சாதனத்துடன் தொடர்புடைய தரவு, சாதனங்களின் இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்.\n\nமேலும் தகவலுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்." + "சாதனத்தை உங்கள் நிறுவனம் நிர்வகிக்கிறது.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், பயன்பாடுகள், உங்கள் சாதனத்துடன் தொடர்புடைய தரவு, சாதனங்களின் இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்.\n\nமேலும் தகவலுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்." "உங்கள் நிறுவனம் இந்தச் சாதனத்தில் சான்றிதழ் அங்கீகாரத்தை நிறுவியுள்ளது. உங்களின் பாதுகாப்பான நெட்வொர்க் ட்ராஃபிக் கண்காணிக்கப்படலாம் அல்லது மாற்றப்படலாம்." "உங்கள் நிறுவனம், பணி விவரத்தில் சான்றிதழ் அங்கீகாரத்தை நிறுவியுள்ளது. உங்களின் பாதுகாப்பான நெட்வொர்க் ட்ராஃபிக் கண்காணிக்கப்படலாம் அல்லது மாற்றப்படலாம்." "இந்தச் சாதனத்தில் சான்றிதழ் அங்கீகாரம் நிறுவப்பட்டுள்ளது. உங்களின் பாதுகாப்பான நெட்வொர்க் ட்ராஃபிக் கண்காணிக்கப்படலாம் அல்லது மாற்றப்படலாம்." "உங்கள் நிர்வாகி, நெட்வொர்க் பதிவெடுத்தலை இயக்கியுள்ளார். இது சாதனத்தில் ட்ராஃபிக்கைக் கண்காணிக்கும்." - - - - + "மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய %1$s உடன் இணைக்கப்பட்டுள்ளீர்கள்." + "மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய %1$s மற்றும் %2$s உடன் இணைக்கப்பட்டுள்ளீர்கள்." "மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய %1$s உடன் உங்கள் பணி விவரம் இணைக்கப்பட்டுள்ளது." "மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய %1$s உடன் உங்களின் தனிப்பட்ட சுயவிவரம் இணைக்கப்பட்டுள்ளது." "உங்கள் சாதனத்தை நிர்வகிப்பது: %1$s." @@ -470,6 +466,8 @@ "%1$s உடன் இணைக்கப்பட்டுள்ளீர்கள். இந்தப் பயன்பாட்டால் மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்." "உங்கள் பணி விவரத்தை %1$s நிர்வகிக்கிறது. மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் பணி நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய %2$s உடன் அது இணைக்கப்பட்டுள்ளது.\n\nமேலும் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்." "உங்கள் பணி விவரத்தை %1$s நிர்வகிக்கிறது. மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் பணி நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய %2$s உடன் அது இணைக்கப்பட்டுள்ளது.\n\nஉங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய %3$s உடனும் இணைக்கப்பட்டுள்ளீர்கள்." + + "நீங்கள் கைமுறையாகத் திறக்கும் வரை, சாதனம் பூட்டப்பட்டிருக்கும்" "விரைவாக அறிவிப்புகளைப் பெறுதல்" "திறக்கும் முன் அவற்றைப் பார்க்கவும்" @@ -703,6 +701,8 @@ "%1$s அறிவிப்பு: %2$s" "திரைப் பிரிப்பில் பயன்பாடு வேலைசெய்யாமல் போகக்கூடும்." "திரையைப் பிரிப்பதைப் பயன்பாடு ஆதரிக்கவில்லை." + "இரண்டாம்நிலைத் திரையில் பயன்பாடுகள் வேலை செய்யாமல் போகக்கூடும்." + "இரண்டாம்நிலைத் திரைகளில் பயன்பாட்டைத் தொடங்க முடியாது." "அமைப்புகளைத் திற." "விரைவு அமைப்புகளைத் திற." "விரைவு அமைப்புகளை மூடு." @@ -752,8 +752,7 @@ "இன்ஸ்டண்ட் பயன்பாடுகள்" "இன்ஸ்டண்ட் பயன்பாடுகளுக்கு நிறுவல் தேவையில்லை." "பயன்பாட்டுத் தகவல்" - - + "இணையத்திற்குச் செல்" "மொபைல் தரவு" "வைஃபை முடக்கத்தில் உள்ளது" "புளூடூத் முடக்கத்தில் உள்ளது" diff --git a/packages/SystemUI/res/values-ta/strings_car.xml b/packages/SystemUI/res/values-ta/strings_car.xml index 7ddd5e0f4f4073d2a88ff262e82b69d95b79ffda..55a136ad92cbce10f82ace435f9efd2b5aaba0fe 100644 --- a/packages/SystemUI/res/values-ta/strings_car.xml +++ b/packages/SystemUI/res/values-ta/strings_car.xml @@ -19,6 +19,5 @@ - "பாதுகாப்பாக வண்டியோட்டவும்" - "வாகனம் ஓட்டுவதற்கான சூழ்நிலைகளை முழுவதுமாகத் தெரிந்து வைத்திருக்கவும் மற்றும் பொருந்தும் விதிகளை எப்போதும் பின்பற்றவும். வழிகள் துல்லியமற்றதாக, முழுமையற்றதாக, ஆபத்துக்குரியதாக, பொருத்தமில்லாததாக, தடைசெய்யப்பட்டதாக அல்லது அரசின் கட்டுப்பாட்டில் உள்ள எல்லைகளைக் கடப்பதாக இருக்கலாம். வணிகத் தகவலும் துல்லியமற்றதாக அல்லது முழுமையற்றதாக இருக்கலாம். தரவு நிகழ்நேர அடிப்படையிலானது அல்ல மற்றும் இருப்பிடத் துல்லியத்திற்கு உத்தரவாதம் வழங்க முடியாது. வாகனம் ஓட்டும் போது மொபைல் சாதனத்தையோ அல்லது Android Auto மூலம் கட்டுப்படுத்த முடியாத பயன்பாடுகளையோ பயன்படுத்த வேண்டாம்." + "தெரியாதது" diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 3a23ee82368282d638a960dca9b83d171b5e6a0f..933a6e0a76046344193b33ade0c2dbfde7cede91 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -152,14 +152,12 @@ "ఎడ్జ్" "Wi-Fi" "సిమ్ లేదు." - - - - - - + "మొబైల్ డేటా" + "మొబైల్ డేటా ఆన్ చేయబడింది" + "మొబైల్ డేటా ఆఫ్ చేయబడింది" "బ్లూటూత్ టెథెరింగ్." "ఎయిర్‌ప్లేన్ మోడ్." + "VPNలో." "SIM కార్డ్ లేదు." "క్యారియర్ నెట్‌వర్క్ మారుస్తుంది." "బ్యాటరీ వివరాలను తెరుస్తుంది" @@ -242,11 +240,9 @@ "ఛార్జ్ అవుతోంది" "2G-3G డేటా పాజ్ చేయబడింది" "4G డేటా పాజ్ చేయబడింది" - - + "మొబైల్ డేటా పాజ్ చేయబడింది" "డేటా పాజ్ చేయబడింది" - - + "మీరు సెట్ చేసిన డేటా పరిమితిని చేరుకున్నారు. మీరు ఇప్పుడు మొబైల్ డేటాను ఉపయోగించడం లేదు.\n\nమీరు పునఃప్రారంభిస్తే, డేటా వినియోగానికి ఛార్జీలు చెల్లించాల్సి రావచ్చు." "పునఃప్రారంభించు" "ఇంటర్నెట్ కనెక్షన్ లేదు" "Wi-Fi కనెక్ట్ చేయబడింది" @@ -319,8 +315,7 @@ "హాట్‌స్పాట్" "నోటిఫికేషన్‌లు" "ఫ్లాష్‌లైట్" - - + "మొబైల్ డేటా" "డేటా వినియోగం" "మిగిలిన డేటా" "పరిమితి మించిపోయింది" @@ -433,8 +428,7 @@ "%1$sకి కార్యాలయ ప్రొఫైల్ కనెక్ట్ చేయబడింది" "వ్యక్తిగత ప్రొఫైల్ %1$sకి కనెక్ట్ చేయబడింది" "పరికరం %1$sకి కనెక్ట్ చేయబడింది" - - + "పరికర నిర్వహణ" "ప్రొఫైల్ పర్యవేక్షణ" "నెట్‌వర్క్ పర్యవేక్షణ" "VPN" @@ -443,18 +437,14 @@ "VPNని నిలిపివేయి" "VPNను డిస్‌కనెక్ట్ చేయి" "విధానాలను వీక్షించండి" - - - - + "మీ పరికరం %1$s నిర్వహణలో ఉంది.\n\nమీ నిర్వాహకులు మీ పరికరం అనుబంధిత సెట్టింగ్‌లు, కార్పొరేట్ ప్రాప్యత, అనువర్తనాలు, డేటా మరియు మీ పరికర స్థాన సమాచారం పర్యవేక్షించగలరు మరియు నిర్వహించగలరు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకులను సంప్రదించండి." + "మీ పరికరం మీ సంస్థ నిర్వహణలో ఉంది.\n\nమీ నిర్వాహకులు మీ పరికరం అనుబంధిత సెట్టింగ్‌లు, కార్పొరేట్ ప్రాప్యత, అనువర్తనాలు, డేటాను మరియు మీ పరికర స్థాన సమాచారాన్ని పర్యవేక్షించగలరు మరియు నిర్వహించగలరు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకులను సంప్రదించండి." "ఈ పరికరంలో మీ సంస్థ ఒక ప్రమాణపత్ర అధికారాన్ని ఇన్‌స్టాల్ చేసింది. మీ సురక్షిత నెట్‌వర్క్ ట్రాఫిక్ పర్యవేక్షించబడవచ్చు లేదా సవరించబడవచ్చు." "మీ కార్యాలయ ప్రొఫైల్‌లో మీ సంస్థ ఒక ప్రమాణపత్ర అధికారాన్ని ఇన్‌స్టాల్ చేసింది. మీ సురక్షిత నెట్‌వర్క్ ట్రాఫిక్ పర్యవేక్షించబడవచ్చు లేదా సవరించబడవచ్చు." "ఈ పరికరంలో ప్రమాణపత్ర అధికారం ఇన్‌స్టాల్ చేయబడింది. మీ సురక్షిత నెట్‌వర్క్ ట్రాఫిక్ పర్యవేక్షించబడవచ్చు లేదా సవరించబడవచ్చు." "మీ నిర్వాహకులు మీ పరికరంలోని ట్రాఫిక్‌ని పర్యవేక్షించగల నెట్‌వర్క్ లాగింగ్‌ని ఆన్ చేసారు." - - - - + "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." + "మీరు ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$s మరియు %2$sకి కనెక్ట్ చేయబడ్డారు." "మీ కార్యాలయ ప్రొఫైల్ ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$sకి కనెక్ట్ చేయబడింది." "మీ వ్యక్తిగత ప్రొఫైల్ ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$sకి కనెక్ట్ చేయబడింది." "మీ పరికరం %1$s ద్వారా నిర్వహించబడుతోంది." @@ -476,6 +466,8 @@ "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." "మీ కార్యాలయ ప్రొఫైల్ %1$s నిర్వహణలో ఉంది. ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ కార్యాలయ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %2$sకి ప్రొఫైల్ కనెక్ట్ చేయబడింది.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకులను సంప్రదించండి." "మీ కార్యాలయ ప్రొఫైల్ %1$s నిర్వహణలో ఉంది. ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ కార్యాలయ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %2$sకి ప్రొఫైల్ కనెక్ట్ చేయబడింది.\n\nమీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %3$sకి కూడా మీరు కనెక్ట్ చేయబడ్డారు." + + "మీరు మాన్యువల్‌గా అన్‌లాక్ చేస్తే మినహా పరికరం లాక్ చేయబడి ఉంటుంది" "నోటిఫికేషన్‌లను వేగంగా పొందండి" "వీటిని మీరు అన్‌లాక్ చేయకముందే చూడండి" @@ -569,12 +561,9 @@ %1$s, %2$s మరియు మరో %3$d %1$s, %2$s మరియు మరో %3$d - - - - - - + "%1$s యొక్క నోటిఫికేషన్ నియంత్రణలు తెరవబడ్డాయి" + "%1$s యొక్క నోటిఫికేషన్ నియంత్రణలు మూసివేయబడ్డాయి" + "ఈ ఛానెల్ యొక్క నోటిఫికేషన్‌లను అనుమతించండి" "అన్ని వర్గాలు" "మరిన్ని సెట్టింగ్‌లు" "అనుకూలీకరించండి: %1$s" @@ -712,6 +701,8 @@ "%1$s నోటిఫికేషన్: %2$s" "స్క్రీన్ విభజనతో అనువర్తనం పని చేయకపోవచ్చు." "అనువర్తనంలో స్క్రీన్ విభజనకు మద్దతు లేదు." + "ప్రత్యామ్నాయ ప్రదర్శనపై యాప్ పని చేయకపోవచ్చు." + "ప్రత్యామ్నాయ ప్రదర్శనలపై ప్రారంభానికి యాప్ మద్దతు లేదు." "సెట్టింగ్‌లను తెరవండి." "శీఘ్ర సెట్టింగ్‌లను తెరవండి." "శీఘ్ర సెట్టింగ్‌లను మూసివేయండి." @@ -730,14 +721,10 @@ "చిత్రంలో చిత్రం మెను" "%s చిత్రంలో చిత్రం రూపంలో ఉంది" "%s ఈ లక్షణాన్ని ఉపయోగించకూడదు అని మీరు అనుకుంటే, సెట్టింగ్‌లను తెరవడానికి నొక్కి, దీన్ని ఆఫ్ చేయండి." - - - - - - - - + "ప్లే చేయి" + "పాజ్ చేయి" + "దాటవేసి తదుపరి దానికి వెళ్లు" + "దాటవేసి మునుపటి దానికి వెళ్లు" "వేడెక్కినందుకు ఫోన్ ఆఫ్ చేయబడింది" "మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది" "మీ ఫోన్ చాలా వేడిగా ఉంది, కనుక చల్లబర్చడానికి ఆఫ్ చేయబడింది. మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది.\n\nమీరు ఇలా చేస్తే మీ ఫోన్ చాలా వేడెక్కవచ్చు:\n • వనరు-ఆధారిత అనువర్తనాలు (గేమింగ్, వీడియో లేదా నావిగేషన్ వంటి అనువర్తనాలు) ఉపయోగించడం\n • పెద్ద ఫైల్‌లను డౌన్‌లోడ్ లేదా అప్‌లోడ్ చేయడం\n • అధిక ఉష్ణోగ్రతలలో మీ ఫోన్‌ని ఉపయోగించడం" @@ -765,8 +752,7 @@ "తక్షణ అనువర్తనాలు" "తక్షణ అనువర్తనాలకు ఇన్‌స్టాలేషన్ అవసరం లేదు." "అనువర్తన సమాచారం" - - + "వెబ్‌కు వెళ్లు" "మొబైల్ డేటా" "Wi-Fi ఆఫ్‌లో ఉంది" "బ్లూటూత్ ఆఫ్‌లో ఉంది" diff --git a/packages/SystemUI/res/values-te/strings_car.xml b/packages/SystemUI/res/values-te/strings_car.xml index 6f60b3ac5fc644ec37ab7a0fa34c15b18d07015d..7999b1c090e262180cd7fa91cde65ad549090d69 100644 --- a/packages/SystemUI/res/values-te/strings_car.xml +++ b/packages/SystemUI/res/values-te/strings_car.xml @@ -19,6 +19,5 @@ - "సురక్షితంగా డ్రైవ్ చేయండి" - "డ్రైవింగ్ షరతులపై పూర్తి అవగాహనను కలిగి ఉండండి మరియు ఎల్లప్పుడూ వర్తించే చట్టాలకు అనుగుణంగా నడుచుకోండి. దిశలు నిర్దిష్టంగా ఉండకపోవచ్చు, అసంపూర్ణంగా ఉండవచ్చు, ప్రమాదకరంగా ఉండవచ్చు, అనుకూలంగా ఉండకపోవచ్చు, నిషేధించబడి ఉండవచ్చు లేదా పాలనా ప్రాంతాల మీదుగా వెళ్లే విధంగా ఉండవచ్చు. వ్యాపార సమాచారం కూడా నిర్దిష్టంగా లేదా సంపూర్ణంగా ఉండకపోవచ్చు. డేటా నిజ-సమయానికి సంబంధించినది కాదు మరియు స్థాన ఖచ్చితత్వానికి ఎలాంటి హామీ ఉండకపోవచ్చు. డ్రైవింగ్ చేస్తున్నప్పుడు మీ మొబైల్ పరికరాన్ని ఉపయోగించవద్దు లేదా Android Auto కోసం ఉద్దేశించబడని అనువర్తనాలను ఉపయోగించవద్దు." + "తెలియని" diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index dc1cd01322dbb9aca265fd3a2bb1587cb4cf8fac..2e66c959f3d5e437fbd712e7ef1b2ad147e2ae54 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -152,14 +152,12 @@ "EDGE" "WiFi" "ไม่มีซิมการ์ด" - - - - - - + "อินเทอร์เน็ตมือถือ" + "อินเทอร์เน็ตมือถือเปิดอยู่" + "อินเทอร์เน็ตมือถือปิดอยู่" "การปล่อยสัญญาณบลูทูธ" "โหมดใช้งานบนเครื่องบิน" + "VPN เปิดอยู่" "ไม่มีซิมการ์ด" "การเปลี่ยนเครือข่ายผู้ให้บริการ" "เปิดรายละเอียดแบตเตอรี่" @@ -242,11 +240,9 @@ "กำลังชาร์จ" "หยุดการใช้ข้อมูล 2G-3G ชั่วคราวแล้ว" "หยุดการใช้ข้อมูล 4G ชั่วคราวแล้ว" - - + "หยุดการใช้อินเทอร์เน็ตมือถือชั่วคราว" "หยุดการใช้ข้อมูลชั่วคราวแล้ว" - - + "คุณใช้อินเทอร์เน็ตถึงปริมาณที่กำหนดไว้แล้ว คุณไม่ได้ใช้อินเทอร์เน็ตมือถือแล้วในขณะนี้\n\nหากใช้ต่อ อาจมีการเรียกเก็บค่าบริการอินเทอร์เน็ต" "ทำต่อ" "ไม่มีอินเทอร์เน็ต" "เชื่อมต่อ WiFi แล้ว" @@ -319,8 +315,7 @@ "ฮอตสปอต" "การแจ้งเตือน" "ไฟฉาย" - - + "อินเทอร์เน็ตมือถือ" "การใช้อินเทอร์เน็ต" "ข้อมูลที่เหลืออยู่" "เกินขีดจำกัด" @@ -433,8 +428,7 @@ "โปรไฟล์งานเชื่อมต่ออยู่กับ %1$s" "โปรไฟล์ส่วนตัวเชื่อมต่ออยู่กับ %1$s" "อุปกรณ์เชื่อมต่ออยู่กับ %1$s" - - + "การจัดการอุปกรณ์" "การตรวจสอบโปรไฟล์" "การตรวจสอบเครือข่าย" "VPN" @@ -443,18 +437,14 @@ "ปิดใช้ VPN" "ยกเลิกการเชื่อมต่อ VPN" "ดูนโยบาย" - - - - + "อุปกรณ์นี้จัดการโดย %1$s\n\nผู้ดูแลระบบสามารถตรวจสอบและจัดการการตั้งค่า การเข้าถึงของบริษัท แอป ข้อมูลที่เชื่อมโยงกับอุปกรณ์ และข้อมูลตำแหน่งของอุปกรณ์\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้แลระบบ" + "อุปกรณ์นี้จัดการโดยองค์กรของคุณ\n\nผู้ดูแลระบบสามารถตรวจสอบและจัดการการตั้งค่า การเข้าถึงของบริษัท แอป ข้อมูลที่เชื่อมโยงกับอุปกรณ์ และข้อมูลตำแหน่งของอุปกรณ์\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้แลระบบ" "องค์กรของคุณติดตั้งผู้ออกใบรับรองในอุปกรณ์นี้ อาจมีการตรวจสอบหรือแก้ไขการจราจรของข้อมูลในเครือข่ายที่ปลอดภัยของคุณ" "องค์กรของคุณติดตั้งผู้ออกใบรับรองในโปรไฟล์งาน อาจมีการตรวจสอบหรือแก้ไขการจราจรของข้อมูลในเครือข่ายที่ปลอดภัยของคุณ" "มีการติดตั้งผู้ออกใบรับรองในอุปกรณ์นี้ อาจมีการตรวจสอบหรือแก้ไขการจราจรของข้อมูลในเครือข่ายที่ปลอดภัยของคุณ" "ผู้ดูแลระบบได้เปิดการบันทึกเครือข่าย ซึ่งจะตรวจสอบการจราจรของข้อมูลในอุปกรณ์ของคุณ" - - - - + "คุณเชื่อมต่ออยู่กับ %1$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ รวมถึงอีเมล แอป และเว็บไซต์" + "คุณเชื่อมต่ออยู่กับ %1$s และ %2$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ รวมถึงอีเมล แอป และเว็บไซต์" "โปรไฟล์งานของคุณเชื่อมต่ออยู่กับ %1$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ รวมถึงอีเมล แอป และเว็บไซต์" "โปรไฟล์ส่วนตัวของคุณเชื่อมต่ออยู่กับ %1$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ รวมถึงอีเมล แอป และเว็บไซต์" "อุปกรณ์ของคุณได้รับการจัดการโดย %1$s" @@ -476,6 +466,8 @@ "คุณเชื่อมต่อกับ %1$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายส่วนตัวของคุณ รวมถึงอีเมล แอป และเว็บไซต์ได้" "%1$s เป็นผู้จัดการโปรไฟล์งานของคุณ โปรไฟล์ดังกล่าวเชื่อมต่ออยู่กับ %2$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ รวมถึงอีเมล แอป และเว็บไซต์\n\nโปรดติดต่อผู้ดูแลระบบของคุณสำหรับข้อมูลเพิ่มเติม" "%1$s เป็นผู้จัดการโปรไฟล์งานของคุณ โปรไฟล์ดังกล่าวเชื่อมต่ออยู่กับ %2$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ รวมถึงอีเมล แอป และเว็บไซต์\n\nคุณยังเชื่อมต่ออยู่กับ %3$s ด้วย ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายส่วนตัวของคุณ" + + "อุปกรณ์จะล็อกจนกว่าคุณจะปลดล็อกด้วยตนเอง" "รับการแจ้งเตือนเร็วขึ้น" "ดูก่อนปลดล็อก" @@ -569,12 +561,9 @@ %1$s, %2$s และอีก %3$d ช่องทาง %1$s, %2$s และอีก %3$d ช่องทาง - - - - - - + "ส่วนควบคุมการแจ้งเตือนของ %1$s เปิดอยู่" + "ส่วนควบคุมการแจ้งเตือนของ %1$s ปิดอยู่" + "อนุญาตการแจ้งเตือนจากช่องนี้" "ทุกหมวดหมู่" "การตั้งค่าเพิ่มเติม" "ปรับแต่ง: %1$s" @@ -712,6 +701,8 @@ "%1$s การแจ้งเตือน: %2$s" "แอปอาจใช้ไม่ได้กับโหมดแยกหน้าจอ" "แอปไม่สนับสนุนการแยกหน้าจอ" + "แอปอาจไม่ทำงานในจอแสดงผลรอง" + "แอปไม่รองรับการเรียกใช้ในจอแสดงผลรอง" "เปิดการตั้งค่า" "เปิดการตั้งค่าด่วน" "ปิดการตั้งค่าด่วน" @@ -730,14 +721,10 @@ "เมนูการแสดงผลหลายแหล่งพร้อมกัน" "%s ใช้การแสดงผลหลายแหล่งพร้อมกัน" "หากคุณไม่ต้องการให้ %s ใช้คุณลักษณะนี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดคุณลักษณะ" - - - - - - - - + "เล่น" + "หยุดชั่วคราว" + "ข้ามไปรายการถัดไป" + "ข้ามไปรายการก่อนหน้า" "โทรศัพท์ปิดไปเพราะร้อนมาก" "ขณะนี้โทรศัพท์ทำงานเป็นปกติ" "โทรศัพท์ร้อนเกินไปจึงปิดเครื่องเพื่อให้เย็นลง ขณะนี้โทรศัพท์ทำงานเป็นปกติ\n\nโทรศัพท์อาจร้อนเกินไปหากคุณ\n • ใช้แอปที่ใช้ทรัพยากรมาก (เช่น เกม วิดีโอ หรือแอปการนำทาง)\n • ดาวน์โหลดหรืออัปโหลดไฟล์ขนาดใหญ่\n • ใช้โทรศัพท์ในอุณหภูมิที่สูง" @@ -765,8 +752,7 @@ "Instant App" "Instant Apps ไม่ต้องใช้การติดตั้ง" "ข้อมูลแอป" - - + "ไปที่เว็บ" "ข้อมูลมือถือ" "Wi-Fi ปิดอยู่" "บลูทูธปิดอยู่" diff --git a/packages/SystemUI/res/values-th/strings_car.xml b/packages/SystemUI/res/values-th/strings_car.xml index b40584a71b599c42a45e13a6494a867712d5607f..e5f8bf0b0881ea906c5629c6fc34ee71c2848000 100644 --- a/packages/SystemUI/res/values-th/strings_car.xml +++ b/packages/SystemUI/res/values-th/strings_car.xml @@ -19,6 +19,5 @@ - "ขับขี่อย่างปลอดภัย" - "มีสติรู้ตัวเต็มที่ในสภาพการขับขี่ต่างๆ เและปฏิบัติตามกฎหมายที่บังคับใช้เสมอ ทั้งนี้เส้นทางอาจไม่ถูกต้อง ไม่ครบถ้วน เป็นอันตราย ไม่เหมาะสม ห้ามใช้ หรือมีการข้ามเขตปกครอง นอกจากนี้ข้อมูลทางธุรกิจอาจไม่ถูกต้องหรือไม่สมบูรณ์ ข้อมูลไม่ใช่แบบเรียลไทม์ และไม่สามารถรับประกันความถูกต้องของตำแหน่ง อย่าใช้งานอุปกรณ์เคลื่อนที่หรือใช้แอปที่ไม่ได้ออกแบบมาสำหรับ Android Auto ขณะขับรถ" + "ไม่ทราบ" diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 51d382f81cac9513bd829a22046b487f05bf97c2..b91bdf60447feadb071efb9ad4ab22d9fecc5e02 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -152,14 +152,12 @@ "Edge" "Wi-Fi" "Walang SIM." - - - - - - + "Mobile Data" + "Naka-on ang Mobile Data" + "Naka-off ang Mobile Data" "Pag-tether ng Bluetooth." "Mode na eroplano." + "Naka-on ang VPN." "Walang SIM card." "Nagpapalit ng carrier network." "Buksan ang mga detalye ng baterya" @@ -242,11 +240,9 @@ "Nagcha-charge" "Naka-pause ang 2G-3G data" "Naka-pause ang 4G data" - - + "Naka-pause ang mobile data" "Naka-pause ang data" - - + "Naabot na ang itinakda mong limitasyon sa data. Hindi ka na gumagamit ng mobile data.\n\nKung magpapatuloy ka, maaaring may mga singil sa paggamit ng data." "Ipagpatuloy" "Walang koneksyon sa Internet" "nakakonekta ang Wi-Fi" @@ -319,8 +315,7 @@ "Hotspot" "Mga Notification" "Flashlight" - - + "Mobile data" "Paggamit ng data" "Natitirang data" "Lumampas sa limitasyon" @@ -433,8 +428,7 @@ "Nakakonekta sa %1$s ang profile sa trabaho" "Nakakonekta ang personal na profile sa %1$s" "Nakakonekta ang device sa %1$s" - - + "Pamamahala ng device" "Pagsubaybay sa Profile" "Pagsubaybay sa network" "VPN" @@ -443,18 +437,14 @@ "I-disable ang VPN" "Idiskonekta ang VPN" "Tingnan ang Mga Patakaran" - - - - + "Pinamamahalaan ng %1$s ang iyong device.\n\nMaaaring subaybayan at pamahalaan ng admin mo ang mga setting, pangkumpanyang access, app, data na nauugnay sa iyong device, at ang impormasyon ng lokasyon ng device mo.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong admin." + "Pinamamahalaan ng iyong organisasyon ang device mo.\n\nMaaaring subaybayan at pamahalaan ng iyong admin ang mga setting, pangkumpanyang access, app, data na nauugnay sa device mo, at ang impormasyon ng lokasyon ng iyong device.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa admin mo." "Nag-install ang iyong organisasyon ng awtoridad sa certificate sa device na ito. Maaaring subaybayan o baguhin ang iyong ligtas na trapiko sa network." "Nag-install ang iyong organisasyon ng awtoridad sa certificate sa iyong profile sa trabaho. Maaaring subaybayan o baguhin ang iyong ligtas na trapiko sa network." "May naka-install sa device na ito na isang awtoridad sa certificate. Maaaring subaybayan o baguhin ang iyong ligtas na trapiko sa network." "Na-on ng iyong admin ang pag-log sa network, na sumusubaybay sa trapiko sa device mo." - - - - + "Nakakonekta ka sa %1$s, na maaaring sumubaybay sa iyong aktibidad sa network, kabilang ang mga email, app, at website." + "Nakakonekta ka sa %1$s at %2$s, na maaaring sumubaybay sa iyong aktibidad sa network, kabilang ang mga email, app, at website." "Nakakonekta sa %1$s ang iyong profile sa trabaho, na maaaring sumubaybay sa aktibidad sa iyong network, kasama ang mga email, app, at website." "Nakakonekta sa %1$s ang iyong personal na profile, na maaaring sumubaybay sa aktibidad mo sa network, kasama ang mga email, app at website." "Pinamamahalaan ng %1$s ang iyong device." @@ -476,6 +466,8 @@ "Nakakonekta ka sa %1$s, na maaaring sumubaybay sa aktibidad sa iyong personal na network, kabilang ang mga email, app at website." "Pinamamahalaan ng %1$s ang iyong profile sa trabaho. Nakakonekta ang profile sa %2$s, na maaaring sumubaybay sa aktibidad sa iyong network sa trabaho, kasama ang mga email, app, at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong admin." "Pinamamahalaan ng %1$s ang iyong profile sa trabaho. Nakakonekta ang profile sa %2$s, na maaaring sumubaybay sa aktibidad sa iyong network sa trabaho, kasama ang mga email, app, at website.\n\nNakakonekta ka rin sa %3$s, na maaaring sumubaybay sa aktibidad sa iyong personal na network." + + "Mananatiling naka-lock ang device hanggang sa manu-mano mong i-unlock" "Kunin ang notification nang mas mabilis" "Tingnan ang mga ito bago ka mag-unlock" @@ -569,12 +561,9 @@ %1$s, %2$s, at %3$d pang iba %1$s, %2$s, at %3$d pang iba - - - - - - + "Binuksan ang mga kontrol sa notification para sa %1$s" + "Isinara ang mga kontrol sa notification para sa %1$s" + "Payagan ang mga notification mula sa channel na ito" "Lahat ng Kategorya" "Higit pang mga setting" "I-customize: %1$s" @@ -712,6 +701,8 @@ "Notification sa %1$s: %2$s" "Maaaring hindi gumana ang app sa split-screen." "Hindi sinusuportahan ng app ang split-screen." + "Maaaring hindi gumana ang app sa pangalawang display." + "Hindi sinusuportahan ng app ang paglulunsad sa mga pangalawang display." "Buksan ang mga setting." "Buksan ang mga mabilisang setting." "Isara ang mga mabilisang setting." @@ -730,14 +721,10 @@ "Menu ng picture in picture" "Nasa picture-in-picture ang %s" "Kung ayaw mong gamitin ng %s ang feature na ito, i-tap upang buksan ang mga setting at i-off ito." - - - - - - - - + "I-play" + "I-pause" + "Lumaktaw sa susunod" + "Lumaktaw sa nakaraan" "Na-off ang telepono dahil sa init" "Maayos na ngayong gumagana ang iyong telepono" "Napakainit ng telepono, kaya nag-off ito para lumamig. Maayos na itong gumagana.\n\nMaaaring lubos na uminit ang telepono kapag:\n • Gumamit ka ng resource-intensive na app (gaya ng app para sa gaming, video, o navigation)\n • Nag-download o nag-upload ka ng malaking file\n • Ginamit mo ito sa mainit na lugar" @@ -765,8 +752,7 @@ "Instant Apps" "Hindi kailangang i-install ang mga instant na app." "Impormasyon ng app" - - + "Pumunta sa web" "Data ng mobile" "Naka-off ang Wi-Fi" "Naka-off ang Bluetooth" diff --git a/packages/SystemUI/res/values-tl/strings_car.xml b/packages/SystemUI/res/values-tl/strings_car.xml index c6926ed6ab838d88ddb36c254f7016d305edb8ca..082fdb22f9766f159ae9fd1260ffceac4275aee3 100644 --- a/packages/SystemUI/res/values-tl/strings_car.xml +++ b/packages/SystemUI/res/values-tl/strings_car.xml @@ -19,6 +19,5 @@ - "Magmaneho nang ligtas" - "Manatiling lubos na nakakaalam sa mga kondisyon sa pagmamaneho at palaging sumunod sa mga naaangkop na batas. Ang mga direksyon ay maaaring hindi tumpak, hindi kumpleto, mapanganib, hindi naaangkop, ipinagbabawal o kinasasangkutan ng pagtawid sa mga administratibong lugar. Maaari ding hindi tumpak o hindi kumpleto ang impormasyon ng negosyo. Hindi real-time ang data at hindi magagarantiya ang katumpakan ng lokasyon. Huwag gamitin ang iyong mobile device o gumamit ng mga app na hindi ginawa para sa Android Auto habang nagmamaneho." + "Hindi Alam" diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 6af09e3d5151144ab1263b6288c17bab1ddd774d..8a586b167be1c806f85786d6eee3b4756d309e72 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -152,14 +152,12 @@ "Edge" "Kablosuz" "SIM kart yok." - - - - - - + "Mobil Veri" + "Mobil Veri Açık" + "Mobil Veri Kapalı" "Bluetooth tethering" "Uçak modu." + "VPN açık." "SIM kart yok." "Operatör şebekesi değişiyor." "Pil ayrıntılarını aç" @@ -200,13 +198,13 @@ "Uçak modu açık." "Uçak modu kapatıldı." "Uçak modu açıldı." - "Rahatsız etmeyin ayarı açık, yalnızca öncelikliler." - "Rahatsız etmeyin ayarı açık, tamamen sessiz." - "Rahatsız etmeyin ayarı açık, yalnızca alarmlar." + "Rahatsız etme ayarı açık, yalnızca öncelikliler." + "Rahatsız etme ayarı açık, tamamen sessiz." + "Rahatsız etme ayarı açık, yalnızca alarmlar." "Rahatsız etmeyin." - "\"Rahatsız etmeyin\" ayarı kapalı." - "\"Rahatsız etmeyin\" ayarı kapalı." - "\"Rahatsız etmeyin\" ayarı açık." + "\"Rahatsız etme\" ayarı kapalı." + "\"Rahatsız etme\" ayarı kapalı." + "\"Rahatsız etme\" ayarı açık." "Bluetooth." "Bluetooth kapalı." "Bluetooth açık." @@ -242,11 +240,9 @@ "Şarj oluyor" "2G-3G veri kullanımı duraklatıldı" "4G veri kullanımı duraklatıldı" - - + "Mobil veri duraklatıldı" "Veri kullanımı duraklatıldı" - - + "Ayarladığınız veri limitine ulaşıldı. Artık mobil veri kullanmıyorsunuz.\n\nDevam ettirirseniz veri kullanımı için sizden ödeme alınabilir." "Devam ettir" "İnternet bağlantısı yok" "Kablosuz bağlandı" @@ -319,8 +315,7 @@ "Hotspot" "Bildirimler" "Fener" - - + "Mobil veri" "Veri kullanımı" "Kalan veri" "Sınır aşıldı" @@ -433,8 +428,7 @@ "İş profiliniz %1$s uygulamasına bağlı" "Kişisel profil %1$s uygulamasına bağlı" "Cihaz %1$s uygulamasına bağlı" - - + "Cihaz yönetimi" "Profil izleme" "Ağ izleme" "VPN" @@ -443,18 +437,14 @@ "VPN\'yi devre dışı bırak" "VPN bağlantısını kes" "Politikaları Göster" - - - - + "Cihazınız %1$s tarafından yönetiliyor.\n\nYöneticiniz ayarları, şirket erişimini, uygulamaları, cihazınızla ilişkili verileri ve cihazınızın konum bilgilerini izleyebilir ve yönetebilir.\n\nDaha fazla bilgi için yöneticinize başvurun." + "Cihazınız kuruluşunuz tarafından yönetiliyor.\n\nYöneticiniz ayarları, şirket erişimini, uygulamaları, cihazınızla ilişkili verileri ve cihazınızın konum bilgilerini izleyebilir ve yönetebilir.\n\nDaha fazla bilgi için yöneticinize başvurun." "Kuruluşunuz bu cihaza bir sertifika yetkilisi yükledi. Güvenli ağ trafiğiniz izlenebilir veya değiştirilebilir." "Kuruluşunuz iş profilinize bir sertifika yetkilisi yükledi. Güvenli ağ trafiğiniz izlenebilir veya değiştirilebilir." "Bu cihazda bir sertifika yetkilisi yüklü. Güvenli ağ trafiğiniz izlenebilir veya değiştirilebilir." "Yöneticiniz,cihazınızdaki trafiği izleyen ağ günlük kaydını açtı." - - - - + "E-postalarınız, uygulamalarınız ve web siteleriniz de dahil olmak üzere ağ etkinliğinizi takip edebilen %1$s ağına bağlısınız." + "E-postalar, uygulamalar ve web siteleri de dahil olmak üzere ağ etkinliğinizi izleyebilen %1$s ve %2$s uygulamalarına bağlısınız." "İş profiliniz, e-postalar, uygulamalar ve web siteleri dahil olmak üzere ağ etkinliğinizi izleyebilen %1$s uygulamasına bağlı." "Kişisel profiliniz; e-postalar, uygulamalar ve web siteleri de dahil olmak üzere ağ etkinliğinizi izleyebilen %1$s uygulamasına bağlı." "Cihazınız %1$s tarafından yönetiliyor." @@ -476,6 +466,8 @@ "E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere kişisel ağ etkinliğinizi izleyebilen %1$s uygulamasına bağlısınız." "İş profiliniz %1$s tarafından yönetiliyor. Profil; e-postalar, uygulamalar ve web siteleri de dahil olmak üzere iş ağı etkinliğinizi izleyebilen %2$s uygulamasına bağlı.\n\nDaha fazla bilgi için yöneticinize başvurun." "İş profiliniz %1$s tarafından yönetiliyor. Profil; e-postalar, uygulamalar ve web siteleri de dahil olmak üzere iş ağı etkinliğinizi izleyebilen %2$s uygulamasına bağlı.\n\nAyrıca, kişisel ağ etkinliğinizi izleyebilen %3$s uygulamasına bağlısınız." + + "Cihazınızın kilidini manuel olarak açmadıkça cihaz kilitli kalacak" "Bildirimleri daha hızlı alın" "Kilidi açmadan bildirimleri görün" @@ -503,9 +495,9 @@ "Bluetooth" "Çift ton çoklu frekans" "Erişilebilirlik" - "%1$s. Sesi açmak için hafifçe dokunun." - "%1$s. Titreşime ayarlamak için hafifçe dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir." - "%1$s. Sesi kapatmak için hafifçe dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir." + "%1$s. Sesi açmak için dokunun." + "%1$s. Titreşime ayarlamak için dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir." + "%1$s. Sesi kapatmak için dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir." "%1$s. Titreşime ayarlamak için dokunun." "%1$s. Sesi kapatmak için dokunun." "%s ses denetimleri gösteriliyor. Kapatmak için hızlıca yukarı kaydırın." @@ -569,12 +561,9 @@ %1$s, %2$s ve diğer %3$d %1$s, %2$s ve %3$d tane daha - - - - - - + "%1$s için bildirim kontrolleri açıldı" + "%1$s için bildirim kontrolleri kapatıldı" + "Bu kanaldan bildirimlere izin verir" "Tüm Kategoriler" "Diğer ayarlar" "Özelleştir: %1$s" @@ -700,9 +689,9 @@ "Üstte %50" "Üstte %30" "Altta tam ekran" - "%1$d. konum, %2$s. Düzenlemek için iki kez hafifçe dokunun." - "%1$s. Eklemek için iki kez hafifçe dokunun." - "%1$d. konum. Seçmek için iki kez hafifçe dokunun." + "%1$d. konum, %2$s. Düzenlemek için iki kez dokunun." + "%1$s. Eklemek için iki kez dokunun." + "%1$d. konum. Seçmek için iki kez dokunun." "%1$s kutusunu taşı" "%1$s kutusunu kaldır" "%1$s kutusu %2$d. konuma eklendi" @@ -712,6 +701,8 @@ "%1$s bildirimi: %2$s" "Uygulama bölünmüş ekranda çalışmayabilir." "Uygulama bölünmüş ekranı desteklemiyor." + "Uygulama ikincil ekranda çalışmayabilir." + "Uygulama ikincil ekranlarda başlatılmayı desteklemiyor." "Ayarları aç." "Hızlı ayarları aç." "Hızlı ayarları kapat." @@ -730,14 +721,10 @@ "Ekran içinde ekran menüsü" "%s, ekran içinde ekran özelliğini kullanıyor" "%s uygulamasının bu özelliği kullanmasını istemiyorsanız dokunarak ayarları açın ve özelliği kapatın." - - - - - - - - + "Oynat" + "Duraklat" + "Sonrakine atla" + "Öncekine atla" "Telefon ısındığından kapatıldı" "Telefonunuz şu anda normal bir şekilde çalışıyor" "Telefonunuz çok ısındığından soğuması için kapatıldı ve şu anda normal bir şekilde çalışıyor.\n\nTelefon şu koşullarda çok ısınabilir:\n • Yoğun kaynak gerektiren uygulamalar (oyun, video veya gezinme uygulamaları gibi) kullanma\n • Büyük dosyalar indirme veya yükleme\n • Telefonu sıcak yerlerde kullanma" @@ -765,8 +752,7 @@ "Hazır Uygulamalar" "Hazır uygulamaların yüklenmesi gerekmez." "Uygulama bilgileri" - - + "Web\'e git" "Mobil veriler" "Kablosuz bağlantı kapalı" "Bluetooth kapalı" diff --git a/packages/SystemUI/res/values-tr/strings_car.xml b/packages/SystemUI/res/values-tr/strings_car.xml index 72018e25808ee197cc6ed2a1e8040d35fde685da..c749bed792c15af9cd038e207817e495572b8fc4 100644 --- a/packages/SystemUI/res/values-tr/strings_car.xml +++ b/packages/SystemUI/res/values-tr/strings_car.xml @@ -19,6 +19,5 @@ - "Güvenli bir şekilde sürün" - "Sürüş koşullarına karşı dikkatli olun ve geçerli yasalara her zaman uyun. Yol tarifi yanlış, eksik, tehlikeli, uygunsuz, yasak olabilir veya idari bölgelerden geçişleri içerebilir. İşletme bilgileri de yanlış veya eksik olabilir. Veriler gerçek zamanlı değildir ve konum doğruluğu garanti edilemez. Sürüş sırasında mobil cihazınızı veya Android Auto için geliştirilmemiş uygulamaları kullanmayın." + "Bilinmiyor" diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index dcf8d4f54764d347dbadb378f335a694566f97c9..482b50f163e2b2c6780a1300070d4c10066e668e 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -159,6 +159,7 @@ "Мобільне передавання даних вимкнено" "Прив’язка Bluetooth." "Режим польоту." + "Мережу VPN увімкнено." "Немає SIM-карти." "Змінення мережі оператора." "Відкрити деталі акумулятора" @@ -433,8 +434,7 @@ "Робочий профіль під’єднано до додатка %1$s" "Особистий профіль під’єднано до додатка %1$s" "Пристрій під’єднано до додатка %1$s" - - + "Керування пристроями" "Відстеження профілю" "Відстеження дій у мережі" "Мережа VPN" @@ -443,18 +443,14 @@ "Вимкнути VPN" "Від’єднатися від мережі VPN" "Переглянути правила" - - - - + "Вашим пристроєм керує адміністратор організації \"%1$s\".\n\nВін може відстежувати та контролювати налаштування, корпоративний доступ, додатки, дані пристрою й інформацію про його місцезнаходження.\n\nЩоб дізнатися більше, зв’яжіться з адміністратором." + "Вашим пристроєм керує адміністратор організації.\n\nВін може відстежувати та контролювати налаштування, корпоративний доступ, додатки, дані пристрою й інформацію про його місцезнаходження.\n\nЩоб дізнатися більше, зв’яжіться з адміністратором." "Адміністратор організації встановив центр сертифікації на цьому пристрої. Захищений мережевий трафік може відстежуватися або змінюватися." "Адміністратор організації встановив центр сертифікації у вашому робочому профілі. Захищений мережевий трафік може відстежуватися або змінюватися." "На цьому пристрої встановлено центр сертифікації. Захищений мережевий трафік може відстежуватися або змінюватися." "Ваш адміністратор увімкнув реєстрацію в мережі, під час якої на вашому пристрої відстежується трафік." - - - - + "Під’єднано додаток %1$s, який може відстежувати вашу активність у мережі, як-от відкривання електронних листів, додатків і веб-сайтів." + "Під’єднано додатки %2$s та %1$s, які можуть відстежувати вашу активність у мережі, як-от відкривання електронних листів, додатків і веб-сайтів." "Ваш робочий профіль під’єднано до додатка %1$s, який може відстежувати вашу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах." "Ваш особистий профіль під’єднано до додатка %1$s, який може відстежувати вашу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах." "Вашим пристроєм керує додаток %1$s." @@ -476,6 +472,8 @@ "Ваш профіль під’єднано до додатка %1$s, який може відстежувати вашу особисту активність у мережі, зокрема доступ до електронної пошти, додатків і веб-сайтів." "Вашим робочим профілем керує адміністратор організації %1$s. Цей профіль під’єднано до додатка %2$s, який може відстежувати вашу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах.\n\nЩоб дізнатися більше, зв’яжіться з адміністратором." "Вашим робочим профілем керує адміністратор організації %1$s. Цей профіль під’єднано до додатка %2$s, який може відстежувати вашу активність у мережі, зокрема а електронній пошті, додатках і на веб-сайтах.\n\nВаш профіль також під’єднано до додатка %3$s, який може відстежувати вашу особисту активність у мережі." + + "Пристрій залишатиметься заблокованим, доки ви не розблокуєте його вручну" "Швидше отримуйте сповіщення" "Переглядайте сповіщення, перш ніж розблокувати екран" @@ -667,7 +665,7 @@ "Вибір клавіатури" "Зберегти" - "Віднов." + "Скинути" "Змінити ширину кнопки" "Буфер обміну" "Спеціальна кнопка навігації" @@ -713,6 +711,8 @@ "Сповіщення %1$s: %2$s" "Додаток може не працювати в режимі розділеного екрана." "Додаток не підтримує розділення екрана." + "Додаток може не працювати на додатковому дисплеї." + "Додаток не підтримує запуск на додаткових дисплеях." "Відкрити налаштування." "Відкрити швидкі налаштування." "Закрити швидкі налаштування." @@ -762,8 +762,7 @@ "Додатки з миттєвим запуском" "Додатки з миттєвим запуском не потрібно встановлювати." "Про додаток" - - + "Перейти на веб-сайт" "Мобільний трафік" "Wi-Fi вимкнено" "Bluetooth вимкнено" diff --git a/packages/SystemUI/res/values-uk/strings_car.xml b/packages/SystemUI/res/values-uk/strings_car.xml index 4fda0ab773de9a6606140f60eb54f28a69fdada9..0f88449758498a225879d07cddea8d7fa22d1351 100644 --- a/packages/SystemUI/res/values-uk/strings_car.xml +++ b/packages/SystemUI/res/values-uk/strings_car.xml @@ -19,6 +19,5 @@ - "Будьте уважні за кермом" - "Стежте умовами дорожнього руху та завжди дотримуйтеся відповідних законів. Маршрути можуть бути неточними, неповними, небезпечними, непридатними або перетинати межі адміністративних одиниць. Інформація про компанії також може бути неточною або неповною. Дані надаються не в реальному часі. Точність визначення місцезнаходжень не гарантується. Коли ви за кермом, не користуйтеся мобільним пристроєм або додатками, не призначеними для Android Auto." + "Невідомо" diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 525054ee8823316899d1d71b25c4c9e8146962ed..88e00226def09ba356323cd2be0f54ed35a5891f 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -152,14 +152,12 @@ "Edge" "Wi-Fi" "‏کوئی SIM نہیں ہے۔" - - - - - - - "بلوٹوتھ مربوط کرنا۔" + "موبائل ڈیٹا" + "موبائل ڈیٹا آن ہے" + "موبائل ڈیٹا آف ہے" + "بلوٹوتھ ٹیتھرنگ۔" "ہوائی جہاز وضع۔" + "‏VPN آن ہے۔" "‏کوئی SIM کارڈ نہیں ہے۔" "کیریئر نیٹ ورک تبدیل ہو رہا ہے۔" "بیٹری کی تفصیلات کھولیں" @@ -242,11 +240,9 @@ "چارج ہو رہا ہے" "‏2G-3G ڈیٹا موقوف کر دیا گیا" "‏4G ڈیٹا موقوف کر دیا گیا" - - + "موبائل ڈیٹا موقوف کر دیا گیا ہے" "ڈیٹا موقوف کر دیا گیا" - - + "ڈیٹا کا استعمال آپ کی مقرر کردہ حد کو پہنچ چکا ہے۔ اب آپ موبائل ڈیٹا کا استعمال نہیں کر رہے ہیں۔\n\nاگر آپ دوبارہ شروع کرتے ہیں تو ڈیٹا استعمال کیلئے چارجز لاگو ہو سکتے ہیں۔" "دوبارہ شروع کریں" "کوئی انٹرنیٹ کنکشن نہیں" "‏Wi-Fi مربوط ہے" @@ -309,18 +305,17 @@ "کوئی آلات دستیاب نہیں ہیں" "چمکیلا پن" "خودکار" - "رنگ تبدیل کریں" + "رنگ پلٹیں" "رنگ کی اصلاح کی وضع" "مزید ترتیبات" "ہو گیا" "مربوط" "مربوط ہو رہا ہے…" - "مربوط کرنا" + "ٹیتھرنگ" "ہاٹ اسپاٹ" "اطلاعات" "فلیش لائٹ" - - + "موبائل ڈیٹا" "ڈیٹا کا استعمال" "باقی ڈیٹا" "حد سے زیادہ" @@ -433,8 +428,7 @@ "دفتری پروفائل %1$s سے منسلک ہے" "ذاتی پروفائل %1$s سے منسلک ہے" "آلہ %1$s سے منسلک ہے" - - + "آلے کا نظم و نسق" "پروفائل کو مانیٹر کرنا" "نیٹ ورک کو مانیٹر کرنا" "VPN" @@ -443,18 +437,14 @@ "‏VPN کو غیر فعال کریں" "‏VPN کو غیر منسلک کریں" "پالیسیاں دیکھیں" - - - - + "آپ کا آلہ %1$s کے زیر انتظام ہے۔\n\nآپ کا منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلہ سے وابستہ ڈیٹا اور آپ کے آلہ کے مقام کی معلومات کو مانیٹر اور ان کا نظم کر سکتا ہے۔\n\nمزید معلومات کیلئے اپنے منتظم سے رابطہ کریں۔" + "آپ کا آلہ آپ کی تنظیم کے زیر انتظام ہے۔\n\nآپ کا منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلہ سے وابستہ ڈیٹا اور آپ کے آلہ کے مقام کی معلومات کو مانیٹر اور ان کا نظم کر سکتا ہے۔\n\nمزید معلومات کیلئے اپنے منتظم سے رابطہ کریں۔" "آپ کی تنظیم نے اس آلے پر ایک سرٹیفکیٹ کی اتھارٹی کو انسٹال کیا ہے۔ آپ کا محفوظ نیٹ ورک ٹریفک مانیٹر ہو سکتا ہے یا اس میں ترمیم کی جا سکتی ہے۔" "آپ کی تنظیم نے آپ کے دفتری پروفائل میں ایک سرٹیفکیٹ کی اتھارٹی کو انسٹال کیا ہے۔ آپ کا محفوظ نیٹ ورک ٹریفک مانیٹر ہو سکتا ہے یا اس میں ترمیم کی جا سکتی ہے۔" "ایک سرٹیفکیٹ کی اتھارٹی اس آلہ پر انسٹال ہے۔ آپ کا محفوظ نیٹ ورک ٹریفک مانیٹر ہو سکتا ہے یا اس میں ترمیم کی جا سکتی ہے۔" "آپ کے منتظم نے نیٹ ورک لاگنگ کو آن کر دیا ہے، جو آپ کے آلے پر ٹریفک مانیٹر کرتی ہے۔" - - - - + "آپ %1$s سے منسلک ہیں جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔" + "آپ %1$s اور %2$s سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہیں۔" "آپ کا دفتری پروفائل %1$s سے منسلک ہے، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔" "آپ کا ذاتی پروفائل %1$s سے منسلک ہے جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔" "آپ کا آلہ %1$s کے زیر انتظام ہے۔" @@ -476,6 +466,8 @@ "آپ %1$s سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نجی نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔" "آپ کا دفتری پروفائل %1$s کے زیر انتظام ہے۔ پروفائل %2$s سے منسلک ہے جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے دفتری نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔\n\nمزید معلومات کیلئے اپنے منتظم سے رابطہ کریں۔" "آپ کا دفتری پروفائل %1$s کے زیر انتظام ہے۔ پروفائل %2$s سے منسلک ہے جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے دفتری نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔\n\nآپ %3$s سے بھی منسلک ہیں، جو آپ کے ذاتی نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔" + + "آلہ اس وقت تک مقفل رہے گا جب تک آپ دستی طور پر اسے غیر مقفل نہ کریں" "تیزی سے اطلاعات حاصل کریں" "غیر مقفل کرنے سے پہلے انہیں دیکھیں" @@ -569,12 +561,9 @@ %1$s، %2$s اور %3$d دیگر %1$s، %2$s اور %3$d دیگر - - - - - - + "%1$s کیلئے اطلاعی کنٹرولز کھلے ہیں" + "%1$s کیلئے اطلاعی کنٹرولز بند کر دئے گئے ہیں" + "اس چینل سے اطلاعات کی اجازت دیں" "سبھی زمرے" "مزید ترتیبات" "حسب ضرورت بنائیں: %1$s" @@ -712,6 +701,8 @@ "%1$s اطلاع: %2$s" "ممکن ہے کہ ایپ سپلٹ اسکرین کے ساتھ کام نہ کرے۔" "ایپ سپلٹ اسکرین کو سپورٹ نہیں کرتی۔" + "یہ ایپ شاید ثانوی ڈسپلے پر کام نہ کرے۔" + "یہ ایپ ثانوی ڈسپلیز پر شروعات کا تعاون نہیں کرتی ہے۔" "ترتیبات کھولیں۔" "فوری ترتیبات کھولیں۔" "فوری ترتیبات بند کریں۔" @@ -730,14 +721,10 @@ "تصویر کے مینو میں تصویر" "%s تصویر میں تصویر میں ہے" "اگر آپ نہیں چاہتے ہیں کہ %s اس خصوصیت کا استعمال کرے تو ترتیبات کھولنے کیلئے تھپتھپائیں اور اسے آف کر دیں۔" - - - - - - - - + "چلائیں" + "موقوف کریں" + "نظرانداز کرکے اگلے پر جائیں" + "نظرانداز کرکے پچھلے پر جائیں" "حرارت کی وجہ سے فون آف ہو گیا" "آپ کا فون اب حسب معمول کام کر رہا ہے" "آپ کا فون کافی گرم ہو گيا تھا، اس لئے سرد ہونے کیلئے یہ آف ہو گیا۔ اب آپ کا فون حسب معمول کام کر رہا ہے۔\n\nمندرجہ ذیل چیزیں کرنے پر آپ کا فون کافی گرم ہو سکتا ہے:\n • ماخذ کا زیادہ استعمال کرنے والی ایپس (جیسے کہ گیمنگ، ویڈیو، یا نیویگیشن ایپس) کا استعمال کرنا\n • بڑی فائلز ڈاؤن لوڈ یا اپ لوڈ کرنا\n • اعلی درجہ حرارت میں فون کا استعمال کرنا" @@ -765,8 +752,7 @@ "فوری ایپس" "فوری ایپس کو انسٹالیشن کی ضرورت نہیں ہے۔" "ایپ کی معلومات" - - + "ویب پر جائیں" "موبائل ڈیٹا" "‏Wi-Fi آف ہے" "بلوٹوتھ آف ہے" diff --git a/packages/SystemUI/res/values-ur/strings_car.xml b/packages/SystemUI/res/values-ur/strings_car.xml index 151ca09473e41917596ded0569b50330e83a6f45..4f819a0d9c960c3f6a6abe5d7414001fa86c10da 100644 --- a/packages/SystemUI/res/values-ur/strings_car.xml +++ b/packages/SystemUI/res/values-ur/strings_car.xml @@ -19,6 +19,5 @@ - "احتیاط سے گاڑی چلائیں" - "‏گاڑی چلاتے وقت اپنے گردونواح سے مکمل طور پر باخبر رہیں اور ہمیشہ قابل اطلاق قوانین کی پابندی کریں۔ ہدایات غلط، نامکمل، خطرناک، موزوں نہیں، ممنوع یا انتظامی علاقوں میں سے گزرنے کے متعلق ہو سکتی ہیں۔ کاروباری معلومات بھی غلط یا نامکمل ہو سکتی ہے۔ گاڑی چلاتے وقت اپنا موبائل آلہ یا وہ ایپس استعمال نہ کریں جو Android Auto کیلئے نہیں ہیں۔" + "نامعلوم" diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index fd5eeb26e4d87bd0b1e8c40d0fac2ddda0cb3bf8..2f34b70af1208c560fccf68aa206fc0a1c976ef0 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -157,6 +157,7 @@ "Mobil internet o‘chiq" "Bluetooth modem" "Parvoz rejimi" + "VPN yoniq." "SIM karta yo‘q." "Mobil tarmoqni o‘zgartirish" "Batareya quvvati sarfi haqida ma’lumot" @@ -243,7 +244,7 @@ "4G internet to‘xtatib qo‘yildi" "Mobil internet pauza qilingan" "Internetdan foydalanish to‘xtatib qo‘yildi" - "O‘rnatilgan trafik sarflab bo‘lindi. Endi mobil internetdan foydalana olmaysiz.\n\nDavom ettiradigan bo‘lsangiz, trafik uchun to‘lov olinishi mumkin." + "Belgilangan trafik sarflab bo‘lindi. Endi mobil internetdan foydalana olmaysiz.\n\nDavom ettiradigan bo‘lsangiz, trafik uchun to‘lov olinishi mumkin." "Davom etish" "Internetga ulanmagan" "Wi-Fi ulandi" @@ -429,8 +430,7 @@ "Ishchi profilda %1$s ilovasi ishga tushirilgan" "Shaxsiy profilda %1$s ilovasi ishga tushirilgan" "Qurilmada %1$s ilovasi ishga tushirilgan" - - + "Qurilmalar boshqaruvi" "Profilni kuzatish" "Tarmoqlarni kuzatish" "VPN" @@ -439,18 +439,14 @@ "VPN tarmog‘ini o‘chirish" "VPN ulanishini uzish" "Siyosatlarni ko‘rish" - - - - + "Qurilmangiz %1$s tomonidan boshqariladi.\n\nAdministrator sozlamalar, korporativ kirish huquqi, ilovalar, qurilmangizdagi ma’lumotlar, jumladan, joylashuv ma’lumotlari hamda unga bog‘liq boshqa ma’lumotlarni boshqarishi mumkin.\n\nBatafsil axborot olish uchun administratoringiz bilan bog‘laning." + "Qurilmangiz tashkilot tomonidan boshqariladi.\n\nAdministrator sozlamalar, korporativ kirish huquqi, ilovalar, qurilmangizdagi ma’lumotlar, jumladan, joylashuv ma’lumotlari hamda unga bog‘liq boshqa ma’lumotlarni boshqarishi mumkin.\n\nBatafsil axborot olish uchun administratoringiz bilan bog‘laning." "Tashkilotingiz bu qurilmada CA sertifikatini o‘rnatdi. U himoyalangan tarmoq trafigini nazorat qilishi va o‘zgartirishi mumkin." "Tashkilotingiz ishchi profilingizga CA sertifikatini o‘rnatdi. U himoyalangan tarmoq trafigini nazorat qilishi va o‘zgartirishi mumkin." "Qurilmada CA sertifikati o‘rnatilgan. U himoyalangan tarmoq trafigini nazorat qilishi va o‘zgartirishi mumkin." "Administrator qurilmangizdagi trafikni nazorat qiluvchi tarmoq jurnalini yoqdi." - - - - + "%1$s ilovasi ishga tushirilgan. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin." + "%1$s va %2$s ilovalari ishga tushirilgan. Ular tarmoqdagi, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin." "Ishchi profilingizda tarmoqdagi, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin bo‘lgan %1$s ilovasi ishga tushirilgan." "Shaxsiy profilingizda tarmoqdagi, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin bo‘lgan %1$s ilovasi ishga tushirilgan." "Qurilmangiz %1$s tomonidan boshqariladi." @@ -472,6 +468,8 @@ "%1$s ilovasi ishga tushirilgan. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin." "Ishchi profilingiz %1$s tomonidan boshqariladi. %2$s ilovasi ish tarmog‘idagi, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin.\n\nBatafsil axborot olish uchun administrator bilan bog‘laning." "Ishchi profilingiz %1$s tomonidan boshqariladi. %2$s ilovasi ish tarmog‘idagi, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin.\n\nShuningdek, %3$s ilovasi ham shaxsiy tarmoqdagi harakatlaringizni kuzatishi mumkin." + + "Qurilma qo‘lda qulfdan chiqarilmaguncha qulflangan holatda qoladi" "Bildirishnomalarni tezroq oling" "Ularni qulfdan chiqarishdan oldin ko‘ring" @@ -565,9 +563,9 @@ %1$s, %2$s va yana %3$d ta %1$s, %2$s va yana %3$d ta - "%1$s uchun bildirishnomalarni boshqarish ochildi" - "%1$s uchun bildirishnomalarni boshqarish yopildi" - "Ushbu kanaldan keladigan bildirishnomalarga ruxsat berish" + "%1$s uchun bildirishnoma sozlamalari ochildi" + "%1$s uchun bildirishnoma sozlamalari yopildi" + "Bu kanaldan keladigan bildirishnomalarga ruxsat berish" "Barcha turkumlar" "Boshqa sozlamalar" "%1$s: sozlash" @@ -705,6 +703,8 @@ "%1$s bildirishnomasi: %2$s" "Ilova ekranni ikkiga bo‘lish rejimini qo‘llab-quvvatlamaydi." "Bu ilova ekranni bo‘lish xususiyatini qo‘llab-quvvatlamaydi." + "Bu ilova qo‘shimcha ekranda ishlamasligi mumkin." + "Bu ilova qo‘shimcha ekranlarda ishlamaydi." "Sozlamalarni ochish." "Tezkor sozlamalarni ochish." "Tezkor sozlamalarni yopish." @@ -726,7 +726,7 @@ "Ijro" "Pauza" "Keyingisiga o‘tish" - "Avvalgisiga o‘tish" + "Avvalgisiga qaytish" "Qizigani uchun o‘chirildi" "Telefoningiz hozir normal holatda ishlayapti" "Telefon qizib ketganligi sababli sovitish uchun o‘chirib qo‘yilgan. Endi telefoningiz normal holatda ishlayapti.\n\nTelefon bu hollarda qizib ketishi mumkin:\n • Resurstalab ilovalar ishlatilganda (masalan, o‘yin, video yoki navigatsiya ilovalari)\n • Katta faylni yuklab olishda yoki yuklashda\n • Telefondan yuqori haroratda foydalanganda" @@ -754,8 +754,7 @@ "Darhol ochiladigan ilovalar" "Darhol ochiladigan ilovalarni o‘rnatish shart emas." "Ilova haqida" - - + "Brauzerga o‘tish" "Mobil internet" "Wi-Fi o‘chiq" "Bluetooth o‘chiq" diff --git a/packages/SystemUI/res/values-uz/strings_car.xml b/packages/SystemUI/res/values-uz/strings_car.xml index 610dc1fbc753698af9689f8cea100b0bf46aa2c1..a28ba3c7a632f7f868b4ac71d990b248fa96821c 100644 --- a/packages/SystemUI/res/values-uz/strings_car.xml +++ b/packages/SystemUI/res/values-uz/strings_car.xml @@ -19,6 +19,5 @@ - "Xavfsiz haydash" - "Harakat xavfsizligi va amaldagi qonunchilikka doim rioya qiling. Yo‘l ko‘rsatmalari noaniq, chala, xavfli, mos emas, taqiqlangan yoki ma’muriy hududlarni kesib o‘tadigan bo‘lishi mumkin. Biznes ma’lumotlari ham noaniq yoki chala bo‘lishi mumkin. Ma’lumotlar real vaqt rejimida bo‘lmasligi hamda joylashuv ma’lumotining aniqligi kafolatlanmaydi. Avtomobilni haydash mobaynida Android Auto xizmati bilan bog‘liq bo‘lmagan hollarda mobil qurilma yoki ilovalardan foydalanmang." + "Noma’lum" diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 5460d2806c411fe717be7fe2c6b264847d76e72f..88920b7dc4c4e671e750ada113546c7a56c9e80a 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -152,14 +152,12 @@ "Cạnh" "Wi-Fi" "Không có SIM nào." - - - - - - + "Dữ liệu di động" + "Dữ liệu di động đang bật" + "Dữ liệu di động đang tắt" "Truy cập Internet qua Bluetooth." "Chế độ trên máy bay." + "VPN đang bật." "Không có thẻ SIM nào." "Thay đổi mạng của nhà cung cấp dịch vụ." "Mở chi tiết về pin" @@ -242,11 +240,9 @@ "Đang sạc" "Đã tạm dừng dữ liệu 2G-3G" "Đã tạm dừng dữ liệu 4G" - - + "Dữ liệu di động bị tạm dừng" "Đã tạm dừng dữ liệu" - - + "Đã đạt đến giới hạn dữ liệu mà bạn đặt. Bạn hiện không còn sử dụng dữ liệu di động.\n\nNếu tiếp tục, bạn có thể phải trả phí sử dụng dữ liệu." "Tiếp tục" "Ko có k.nối Internet" "Đã kết nối Wi-Fi" @@ -319,8 +315,7 @@ "Điểm phát sóng" "Thông báo" "Đèn pin" - - + "Dữ liệu di động" "Sử dụng dữ liệu" "Dữ liệu còn lại" "Vượt quá giới hạn" @@ -433,8 +428,7 @@ "Hồ sơ công việc được kết nối với %1$s" "Hồ sơ cá nhân được kết nối với %1$s" "Thiết bị được kết nối với %1$s" - - + "Quản lý thiết bị" "Giám sát hồ sơ" "Giám sát mạng" "VPN" @@ -443,18 +437,14 @@ "Tắt VPN" "Ngắt kết nối VPN" "Xem chính sách" - - - - + "Thiết bị của bạn do %1$s quản lý.\n\nQuản trị viên của bạn có thể giám sát và quản lý cài đặt, quyền truy cập vào dữ liệu công ty, ứng dụng, dữ liệu được liên kết với thiết bị và thông tin vị trí thiết bị của bạn.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn." + "Thiết bị của bạn do tổ chức của bạn quản lý.\n\nQuản trị viên có thể giám sát và quản lý cài đặt, quyền truy cập vào dữ liệu công ty, ứng dụng, dữ liệu được liên kết với thiết bị và thông tin vị trí thiết bị của bạn.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn." "Tổ chức của bạn đã cài đặt một tổ chức phát hành chứng chỉ trên thiết bị này. Lưu lượng truy cập mạng bảo mật của bạn có thể được giám sát hoặc sửa đổi." "Tổ chức của bạn đã cài đặt một tổ chức phát hành chứng chỉ trong hồ cơ công việc của bạn. Lưu lượng truy cập mạng bảo mật của bạn có thể được giám sát hoặc sửa đổi." "Một tổ chức phát hành chứng chỉ được cài đặt trên thiết bị này. Lưu lượng truy cập mạng bảo mật của bạn có thể được giám sát hoặc sửa đổi." "Quản trị viên của bạn đã bật tính năng ghi nhật ký mạng. Tính năng này giám sát lưu lượng truy cập trên thiết bị của bạn." - - - - + "Bạn đang kết nối với %1$s. Ứng dụng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web." + "Bạn đang kết nối với %1$s%2$s. Các ứng dụng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web." "Hồ sơ công việc của bạn được kết nối với %1$s, ứng dụng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web." "Hồ sơ cá nhân của bạn được kết nối với %1$s. Ứng dụng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web." "Thiết bị của bạn do %1$s quản lý." @@ -476,6 +466,8 @@ "Bạn đang kết nối với %1$s. Ứng dụng này có thể giám sát hoạt động mạng cá nhân của bạn bao gồm email, ứng dụng và trang web." "Hồ sơ công việc của bạn do %1$s quản lý. Hồ sơ này được kết nối với %2$s, ứng dụng này có thể giám sát hoạt động mạng cơ quan của bạn, bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn." "Hồ sơ công việc của bạn do %1$s quản lý. Hồ sơ này được kết nối với %2$s, ứng dụng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web.\n\nBạn cũng đang kết nối với %3$s, ứng dụng này có thể giám sát hoạt động mạng cá nhân của bạn." + + "Thiết bị sẽ vẫn bị khóa cho tới khi bạn mở khóa theo cách thủ công" "Nhận thông báo nhanh hơn" "Xem thông báo trước khi bạn mở khóa" @@ -571,12 +563,9 @@ %1$s, %2$s%3$d kênh khác %1$s, %2$s%3$d kênh khác - - - - - - + "Đã mở điều khiển thông báo đối với %1$s" + "Đã đóng điều khiển thông báo đối với %1$s" + "Cho phép thông báo từ kênh này" "Tất cả danh mục" "Cài đặt khác" "Tùy chỉnh: %1$s" @@ -714,6 +703,8 @@ "Thông báo của %1$s: %2$s" "Ứng dụng có thể không hoạt động với tính năng chia đôi màn hình." "Ứng dụng không hỗ trợ chia đôi màn hình." + "Ứng dụng có thể không hoạt động trên màn hình phụ." + "Ứng dụng không hỗ trợ khởi chạy trên màn hình phụ." "Mở cài đặt." "Mở cài đặt nhanh." "Đóng cài đặt nhanh." @@ -732,14 +723,10 @@ "Menu ảnh trong ảnh" "%s đang ở chế độ ảnh trong ảnh" "Nếu bạn không muốn %s sử dụng tính năng này, hãy nhấn để mở cài đặt và tắt tính năng này." - - - - - - - - + "Phát" + "Tạm dừng" + "Chuyển tới mục tiếp theo" + "Chuyển về mục trước" "Điện thoại đã tắt do nhiệt" "Điện thoại của bạn hiện đang chạy bình thường" "Do quá nóng nên điện thoại đã tắt để hạ nhiệt. Hiện điện thoại của bạn đang chạy bình thường.\n\nĐiện thoại có thể bị quá nóng nếu bạn:\n • Dùng các ứng dụng tốn nhiều tài nguyên (như ứng dụng trò chơi, video hoặc điều hướng)\n • Tải xuống hoặc tải lên tệp có dung lượng lớn\n • Dùng điện thoại ở nhiệt độ cao" @@ -767,8 +754,7 @@ "Ứng dụng tức thì" "Ứng dụng tức thì không yêu cầu cài đặt." "Thông tin ứng dụng" - - + "Truy cập web" "Dữ liệu di động" "Wi-Fi tắt" "Bluetooth tắt" diff --git a/packages/SystemUI/res/values-vi/strings_car.xml b/packages/SystemUI/res/values-vi/strings_car.xml index 2aee7d5fc8a29d4fc20baf2b626d0fe5d20579b9..ca176064cffef98223bbdca464dc423060ed4e63 100644 --- a/packages/SystemUI/res/values-vi/strings_car.xml +++ b/packages/SystemUI/res/values-vi/strings_car.xml @@ -19,6 +19,5 @@ - "Lái xe an toàn" - "Luôn biết rõ điều kiện lái xe và luôn tuân thủ luật pháp hiện hành. Chỉ đường có thể không chính xác, không hoàn chỉnh, nguy hiểm, không thích hợp, bị cấm hoặc bao gồm tuyến đường giao các khu vực hành chính. Thông tin doanh nghiệp cũng có thể không chính xác hoặc không hoàn chỉnh. Dữ liệu không ở thời gian thực và không thể đảm bảo độ chính xác của vị trí. Không sử dụng thiết bị di động của bạn hoặc sử dụng ứng dụng không dành cho Android Auto trong khi lái xe." + "Không xác định" diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 38850d495e54f5c7e57ae2e68c28be5a389fdb56..02cb28fa9bfeaf10f9799343607eefe8e807f3df 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -152,14 +152,12 @@ "EDGE" "WLAN" "无 SIM 卡。" - - - - - - + "移动数据" + "移动数据已开启" + "移动数据已关闭" "蓝牙网络共享。" "飞行模式。" + "VPN 已开启。" "没有 SIM 卡。" "运营商网络正在更改。" "打开电量详情" @@ -200,8 +198,8 @@ "飞行模式开启。" "飞行模式已关闭。" "飞行模式已开启。" - "勿扰模式已开启,仅限优先打扰。" - "勿扰模式已开启,完全静音。" + "勿扰模式已开启,仅允许指定的优先事项打扰。" + "勿扰模式已开启,阻止全部通知。" "勿扰模式已开启,仅限闹钟。" "勿扰。" "勿扰模式关闭。" @@ -242,11 +240,9 @@ "正在充电" "2G-3G 数据网络已暂停使用" "4G 数据网络已暂停使用" - - + "移动数据已暂停使用" "数据网络已暂停使用" - - + "您的数据用量已达到所设置的用量上限,因此系统已停用移动数据。\n\n如果您要继续使用移动数据,则可能需要支付相应的数据流量费用。" "恢复" "未连接互联网" "已连接到WLAN网络" @@ -271,7 +267,7 @@ "屏保" "有线网络" "勿扰" - "仅限优先打扰" + "仅限优先事项" "仅限闹钟" "完全阻止" "蓝牙" @@ -319,8 +315,7 @@ "热点" "通知" "手电筒" - - + "移动数据" "流量使用情况" "剩余流量" "超出上限" @@ -370,9 +365,9 @@ "滑动图标即可拨打电话" "滑动图标即可打开语音助理" "滑动图标即可打开相机" - "完全静音。此模式也会将屏幕阅读器静音。" + "完全阻止。此模式也会将屏幕阅读器静音。" "完全阻止" - "仅限优先打扰" + "仅限优先事项" "仅限闹钟" "完全\n静音" "仅限\n优先打扰" @@ -433,8 +428,7 @@ "工作资料已连接到“%1$s”" "个人资料已连接到“%1$s”" "设备已连接到“%1$s”" - - + "设备管理" "资料监控" "网络监控" "VPN" @@ -443,18 +437,14 @@ "关闭VPN" "断开VPN连接" "查看政策" - - - - + "您的设备由“%1$s”负责管理。\n\n您的管理员能够监控和管理与您的设备相关的设置、企业权限、应用、数据,以及您设备的位置信息。\n\n要了解详情,请与您的管理员联系。" + "您的设备由贵单位负责管理。\n\n您的管理员能够监控和管理与您的设备相关的设置、企业权限、应用、数据,以及您设备的位置信息。\n\n要了解详情,请与您的管理员联系。" "您所在的单位已在此设备上安装证书授权中心。您的安全网络流量可能会受到监控或修改。" "您所在的单位已为您的工作资料安装证书授权中心。您的安全网络流量可能会受到监控或修改。" "此设备上已安装证书授权中心。您的安全网络流量可能会受到监控或修改。" "您的管理员已开启网络日志功能(该功能会监控您设备上的流量)。" - - - - + "您已连接到“%1$s”(该应用能够监控您的网络活动,其中包括收发电子邮件、使用应用和浏览网站)。" + "您已连接到“%1$s”和“%2$s”(这两个应用能够监控您的网络活动,其中包括收发电子邮件、使用应用和浏览网站)。" "您的工作资料已连接到“%1$s”(该应用能够监控您的网络活动,其中包括收发电子邮件、使用应用和浏览网站)。" "您的个人资料已连接到“%1$s”(该应用能够监控您的网络活动,其中包括收发电子邮件、使用应用和浏览网站)。" "您的设备由%1$s管理。" @@ -476,6 +466,8 @@ "您已连接到%1$s,该应用可以监控您的个人网络活动,包括收发电子邮件、使用应用和浏览网站。" "您的工作资料由“%1$s”负责管理,且已连接到“%2$s”(该应用能够监控您的工作网络活动,其中包括收发电子邮件、使用应用和浏览网站)。\n\n如需更多信息,请与您的管理员联系。" "您的工作资料由“%1$s”负责管理,且已连接到“%2$s”(该应用能够监控您的工作网络活动,其中包括收发电子邮件、使用应用和浏览网站)。\n\n此外,您还连接到了“%3$s”(该应用能够监控您的个人网络活动)。" + + "在您手动解锁之前,设备会保持锁定状态" "更快捷地查看通知" "无需解锁即可查看通知" @@ -569,12 +561,9 @@ %1$s%2$s以及另外 %3$d %1$s%2$s以及另外 %3$d - - - - - - + "%1$s的通知控件已打开" + "%1$s的通知控件已关闭" + "允许接收来自此频道的通知" "所有类别" "更多设置" "自定义:%1$s" @@ -712,6 +701,8 @@ "%1$s通知:%2$s" "应用可能无法在分屏模式下正常运行。" "应用不支持分屏。" + "应用可能无法在辅助显示屏上正常运行。" + "应用不支持在辅助显示屏上启动。" "打开设置。" "开启快捷设置。" "关闭快捷设置。" @@ -730,14 +721,10 @@ "画中画菜单" "%s目前位于“画中画”中" "如果您不想让%s使用此功能,请点按以打开设置,然后关闭此功能。" - - - - - - - - + "播放" + "暂停" + "跳到下一个" + "跳到上一个" "手机因严重发热而自动关机" "现在,您的手机已恢复正常运行" "由于发热严重,因此您的手机执行了自动关机以降温。现在,您的手机已恢复正常运行。\n\n以下情况可能会导致您的手机严重发热:\n • 使用占用大量资源的应用(例如游戏、视频或导航应用)\n • 下载或上传大型文件\n • 在高温环境下使用手机" @@ -765,8 +752,7 @@ "免安装应用" "免安装应用无需安装就能使用。" "应用信息" - - + "转到网页版" "移动数据" "WLAN 已关闭" "蓝牙已关闭" diff --git a/packages/SystemUI/res/values-zh-rCN/strings_car.xml b/packages/SystemUI/res/values-zh-rCN/strings_car.xml index 6a5a4e85abf7d264467dd309feb6b5b506499970..4797c7b4b6f4256f16dd022d32374975a779306d 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings_car.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings_car.xml @@ -19,6 +19,5 @@ - "安全驾驶" - "请充分了解驾驶条件并务必遵守适用的法律。路线指示可能不准确,不完整,也可能包含危险、不适合通行、禁止通行或跨越行政区域的路段。商家信息也可能不准确或不完整。数据并非实时提供,因此无法保证位置信息的精确度。请勿在驾驶过程中操作您的移动设备或使用不支持 Android Auto 的应用。" + "未知" diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 19957bfc48f87d780f826c608b366f07d520e817..1574fd8c9da6c7809deb206fd56739fb9ad6128a 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -152,14 +152,12 @@ "Edge" "Wi-Fi" "無 SIM 卡。" - - - - - - + "流動數據" + "開咗流動數據" + "閂咗流動數據" "藍牙網絡共享。" "飛航模式。" + "開咗 VPN。" "沒有 SIM 卡。" "流動網絡供應商網絡正在變更。" "開啟電池詳細資料" @@ -244,11 +242,9 @@ "正在充電" "已暫停 2G-3G 數據" "已暫停 4G 數據" - - + "已暫停使用流動數據" "已暫停使用數據" - - + "您的數據用量已達到所設定的上限,因此系統已停用流動數據連線。\n\n如果您恢復使用流動數據連線,可能需要支付數據用量費用。" "恢復" "沒有互聯網連線" "Wi-Fi 已連線" @@ -321,8 +317,7 @@ "熱點" "通知" "手電筒" - - + "流動數據" "數據用量" "剩餘資料" "超過上限" @@ -435,8 +430,7 @@ "工作設定檔已連結至「%1$s」" "個人設定檔已連結至「%1$s」" "裝置已連結至「%1$s」" - - + "裝置管理" "個人檔案監控" "網絡監控" "VPN" @@ -445,18 +439,14 @@ "停用 VPN" "中斷 VPN 連線" "查看政策" - - - - + "您的裝置由%1$s管理。\n\n您的管理員可以監控和管理與您裝置相關的設定、公司存取權、應用程式、資料和位置。\n\n如需瞭解詳情,請聯絡您的管理員。" + "您的裝置由您的機構管理。\n\n您的管理員可以監控和管理與您裝置相關的設定、公司存取權、應用程式、資料和位置。\n\n如需瞭解詳情,請聯絡您的管理員。" "您的機構已在此裝置中安裝憑證授權單位。您的安全網絡流量可能會受監控或修改。" "您的機構已在您的工作設定檔中安裝憑證授權單位。您的安全網絡流量可能會受監控或修改。" "此裝置已安裝憑證授權單位。您的安全網絡流量可能會受監控或修改。" "您的管理員已開啟網絡記錄功能,以監控您裝置上的流量。" - - - - + "您已連接至「%1$s」,此應用程式可以監控您的網絡活動,包括電郵、應用程式及網站。" + "您已連接至「%1$s」和「%2$s」,這些應用程式可以監控您的網絡活動,包括電郵、應用程式及網站。" "您的工作設定檔已連結至「%1$s」,此應用程式可以監控您的網絡活動,包括電郵、應用程式及網站。" "您的個人設定檔已連結至「%1$s」,此應用程式可以監控您的網絡活動,包括電郵、應用程式及網站。" "您的裝置由「%1$s」管理。" @@ -478,6 +468,8 @@ "您已連接至「%1$s」,此應用程式可以監控您的個人網絡活動,包括電郵、應用程式及網站。" "您的工作設定檔由%1$s管理。設定檔已連結至「%2$s」,此應用程式可以監控您的工作網絡活動,包括電郵、應用程式和網站。\n\n如需瞭解詳情,請聯絡您的管理員。" "您的工作設定檔由%1$s管理。設定檔已連結至「%2$s」,此應用程式可以監控您的工作網絡活動,包括電郵、應用程式和網站。\n\n您亦已連結至「%3$s」,此應用程式可以監控您的個人網絡活動。" + + "裝置將保持上鎖,直到您手動解鎖" "更快取得通知" "解鎖前顯示" @@ -571,12 +563,9 @@ %1$s%2$s和另外 %3$d 個頻道 %1$s%2$s和另外 %3$d 個頻道 - - - - - - + "開咗「%1$s」嘅通知控制項" + "閂咗「%1$s」嘅通知控制項" + "允許收到呢個頻道嘅通知" "所有類別" "更多設定" "自訂:%1$s" @@ -714,6 +703,8 @@ "%1$s 通知:%2$s" "應用程式可能無法在分割畫面中運作。" "應用程式不支援分割畫面。" + "應用程式可能無法在次要顯示屏上運作。" + "應用程式不支援在次要顯示屏上啟動。" "開啟設定。" "開啟快速設定。" "關閉快速設定。" @@ -732,14 +723,10 @@ "畫中畫選單" "「%s」目前在畫中畫模式" "如果您不想「%s」使用此功能,請輕按以開啟設定,然後停用此功能。" - - - - - - - - + "播放" + "暫停" + "跳到下一個" + "跳到上一個" "手機因過熱而關上" "您的手機現已正常運作" "您的手機之前因過熱而關上降溫。手機現已正常運作。\n\n以下情況可能會導致手機過熱:\n • 使用耗用大量資源的應用程式 (例如遊戲、影片或導航應用程式)\n • 下載或上載大型檔案\n • 在高溫環境下使用手機" @@ -767,8 +754,7 @@ "即時應用程式" "即時應用程式無需安裝即可使用。" "應用程式資料" - - + "前往網頁版" "流動數據" "Wi-Fi 已關閉" "藍牙已關閉" diff --git a/packages/SystemUI/res/values-zh-rHK/strings_car.xml b/packages/SystemUI/res/values-zh-rHK/strings_car.xml index 18f9e5025a4a72dd459d0895d93dd0a5803cc2a2..c40e4309dd96968440468366dcba611ff844fa9c 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings_car.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings_car.xml @@ -19,6 +19,5 @@ - "請安全駕駛" - "請隨時留意路面情況,並遵守適用的交通規則。系統提供的路線可能不準確、不完整、存在危險、不適合、禁止通行,或涉及跨越行政區域的路段。此外,商家資訊也可能不準確或不完整。路況資料並非即時更新,也無法保證定位資訊的準確性。駕駛時請勿操作流動裝置,或使用不適用於 Android Auto 的應用程式。" + "不明" diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 4c2505f01e86396fc31cf28913cc11d5b38ec1ef..dfd705fe30a012613842bdb1c05309ff9b9c6a15 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -23,7 +23,7 @@ "清除" "從清單中移除" "應用程式資訊" - "您最近的螢幕會顯示在這裡" + "你最近的螢幕會顯示在這裡" "關閉最近使用的應用程式" 總覽中有 %d 個畫面 @@ -152,14 +152,12 @@ "Edge" "Wi-Fi" "沒有 SIM 卡。" - - - - - - + "行動數據" + "行動數據已開啟" + "行動數據已關閉" "藍牙網路共用" "飛行模式。" + "VPN 已開啟。" "沒有 SIM 卡。" "電信業者網路正在變更。" "開啟電量詳細資料" @@ -242,11 +240,9 @@ "充電中" "已暫停 2G-3G 數據連線" "已暫停 4G 數據連線" - - + "行動數據已暫停使用" "已暫停數據連線" - - + "你的數據用量已達設定的用量上限,因此系統已停止使用行動數據連線。\n\n如果你繼續使用行動數據連線,可能需要支付相關的數據傳輸費用。" "恢復連線" "沒有網際網路連線" "Wi-Fi 已連線" @@ -319,8 +315,7 @@ "無線基地台" "通知" "手電筒" - - + "行動數據" "數據用量" "剩餘資料" "超過上限" @@ -333,7 +328,7 @@ "NFC 已停用" "NFC 已啟用" "最近沒有任何項目" - "您已清除所有工作" + "你已清除所有工作" "應用程式資訊" "螢幕固定" "搜尋" @@ -357,9 +352,9 @@ "搜尋" "向上滑動即可%s。" "向左滑動即可%s。" - "您不會受到聲音和震動干擾,但鬧鐘、提醒、活動和指定來電者除外。" + "你不會受到聲音和震動干擾,但鬧鐘、提醒、活動和指定來電者除外。" "自訂" - "這會封鎖「所有」聲音和震動干擾,包括鬧鐘、音樂、影片和遊戲在內。您仍可以撥打電話。" + "這會封鎖「所有」聲音和震動干擾,包括鬧鐘、音樂、影片和遊戲在內,但你仍然可以撥打電話。" "這會封鎖「所有」聲音和震動干擾,包括鬧鐘、音樂、影片和遊戲在內。" "還有 %d 則通知" "較不緊急的通知會顯示在下方" @@ -392,8 +387,8 @@ "移除訪客?" "這個工作階段中的所有應用程式和資料都會遭到刪除。" "移除" - "訪客您好,歡迎回來!" - "您要繼續這個工作階段嗎?" + "訪客你好,歡迎回來!" + "你要繼續這個工作階段嗎?" "重新開始" "是,請繼續" "訪客使用者" @@ -410,7 +405,7 @@ "節約耗電量模式已啟用" "降低效能並限制背景數據傳輸" "關閉節約耗電量模式" - "%s 將開始擷取您的螢幕上顯示的內容。" + "%s 將開始擷取你的螢幕上顯示的內容。" "不要再顯示" "全部清除" "立即開始" @@ -433,8 +428,7 @@ "Work 設定檔已連結至「%1$s」" "個人設定檔已連結至「%1$s」" "裝置已連結至「%1$s」" - - + "裝置管理" "設定檔監控" "網路監控" "VPN" @@ -443,18 +437,14 @@ "停用 VPN" "中斷 VPN 連線" "查看政策" - - - - + "你的裝置是由「%1$s」所管理。\n\n你的管理員可以監控及管理與裝置相關聯的設定、公司系統權限、應用程式和資料,以及裝置的位置資訊。\n\n如要瞭解詳情,請與你的管理員聯絡。" + "你的裝置是由貴機構所管理。\n\n你的管理員可以監控及管理與裝置相關聯的設定、公司系統權限、應用程式和資料,以及裝置的位置資訊。\n\n如要瞭解詳情,請與你的管理員聯絡。" "貴機構已為這個裝置安裝憑證授權單位憑證。你的安全網路流量可能會受到監控或修改。" "貴機構已為你的 Work 設定檔安裝憑證授權單位憑證。你的安全網路流量可能會受到監控或修改。" "這個裝置已安裝憑證授權單位憑證。你的安全網路流量可能會受到監控或修改。" "你的管理員已啟用網路紀錄功能,可監控你裝置的流量。" - - - - + "由於你已連結至「%1$s」,因此你的網路活動 (包括收發電子郵件、使用應用程式及瀏覽網站) 可能會受到這個應用程式監控。" + "由於你已連結至「%1$s」和「%2$s」,因此你的網路活動 (包括收發電子郵件、使用應用程式及瀏覽網站) 可能會受到這兩個應用程式監控。" "由於你的 Work 設定檔已連結至「%1$s」,因此你的網路活動 (包括收發電子郵件、使用應用程式及瀏覽網站) 可能會受到這個應用程式監控。" "由於你的個人設定檔已連結至「%1$s」,因此你的網路活動 (包括收發電子郵件、使用應用程式及瀏覽網站) 可能會受到這個應用程式監控。" "你的裝置是由「%1$s」所管理。" @@ -468,15 +458,17 @@ " " "開啟信任的憑證" "你的管理員已啟用網路紀錄功能,可監控你裝置的流量。\n\n如需詳細資訊,請與你的管理員聯絡。" - "您已授權一個應用程式設定 VPN 連線。\n\n這個應用程式可以監控您的裝置和網路活動,包括收發電子郵件、使用應用程式和瀏覽網站。" + "你已授權一個應用程式設定 VPN 連線。\n\n這個應用程式可以監控你的裝置和網路活動,包括收發電子郵件、使用應用程式和瀏覽網站。" "你的 Work 設定檔是由下列機構管理:%1$s。\n\n你的管理員可以監控你的網路活動,包括收發電子郵件、使用應用程式及瀏覽網站。\n\n如需詳細資訊,請與你的管理員聯絡。\n\n此外,由於你已連線至 VPN,因此你的網路活動也會受到 VPN 監控。" "VPN" "由於你已連結至「%1$s」,因此你的網路活動 (包括收發電子郵件、使用應用程式和瀏覽網站) 可能會受到這個應用程式監控。" - "由於您已連線至 %1$s,您的個人網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。" + "由於你已連線至 %1$s,你的個人網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。" "由於你已連結至「%1$s」,你的個人網路活動 (包括收發電子郵件、使用應用程式及瀏覽網站) 可能會受到這個應用程式監控。" "你的 Work 設定檔是由「%1$s」所管理。由於該設定檔已連結至「%2$s」,因此你的網路活動 (包括收發電子郵件、使用應用程式和瀏覽網站) 可能會受到這個應用程式監控。\n\n如要瞭解詳情,請與你的管理員聯絡。" "你的 Work 設定檔是由「%1$s」所管理。由於該設定檔已連結至「%2$s」,因此你的網路活動 (包括收發電子郵件、使用應用程式和瀏覽網站) 可能會受到這個應用程式監控。\n\n此外,你還與「%3$s」建立了連結,因此你的個人網路活動也可能會受到該應用程式監控。" - "在您手動解鎖前,裝置將保持鎖定狀態" + + + "在你手動解鎖前,裝置將保持鎖定狀態" "更快取得通知" "解鎖前顯示" "不用了,謝謝" @@ -493,7 +485,7 @@ "隱藏%1$s?" "只要在設定頁面中重新啟用,就能再次看到快捷設定選項。" "隱藏" - "您正在使用 Work 設定檔" + "你正在使用 Work 設定檔" "通話" "系統" "鈴響" @@ -525,28 +517,28 @@ "飛航模式" "新增圖塊" "播送圖塊" - "您不會聽到下一個%1$s 的鬧鐘,除非您預先關閉這項功能" - "您不會聽到下一個%1$s 的鬧鐘" + "你不會聽到下一個%1$s 的鬧鐘,除非你預先關閉這項功能" + "你不會聽到下一個%1$s 的鬧鐘" "於%1$s" "於%1$s" "快速設定,%s。" "無線基地台" "Work 設定檔" "有趣與否,見仁見智" - "系統使用者介面調整精靈可讓您透過其他方式,調整及自訂 Android 使用者介面。這些實驗性功能隨著版本更新可能會變更、損壞或消失,執行時請務必謹慎。" + "系統使用者介面調整精靈可讓你透過其他方式,調整及自訂 Android 使用者介面。這些實驗性功能隨著版本更新可能會變更、損壞或消失,執行時請務必謹慎。" "這些實驗性功能隨著版本更新可能會變更、損壞或消失,執行時請務必謹慎。" "知道了" "恭喜!系統使用者介面調整精靈已新增到設定中" "從設定中移除" "要將系統使用者介面調整精靈從設定中移除,並停止使用所有相關功能嗎?" - "您的裝置未安裝這個應用程式" + "你的裝置未安裝這個應用程式" "顯示時鐘秒數" "在狀態列中顯示時鐘秒數。這可能會影響電池續航力。" "重新排列快速設定" "在快速設定中顯示亮度" "實驗性" "要開啟藍牙功能嗎?" - "如要將鍵盤連線到平板電腦,您必須先開啟藍牙。" + "如要將鍵盤連線到平板電腦,你必須先開啟藍牙。" "開啟" "顯示通知,但不發出任何音效" "封鎖所有通知" @@ -555,7 +547,7 @@ "電源通知控制項" "開啟" "關閉" - "只要使用電源通知控制項,您就能為應用程式通知設定從 0 到 5 的重要性等級。\n\n""等級 5"" \n- 顯示在通知清單頂端 \n- 允許全螢幕通知 \n- 一律允許短暫顯示通知 \n\n""等級 4"" \n- 禁止全螢幕通知 \n- 一律允許短暫顯示通知 \n\n""等級 3"" \n- 禁止全螢幕通知 \n- 一律不允許短暫顯示通知 \n\n""等級 2"" \n- 禁止全螢幕通知 \n- 一律不允許短暫顯示通知 \n- 一律不發出音效或震動 \n\n""等級 1"" \n- 禁止全螢幕通知 \n- 一律不允許短暫顯示通知 \n- 一律不發出音效或震動 \n- 在鎖定畫面和狀態列中隱藏 \n- 顯示在通知清單底端 \n\n""等級 0"" \n- 封鎖應用程式的所有通知" + "只要使用電源通知控制項,你就能為應用程式通知設定從 0 到 5 的重要性等級。\n\n""等級 5"" \n- 顯示在通知清單頂端 \n- 允許全螢幕通知 \n- 一律允許短暫顯示通知 \n\n""等級 4"" \n- 禁止全螢幕通知 \n- 一律允許短暫顯示通知 \n\n""等級 3"" \n- 禁止全螢幕通知 \n- 一律不允許短暫顯示通知 \n\n""等級 2"" \n- 禁止全螢幕通知 \n- 一律不允許短暫顯示通知 \n- 一律不發出音效或震動 \n\n""等級 1"" \n- 禁止全螢幕通知 \n- 一律不允許短暫顯示通知 \n- 一律不發出音效或震動 \n- 在鎖定畫面和狀態列中隱藏 \n- 顯示在通知清單底端 \n\n""等級 0"" \n- 封鎖應用程式的所有通知" "通知" "你不會再收到這類通知。" "%d 個通知類別" @@ -569,12 +561,9 @@ %1$s%2$s和另外 %3$d 個管道 %1$s%2$s和另外 %3$d 個管道 - - - - - - + "「%1$s」的通知控制項已開啟" + "「%1$s」的通知控制項已關閉" + "允許來自這個頻道的通知" "所有類別" "更多設定" "自訂:%1$s" @@ -712,6 +701,8 @@ "%1$s 通知:%2$s" "應用程式可能無法在分割畫面中運作。" "這個應用程式不支援分割畫面。" + "應用程式可能無法在第二個顯示器上運作。" + "應用程式不支援在第二個顯示器上啟動。" "開啟設定。" "開啟快速設定。" "關閉快速設定。" @@ -730,14 +721,10 @@ "子母畫面選單" "「%s」目前在子母畫面中" "如果你不想讓「%s」使用這項功能,請輕觸開啟設定頁面,然後停用此功能。" - - - - - - - - + "播放" + "暫停" + "跳到下一個" + "跳到上一個" "手機先前過熱,因此關閉電源" "手機現在已恢復正常運作" "手機先前的溫度過高,因此關閉了電源以進行降溫。手機現在已恢復正常運作。\n\n以下情況可能會導致你的手機溫度過高:\n • 使用需要密集處理資料的應用程式 (例如遊戲、影片或導航應用程式)\n • 下載或上傳大型檔案\n • 在高溫環境下使用手機" @@ -765,8 +752,7 @@ "免安裝應用程式" "免安裝應用程式不必安裝就能使用。" "應用程式資訊" - - + "前往網頁版" "行動數據" "Wi-Fi 已關閉" "藍牙已關閉" diff --git a/packages/SystemUI/res/values-zh-rTW/strings_car.xml b/packages/SystemUI/res/values-zh-rTW/strings_car.xml index 5e18309fc1e76a9942341d1551da8ee23c3e06e1..c40e4309dd96968440468366dcba611ff844fa9c 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings_car.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings_car.xml @@ -19,6 +19,5 @@ - "安全駕駛" - "請隨時注意周遭路況並遵守交通規則。系統所提供的路線可能有誤、不完整,或包含危險、不合適、禁止通行或管制區域的路段;此外,商家資訊也可能有誤或不完整。路況資料並非即時更新,也無法保證定位資訊必然準確無誤。駕駛時請勿操作您的行動裝置,或使用不適用於 Android Auto 的應用程式。" + "不明" diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index d1f64931232ef2ee375443b257314d2b001d63f0..1a925ac6474060bb664a7c9e254c5400f9313b7f 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -102,11 +102,11 @@ "Sondeza kancane esikrinini esikhudlwana" "Bluetooth ixhunyiwe" "i-Bluetooth ayixhunywanga." - "Ayikho ibhetri." - "Ibha eyodwa yebhetri" - "Amabha amabili ebhetri" - "Amabha amathathu ebhetri" - "Ibhetri igcwele." + "Ayikho ibhethri." + "Ibha eyodwa yebhethri" + "Amabha amabili ebhethri" + "Amabha amathathu ebhethri" + "Ibhethri igcwele." "Ayikho ifoni." "Ibha eyodwa yefoni" "Amabha amabilil efoni." @@ -157,10 +157,11 @@ "Idatha yeselula ivaliwe" "Imodemu nge-Bluetooth." "Imodi yendiza." + "I-VPN ivuliwe." "Alikho ikhadi le-SIM." "Iguqula inethiwekhi yenkampani yenethiwekhi." "Vula imininingwane yebhethri" - "Iphesenti %d lebhetri" + "Iphesenti %d lebhethri" "Ibhethri liyashaja, %d iphesenti." "Izilungiselelo zesistimu" "Izaziso" @@ -427,8 +428,7 @@ "Iphrofayela yomsebenzi ixhumeke ku-%1$s" "Iphrofayela yomuntu siqu ixhumeke ku-%1$s" "Idivayisi ixhumeke ku-%1$s" - - + "Ukuphathwa kwedivayisi" "Ukuqapha iphrofayela" "Ukuqashwa kwenethiwekhi" "I-VPN" @@ -437,18 +437,14 @@ "Khubaza i-VPN" "Nqamula i-VPN" "Buka izinqubomgomo" - - - - + "Idivayisi yakho iphethwe yi-%1$s.\n\nUmlawuli wakho angaqaphela aphinde aphathe izilungiselelo, ukufinyelela kwezinkampani, izinhlelo zokusebenza, idatha ehlotshaniswa nedivayisi yakho, kanye nolwazi lwendawo yedivayisi yakho.\n\nUkuze uthole olunye ulwazi, xhumana nomlawuli wakho." + "Idivayisi yakho iphethwe inhlangano yakho.\n\nUmlawuli wakho angaqapha aphinde aphathe izilungiselelo, ukufinyelela kwezinkampani, izinhlelo zokusebenza, idatha ehlotshaniswa nedivayisi yakho, kanye nolwazi lwendawo yedivayisi yakho.\n\nUkuze uthole olunye ulwazi, xhumana nomlawuli wakho." "Inhlangano yakho ifake ukugunyazwa kwesitifiketi kule divayisi. Ithrafikhi yenethiwekhi yakho evikelekile kungenzeka iqashelwe noma ilungiswe." "Inhlangano yakho ifake ukugunyaza kwesitifiketi kuphrofayela yakho yomsebenzi. Ithrafikhi yenethiwekhi yakho evikelekile ingaqashwa noma ilungiswe." "Ukugunyaza kwesitifiketi kufakwe kule divayisi. Ithrafikhi yenethiwekhi yakho evikelekile ingaqashelwa noma ilungiswe." "Umlawuli wakho uvule ukungena kwedivayisi yakho, okuqapha ithrafikhi kudivayisi yakho." - - - - + "Uxhumeke ku-%1$s, engaqapha umsebenzi wenethiwekhi yakho, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi." + "Uxhumeke ku-%1$s naku-%2$s, okungaqaphela umsebenzi wakho wenethiwekhi, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi." "Iphrofayela yakho yomsebenzi ixhumeke ku-%1$s, engaqapha umsebenzi wenethiwekhi yakho, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi." "Iphrofayela yakho siqu ixhumeke ku-%1$s, engaqapha umsebenzi wakho wenethiwekhi, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi." "Idivayisi yakho iphethwe yi-%1$s." @@ -470,6 +466,8 @@ "Uxhumeke ku-%1$s, engaqapha umsebenzi wakho womuntu siqu wenethiwekhi, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi." "Iphrofayela yakho yomsebenzi iphethwe i-%1$s. Iphrofayela ixhumeke ku-%2$s, engaqapha umsebenzi wenethiwekhi yakho yokusebenza, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi.\n\nUkuze uthole olunye ulwazi, xhumana nomlawuli wakho." "Iphrofayela yakho yomsebenzi iphethwe i-%1$s. Iphrofayela ixhumeke ku-%2$s, engaqapha umsebenzi wakho wenethiwekhi, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi.\n\nFuthi uxhumeke ku-%3$s, engaqapha umsebenzi wakho siqu wenethiwekhi." + + "Idivayisi izohlala ikhiyekile uze uyivule ngokwenza" "Thola izaziso ngokushesha" "Ibone ngaphambi kokuthi uyivule" @@ -703,6 +701,8 @@ "%1$s isaziso: %2$s" "Izinhlelo zokusebenza kungenzeka zingasebenzi ngesikrini esihlukanisiwe." "Uhlelo lokusebenza alusekeli isikrini esihlukanisiwe." + "Uhlelo lokusebenza kungenzeka lungasebenzi kusibonisi sesibili." + "Uhlelo lokusebenza alusekeli ukuqalisa kuzibonisi zesibili." "Vula izilungiselelo." "Vula izilungiselelo ezisheshayo." "Vala izilungiselelo ezisheshayo." @@ -752,8 +752,7 @@ "Izinhlelo zokusebenza ezisheshayo" "Izinhlelo zokusebenza ezisheshayo azidingi ukufakwa." "Ulwazi lohlelo lokusebenza" - - + "Iya kuwebhu" "Idatha yeselula" "I-Wi-Fi ivaliwe" "I-Bluetooth ivaliwe" diff --git a/packages/SystemUI/res/values-zu/strings_car.xml b/packages/SystemUI/res/values-zu/strings_car.xml index 83301accf5c4b180142bf106f9ce0bb7b9961dd2..d4be153b23712b7d5e34b3588e46eb723be8360d 100644 --- a/packages/SystemUI/res/values-zu/strings_car.xml +++ b/packages/SystemUI/res/values-zu/strings_car.xml @@ -19,6 +19,5 @@ - "Shayela ngokuqophelela" - "Hlala wazi ngokugcwele izimo zokushayela uphinde uthobele yonke imithetho esebenzayo. Izikhombisi-ndlela kungenzeka azilungile, aziphelele, ziyingozi, azifanelekile, zivinjiwe, noma zifaka ukweqa izindawo zokulawula. Ulwazi lwebhizinisi kungenzeka lungalungi noma lungapheleli. Idatha akuyona isikhathi sangempela, futhi ukunemba kwendawo akukwazi ukuqinisekiswa. Ungaphathi idivayisi yakho yeselula noma usebenzise izinhlelo zokusebenza ezihloselwe i-Android Auto ngenkathi ushayela." + "Akwaziwa" diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index a98afa9e683035190809ad2f36ecacbb513799a4..9273f01ce53e8da7db64f3c995f6f1e7662eaadd 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -130,6 +130,9 @@ 17dp + + @*android:dimen/notification_header_icon_size_ambient + 90% diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 9097c5375e13dac679a2ab8b63b440f750630594..1ea4f835073b7d73e682c08559438e2c8ad78964 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1192,6 +1192,9 @@ %3$s, which can monitor your personal network activity. + + Unlocked for %1$s + Device will stay locked until you manually unlock @@ -2030,4 +2033,10 @@ Replace + + Apps running in background + + + Tap for details on battery and data usage + 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 0000000000000000000000000000000000000000..80509a689a64320eb1b6ac8dd7e1a7c9adcabf0f --- /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 162faa595ed3bec874097fb9074a2ac8f25b4a82..d4d69ffd3b7cf35b3805d50701fb52915fbb1947 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.util.ArrayUtils; 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 @@ public class KeyguardStatusView extends GridLayout { 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 7a6ac571f9e01eaedf93c8a8dff806aaa0345ab1..1ce34d44a3c5bb27e4c25318715441e70cecd421 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -197,6 +197,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { 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) { @@ -294,6 +299,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } }; + private boolean mEnableNextFingerprint; private SparseBooleanArray mUserHasTrust = new SparseBooleanArray(); private SparseBooleanArray mUserTrustIsManaged = new SparseBooleanArray(); private SparseBooleanArray mUserFingerprintAuthenticated = new SparseBooleanArray(); @@ -309,6 +315,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { return sCurrentUser; } + public void enableNextFingerprint() { + mEnableNextFingerprint = true; + if (DEBUG) Log.v(TAG, "enabling next fingerprint"); + } + @Override public void onTrustChanged(boolean enabled, int userId, int flags) { mUserHasTrust.put(userId, enabled); @@ -471,6 +482,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } } + 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 +499,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } 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 +969,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } 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 +1102,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } private void updateFingerprintListeningState() { + mHandler.removeCallbacks(mRetryFingerprintAuthentication); boolean shouldListenForFingerprint = shouldListenForFingerprint(); if (mFingerprintRunningState == FINGERPRINT_STATE_RUNNING && !shouldListenForFingerprint) { stopListeningForFingerprint(); @@ -1083,7 +1114,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private boolean shouldListenForFingerprint() { return (mKeyguardIsVisible || !mDeviceInteractive || mBouncer || mGoingToSleep) - && !mSwitchingUser && !isFingerprintDisabled(getCurrentUser()); + && (!mSwitchingUser && !isFingerprintDisabled(getCurrentUser()) || + mEnableNextFingerprint); } private void startListeningForFingerprint() { @@ -1110,6 +1142,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private void stopListeningForFingerprint() { if (DEBUG) Log.v(TAG, "stopListeningForFingerprint()"); + if (mEnableNextFingerprint) { + if (DEBUG) Log.v(TAG, "listening to one more fingerprint"); + return; + } + if (mFingerprintRunningState == FINGERPRINT_STATE_RUNNING) { mFingerprintCancelSignal.cancel(); mFingerprintCancelSignal = null; @@ -1415,6 +1452,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private void handleKeyguardReset() { if (DEBUG) Log.d(TAG, "handleKeyguardReset"); updateFingerprintListeningState(); + mEnableNextFingerprint = false; mNeedsSlowUnlockTransition = resolveNeedsSlowUnlockTransition(); } diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index f4d4a9ff327d1a50451a54aee16e640bcdd5ce69..cfac2b70c9920c1c9b1393d51af5daf0ecd01ec4 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -248,7 +248,7 @@ public class Dependency extends SystemUI { new FragmentService(mContext)); mProviders.put(ExtensionController.class, () -> - new ExtensionControllerImpl()); + new ExtensionControllerImpl(mContext)); mProviders.put(PluginDependencyProvider.class, () -> new PluginDependencyProvider(get(PluginManager.class))); 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 0000000000000000000000000000000000000000..086e5e52e0371bd682b22ce42a984a187a5fee25 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/ForegroundServicesDialog.java @@ -0,0 +1,204 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Bundle; +import android.provider.Settings; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; + +import com.android.internal.app.AlertActivity; +import com.android.internal.app.AlertController; +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.nano.MetricsProto; + +import com.android.systemui.R; + +import java.util.ArrayList; + +/** + * Show a list of currently running foreground services (supplied by the caller) + * that the user can tap through to their application details. + */ +public final class ForegroundServicesDialog extends AlertActivity implements + AdapterView.OnItemSelectedListener, DialogInterface.OnClickListener, + AlertController.AlertParams.OnPrepareListViewListener { + + private static final String TAG = "ForegroundServicesDialog"; + + LayoutInflater mInflater; + + private MetricsLogger mMetricsLogger; + + private String[] mPackages; + private PackageItemAdapter mAdapter; + + private DialogInterface.OnClickListener mAppClickListener = + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + String pkg = mPackages[which]; + Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.setData(Uri.fromParts("package", pkg, null)); + startActivity(intent); + finish(); + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Dependency.initDependencies(getApplicationContext()); + + mMetricsLogger = Dependency.get(MetricsLogger.class); + + mInflater = LayoutInflater.from(this); + + mAdapter = new PackageItemAdapter(this); + + final AlertController.AlertParams p = mAlertParams; + p.mAdapter = mAdapter; + p.mOnClickListener = mAppClickListener; + p.mCustomTitleView = mInflater.inflate(R.layout.foreground_service_title, null); + p.mIsSingleChoice = true; + p.mOnItemSelectedListener = this; + p.mPositiveButtonText = getString(com.android.internal.R.string.done_label); + p.mPositiveButtonListener = this; + p.mOnPrepareListViewListener = this; + + updateApps(getIntent()); + if (mPackages == null) { + Log.w(TAG, "No packages supplied"); + finish(); + return; + } + + setupAlert(); + } + + @Override + protected void onResume() { + super.onResume(); + mMetricsLogger.visible(MetricsProto.MetricsEvent.RUNNING_BACKGROUND_APPS_DIALOG); + } + + @Override + protected void onPause() { + super.onPause(); + mMetricsLogger.hidden(MetricsProto.MetricsEvent.RUNNING_BACKGROUND_APPS_DIALOG); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + updateApps(intent); + } + + @Override + protected void onStop() { + super.onStop(); + + // This is a transient dialog, if the user leaves it then it goes away, + // they can return back to it from the notification. + if (!isChangingConfigurations()) { + finish(); + } + } + + void updateApps(Intent intent) { + mPackages = intent.getStringArrayExtra("packages"); + if (mPackages != null) { + mAdapter.setPackages(mPackages); + } + } + + public void onPrepareListView(ListView listView) { + } + + /* + * On click of Ok/Cancel buttons + */ + public void onClick(DialogInterface dialog, int which) { + finish(); + } + + public void onItemSelected(AdapterView parent, View view, int position, long id) { + } + + public void onNothingSelected(AdapterView parent) { + } + + static private class PackageItemAdapter extends ArrayAdapter { + final PackageManager mPm; + final LayoutInflater mInflater; + + public PackageItemAdapter(Context context) { + super(context, R.layout.foreground_service_item); + mPm = context.getPackageManager(); + mInflater = LayoutInflater.from(context); + } + + public void setPackages(String[] packages) { + clear(); + + ArrayList apps = new ArrayList<>(); + for (int i = 0; i < packages.length; i++) { + try { + apps.add(mPm.getApplicationInfo(packages[i], + PackageManager.MATCH_KNOWN_PACKAGES)); + } catch (PackageManager.NameNotFoundException e) { + } + } + + apps.sort(new ApplicationInfo.DisplayNameComparator(mPm)); + addAll(apps); + } + + public @NonNull + View getView(int position, @Nullable View convertView, + @NonNull ViewGroup parent) { + final View view; + if (convertView == null) { + view = mInflater.inflate(R.layout.foreground_service_item, parent, false); + } else { + view = convertView; + } + + ImageView icon = view.findViewById(R.id.app_icon); + icon.setImageDrawable(getItem(position).loadIcon(mPm)); + + TextView label = view.findViewById(R.id.app_name); + label.setText(getItem(position).loadLabel(mPm)); + + return view; + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java index 36c38f372b46cd57e3f9eb43b48266f91b2c8366..ee95254ed26a20b2af1c103edf13f4590261c1eb 100644 --- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java @@ -50,7 +50,7 @@ public class SwipeHelper implements Gefingerpoken { 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 @@ -58,6 +58,9 @@ public class SwipeHelper implements Gefingerpoken { 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; @@ -369,9 +372,8 @@ public class SwipeHelper implements Gefingerpoken { // 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 { @@ -590,7 +592,7 @@ public class SwipeHelper implements Gefingerpoken { // 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 { @@ -652,7 +654,8 @@ public class SwipeHelper implements Gefingerpoken { 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 4d8323bf3fbf9a0b99ee55a508ea35c67ea23f8f..3ae0305f15f0a871914feb6083b32480de7d46bf 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java @@ -27,6 +27,7 @@ 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.DelayedWakeLock; import com.android.systemui.util.wakelock.WakeLock; public class DozeFactory { @@ -47,7 +48,8 @@ public class DozeFactory { AmbientDisplayConfiguration config = new AmbientDisplayConfiguration(context); DozeParameters params = new DozeParameters(context); Handler handler = new Handler(); - WakeLock wakeLock = WakeLock.createPartial(context, "Doze"); + WakeLock wakeLock = new DelayedWakeLock(handler, + WakeLock.createPartial(context, "Doze")); DozeMachine machine = new DozeMachine( DozeSuspendScreenStatePreventingAdapter.wrapIfNeeded( diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java index 90eb1fc8aa3e387bf4b095b2cfe387a57a77e6ae..34d621f7b624df4c467d90cf9375e2c1dbeb3888 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java @@ -91,7 +91,7 @@ public class DozeMachine { case DOZE_AOD_PAUSED: return Display.STATE_OFF; case DOZE_PULSING: - return Display.STATE_DOZE; + return Display.STATE_ON; case DOZE_AOD: return Display.STATE_DOZE_SUSPEND; default: diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java index e55a597223853cc42c0e61f67446e582a0fa247c..8181c4e8428d11115ddde551ce6f8946cd163fee 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java @@ -60,6 +60,8 @@ public class DozeService extends DreamService implements DozeMachine.Service { super.onDreamingStarted(); mDozeMachine.requestState(DozeMachine.State.INITIALIZED); startDozing(); + setDozeScreenBrightness(getResources().getInteger( + com.android.internal.R.integer.config_screenBrightnessDoze)); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index 2096956e8c8f9c918c635a8518ed365e1edbb5ee..a721bf80859f35f52923a26f30072b0cb3ea8357 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -99,9 +99,20 @@ public class DozeTriggers implements DozeMachine.Part { } private void onSensor(int pulseReason, boolean sensorPerformedProxCheck) { - requestPulse(pulseReason, sensorPerformedProxCheck); + boolean isDoubleTap = pulseReason == DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP; + boolean isPickup = pulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP; - if (pulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP) { + if (mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT)) { + if (isDoubleTap) { + mMachine.wakeUp(); + } else { + mDozeHost.extendPulse(); + } + } else { + requestPulse(pulseReason, sensorPerformedProxCheck); + } + + if (isPickup) { final long timeSinceNotification = SystemClock.elapsedRealtime() - mNotificationPulseTime; final boolean withinVibrationThreshold = diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java index 03076cc4b7a8fa70a0488be8eda5990eea891793..4e72bdf3a0f89430eaf5c29488e7bd33e0e679fe 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java @@ -87,6 +87,7 @@ public class DozeUi implements DozeMachine.Part { break; case DOZE_PULSE_DONE: mHost.abortPulsing(); + break; case INITIALIZED: mHost.startDozing(); break; diff --git a/packages/SystemUI/src/com/android/systemui/fragments/ExtensionFragmentListener.java b/packages/SystemUI/src/com/android/systemui/fragments/ExtensionFragmentListener.java new file mode 100644 index 0000000000000000000000000000000000000000..880951036661b3a39e005b34338277aefa62c7ac --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/fragments/ExtensionFragmentListener.java @@ -0,0 +1,64 @@ +/* + * 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.fragments; + +import android.app.Fragment; +import android.util.Log; +import android.view.View; + +import com.android.systemui.plugins.FragmentBase; +import com.android.systemui.statusbar.policy.ExtensionController.Extension; + +import java.util.function.Consumer; + +/** + * Wires up an Extension to a Fragment tag/id so that it always contains the class + * selected by the extension. + */ +public class ExtensionFragmentListener implements Consumer { + + private static final String TAG = "ExtensionFragmentListener"; + + private final FragmentHostManager mFragmentHostManager; + private final String mTag; + private final Extension mExtension; + private String mOldClass; + + private ExtensionFragmentListener(View view, String tag, int id, Extension extension) { + mTag = tag; + mFragmentHostManager = FragmentHostManager.get(view); + mExtension = extension; + mFragmentHostManager.getFragmentManager().beginTransaction() + .replace(id, (Fragment) mExtension.get(), mTag) + .commit(); + } + + @Override + public void accept(T extension) { + try { + Fragment.class.cast(extension); + mFragmentHostManager.getExtensionManager().setCurrentExtension(mTag, + mOldClass, extension.getClass().getName(), mExtension.getContext()); + mOldClass = extension.getClass().getName(); + } catch (ClassCastException e) { + Log.e(TAG, extension.getClass().getName() + " must be a Fragment", e); + } + } + + public static void attachExtensonToFragment(View view, String tag, int id, + Extension extension) { + extension.addCallback(new ExtensionFragmentListener(view, tag, id, extension)); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java b/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java index 8ac97f3306beabd896c619c8571fd608355f92a6..4dbf6f98e3e6681b685636d85e7405a3ebdc2f6d 100644 --- a/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java +++ b/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java @@ -28,6 +28,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Parcelable; +import android.support.annotation.NonNull; import android.util.ArrayMap; import android.view.LayoutInflater; import android.view.View; @@ -51,7 +52,7 @@ public class FragmentHostManager { private final InterestingConfigChanges mConfigChanges = new InterestingConfigChanges( ActivityInfo.CONFIG_FONT_SCALE); private final FragmentService mManager; - private final PluginFragmentManager mPlugins = new PluginFragmentManager(); + private final ExtensionFragmentManager mPlugins = new ExtensionFragmentManager(); private FragmentController mFragments; private FragmentLifecycleCallbacks mLifecycleCallbacks; @@ -174,7 +175,7 @@ public class FragmentHostManager { return mFragments.getFragmentManager(); } - PluginFragmentManager getPluginManager() { + ExtensionFragmentManager getExtensionManager() { return mPlugins; } @@ -261,22 +262,16 @@ public class FragmentHostManager { } } - class PluginFragmentManager { - private final ArrayMap mPluginLookup = new ArrayMap<>(); + class ExtensionFragmentManager { + private final ArrayMap mExtensionLookup = new ArrayMap<>(); - public void removePlugin(String tag, String currentClass, String defaultClass) { + public void setCurrentExtension(@NonNull String tag, @Nullable String oldClass, + @NonNull String currentClass, @Nullable Context context) { Fragment fragment = getFragmentManager().findFragmentByTag(tag); - mPluginLookup.remove(currentClass); - getFragmentManager().beginTransaction() - .replace(((View) fragment.getView().getParent()).getId(), - instantiate(mContext, defaultClass, null), tag) - .commit(); - reloadFragments(); - } - - public void setCurrentPlugin(String tag, String currentClass, Context context) { - Fragment fragment = getFragmentManager().findFragmentByTag(tag); - mPluginLookup.put(currentClass, context); + if (oldClass != null) { + mExtensionLookup.remove(oldClass); + } + mExtensionLookup.put(currentClass, context); getFragmentManager().beginTransaction() .replace(((View) fragment.getView().getParent()).getId(), instantiate(context, currentClass, null), tag) @@ -292,11 +287,11 @@ public class FragmentHostManager { } Fragment instantiate(Context context, String className, Bundle arguments) { - Context pluginContext = mPluginLookup.get(className); - if (pluginContext != null) { - Fragment f = Fragment.instantiate(pluginContext, className, arguments); + Context extensionContext = mExtensionLookup.get(className); + if (extensionContext != null) { + Fragment f = Fragment.instantiate(extensionContext, className, arguments); if (f instanceof Plugin) { - ((Plugin) f).onCreate(mContext, pluginContext); + ((Plugin) f).onCreate(mContext, extensionContext); } return f; } diff --git a/packages/SystemUI/src/com/android/systemui/fragments/PluginFragmentListener.java b/packages/SystemUI/src/com/android/systemui/fragments/PluginFragmentListener.java deleted file mode 100644 index 03bb73da3902767aff1b20bbdcacaa7a9caf525a..0000000000000000000000000000000000000000 --- a/packages/SystemUI/src/com/android/systemui/fragments/PluginFragmentListener.java +++ /dev/null @@ -1,74 +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.fragments; - -import android.app.Fragment; -import android.content.Context; -import android.util.Log; -import android.view.View; - -import com.android.systemui.Dependency; -import com.android.systemui.plugins.FragmentBase; -import com.android.systemui.plugins.Plugin; -import com.android.systemui.plugins.PluginListener; -import com.android.systemui.plugins.PluginManager; - -public class PluginFragmentListener implements PluginListener { - - private static final String TAG = "PluginFragmentListener"; - - private final FragmentHostManager mFragmentHostManager; - private final PluginManager mPluginManager; - private final Class mDefaultClass; - private final Class mExpectedInterface; - private final String mTag; - - public PluginFragmentListener(View view, String tag, Class defaultFragment, - Class expectedInterface) { - mTag = tag; - mFragmentHostManager = FragmentHostManager.get(view); - mPluginManager = Dependency.get(PluginManager.class); - mExpectedInterface = expectedInterface; - mDefaultClass = defaultFragment; - } - - public void startListening() { - mPluginManager.addPluginListener(this, mExpectedInterface, - false /* Only allow one */); - } - - public void stopListening() { - mPluginManager.removePluginListener(this); - } - - @Override - public void onPluginConnected(Plugin plugin, Context pluginContext) { - try { - mExpectedInterface.cast(plugin); - Fragment.class.cast(plugin); - mFragmentHostManager.getPluginManager().setCurrentPlugin(mTag, - plugin.getClass().getName(), pluginContext); - } catch (ClassCastException e) { - Log.e(TAG, plugin.getClass().getName() + " must be a Fragment and implement " - + mExpectedInterface.getName(), e); - } - } - - @Override - public void onPluginDisconnected(Plugin plugin) { - mFragmentHostManager.getPluginManager().removePlugin(mTag, - plugin.getClass().getName(), mDefaultClass.getName()); - } -} 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 28bd23ce982592b5b6b0df8f09714c32dced02d9..df03fdc46d0645d2d7deb6918392f64110cbb0c1 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 @@ public class PipManager implements BasePipManager { // 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 79ac8160c095cd59de8ed4c6295201642edcdd5b..65f24cf5ba983ef0998392b483841570ac1e4374 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 class PipMenuActivity extends Activity { 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 @@ public class PipMenuActivity extends Activity { private int mMenuState; private boolean mAllowMenuTimeout = true; + private boolean mAllowTouches = true; private final List mActions = new ArrayList<>(); @@ -149,6 +151,10 @@ public class PipMenuActivity extends Activity { updateDismissFraction(data.getFloat(EXTRA_DISMISS_FRACTION)); break; } + case MESSAGE_ANIMATION_ENDED: { + mAllowTouches = true; + break; + } } } }); @@ -245,6 +251,10 @@ public class PipMenuActivity extends Activity { @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 @@ public class PipMenuActivity extends Activity { 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 @@ public class PipMenuActivity extends Activity { }); } 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 c41f898ef4fe042cd12fa45c5cf86a5fc0bbb3bb..d5cf1dd0387dcddc8b6d7d250ac995245a7e9919 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 class PipMenuActivityController { } } + 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/power/PowerNotificationWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java index daf0622fa7a63079bef6f60e8783cbb6769ee871..6b3daa30610316c5d9d6baa19af5af5f7a20a6c3 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.PowerManager; 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 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { 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 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { 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 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { 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 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { } @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 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { 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 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { 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 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { 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 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { } 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 471c3aeb9eb585c4540c183ac9f1fa9daf6ba033..a64207714093e8dd4f28ad89b88f1212d6dba450 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.PowerManager; 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 @@ public class PowerUI extends SystemUI { 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 @@ public class PowerUI extends SystemUI { 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 @@ public class PowerUI extends SystemUI { if (statusBar != null && !statusBar.isDeviceInVrMode() && temp >= mThresholdTemp) { logAtTemperatureThreshold(temp); - mWarnings.showTemperatureWarning(); + mWarnings.showHighTemperatureWarning(); } else { - mWarnings.dismissTemperatureWarning(); + mWarnings.dismissHighTemperatureWarning(); } } @@ -369,8 +381,9 @@ public class PowerUI extends SystemUI { void showInvalidChargerWarning(); void updateLowBatteryWarning(); boolean isInvalidChargerWarningShowing(); - void dismissTemperatureWarning(); - void showTemperatureWarning(); + void dismissHighTemperatureWarning(); + void showHighTemperatureWarning(); + void showThermalShutdownWarning(); void dump(PrintWriter pw); void userSwitched(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index e457d7247434fa85e579f4e9a1dccab0e6025cd5..7518527a309389b4b6b5435042a8090cd4167546 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 @@ public class QuickStatusBarHeader extends RelativeLayout { 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 b5c1bd9ff9dbab1fd5b3e3aa4fab64d0fa9c2ccd..dc9176f66bb212e88fc20f7fd1746ed678351513 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java @@ -240,7 +240,7 @@ public class CustomTile extends QSTileImpl implements TileChangeListener i.setPackage(mComponent.getPackageName()); i = resolveIntent(i); if (i != null) { - i.putExtra(TileService.EXTRA_COMPONENT, mComponent); + i.putExtra(Intent.EXTRA_COMPONENT_NAME, mComponent); i.putExtra(TileService.EXTRA_STATE, mTile.getState()); return i; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java index d9c3cc3fd61fb490c08a98d3b2b6e612bd244c76..d2f3bb6030776d5491c059d3c32a9ea83978cddf 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 class TileServices extends IQSService.Stub { public void onReceive(Context context, Intent intent) { if (TileService.ACTION_REQUEST_LISTENING.equals(intent.getAction())) { requestListening( - (ComponentName) intent.getParcelableExtra(TileService.EXTRA_COMPONENT)); + (ComponentName) intent.getParcelableExtra(Intent.EXTRA_COMPONENT_NAME)); } } }; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java index d74e3ac656f747660463d3fe625747c9e2ec3c6a..92ff17a1f0294b4313cf1f268b6041d43bcef6b9 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 @@ public class CellularTile extends QSTileImpl { 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 @@ public class CellularTile extends QSTileImpl { 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 @@ public class CellularTile extends QSTileImpl { @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 53a9eae17f418c278783cfd301ec216c2d4a7ea8..2b812a5f7ac3f0a4fb9000cd8b5ef437c812b0d6 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 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener 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 0b4498c487a8a8c17e695c4202189543731cef80..802cb83154845a5fe2ce42692f7cfea492e4b050 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 @@ class BackgroundTaskLoader implements Runnable { // 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 @@ class BackgroundTaskLoader implements Runnable { } } } + + /** + * 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 469f3ad45c567a22ce1cccbd710883db0c069ca2..d7eab97726779158c94f9f2da0e00917a23f9db1 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 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView 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 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView @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 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView @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 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView } 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 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView 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 abstract class ActivatableNotificationView extends ExpandableOutlineView } public void setDimmed(boolean dimmed, boolean fade) { + mNeedsDimming = dimmed; + dimmed &= isDimmable(); if (mDimmed != dimmed) { mDimmed = dimmed; resetBackgroundAlpha(); @@ -382,6 +407,10 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView } } + 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 98299207b290267f8c36b9fa1fda5f594628ff97..4612735cdee092b0fa38f156992f6954e7f6cdcd 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; @@ -48,6 +48,7 @@ import android.widget.FrameLayout; 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; @@ -62,7 +63,6 @@ import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; 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; @@ -315,14 +315,13 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } } - 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); } @@ -362,6 +361,14 @@ public class ExpandableNotificationRow extends ActivatableNotificationView expandedIcon.setStaticDrawableColor(color); } + @Override + public boolean isDimmable() { + if (!getShowingLayout().isDimmable()) { + return false; + } + return super.isDimmable(); + } + private void updateLimits() { for (NotificationContentView l : mLayouts) { updateLimitsForView(l); @@ -483,9 +490,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView 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(); @@ -1114,14 +1119,19 @@ public class ExpandableNotificationRow extends ActivatableNotificationView 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/ExpandableOutlineView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java index f68770895e341ec8af224828787477bae0e121be..255689072b1219de98b01022051079b3931ba241 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java @@ -45,7 +45,7 @@ public abstract class ExpandableOutlineView extends ExpandableView { private final ViewOutlineProvider mProvider = new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { - int translation = mShouldTranslateContents ? 0 : (int) getTranslation(); + int translation = mShouldTranslateContents ? (int) getTranslation() : 0; if (!mCustomOutline) { outline.setRoundRect(translation, mClipTopAmount, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 092408961eab82a7c4c88544be5b2d0a7429d019..de2bdde08037063e4ca2a7f0dcf78e16b9c096b4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -89,7 +89,7 @@ public class KeyguardIndicationController { private int mChargingWattage; private String mMessageToShowOnScreenOn; - private KeyguardUpdateMonitorCallback mUpdateMonitor; + private KeyguardUpdateMonitorCallback mUpdateMonitorCallback; private final DevicePolicyManager mDevicePolicyManager; private boolean mDozing; @@ -153,10 +153,10 @@ public class KeyguardIndicationController { * same instance. */ protected KeyguardUpdateMonitorCallback getKeyguardCallback() { - if (mUpdateMonitor == null) { - mUpdateMonitor = new BaseKeyguardCallback(); + if (mUpdateMonitorCallback == null) { + mUpdateMonitorCallback = new BaseKeyguardCallback(); } - return mUpdateMonitor; + return mUpdateMonitorCallback; } private void updateDisclosure() { @@ -202,6 +202,15 @@ public class KeyguardIndicationController { public void setUserInfoController(UserInfoController userInfoController) { } + /** + * Returns the indication text indicating that trust has been granted. + * + * @return {@code null} or an empty string if a trust indication text should not be shown. + */ + protected String getTrustIndication() { + return null; + } + /** * Hides transient indication in {@param delayMs}. */ @@ -250,7 +259,7 @@ public class KeyguardIndicationController { } } - private void updateIndication() { + protected final void updateIndication() { if (TextUtils.isEmpty(mTransientIndication)) { mWakeLock.setAcquired(false); } @@ -270,14 +279,19 @@ public class KeyguardIndicationController { return; } - if (!mUserManager.isUserUnlocked(ActivityManager.getCurrentUser())) { + KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext); + int userId = ActivityManager.getCurrentUser(); + String trustIndication = getTrustIndication(); + if (!mUserManager.isUserUnlocked(userId)) { mTextView.switchIndication(com.android.internal.R.string.lockscreen_storage_locked); mTextView.setTextColor(Color.WHITE); - } else if (!TextUtils.isEmpty(mTransientIndication)) { mTextView.switchIndication(mTransientIndication); mTextView.setTextColor(mTransientTextColor); - + } else if (!TextUtils.isEmpty(trustIndication) + && updateMonitor.getUserHasTrust(userId)) { + mTextView.switchIndication(trustIndication); + mTextView.setTextColor(Color.WHITE); } else if (mPowerPluggedIn) { String indication = computePowerIndication(); if (DEBUG_CHARGING_SPEED) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java index 609856522e758768e9809e43e5634baaf5be7319..e7bf98336e8c0809eba2de16fc4ea2d5e6daff5d 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 class NotificationContentView extends FrameLayout { 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 90e908b0a4689b04084862af1aa535b4e168db4b..540c39150188e55ac3bebb7e092485989c80c5dc 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.IPackageManager; 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.NotificationListenerService.RankingMap; 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.annotations.VisibleForTesting; 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 class NotificationData { public List snoozeCriteria; private int mCachedContrastColor = COLOR_INVALID; private int mCachedContrastColorIsFor = COLOR_INVALID; + private ArraySet mRunningTasks = new ArraySet(); public Entry(StatusBarNotification n) { this.key = n.getKey(); @@ -210,6 +214,29 @@ public class NotificationData { 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 getRunningTasks() { + return mRunningTasks; + } } private final ArrayMap mEntries = new ArrayMap<>(); @@ -302,12 +329,12 @@ public class NotificationData { 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 7563fd1bf9bf2718ca6318f613b0611b4ecb53bc..4305bdef6fef103c8090e50b91e5190e1fb63541 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 @@ import android.widget.FrameLayout.LayoutParams; 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 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl private int mIconPadding; private float mAlpha = 0f; + private float mPrevX; private CheckForDrag mCheckForDrag; private Handler mHandler; @@ -203,14 +215,14 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl } 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 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl final double timeForGesture = ev.getEventTime() - ev.getDownTime(); final boolean showMenuForSlowOnGoing = !mParent.canViewBeDismissed() && timeForGesture >= SWIPE_MENU_TIMING; + final float menuSnapTarget = mOnLeft ? getSpaceForMenu() : -getSpaceForMenu(); + + 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); + } - 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 (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 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl 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 ccc99c59e510baaa76d5b75b17232399fd6c785e..8b3d6d9b702144d861aa6b427a0a57e9e8091d0b 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 @@ public class NotificationSnooze extends LinearLayout } 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 b01d9cc07bf5940ab67741c13823cf5629827ce7..dc254f9fdc1e3505abbd3898d04c53614bff6ffe 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.Resources; 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 @@ public class SignalClusterView extends LinearLayout implements NetworkController private boolean mBlockWifi; private boolean mBlockEthernet; private boolean mActivityEnabled; - private boolean mForceBlockWifi; public SignalClusterView(Context context) { this(context, null); @@ -150,16 +151,6 @@ public class SignalClusterView extends LinearLayout implements NetworkController 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 @@ public class SignalClusterView extends LinearLayout implements NetworkController 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 @@ public class SignalClusterView extends LinearLayout implements NetworkController } @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 @@ public class SignalClusterView extends LinearLayout implements NetworkController 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 @@ public class SignalClusterView extends LinearLayout implements NetworkController 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 @@ public class SignalClusterView extends LinearLayout implements NetworkController 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 @@ public class SignalClusterView extends LinearLayout implements NetworkController // 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 263df79318eaf8cdfe0476f260e4e3c370ff1a15..c7fbbf956c68ce0e86efe5fa6d545b514a1c063a 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 @@ public class StatusBarIconView extends AnimatedImageView { }; 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 @@ public class StatusBarIconView extends AnimatedImageView { 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 @@ public class StatusBarIconView extends AnimatedImageView { 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 @@ public class StatusBarIconView extends AnimatedImageView { int density = newConfig.densityDpi; if (density != mDensity) { mDensity = density; - maybeUpdateIconScale(); + maybeUpdateIconScaleDimens(); updateDrawable(); reloadDimens(); } @@ -198,7 +213,7 @@ public class StatusBarIconView extends AnimatedImageView { mDozer = new NotificationIconDozeHelper(context); mBlocked = false; mAlwaysScaleIcon = true; - updateIconScale(); + updateIconScaleDimens(); mDensity = context.getResources().getDisplayMetrics().densityDpi; } @@ -681,6 +696,7 @@ public class StatusBarIconView extends AnimatedImageView { 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 0000000000000000000000000000000000000000..82910b8bf96784187ac022b4130235700a82eff2 --- /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 0000000000000000000000000000000000000000..cef225b0e80e9f8b6735f821c85016dae929fb66 --- /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 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 2e34f2483a857916d9fe12d126201e8c15cf9e06..7cfc767f89b7b60be102cb95283c778612f102a4 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 @@ package com.android.systemui.statusbar.notification; 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 @@ public class NotificationInflater { @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 @@ public class NotificationInflater { 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 @@ public class NotificationInflater { * * @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 @@ public class NotificationInflater { 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 @@ public class NotificationInflater { && 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 @@ public class NotificationInflater { entry.cachedContentView = null; entry.cachedHeadsUpContentView = null; entry.cachedPublicContentView = null; + inflateNotificationViews(); + } + + private class AsyncInflationTask extends AsyncTask { + + 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(); - } catch (InflationException e) { - mInflateExceptionHandler.handleInflationException( - mRow.getStatusBarNotification(), e); + 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 a2f488c7d7ed7115264be8e3610242675163ac7e..7fbee7d66615670aa54738e0d92041134f1290d2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationMediaTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationMediaTemplateViewWrapper.java @@ -55,4 +55,9 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi 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 f4db9a1977f3b7443984726e36e3ba41c42f49ca..5cc39cc27b264674003a475a5a72a058689fb260 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 abstract class NotificationViewWrapper implements TransformableView { public void setIsChildInGroup(boolean isChildInGroup) { } + + public boolean isDimmable() { + return true; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java index 99b3aa878c7b2c920b7bc08925b1a24f0b495c83..c4879011b9f8bbe999e34d16232aa783e4d39233 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java @@ -36,6 +36,7 @@ import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; +import android.app.WallpaperColors; import android.util.Log; import com.android.keyguard.KeyguardUpdateMonitor; @@ -156,6 +157,11 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen postUpdateWallpaper(); } + @Override + public void onWallpaperColorsChanged(WallpaperColors colors, int which) { + + } + private void postUpdateWallpaper() { mH.removeCallbacks(this); mH.post(this); 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 6361eb6ccb895cd4a5dd29684f1a3739bb22f7f3..a9eb20ba3a575d46e4a1422d6538c15963ce70a3 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 @@ public class SignalDrawable extends Drawable { 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 608d03cf52c91dce43feed403a5bc5a8ef579ad0..b89b062c6d0d5091e0a1aea9ee441f4fab3f48dc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -21,8 +21,9 @@ package com.android.systemui.statusbar.phone; import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN; import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; import static android.app.StatusBarManager.windowStateToString; +import static android.content.res.Configuration.UI_MODE_TYPE_CAR; -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; @@ -36,11 +37,17 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.annotation.NonNull; import android.app.ActivityManager; +import android.app.ActivityManager.StackId; import android.app.ActivityOptions; +import android.app.INotificationManager; +import android.app.KeyguardManager; import android.app.Notification; +import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; +import android.app.RemoteInput; import android.app.StatusBarManager; +import android.app.TaskStackBuilder; import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.ComponentCallbacks2; @@ -49,8 +56,11 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.IntentSender; +import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.UserInfo; import android.content.res.Configuration; import android.content.res.Resources; import android.database.ContentObserver; @@ -75,7 +85,9 @@ import android.media.session.PlaybackState; import android.metrics.LogMaker; import android.net.Uri; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; +import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.PowerManager; @@ -88,63 +100,86 @@ import android.os.UserHandle; import android.os.UserManager; import android.os.Vibrator; import android.provider.Settings; +import android.service.dreams.DreamService; +import android.service.dreams.IDreamManager; +import android.service.notification.NotificationListenerService; import android.service.notification.NotificationListenerService.RankingMap; import android.service.notification.StatusBarNotification; +import android.service.vr.IVrManager; +import android.service.vr.IVrStateCallbacks; +import android.text.TextUtils; import android.util.ArraySet; import android.util.DisplayMetrics; import android.util.EventLog; import android.util.Log; +import android.util.Slog; +import android.util.SparseArray; +import android.util.SparseBooleanArray; import android.view.ContextThemeWrapper; import android.view.Display; +import android.view.IWindowManager; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.ThreadedRenderer; import android.view.View; +import android.view.ViewAnimationUtils; import android.view.ViewGroup; import android.view.ViewParent; import android.view.ViewStub; import android.view.ViewTreeObserver; import android.view.WindowManager; import android.view.WindowManagerGlobal; +import android.view.accessibility.AccessibilityManager; import android.view.animation.AccelerateInterpolator; import android.view.animation.Interpolator; import android.widget.DateTimeView; import android.widget.ImageView; +import android.widget.RemoteViews; import android.widget.TextView; +import android.widget.Toast; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; +import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.NotificationVisibility; import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.util.NotificationMessagingUtil; +import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardHostView.OnDismissAction; import com.android.keyguard.KeyguardStatusView; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.keyguard.ViewMediatorCallback; import com.android.systemui.ActivityStarterDelegate; +import com.android.systemui.DejankUtils; import com.android.systemui.DemoMode; import com.android.systemui.Dependency; import com.android.systemui.EventLogTags; import com.android.systemui.Interpolators; import com.android.systemui.Prefs; import com.android.systemui.R; +import com.android.systemui.RecentsComponent; +import com.android.systemui.SwipeHelper; +import com.android.systemui.SystemUI; import com.android.systemui.SystemUIFactory; import com.android.systemui.assist.AssistManager; import com.android.systemui.classifier.FalsingLog; import com.android.systemui.classifier.FalsingManager; import com.android.systemui.doze.DozeHost; import com.android.systemui.doze.DozeLog; +import com.android.systemui.fragments.ExtensionFragmentListener; import com.android.systemui.fragments.FragmentHostManager; -import com.android.systemui.fragments.PluginFragmentListener; import com.android.systemui.keyguard.KeyguardViewMediator; -import com.android.systemui.plugins.qs.QS; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.plugins.qs.QS; +import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem; import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption; import com.android.systemui.qs.QSFragment; import com.android.systemui.qs.QSPanel; import com.android.systemui.qs.QSTileHost; +import com.android.systemui.recents.Recents; import com.android.systemui.recents.ScreenPinningRequest; import com.android.systemui.recents.events.EventBus; import com.android.systemui.recents.events.activity.AppTransitionFinishedEvent; @@ -183,6 +218,7 @@ import com.android.systemui.statusbar.policy.ConfigurationController.Configurati import com.android.systemui.statusbar.policy.DarkIconDispatcher; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; +import com.android.systemui.statusbar.policy.ExtensionController; import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.policy.KeyguardMonitor; import com.android.systemui.statusbar.policy.KeyguardMonitorImpl; @@ -190,11 +226,15 @@ import com.android.systemui.statusbar.policy.KeyguardUserSwitcher; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import com.android.systemui.statusbar.policy.PreviewInflater; +import com.android.systemui.statusbar.policy.RemoteInputView; import com.android.systemui.statusbar.policy.UserInfoController; import com.android.systemui.statusbar.policy.UserInfoControllerImpl; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; -import com.android.systemui.statusbar.stack.NotificationStackScrollLayout.OnChildLocationsChangedListener; +import com.android.systemui.statusbar.stack.NotificationStackScrollLayout + .OnChildLocationsChangedListener; +import com.android.systemui.statusbar.stack.StackStateAnimator; +import com.android.systemui.util.NotificationChannels; import com.android.systemui.util.leak.LeakDetector; import com.android.systemui.volume.VolumeComponent; @@ -205,50 +245,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import android.app.ActivityManager.StackId; -import android.app.INotificationManager; -import android.app.KeyguardManager; -import android.app.NotificationChannel; -import android.app.RemoteInput; -import android.app.TaskStackBuilder; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.UserInfo; -import android.os.Build; -import android.os.Handler; -import android.service.dreams.DreamService; -import android.service.dreams.IDreamManager; -import android.service.notification.NotificationListenerService; -import android.service.vr.IVrManager; -import android.service.vr.IVrStateCallbacks; -import android.text.TextUtils; -import android.util.Slog; -import android.util.SparseArray; -import android.util.SparseBooleanArray; -import android.view.IWindowManager; -import android.view.ViewAnimationUtils; -import android.view.accessibility.AccessibilityManager; -import android.widget.RemoteViews; -import android.widget.Toast; - -import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; -import com.android.internal.statusbar.IStatusBarService; -import com.android.internal.widget.LockPatternUtils; -import com.android.systemui.DejankUtils; -import com.android.systemui.RecentsComponent; -import com.android.systemui.SwipeHelper; -import com.android.systemui.SystemUI; -import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem; -import com.android.systemui.recents.Recents; -import com.android.systemui.statusbar.policy.RemoteInputView; -import com.android.systemui.statusbar.stack.StackStateAnimator; -import com.android.systemui.util.NotificationChannels; - import java.util.HashSet; +import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Set; import java.util.Stack; @@ -257,7 +257,7 @@ public class StatusBar extends SystemUI implements DemoMode, 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 = @@ -709,12 +709,14 @@ public class StatusBar extends SystemUI implements DemoMode, private KeyguardMonitorImpl mKeyguardMonitor; private BatteryController mBatteryController; private boolean mPanelExpanded; + private boolean mKeyguardRequested; + private boolean mIsKeyguard; private LogMaker mStatusBarStateLog; private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger(); private NotificationIconAreaController mNotificationIconAreaController; private ConfigurationListener mConfigurationListener; - private InflationExceptionHandler mInflationExceptionHandler = this::handleInflationException; private boolean mReinflateNotificationsOnUserSwitched; + private HashMap mPendingNotifications = new HashMap<>(); private boolean mClearAllEnabled; private void recycleAllVisibilityObjects(ArraySet array) { @@ -1131,11 +1133,12 @@ public class StatusBar extends SystemUI implements DemoMode, View container = mStatusBarWindow.findViewById(R.id.qs_frame); if (container != null) { FragmentHostManager fragmentHostManager = FragmentHostManager.get(container); - fragmentHostManager.getFragmentManager().beginTransaction() - .replace(R.id.qs_frame, new QSFragment(), QS.TAG) - .commit(); - new PluginFragmentListener(container, QS.TAG, QSFragment.class, QS.class) - .startListening(); + ExtensionFragmentListener.attachExtensonToFragment(container, QS.TAG, R.id.qs_frame, + Dependency.get(ExtensionController.class).newExtension(QS.class) + .withPlugin(QS.class) + .withUiMode(UI_MODE_TYPE_CAR, () -> new QSFragment()) + .withDefault(() -> new QSFragment()) + .build()); final QSTileHost qsh = SystemUIFactory.getInstance().createQSTileHost(mContext, this, mIconController); mBrightnessMirrorController = new BrightnessMirrorController(mStatusBarWindow); @@ -1551,29 +1554,24 @@ public class StatusBar extends SystemUI implements DemoMode, 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. @@ -1585,7 +1583,7 @@ public class StatusBar extends SystemUI implements DemoMode, 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); @@ -1593,15 +1591,47 @@ public class StatusBar extends SystemUI implements DemoMode, } } } - 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; @@ -1621,6 +1651,7 @@ public class StatusBar extends SystemUI implements DemoMode, 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. @@ -3308,6 +3339,14 @@ public class StatusBar extends SystemUI implements DemoMode, + " 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="); @@ -4022,6 +4061,30 @@ public class StatusBar extends SystemUI implements DemoMode, } public void showKeyguard() { + mKeyguardRequested = true; + updateIsKeyguard(); + } + + public boolean hideKeyguard() { + mKeyguardRequested = false; + return updateIsKeyguard(); + } + + private boolean updateIsKeyguard() { + // For dozing, keyguard needs to be shown whenever the device is non-interactive. Otherwise + // there's no surface we can show to the user. + boolean keyguardForDozing = mDozingRequested && !mDeviceInteractive; + boolean shouldBeKeyguard = mKeyguardRequested || keyguardForDozing; + if (shouldBeKeyguard && !mIsKeyguard) { + showKeyguardImpl(); + } else if (!shouldBeKeyguard && mIsKeyguard) { + return hideKeyguardImpl(); + } + return false; + } + + public void showKeyguardImpl() { + mIsKeyguard = true; if (mLaunchTransitionFadingAway) { mNotificationPanel.animate().cancel(); onLaunchTransitionFadingEnded(); @@ -4175,7 +4238,8 @@ public class StatusBar extends SystemUI implements DemoMode, /** * @return true if we would like to stay in the shade, false if it should go away entirely */ - public boolean hideKeyguard() { + public boolean hideKeyguardImpl() { + mIsKeyguard = false; Trace.beginSection("StatusBar#hideKeyguard"); boolean staying = mLeaveOpenOnKeyguardHide; setBarState(StatusBarState.SHADE); @@ -4854,6 +4918,7 @@ public class StatusBar extends SystemUI implements DemoMode, } }); } + updateIsKeyguard(); } public void onStartedWakingUp() { @@ -4862,6 +4927,7 @@ public class StatusBar extends SystemUI implements DemoMode, mVisualStabilityManager.setScreenOn(true); mNotificationPanel.setTouchDisabled(false); updateVisibleToUser(); + updateIsKeyguard(); } public void onScreenTurningOn() { @@ -4976,6 +5042,7 @@ public class StatusBar extends SystemUI implements DemoMode, || mFingerprintUnlockController.getMode() == FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING; mStatusBarWindowManager.setDozing(mDozing); + mStatusBarKeyguardViewManager.setDozing(mDozing); updateDozingState(); Trace.endSection(); } @@ -5548,7 +5615,7 @@ public class StatusBar extends SystemUI implements DemoMode, public void run() { for (StatusBarNotification sbn : notifications) { try { - addNotification(sbn, currentRanking, null /* oldEntry */); + addNotification(sbn, currentRanking); } catch (InflationException e) { handleInflationException(sbn, e); } @@ -5591,7 +5658,7 @@ public class StatusBar extends SystemUI implements DemoMode, if (isUpdate) { updateNotification(sbn, rankingMap); } else { - addNotification(sbn, rankingMap, null /* oldEntry */); + addNotification(sbn, rankingMap); } } catch (InflationException e) { handleInflationException(sbn, e); @@ -6153,8 +6220,7 @@ public class StatusBar extends SystemUI implements DemoMode, } } - protected void inflateViews(Entry entry, ViewGroup parent) throws - InflationException { + protected void inflateViews(Entry entry, ViewGroup parent) { PackageManager pmUser = getPackageManagerForUser(mContext, entry.notification.getUser().getIdentifier()); @@ -6175,7 +6241,7 @@ public class StatusBar extends SystemUI implements DemoMode, 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 @@ -6573,12 +6639,12 @@ public class StatusBar extends SystemUI implements DemoMode, 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(); } @@ -6710,6 +6776,7 @@ public class StatusBar extends SystemUI implements DemoMode, 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/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 2a69c1e663bbc386ad775782a56652cce7a3fbd9..3b09bec08cb0589f9b60333c45c7e25215eabe5f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -84,6 +84,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb protected boolean mShowing; protected boolean mOccluded; protected boolean mRemoteInputActive; + private boolean mDozing; protected boolean mFirstUpdate = true; protected boolean mLastShowing; @@ -91,6 +92,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private boolean mLastBouncerShowing; private boolean mLastBouncerDismissible; protected boolean mLastRemoteInputActive; + private boolean mLastDozing; private OnDismissAction mAfterKeyguardGoneAction; private final ArrayList mAfterKeyguardGoneRunnables = new ArrayList<>(); @@ -239,6 +241,11 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb updateStates(); } + public void setDozing(boolean dozing) { + mDozing = dozing; + updateStates(); + } + public void onScreenTurnedOff() { mScreenTurnedOn = false; mStatusBar.onScreenTurnedOff(); @@ -481,11 +488,11 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private long getNavBarShowDelay() { if (mStatusBar.isKeyguardFadingAway()) { return mStatusBar.getKeyguardFadingAwayDelay(); - } else { - - // Keyguard is not going away, thus we are showing the navigation bar because the - // bouncer is appearing. + } else if (mBouncer.isShowing()) { return NAV_BAR_SHOW_DELAY_BOUNCER; + } else { + // No longer dozing, or remote input is active. No delay. + return 0; } } @@ -553,6 +560,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mLastBouncerShowing = bouncerShowing; mLastBouncerDismissible = bouncerDismissible; mLastRemoteInputActive = remoteInputActive; + mLastDozing = mDozing; mStatusBar.onKeyguardViewManagerStatesUpdated(); } @@ -561,14 +569,15 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb * @return Whether the navigation bar should be made visible based on the current state. */ protected boolean isNavBarVisible() { - return !(mShowing && !mOccluded) || mBouncer.isShowing() || mRemoteInputActive; + return !(mShowing && !mOccluded) && !mDozing || mBouncer.isShowing() || mRemoteInputActive; } /** * @return Whether the navigation bar was made visible based on the last known state. */ protected boolean getLastNavBarVisible() { - return !(mLastShowing && !mLastOccluded) || mLastBouncerShowing || mLastRemoteInputActive; + return !(mLastShowing && !mLastOccluded) && !mLastDozing || mLastBouncerShowing + || mLastRemoteInputActive; } public boolean shouldDismissOnMenuPressed() { 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 e98dc987aa5cf15e2e08ac14d75cad71d12af940..a456786d712f6b3ba715e73edd23fba060a0d69b 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 class CallbackHandler extends Handler implements EmergencyListener, Signa 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/ExtensionController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java index eaf89259ed59247bdfba6eac7b870f7d1dc01800..61287491766bcff0c3fcf9a77f80705ace29c854 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java @@ -14,8 +14,7 @@ package com.android.systemui.statusbar.policy; -import com.android.systemui.Dependency; -import com.android.systemui.plugins.Plugin; +import android.content.Context; import java.util.Map; import java.util.function.Consumer; @@ -31,7 +30,9 @@ public interface ExtensionController { interface Extension { T get(); + Context getContext(); void destroy(); + void addCallback(Consumer callback); } interface ExtensionBuilder { @@ -42,6 +43,7 @@ public interface ExtensionController { PluginConverter converter); ExtensionBuilder withDefault(Supplier def); ExtensionBuilder withCallback(Consumer callback); + ExtensionBuilder withUiMode(int mode, Supplier def); Extension build(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java index fefbaa31af2aecad3a902064230d1d2ce3981fd8..91b61607d04dcebcbbeaf227ca2371256b9fd1b4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java @@ -14,23 +14,38 @@ package com.android.systemui.statusbar.policy; +import android.content.Context; +import android.content.res.Configuration; +import android.os.Handler; +import android.util.ArrayMap; + import com.android.systemui.Dependency; import com.android.systemui.plugins.Plugin; import com.android.systemui.plugins.PluginListener; import com.android.systemui.plugins.PluginManager; +import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; -import android.content.Context; -import android.util.ArrayMap; - import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.function.Consumer; import java.util.function.Supplier; public class ExtensionControllerImpl implements ExtensionController { + public static final int SORT_ORDER_PLUGIN = 0; + public static final int SORT_ORDER_TUNER = 1; + public static final int SORT_ORDER_UI_MODE = 2; + public static final int SORT_ORDER_DEFAULT = 3; + + private final Context mDefaultContext; + + public ExtensionControllerImpl(Context context) { + mDefaultContext = context; + } + @Override public ExtensionBuilder newExtension(Class cls) { return new ExtensionBuilder<>(); @@ -38,6 +53,7 @@ public class ExtensionControllerImpl implements ExtensionController { private interface Producer { T get(); + void destroy(); } @@ -75,6 +91,12 @@ public class ExtensionControllerImpl implements ExtensionController { return this; } + public ExtensionController.ExtensionBuilder withUiMode(int uiMode, + Supplier supplier) { + mExtension.addUiMode(uiMode, supplier); + return this; + } + @Override public ExtensionController.ExtensionBuilder withCallback( Consumer callback) { @@ -85,40 +107,32 @@ public class ExtensionControllerImpl implements ExtensionController { @Override public ExtensionController.Extension build() { // Manually sort, plugins first, tuners second, defaults last. - Collections.sort(mExtension.mProducers, (o1, o2) -> { - if (o1 instanceof ExtensionImpl.PluginItem) { - if (o2 instanceof ExtensionImpl.PluginItem) { - return 0; - } else { - return -1; - } - } - if (o1 instanceof ExtensionImpl.TunerItem) { - if (o2 instanceof ExtensionImpl.PluginItem) { - return 1; - } else if (o2 instanceof ExtensionImpl.TunerItem) { - return 0; - } else { - return -1; - } - } - return 0; - }); + Collections.sort(mExtension.mProducers, Comparator.comparingInt(Item::sortOrder)); mExtension.notifyChanged(); return mExtension; } } private class ExtensionImpl implements ExtensionController.Extension { - private final ArrayList> mProducers = new ArrayList<>(); + private final ArrayList> mProducers = new ArrayList<>(); private final ArrayList> mCallbacks = new ArrayList<>(); private T mItem; + private Context mPluginContext; + + public void addCallback(Consumer callback) { + mCallbacks.add(callback); + } @Override public T get() { return mItem; } + @Override + public Context getContext() { + return mPluginContext != null ? mPluginContext : mDefaultContext; + } + @Override public void destroy() { for (int i = 0; i < mProducers.size(); i++) { @@ -127,6 +141,7 @@ public class ExtensionControllerImpl implements ExtensionController { } private void notifyChanged() { + mItem = null; for (int i = 0; i < mProducers.size(); i++) { final T item = mProducers.get(i).get(); if (item != null) { @@ -151,7 +166,11 @@ public class ExtensionControllerImpl implements ExtensionController { mProducers.add(new TunerItem(factory, factory.keys())); } - private class PluginItem

implements Producer, PluginListener

{ + public void addUiMode(int uiMode, Supplier mode) { + mProducers.add(new UiModeItem(uiMode, mode)); + } + + private class PluginItem

implements Item, PluginListener

{ private final PluginConverter mConverter; private T mItem; @@ -162,6 +181,7 @@ public class ExtensionControllerImpl implements ExtensionController { @Override public void onPluginConnected(P plugin, Context pluginContext) { + mPluginContext = pluginContext; if (mConverter != null) { mItem = mConverter.getInterfaceFromPlugin(plugin); } else { @@ -172,6 +192,7 @@ public class ExtensionControllerImpl implements ExtensionController { @Override public void onPluginDisconnected(P plugin) { + mPluginContext = null; mItem = null; notifyChanged(); } @@ -185,9 +206,14 @@ public class ExtensionControllerImpl implements ExtensionController { public void destroy() { Dependency.get(PluginManager.class).removePluginListener(this); } + + @Override + public int sortOrder() { + return SORT_ORDER_PLUGIN; + } } - private class TunerItem implements Producer, Tunable { + private class TunerItem implements Item, Tunable { private final TunerFactory mFactory; private final ArrayMap mSettings = new ArrayMap<>(); private T mItem; @@ -213,9 +239,54 @@ public class ExtensionControllerImpl implements ExtensionController { mItem = mFactory.create(mSettings); notifyChanged(); } + + @Override + public int sortOrder() { + return SORT_ORDER_TUNER; + } + } + + private class UiModeItem implements Item, ConfigurationListener { + + private final int mDesiredUiMode; + private final Supplier mSupplier; + private int mUiMode; + private Handler mHandler = new Handler(); + + public UiModeItem(int uiMode, Supplier supplier) { + mDesiredUiMode = uiMode; + mSupplier = supplier; + mUiMode = mDefaultContext.getResources().getConfiguration().uiMode; + Dependency.get(ConfigurationController.class).addCallback(this); + } + + @Override + public void onConfigChanged(Configuration newConfig) { + int newMode = newConfig.uiMode & Configuration.UI_MODE_TYPE_MASK; + if (newMode != mUiMode) { + mUiMode = newMode; + // Post to make sure we don't have concurrent modifications. + mHandler.post(ExtensionImpl.this::notifyChanged); + } + } + + @Override + public T get() { + return (mUiMode == mDesiredUiMode) ? mSupplier.get() : null; + } + + @Override + public void destroy() { + Dependency.get(ConfigurationController.class).removeCallback(this); + } + + @Override + public int sortOrder() { + return SORT_ORDER_UI_MODE; + } } - private class Default implements Producer { + private class Default implements Item { private final Supplier mSupplier; public Default(Supplier supplier) { @@ -231,6 +302,15 @@ public class ExtensionControllerImpl implements ExtensionController { public void destroy() { } + + @Override + public int sortOrder() { + return SORT_ORDER_DEFAULT; + } } } + + private interface Item extends Producer { + int sortOrder(); + } } 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 4421a6ab0cfdb72ca3f49fd568696cddbee684ed..67b5596e34c9469d6538e7e26280bfc66069bacf 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 @@ public class MobileSignalController extends SignalController< 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 @@ public class MobileSignalController extends SignalController< 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 @@ public class MobileSignalController extends SignalController< && 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 @@ public class MobileSignalController extends SignalController< } 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 @@ public class MobileSignalController extends SignalController< boolean isDefault; boolean userSetup; boolean roaming; - boolean dataDisabled; @Override public void copyFrom(State s) { @@ -585,7 +592,6 @@ public class MobileSignalController extends SignalController< carrierNetworkChangeMode = state.carrierNetworkChangeMode; userSetup = state.userSetup; roaming = state.roaming; - dataDisabled = state.dataDisabled; } @Override @@ -603,7 +609,6 @@ public class MobileSignalController extends SignalController< builder.append("carrierNetworkChangeMode=").append(carrierNetworkChangeMode) .append(','); builder.append("userSetup=").append(userSetup); - builder.append("dataDisabled=").append(dataDisabled); } @Override @@ -618,7 +623,6 @@ public class MobileSignalController extends SignalController< && ((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 ab4a8f21ba245e76b2fa69f214da49b13ff1a939..c02ce0ea6335ed9810e42c28426b9bc7d7cc12b2 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 @@ public interface NetworkController extends CallbackController, D 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 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 60f4ab8ffe0ed26e4bf5ae87a71ee5c7d5b705bb..c21f444d0bf34c476e34ec7519c77c575a48c5ce 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 @@ public class NetworkControllerImpl extends BroadcastReceiver 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 ec7e557fde8135178c73e86f59719f0db116ba1e..aaa0568a72cde697550a3973cc36e02d88bd57ee 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 @@ class TelephonyIcons { 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 @@ class TelephonyIcons { 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 dfc3591678ac1b0220d794999b852ec5964ae087..374408d3ec7a9bd8cc51360736f9eebe43e24d04 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 @@ public class WifiIcons { 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 a773acf317c931f521a0711b6b368f89c57ec4f3..2104cb1421aa65ba7f597f18e72298336404056b 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 @@ public class WifiSignalController extends 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 @@ public class WifiSignalController extends @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 af447f3f74ecf771437cde1c3a3963aa1727556b..0f7c9a462c0a64cc777cc0a99ea2291668b5bb97 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 @@ public class Assert { 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/DelayedWakeLock.java b/packages/SystemUI/src/com/android/systemui/util/wakelock/DelayedWakeLock.java new file mode 100644 index 0000000000000000000000000000000000000000..b83590979ef7a7e5a55770c155bf73864e5b5ed3 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/util/wakelock/DelayedWakeLock.java @@ -0,0 +1,52 @@ +/* + * 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.util.wakelock; + +import android.os.Handler; + +/** + * A wake lock that has a built in delay when releasing to give the framebuffer time to update. + */ +public class DelayedWakeLock implements WakeLock { + + private static final long RELEASE_DELAY_MS = 100; + + private final Handler mHandler; + private final WakeLock mInner; + private final Runnable mRelease; + + public DelayedWakeLock(Handler h, WakeLock inner) { + mHandler = h; + mInner = inner; + mRelease = mInner::release; + } + + @Override + public void acquire() { + mInner.acquire(); + } + + @Override + public void release() { + mHandler.postDelayed(mRelease, RELEASE_DELAY_MS); + } + + @Override + public Runnable wrap(Runnable r) { + return WakeLock.wrapImpl(this, r); + } +} 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 eea3de38fc0969a4e4c050eb1f44e771ba951f0e..23c51d2d91e45af6c38db7c6964bded5f4fa9942 100644 --- a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java +++ b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java @@ -35,6 +35,17 @@ public interface WakeLock extends DozeProvider.WakeLock { .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, tag); } + static Runnable wrapImpl(WakeLock w, Runnable r) { + w.acquire(); + return () -> { + try { + r.run(); + } finally { + w.release(); + } + }; + } + static WakeLock wrap(final PowerManager.WakeLock inner) { return new WakeLock() { /** @see PowerManager.WakeLock#acquire() */ @@ -49,7 +60,7 @@ public interface WakeLock extends DozeProvider.WakeLock { /** @see PowerManager.WakeLock#wrap(Runnable) */ public Runnable wrap(Runnable runnable) { - return inner.wrap(runnable); + return wrapImpl(this, runnable); } }; } diff --git a/packages/SystemUI/tests/Android.mk b/packages/SystemUI/tests/Android.mk index 8eedf3145e6142984cf88aa3afa6196602db46b9..5e8b3f905258f16bae0d4df2284510eba5d8d542 100644 --- a/packages/SystemUI/tests/Android.mk +++ b/packages/SystemUI/tests/Android.mk @@ -42,6 +42,7 @@ LOCAL_STATIC_ANDROID_LIBRARIES := \ 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 0000000000000000000000000000000000000000..1c9f8133a15f9cebbf21b6582d68569f291da251 --- /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 texts) { + return texts.stream().allMatch(this::isAscii); + } + + private boolean isEmpty(List 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 1b5d4a4cb9cd7ab9ad00ea3100a108889cdd7819..aa8409890336d415f1e041a05d8b8f67e00620e0 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 @@ public class ExpandHelperTest extends SysuiTestCase { 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 048936b3f5f0bc44b73f81baf8d93028b46d80c5..bbe324d7d8d0be5c02c99b829688a3fe30cb5547 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 @@ public class DozeConfigurationTest extends SysuiTestCase { 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 5771b2819f37e109c8746dc750767c4cbee273d0..24d8b924ee85fc434406cf45fad50561604d420b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java @@ -238,7 +238,7 @@ public class DozeMachineTest { mMachine.requestState(DOZE_REQUEST_PULSE); mMachine.requestState(DOZE_PULSING); - assertEquals(Display.STATE_DOZE, mServiceFake.screenState); + assertEquals(Display.STATE_ON, mServiceFake.screenState); } @Test 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 34cfa7be5b53d801e1a0b1dd5375ba28b572d5f0..eb59a341ef0f155575fca2c007d3736ea12dfcd4 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 junit.framework.Assert.assertTrue; 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 @@ public class PowerNotificationWarningsTest extends SysuiTestCase { } @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 673ffc5d0fbf3edab33c6d51a8b2ebb961404521..d81224e8507d83e933a6ee56b36a47b414865c5b 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 android.testing.AndroidTestingRunner; 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 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { 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 3db2440485366108011d604c2b1164f693353527..5cd092bc8b53cbd14c9da9a7a4d48b9725f43936 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 @@ public class ExpandableNotificationRowTest { 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 08ac9a9de864f4db8672a34f0c836d6ad3f77cb9..18c5756b3fb68aae37d9fe6470e43e0f66330f5a 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 static org.mockito.Mockito.when; 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 @@ public class NotificationDataTest extends SysuiTestCase { 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 @@ public class NotificationDataTest extends SysuiTestCase { 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 @@ public class NotificationDataTest extends SysuiTestCase { 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 @@ public class NotificationDataTest extends SysuiTestCase { .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 c91b269d6329e3e08084d0d638db4e951fe6c55c..cb238ddbabaa71de24b63854790dc60931a2a64f 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 @@ import com.android.systemui.statusbar.phone.NotificationGroupManager; 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 @@ public class NotificationTestHelper { 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 @@ public class NotificationTestHelper { 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 0000000000000000000000000000000000000000..fbb25e5484bac4dab6222e14d407459423871c89 --- /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 0ec9c106a59648d9c1b369421502cb7df512433c..0000000000000000000000000000000000000000 --- 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 f6c75a8f0b8466e1c6e14bd2d0787fd742b302a2..3ed1681644f28925213e9214da436f3ce816b486 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 @@ public class CallbackHandlerTest { 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 statusArg = ArgumentCaptor.forClass(IconState.class); + ArgumentCaptor qsArg = ArgumentCaptor.forClass(IconState.class); ArgumentCaptor typeIconArg = ArgumentCaptor.forClass(Integer.class); + ArgumentCaptor qsTypeIconArg = ArgumentCaptor.forClass(Integer.class); ArgumentCaptor inArg = ArgumentCaptor.forClass(Boolean.class); ArgumentCaptor outArg = ArgumentCaptor.forClass(Boolean.class); ArgumentCaptor typeContentArg = ArgumentCaptor.forClass(String.class); + ArgumentCaptor descArg = ArgumentCaptor.forClass(String.class); + ArgumentCaptor wideArg = ArgumentCaptor.forClass(Boolean.class); ArgumentCaptor 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/ExtensionControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerImplTest.java new file mode 100644 index 0000000000000000000000000000000000000000..564019c2bdc515282ead012e9663c6149c4b3f04 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerImplTest.java @@ -0,0 +1,197 @@ +/* + * 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.policy; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.res.Configuration; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; +import android.testing.TestableLooper.RunWithLooper; +import android.util.Log; + +import com.android.systemui.Dependency; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.OverlayPlugin; +import com.android.systemui.plugins.Plugin; +import com.android.systemui.plugins.PluginListener; +import com.android.systemui.plugins.PluginManager; +import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; +import com.android.systemui.statusbar.policy.ExtensionController.Extension; +import com.android.systemui.statusbar.policy.ExtensionController.TunerFactory; +import com.android.systemui.tuner.TunerService; +import com.android.systemui.tuner.TunerService.Tunable; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; + +import java.util.Map; +import java.util.function.Consumer; + +@RunWith(AndroidTestingRunner.class) +public class ExtensionControllerImplTest extends SysuiTestCase { + + private PluginManager mPluginManager; + private TunerService mTunerService; + private ExtensionController mExtensionController; + private ConfigurationController mConfigurationController; + + @Before + public void setup() { + mPluginManager = mDependency.injectMockDependency(PluginManager.class); + mTunerService = mDependency.injectMockDependency(TunerService.class); + mConfigurationController = mDependency.injectMockDependency(ConfigurationController.class); + mExtensionController = Dependency.get(ExtensionController.class); + } + + @Test + public void testPlugin() { + OverlayPlugin plugin = mock(OverlayPlugin.class); + + Extension ext = mExtensionController.newExtension(OverlayPlugin.class) + .withPlugin(OverlayPlugin.class) + .build(); + ArgumentCaptor listener = ArgumentCaptor.forClass(PluginListener.class); + verify(mPluginManager).addPluginListener(eq(OverlayPlugin.ACTION), listener.capture(), + eq(OverlayPlugin.class)); + + listener.getValue().onPluginConnected(plugin, null); + assertEquals(plugin, ext.get()); + + ext.destroy(); + verify(mPluginManager).removePluginListener(any()); + } + + @Test + public void testTuner() { + String[] keys = new String[] { "key1", "key2" }; + TunerFactory factory = new ExtensionController.TunerFactory() { + @Override + public String[] keys() { + return keys; + } + + @Override + public Object create(Map settings) { + return null; + } + }; + Extension ext = mExtensionController.newExtension(Object.class) + .withTunerFactory(factory) + .build(); + verify(mTunerService).addTunable(any(), eq(keys[0]), eq(keys[1])); + + ext.destroy(); + verify(mTunerService).removeTunable(any()); + } + + @Test + @RunWithLooper + public void testUiMode() { + Object o = new Object(); + Extension ext = mExtensionController.newExtension(Object.class) + .withUiMode(Configuration.UI_MODE_TYPE_CAR, () -> o) + .build(); + ArgumentCaptor captor = ArgumentCaptor.forClass( + ConfigurationListener.class); + verify(mConfigurationController).addCallback(captor.capture()); + + Configuration c = new Configuration(mContext.getResources().getConfiguration()); + c.uiMode = 0; + captor.getValue().onConfigChanged(c); + TestableLooper.get(this).processAllMessages(); + assertNull(ext.get()); + + c.uiMode = Configuration.UI_MODE_TYPE_CAR; + captor.getValue().onConfigChanged(c); + TestableLooper.get(this).processAllMessages(); + assertEquals(o, ext.get()); + + ext.destroy(); + verify(mConfigurationController).removeCallback(eq(captor.getValue())); + } + + @Test + public void testDefault() { + Object o = new Object(); + Extension ext = mExtensionController.newExtension(Object.class) + .withDefault(() -> o) + .build(); + assertEquals(o, ext.get()); + } + + @Test + @RunWithLooper + public void testSortOrder() { + Log.d("TestTest", "Config " + mContext.getResources().getConfiguration().uiMode); + Object def = new Object(); + Object uiMode = new Object(); + Object tuner = new Object(); + Plugin plugin = mock(Plugin.class); + TunerFactory factory = mock(TunerFactory.class); + Extension ext = mExtensionController.newExtension(Object.class) + .withDefault(() -> def) + .withUiMode(Configuration.UI_MODE_TYPE_CAR, () -> uiMode) + .withTunerFactory(factory) + .withPlugin(Object.class, "some_action") + .build(); + + // Test default first. + assertEquals(def, ext.get()); + + // Enable a UI mode and check that. + ArgumentCaptor captor = ArgumentCaptor.forClass( + ConfigurationListener.class); + verify(mConfigurationController).addCallback(captor.capture()); + Configuration c = new Configuration(mContext.getResources().getConfiguration()); + c.uiMode |= Configuration.UI_MODE_TYPE_CAR; + captor.getValue().onConfigChanged(c); + TestableLooper.get(this).processAllMessages(); + assertEquals(uiMode, ext.get()); + + // Turn on tuner item and check that. + when(factory.create(any())).thenReturn(tuner); + ArgumentCaptor tunable = ArgumentCaptor.forClass(Tunable.class); + verify(mTunerService).addTunable(tunable.capture(), any()); + tunable.getValue().onTuningChanged(null, null); + assertEquals(tuner, ext.get()); + + // Lastly, check a plugin. + ArgumentCaptor listener = ArgumentCaptor.forClass(PluginListener.class); + verify(mPluginManager).addPluginListener(any(), listener.capture(), any()); + listener.getValue().onPluginConnected(plugin, null); + assertEquals(plugin, ext.get()); + } + + @Test + public void testCallback() { + Consumer callback = mock(Consumer.class); + final Object o = new Object(); + mExtensionController.newExtension(Object.class) + .withDefault(() -> o) + .withCallback(callback) + .build(); + verify(callback).accept(eq(o)); + } + +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java deleted file mode 100644 index 3e79a0404026169ea25ea31584f45a736f69c996..0000000000000000000000000000000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java +++ /dev/null @@ -1,105 +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.policy; - -import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; - -import com.android.systemui.Dependency; -import com.android.systemui.SysuiTestCase; -import com.android.systemui.plugins.OverlayPlugin; -import com.android.systemui.plugins.PluginManager; -import com.android.systemui.statusbar.policy.ExtensionController.Extension; -import com.android.systemui.statusbar.policy.ExtensionController.TunerFactory; -import com.android.systemui.tuner.TunerService; - -import org.junit.Before; -import org.junit.Test; - -import java.util.Map; -import java.util.function.Consumer; - -public class ExtensionControllerTest extends SysuiTestCase { - - private PluginManager mPluginManager; - private TunerService mTunerService; - private ExtensionController mExtensionController; - - @Before - public void setup() { - mPluginManager = mDependency.injectMockDependency(PluginManager.class); - mTunerService = mDependency.injectMockDependency(TunerService.class); - mExtensionController = Dependency.get(ExtensionController.class); - } - - @Test - public void testPlugin() { - Extension ext = mExtensionController.newExtension(OverlayPlugin.class) - .withPlugin(OverlayPlugin.class) - .build(); - verify(mPluginManager).addPluginListener(eq(OverlayPlugin.ACTION), any(), - eq(OverlayPlugin.class)); - - ext.destroy(); - verify(mPluginManager).removePluginListener(any()); - } - - @Test - public void testTuner() { - String[] keys = new String[] { "key1", "key2" }; - TunerFactory factory = new ExtensionController.TunerFactory() { - @Override - public String[] keys() { - return keys; - } - - @Override - public Object create(Map settings) { - return null; - } - }; - Extension ext = mExtensionController.newExtension(Object.class) - .withTunerFactory(factory) - .build(); - verify(mTunerService).addTunable(any(), eq(keys[0]), eq(keys[1])); - - ext.destroy(); - verify(mTunerService).removeTunable(any()); - } - - @Test - public void testDefault() { - Object o = new Object(); - Extension ext = mExtensionController.newExtension(Object.class) - .withDefault(() -> o) - .build(); - assertEquals(o, ext.get()); - } - - @Test - public void testCallback() { - Consumer callback = mock(Consumer.class); - final Object o = new Object(); - mExtensionController.newExtension(Object.class) - .withDefault(() -> o) - .withCallback(callback) - .build(); - verify(callback).accept(eq(o)); - } - -} 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 b39171e9f720ec0f1746a8065751b8dcc17f1e82..505e1d8346fd80ab1b4c4870c37b2880d74a9ced 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.SubscriptionInfo; 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.rules.TestWatcher; 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 @@ public class NetworkControllerBaseTest extends SysuiTestCase { 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 @@ public class NetworkControllerBaseTest extends SysuiTestCase { 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 @@ public class NetworkControllerBaseTest extends SysuiTestCase { } 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 @@ public class NetworkControllerBaseTest extends SysuiTestCase { ArgumentCaptor 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 @@ public class NetworkControllerBaseTest extends SysuiTestCase { } protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon, - boolean roaming, boolean inet) { + boolean roaming, boolean inet) { ArgumentCaptor iconArg = ArgumentCaptor.forClass(IconState.class); ArgumentCaptor 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 @@ public class NetworkControllerBaseTest extends SysuiTestCase { } 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 iconArg = ArgumentCaptor.forClass(IconState.class); ArgumentCaptor typeIconArg = ArgumentCaptor.forClass(Integer.class); + ArgumentCaptor qsIconArg = ArgumentCaptor.forClass(IconState.class); + ArgumentCaptor qsTypeIconArg = ArgumentCaptor.forClass(Integer.class); ArgumentCaptor dataInArg = ArgumentCaptor.forClass(Boolean.class); ArgumentCaptor 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 @@ public class NetworkControllerBaseTest extends SysuiTestCase { 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 6470c117f406ba2747bd307679c76c456286d705..dfe00f95fe4d06ecf7bcec79a0a2829bf37b9844 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.telephony.TelephonyManager; 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 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, 0); setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false); - ArgumentCaptor 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 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { 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 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 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { 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 e542c371feda24c283c2280bb7ef5fe474661abf..1627925ae1bcbf5da8cd19fa284f4f5330869469 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 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { verifyLastQsMobileDataIndicators(true, testStrength, - TelephonyIcons.ICON_1X, false, false); + TelephonyIcons.QS_DATA_1X, false, false); } } @@ -434,7 +434,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { 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 edfa3261a7e86bb1bfb2c7156bd8a17227658bee..dbaa2c5fea0aa1e0969f4923992dc2d071efdd1c 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 android.test.suitebuilder.annotation.SmallTest; 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 class NetworkControllerWifiTest extends NetworkControllerBaseTest { 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 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { 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 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { 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 dbe0de42fd0a1a0fd3ce25d08ef5afaa830deb08..f051f3043224c7d76009f2f604b6cf9805738f02 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 @@ public class NotificationChildrenContainerTest { 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/utils/leaks/FakeExtensionController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java index b9d188a3871a3bac3e21920f7dc973fd3891c826..3a0f907b8697da079ff7157cf69dd6e3b430f057 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java @@ -14,6 +14,7 @@ package com.android.systemui.utils.leaks; +import android.content.Context; import android.testing.LeakCheck; import android.testing.LeakCheck.Tracker; @@ -74,6 +75,11 @@ public class FakeExtensionController implements ExtensionController { return this; } + @Override + public ExtensionBuilder withUiMode(int mode, Supplier def) { + return null; + } + @Override public Extension build() { return new FakeExtension(mAllocation); @@ -93,9 +99,19 @@ public class FakeExtensionController implements ExtensionController { return null; } + @Override + public Context getContext() { + return null; + } + @Override public void destroy() { mTracker.getLeakInfo(mAllocation).clearAllocations(); } + + @Override + public void addCallback(Consumer callback) { + + } } } diff --git a/packages/VpnDialogs/res/values-zh-rTW/strings.xml b/packages/VpnDialogs/res/values-zh-rTW/strings.xml index 1a7ab358ab10eb5320ef8204efa1123c1cd8df03..6b35993320852de92387c51ed47efc179c2c1cfe 100644 --- a/packages/VpnDialogs/res/values-zh-rTW/strings.xml +++ b/packages/VpnDialogs/res/values-zh-rTW/strings.xml @@ -17,7 +17,7 @@ "連線要求" - "%s 要求設定 VPN 連線,允許此要求即開放該來源監控網路流量。除非您信任該來源,否則請勿任意接受要求。<br /> <br />VPN 啟用時,畫面頂端會顯示 <img src=vpn_icon />。" + "%s 要求設定 VPN 連線,允許此要求即開放該來源監控網路流量。除非你信任該來源,否則請勿任意接受要求。<br /> <br />VPN 啟用時,畫面頂端會顯示 <img src=vpn_icon />。" "VPN 已連線" "設定" "中斷連線" diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index 4a533549a52323fbc96708cc3bf433bda38b819f..f9b4372b36c6677944c72140afeb6b4073846514 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -3636,7 +3636,7 @@ message MetricsEvent { // 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; @@ -3938,6 +3938,25 @@ message MetricsEvent { // 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 ---- // OPEN: Settings > System > Languages & input > Advanced > Lift to open camera diff --git a/proto/src/system_messages.proto b/proto/src/system_messages.proto index 65cc17eec6bde63deb03f57a15f1a5b63e20820e..ac544e8abd7497e2cc662298146161edda0352f6 100644 --- a/proto/src/system_messages.proto +++ b/proto/src/system_messages.proto @@ -176,6 +176,13 @@ message SystemMessage { // 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; + + // Inform the user that the connected audio accessory is not supported + NOTE_USB_AUDIO_ACCESSORY_NOT_SUPPORTED = 41; + // 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/rs/jni/Android.mk b/rs/jni/Android.mk index 4040db36c4fb7f78ef3cc6190f3e4d2c23c4ebce..21438e04f38cc67539780e8930827189c61afe0d 100644 --- a/rs/jni/Android.mk +++ b/rs/jni/Android.mk @@ -18,7 +18,8 @@ LOCAL_SHARED_LIBRARIES := \ libgui \ libjnigraphics -LOCAL_STATIC_LIBRARIES := +LOCAL_HEADER_LIBRARIES := \ + libbase_headers LOCAL_C_INCLUDES += \ $(JNI_H_INCLUDE) \ diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp index f6d3f483538168cd0dd7cf1a24a2e5839f03562a..ee48289731a8330d45e12ffa6509f4e18597880c 100644 --- a/rs/jni/android_renderscript_RenderScript.cpp +++ b/rs/jni/android_renderscript_RenderScript.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include "jni.h" #include "JNIHelp.h" diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index b6dfdd178a1b78e39573e4b3c49c4a192d7adb7f..fa78f10f3e857dbcb6eaf3a0f7a410e064449346 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 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { 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 class AccessibilityManagerService extends IAccessibilityManager.Stub { 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 f61edc5e28ac0da259c42c44913da7aa63d7d54e..b536ad969c95c7a183ed3de063075778f2ea73b9 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java @@ -19,14 +19,14 @@ package com.android.server.autofill; 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; @@ -39,6 +39,7 @@ import android.database.ContentObserver; 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,13 +51,12 @@ import android.os.UserManager; import android.os.UserManagerInternal; import android.provider.Settings; import android.service.autofill.FillEventHistory; -import android.text.TextUtils; 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; @@ -118,10 +118,6 @@ public final class AutofillManagerService extends SystemService { @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(); } } @@ -130,7 +126,11 @@ public final class AutofillManagerService extends SystemService { 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); @@ -154,7 +154,7 @@ public final class AutofillManagerService extends SystemService { 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; @@ -368,6 +368,42 @@ public final class AutofillManagerService extends SystemService { } } + // 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. */ @@ -390,7 +426,7 @@ public final class AutofillManagerService extends SystemService { * 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()) { @@ -399,24 +435,21 @@ public final class AutofillManagerService extends SystemService { } } - private IBinder getTopActivityForUser() { - final List 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; } } @@ -509,12 +542,12 @@ public final class AutofillManagerService extends SystemService { @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); } } } @@ -568,24 +601,34 @@ public final class AutofillManagerService extends SystemService { @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 44a296e79b573f8ea0fcabe5d9af725c78800159..4507eae8d3d7d88035e6687532da040c086983b2 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,12 +47,9 @@ import android.service.autofill.FillResponse; import android.service.autofill.IAutoFillService; import android.text.TextUtils; import android.util.LocalLog; -import android.util.Log; -import android.util.PrintWriterPrinter; import android.util.Slog; import android.util.SparseArray; import android.view.autofill.AutofillId; -import android.view.autofill.AutofillManager; import android.view.autofill.AutofillValue; import android.view.autofill.IAutoFillManagerClient; @@ -271,14 +267,14 @@ final class AutofillManagerServiceImpl { } final String historyItem = - "id=" + newSession.getId() + " uid=" + uid + " s=" + mInfo.getServiceInfo().packageName + "id=" + newSession.id + " uid=" + uid + " s=" + mInfo.getServiceInfo().packageName + " u=" + mUserId + " i=" + autofillId + " b=" + virtualBounds + " hc=" + 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.getId(); + return newSession.id; } void finishSessionLocked(int sessionId, int uid) { @@ -288,14 +284,15 @@ final class AutofillManagerServiceImpl { 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.removeSelfLocked(); } @@ -342,7 +339,7 @@ final class AutofillManagerServiceImpl { 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; } @@ -350,9 +347,9 @@ final class AutofillManagerServiceImpl { } 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.getId(), newSession); + mSessions.put(newSession.id, newSession); return newSession; } @@ -396,17 +393,17 @@ final class AutofillManagerServiceImpl { } 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) { @@ -426,9 +423,7 @@ final class AutofillManagerServiceImpl { } 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++) { @@ -519,12 +514,6 @@ final class AutofillManagerServiceImpl { 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"); diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java index 62226e3a6cfceebfb18d654cdbf69aaf69643b06..1b9c86ef59a96d6311a715028adfc49d68d81680 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 @@ package com.android.server.autofill; 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 @@ public final class AutofillManagerServiceShellCommand extends ShellCommand { 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 @@ public final class AutofillManagerServiceShellCommand extends ShellCommand { 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 @@ public final class AutofillManagerServiceShellCommand extends ShellCommand { } } + 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 @@ public final class AutofillManagerServiceShellCommand extends ShellCommand { 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 @@ public final class AutofillManagerServiceShellCommand extends ShellCommand { 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 5964172e138a64ad967c463983462a82b39b4824..68ade63ac516c2e1932dd7b9566284019b4e4aad 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.Arrays; 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 2aeb07e1057bae47bf17a99f5352f568fe269e13..a12ebb23ba5f069a1481219aba7906860084eebb 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 @@ package com.android.server.autofill; 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 @@ final class RemoteFillService implements DeathRecipient { 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 @@ final class RemoteFillService implements DeathRecipient { 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 @@ final class RemoteFillService implements DeathRecipient { 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 @@ final class RemoteFillService implements DeathRecipient { 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 @@ final class RemoteFillService implements DeathRecipient { 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 @@ final class RemoteFillService implements DeathRecipient { } 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 @@ final class RemoteFillService implements DeathRecipient { 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 0687f6da022e34c4fbc9cb8c48ebd3ac4abddfb6..018fb6886cd986a6f374f2963574b0d9ce0ce0e0 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -20,13 +20,13 @@ 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; @@ -108,7 +108,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState private static AtomicInteger sIdCounter = new AtomicInteger(); /** Id of the session */ - private final int mId; + public final int id; /** uid the session is for */ public final int uid; @@ -173,24 +173,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState @GuardedBy("mLock") private boolean mDestroyed; - /** - * Flags used to start the session. - */ - private final int mFlags; - /** * Receiver of assist data from the app's {@link Activity}. */ private final IResultReceiver mAssistReceiver = new IResultReceiver.Stub() { @Override public void send(int resultCode, Bundle resultData) throws RemoteException { - if (VERBOSE) { - Slog.v(TAG, "resultCode on mAssistReceiver: " + resultCode); - } - final AssistStructure structure = resultData.getParcelable(KEY_STRUCTURE); if (structure == null) { - Slog.wtf(TAG, "no assist structure for id " + resultCode); + Slog.wtf(TAG, "no assist structure"); return; } @@ -202,8 +193,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState 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; @@ -218,6 +209,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // 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); } @@ -230,7 +224,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState fillStructureWithAllowedValues(mContexts.get(i).getStructure()); } - request = new FillRequest(requestId, mContexts, mClientState, mFlags); + request = new FillRequest(requestId, mContexts, mClientState, flags); } mRemoteFillService.onFillRequest(request); @@ -251,9 +245,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState 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; } @@ -295,15 +287,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState /** * 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 @@ -319,7 +311,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState 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 { @@ -334,8 +326,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState @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) { - mId = sessionId; + @NonNull ComponentName componentName, @NonNull String packageName) { + id = sessionId; this.uid = uid; mService = service; mLock = lock; @@ -346,7 +338,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState mWindowToken = windowToken; mHasCallback = hasCallback; mPackageName = packageName; - mFlags = flags; mClient = IAutoFillManagerClient.Stub.asInterface(client); mMetricsLogger.action(MetricsEvent.AUTOFILL_SESSION_STARTED, mPackageName); @@ -371,7 +362,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#switchWindow() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } mWindowToken = newWindow; @@ -388,7 +379,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#switchActivity() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } mActivityToken = newActivity; @@ -401,17 +392,17 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // 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: " - + mId + " destroyed"); + + 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. @@ -452,7 +443,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#onFillRequestFailure() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } @@ -472,7 +463,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#onSaveRequestSuccess() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } @@ -494,7 +485,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#onSaveRequestFailure() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } @@ -541,7 +532,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#authenticate() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } @@ -563,11 +554,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // AutoFillUiCallback @Override public void fill(int requestId, Dataset dataset) { - mHandlerCaller.getHandler().post(() -> autoFill(requestId, dataset)); synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#fill() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } @@ -580,12 +570,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#save() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } mHandlerCaller.getHandler() - .obtainMessage(AutofillManagerServiceImpl.MSG_SERVICE_SAVE, mId, 0) + .obtainMessage(AutofillManagerServiceImpl.MSG_SERVICE_SAVE, id, 0) .sendToTarget(); } @@ -595,7 +585,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#cancelSave() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } @@ -609,19 +599,19 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#requestShowFillUi() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } if (id.equals(mCurrentViewId)) { try { final ViewState view = mViewStates.get(id); - mClient.requestShowFillUi(mId, mWindowToken, id, width, height, + mClient.requestShowFillUi(this.id, mWindowToken, id, width, height, view.getVirtualBounds(), presenter); } catch (RemoteException e) { 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"); } @@ -636,7 +626,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // 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(mId, mWindowToken, id); + mClient.requestHideFillUi(this.id, mWindowToken, id); } catch (RemoteException e) { Slog.e(TAG, "Error requesting to hide fill UI", e); } @@ -649,7 +639,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#startIntentSender() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } removeSelfLocked(); @@ -668,7 +658,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState void setAuthenticationResultLocked(Bundle data) { if (mDestroyed) { Slog.w(TAG, "Call to Session#setAuthenticationResultLocked() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } if ((mResponseWaitingAuth == null && mDatasetWaitingAuth == null) || data == null) { @@ -708,7 +698,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState void setHasCallbackLocked(boolean hasIt) { if (mDestroyed) { Slog.w(TAG, "Call to Session#setHasCallbackLocked() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } mHasCallback = hasIt; @@ -722,7 +712,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState public boolean showSaveLocked() { if (mDestroyed) { Slog.w(TAG, "Call to Session#showSaveLocked() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return false; } if (mContexts == null) { @@ -732,23 +722,23 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState 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); } @@ -783,7 +773,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState 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; @@ -792,7 +782,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState 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); } @@ -815,7 +805,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState 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); } @@ -832,7 +822,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } // Nothing changed... - if (DEBUG) { + if (sDebug) { Slog.d(TAG, "showSaveLocked(): with no changes, comes no responsibilities." + "allRequiredAreNotNull=" + allRequiredAreNotEmpty + ", atLeastOneChanged=" + atLeastOneChanged); @@ -846,29 +836,23 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState void callSaveLocked() { if (mDestroyed) { Slog.w(TAG, "Call to Session#callSaveLocked() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } - if (DEBUG) { - Slog.d(TAG, "callSaveLocked(): mViewStates=" + mViewStates); - } + if (sVerbose) Slog.v(TAG, "callSaveLocked(): mViewStates=" + mViewStates); - int numContexts = mContexts.size(); + 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 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(); @@ -877,9 +861,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState 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); } @@ -887,7 +869,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // 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(); } @@ -933,108 +915,121 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState final int numDatasets = datasets.size(); for (int dataSetNum = 0; dataSetNum < numDatasets; dataSetNum++) { - final ArrayList fields = datasets.get(dataSetNum).getFieldIds(); + final ArrayList 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: " - + mId + " destroyed"); + + 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; - } - - if ((flags & FLAG_VALUE_CHANGED) != 0) { - if (value != null && !value.equals(viewState.getCurrentValue())) { - // Always update the internal state. - viewState.setCurrentValue(value); - - // Must check if this update was caused by autofilling the view, in which - // case we just update the value, but not the UI. - final AutofillValue filledValue = viewState.getAutofilledValue(); - if (value.equals(filledValue)) { - return; - } - // Update the internal state... - viewState.setState(ViewState.STATE_CHANGED); - - //..and the UI - if (value.isText()) { - getUiForShowing().filterFillUi(value.getTextValue().toString()); - } else { - getUiForShowing().filterFillUi(null); + 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); + + // Must check if this update was caused by autofilling the view, in which + // case we just update the value, but not the UI. + final AutofillValue filledValue = viewState.getAutofilledValue(); + if (value.equals(filledValue)) { + return; + } + // Update the internal state... + viewState.setState(ViewState.STATE_CHANGED); + + //..and the UI + if (value.isText()) { + getUiForShowing().filterFillUi(value.getTextValue().toString()); + } else { + getUiForShowing().filterFillUi(null); + } } - } - - return; - } - - if ((flags & FLAG_VIEW_ENTERED) != 0) { - 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; - } - // If the ViewState is ready to be displayed, onReady() will be called. - viewState.update(value, virtualBounds); + // Remove the UI if the ViewState has changed. + if (mCurrentViewId != viewState.id) { + mUi.hideFillUi(mCurrentViewId != null ? mCurrentViewId : null); + mCurrentViewId = viewState.id; + } - 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 @@ -1043,7 +1038,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#onFillReady() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } } @@ -1056,12 +1051,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState getUiForShowing().showFillUi(filledId, response, filterText, mPackageName); } - static String getFlagAsString(int flag) { - return DebugUtils.flagsToString(AutofillManager.class, "FLAG_", flag); - } - - int getId() { - return mId; + String getActionAsString(int flag) { + return DebugUtils.flagsToString(AutofillManager.class, "ACTION_", flag); } boolean isDestroyed() { @@ -1080,7 +1071,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (!mHasCallback) return; try { - mClient.notifyNoFillUi(mId, mWindowToken, mCurrentViewId); + mClient.notifyNoFillUi(id, mWindowToken, mCurrentViewId); } catch (RemoteException e) { Slog.e(TAG, "Error notifying client no fill UI: windowToken=" + mWindowToken + " id=" + mCurrentViewId, e); @@ -1115,21 +1106,22 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } try { - mClient.setTrackedViews(mId, trackedViews, saveOnAllViewsInvisible); + mClient.setTrackedViews(id, trackedViews, saveOnAllViewsInvisible); } catch (RemoteException e) { Slog.w(TAG, "Cannot set tracked ids", e); } } 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); @@ -1139,13 +1131,18 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState 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 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(); @@ -1169,18 +1166,24 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState 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); + } + } + } /** @@ -1200,14 +1203,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } - 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); } @@ -1235,7 +1238,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#autoFill() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } // Autofill it directly... @@ -1273,7 +1276,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState 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; } @@ -1281,7 +1284,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState private void startAuthentication(IntentSender intent, Intent fillInIntent) { try { synchronized (mLock) { - mClient.authenticate(mId, intent, fillInIntent); + mClient.authenticate(id, intent, fillInIntent); } } catch (RemoteException e) { Slog.e(TAG, "Error launching auth intent", e); @@ -1289,10 +1292,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } void dumpLocked(String prefix, PrintWriter pw) { - pw.print(prefix); pw.print("id: "); pw.println(mId); + 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); @@ -1312,7 +1314,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState 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 @@ -1333,14 +1335,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState synchronized (mLock) { if (mDestroyed) { Slog.w(TAG, "Call to Session#autoFillApp() rejected - session: " - + mId + " destroyed"); + + id + " destroyed"); return; } try { - if (DEBUG) { - Slog.d(TAG, "autoFillApp(): the buck is on the app: " + dataset); - } - mClient.autofill(mId, mWindowToken, dataset.getFieldIds(), + 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) { @@ -1374,16 +1374,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } 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: " - + mId + " destroyed"); + + id + " destroyed"); return; } destroyLocked(); - mService.removeSessionLocked(mId); + mService.removeSessionLocked(id); } private int getLastResponseIndex() { diff --git a/services/autofill/java/com/android/server/autofill/ViewState.java b/services/autofill/java/com/android/server/autofill/ViewState.java index 3967f59355c4e5b80794971ca65a528dfd48f4d3..d114e14523732aaf88bc3e736bd5f1d4cee23588 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 @@ final class ViewState { 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 @@ final class ViewState { */ 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 @@ final class ViewState { 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 0556c671188816bfb2ec3c8960ead15c1345e8c9..086742eac6d5334b2616b161a496ad6b4eb36ff9 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 @@ import java.io.PrintWriter; * 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 final class AutoFillUI { */ 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 bb47e5b54863d56ae2aef597d695674dbf04b1ae..dd297a645436c7dd75b52fe349e6238b7cd7b6b4 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 @@ final class FillUi { 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 @@ final class FillUi { 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 @@ final class FillUi { 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 @@ final class FillUi { 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 @@ final class FillUi { return changed; } + Point maxSize = mTempPoint; + resolveMaxWindowSize(mContext, maxSize); + mContentWidth = 0; mContentHeight = 0; @@ -252,12 +271,14 @@ final class FillUi { 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 @@ final class FillUi { } } + 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 @@ final class FillUi { 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/SaveUi.java b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java index cbaaef707bec06480d0401ce13410b268df79767..bcdb118eb76d31eb3b45b31a17085fbdf40a1a91 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 @@ import com.android.server.UiThread; */ final class SaveUi { - private static final String TAG = "SaveUi"; + private static final String TAG = "AutofillSaveUi"; public interface OnSaveListener { void onSave(); @@ -61,7 +61,7 @@ final class SaveUi { @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 @@ final class SaveUi { @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 @@ final class SaveUi { @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 @@ final class SaveUi { 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 @@ final class SaveUi { 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/fullbackup/PerformFullTransportBackupTask.java b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java index 334d2145cf8ffc065b68a3a635fc379768fb46e4..1c1248e8834adce29033772a27e55a9fd0d3e97a 100644 --- a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java +++ b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java @@ -265,7 +265,8 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba if (RefactoredBackupManagerService.DEBUG) { Slog.i(TAG, "full backup requested but enabled=" + backupManagerService .isEnabled() - + " provisioned=" + backupManagerService.isProvisioned() + "; ignoring"); + + " provisioned=" + backupManagerService.isProvisioned() + + "; ignoring"); } int monitoringEvent; if (!backupManagerService.isEnabled()) { diff --git a/services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java b/services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java index f1156b42525ac44f85bffce5039fdaf0f7c7e483..f7bf8d995ee57d1612765265d8bd0348d9bb6496 100644 --- a/services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java +++ b/services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java @@ -44,7 +44,8 @@ public class PerformInitializeTask implements Runnable { try { for (String transportName : mQueue) { IBackupTransport transport = - backupManagerService.getTransportManager().getTransportBinder(transportName); + backupManagerService.getTransportManager().getTransportBinder( + transportName); if (transport == null) { Slog.e( RefactoredBackupManagerService.TAG, diff --git a/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java b/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java index 6ef1d08443fe061840a5dd9fdb9b0b72f68f0511..af88792fa041cc0c22ceb58cc948a44dcac22d91 100644 --- a/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java +++ b/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java @@ -50,7 +50,8 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { String packageName, String transport) { this.backupManagerService = backupManagerService; mPackageName = packageName; - mRestoreTransport = backupManagerService.getTransportManager().getTransportBinder(transport); + mRestoreTransport = backupManagerService.getTransportManager().getTransportBinder( + transport); } public void markTimedOut() { @@ -298,7 +299,8 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { // If the caller is not privileged and is not coming from the target // app's uid, throw a permission exception back to the caller. - int perm = backupManagerService.getContext().checkPermission(android.Manifest.permission.BACKUP, + int perm = backupManagerService.getContext().checkPermission( + android.Manifest.permission.BACKUP, Binder.getCallingPid(), Binder.getCallingUid()); if ((perm == PackageManager.PERMISSION_DENIED) && (app.applicationInfo.uid != Binder.getCallingUid())) { diff --git a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java index 61c703c167d0d2a4c8ede3a87df4558d19c26678..5009075f926b1af592a6815701bda20e6d9d7bcb 100644 --- a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java +++ b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java @@ -18,37 +18,32 @@ package com.android.server.backup.restore; import android.app.ApplicationThreadConstants; import android.app.IBackupAgent; -import android.app.PackageInstallObserver; import android.app.backup.FullBackup; import android.app.backup.IBackupManagerMonitor; import android.app.backup.IFullBackupRestoreObserver; import android.content.pm.ApplicationInfo; -import android.content.pm.IPackageDeleteObserver; import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.Signature; -import android.net.Uri; -import android.os.Bundle; import android.os.ParcelFileDescriptor; -import android.os.Process; import android.os.RemoteException; import android.util.Slog; import com.android.server.backup.BackupRestoreTask; import com.android.server.backup.FileMetadata; +import com.android.server.backup.KeyValueAdbRestoreEngine; import com.android.server.backup.RefactoredBackupManagerService; import com.android.server.backup.fullbackup.FullBackupObbConnection; -import com.android.server.backup.utils.AppBackupUtils; +import com.android.server.backup.utils.BytesReadListener; +import com.android.server.backup.utils.FullBackupRestoreObserverUtils; +import com.android.server.backup.utils.RestoreUtils; import com.android.server.backup.utils.TarBackupReader; -import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.HashSet; -import java.util.concurrent.atomic.AtomicBoolean; /** * Full restore engine, used by both adb restore and transport-based full restore. @@ -108,42 +103,7 @@ public class FullRestoreEngine extends RestoreEngine { // Widget blob to be restored out-of-band byte[] mWidgetData = null; - private final int mEphemeralOpToken; - - // Runner that can be placed in a separate thread to do in-process - // invocations of the full restore API asynchronously. Used by adb restore. - class RestoreFileRunnable implements Runnable { - - IBackupAgent mAgent; - FileMetadata mInfo; - ParcelFileDescriptor mSocket; - int mToken; - - RestoreFileRunnable(IBackupAgent agent, FileMetadata info, - ParcelFileDescriptor socket, int token) throws IOException { - mAgent = agent; - mInfo = info; - mToken = token; - - // This class is used strictly for process-local binder invocations. The - // semantics of ParcelFileDescriptor differ in this case; in particular, we - // do not automatically get a 'dup'ed descriptor that we can can continue - // to use asynchronously from the caller. So, we make sure to dup it ourselves - // before proceeding to do the restore. - mSocket = ParcelFileDescriptor.dup(socket.getFileDescriptor()); - } - - @Override - public void run() { - try { - mAgent.doRestoreFile(mSocket, mInfo.size, mInfo.type, - mInfo.domain, mInfo.path, mInfo.mode, mInfo.mtime, - mToken, backupManagerService.getBackupManagerBinder()); - } catch (RemoteException e) { - // never happens; this is used strictly for local binder calls - } - } - } + final int mEphemeralOpToken; public FullRestoreEngine(RefactoredBackupManagerService backupManagerService, BackupRestoreTask monitorTask, IFullBackupRestoreObserver observer, @@ -169,19 +129,22 @@ public class FullRestoreEngine extends RestoreEngine { return mWidgetData; } - public boolean restoreOneFile(InputStream instream, boolean mustKillAgent) { + public boolean restoreOneFile(InputStream instream, boolean mustKillAgent, byte[] buffer, + PackageInfo onlyPackage, boolean allowApks, int token, IBackupManagerMonitor monitor) { if (!isRunning()) { Slog.w(RefactoredBackupManagerService.TAG, "Restore engine used after halting"); return false; } + BytesReadListener bytesReadListener = new BytesReadListener() { + @Override + public void onBytesRead(long bytesRead) { + mBytes += bytesRead; + } + }; + TarBackupReader tarBackupReader = new TarBackupReader(instream, - new TarBackupReader.BytesReadListener() { - @Override - public void onBytesRead(long bytesRead) { - mBytes += bytesRead; - } - }, mMonitor); + bytesReadListener, monitor); FileMetadata info; try { @@ -198,10 +161,10 @@ public class FullRestoreEngine extends RestoreEngine { if (!pkg.equals(mAgentPackage)) { // In the single-package case, it's a semantic error to expect // one app's data but see a different app's on the wire - if (mOnlyPackage != null) { - if (!pkg.equals(mOnlyPackage.packageName)) { + if (onlyPackage != null) { + if (!pkg.equals(onlyPackage.packageName)) { Slog.w(RefactoredBackupManagerService.TAG, - "Expected data for " + mOnlyPackage + "Expected data for " + onlyPackage + " but saw " + pkg); setResult(RestoreEngine.TRANSPORT_FAILURE); setRunning(false); @@ -232,7 +195,7 @@ public class FullRestoreEngine extends RestoreEngine { if (info.path.equals(RefactoredBackupManagerService.BACKUP_MANIFEST_FILENAME)) { RestorePolicy appManifest = tarBackupReader.readAppManifest( - backupManagerService.getPackageManager(), mAllowApks, + backupManagerService.getPackageManager(), allowApks, mManifestSignatures, info); mPackagePolicies.put(pkg, appManifest); mPackageInstallers.put(pkg, info.installerPackageName); @@ -240,7 +203,7 @@ public class FullRestoreEngine extends RestoreEngine { // so consume the footer before looping around to the next // input file tarBackupReader.skipTarPadding(info.size); - sendOnRestorePackage(pkg); + mObserver = FullBackupRestoreObserverUtils.sendOnRestorePackage(mObserver, pkg); } else if (info.path.equals( RefactoredBackupManagerService.BACKUP_METADATA_FILENAME)) { // Metadata blobs! @@ -252,7 +215,7 @@ public class FullRestoreEngine extends RestoreEngine { // This is read during TarBackupReader.readMetadata(). mWidgetData = tarBackupReader.getWidgetData(); // This can be nulled during TarBackupReader.readMetadata(). - mMonitor = tarBackupReader.getMonitor(); + monitor = tarBackupReader.getMonitor(); tarBackupReader.skipTarPadding(info.size); } else { @@ -275,9 +238,14 @@ public class FullRestoreEngine extends RestoreEngine { } // Try to install the app. String installerName = mPackageInstallers.get(pkg); - okay = installApk(info, installerName, instream); + boolean isSuccessfullyInstalled = RestoreUtils.installApk( + instream, backupManagerService.getPackageManager(), + mInstallObserver, mDeleteObserver, mManifestSignatures, + mPackagePolicies, info, installerName, + bytesReadListener, backupManagerService.getDataDir() + ); // good to go; promote to ACCEPT - mPackagePolicies.put(pkg, (okay) + mPackagePolicies.put(pkg, isSuccessfullyInstalled ? RestorePolicy.ACCEPT : RestorePolicy.IGNORE); // At this point we've consumed this file entry @@ -318,8 +286,8 @@ public class FullRestoreEngine extends RestoreEngine { break; } - // Is it a *file* we need to drop? - if (!isRestorableFile(info)) { + // Is it a *file* we need to drop or is it not a canonical path? + if (!isRestorableFile(info) || !isCanonicalFilePath(info.path)) { okay = false; } @@ -404,12 +372,12 @@ public class FullRestoreEngine extends RestoreEngine { boolean agentSuccess = true; long toCopy = info.size; try { - backupManagerService.prepareOperationTimeout(mEphemeralOpToken, + backupManagerService.prepareOperationTimeout(token, RefactoredBackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL, mMonitorTask, RefactoredBackupManagerService.OP_TYPE_RESTORE_WAIT); - if (info.domain.equals(FullBackup.OBB_TREE_TOKEN)) { + if (FullBackup.OBB_TREE_TOKEN.equals(info.domain)) { if (RefactoredBackupManagerService.DEBUG) { Slog.d(RefactoredBackupManagerService.TAG, "Restoring OBB file for " + pkg @@ -417,8 +385,22 @@ public class FullRestoreEngine extends RestoreEngine { } mObbConnection.restoreObbFile(pkg, mPipes[0], info.size, info.type, info.path, info.mode, - info.mtime, mEphemeralOpToken, + info.mtime, token, backupManagerService.getBackupManagerBinder()); + } else if (FullBackup.KEY_VALUE_DATA_TOKEN.equals(info.domain)) { + // This is only possible during adb restore. + // TODO: Refactor to clearly separate the flows. + if (RefactoredBackupManagerService.DEBUG) { + Slog.d(RefactoredBackupManagerService.TAG, + "Restoring key-value file for " + pkg + + " : " + info.path); + } + KeyValueAdbRestoreEngine restoreEngine = + new KeyValueAdbRestoreEngine( + backupManagerService, + backupManagerService.getDataDir(), info, mPipes[0], + mAgent, token); + new Thread(restoreEngine, "restore-key-value-runner").start(); } else { if (RefactoredBackupManagerService.MORE_DEBUG) { Slog.d(RefactoredBackupManagerService.TAG, @@ -433,13 +415,12 @@ public class FullRestoreEngine extends RestoreEngine { Slog.d(RefactoredBackupManagerService.TAG, "system process agent - spinning a thread"); RestoreFileRunnable runner = new RestoreFileRunnable( - mAgent, info, mPipes[0], mEphemeralOpToken); + backupManagerService, mAgent, info, mPipes[0], token); new Thread(runner, "restore-sys-runner").start(); } else { mAgent.doRestoreFile(mPipes[0], info.size, info.type, info.domain, info.path, info.mode, info.mtime, - mEphemeralOpToken, - backupManagerService.getBackupManagerBinder()); + token, backupManagerService.getBackupManagerBinder()); } } } catch (IOException e) { @@ -468,9 +449,9 @@ public class FullRestoreEngine extends RestoreEngine { FileOutputStream pipe = new FileOutputStream( mPipes[1].getFileDescriptor()); while (toCopy > 0) { - int toRead = (toCopy > mBuffer.length) - ? mBuffer.length : (int) toCopy; - int nRead = instream.read(mBuffer, 0, toRead); + int toRead = (toCopy > buffer.length) + ? buffer.length : (int) toCopy; + int nRead = instream.read(buffer, 0, toRead); if (nRead >= 0) { mBytes += nRead; } @@ -483,7 +464,7 @@ public class FullRestoreEngine extends RestoreEngine { // are still good if (pipeOkay) { try { - pipe.write(mBuffer, 0, nRead); + pipe.write(buffer, 0, nRead); } catch (IOException e) { Slog.e(RefactoredBackupManagerService.TAG, "Failed to write to restore pipe: " @@ -499,15 +480,14 @@ public class FullRestoreEngine extends RestoreEngine { // and now that we've sent it all, wait for the remote // side to acknowledge receipt - agentSuccess = backupManagerService.waitUntilOperationComplete( - mEphemeralOpToken); + agentSuccess = backupManagerService.waitUntilOperationComplete(token); } // okay, if the remote end failed at any point, deal with // it by ignoring the rest of the restore on it if (!agentSuccess) { Slog.w(RefactoredBackupManagerService.TAG, - "Agent failure; ending restore"); + "Agent failure restoring " + pkg + "; ending restore"); backupManagerService.getBackupHandler().removeMessages( RefactoredBackupManagerService.MSG_RESTORE_OPERATION_TIMEOUT); tearDownPipes(); @@ -517,7 +497,7 @@ public class FullRestoreEngine extends RestoreEngine { // If this was a single-package restore, we halt immediately // with an agent error under these circumstances - if (mOnlyPackage != null) { + if (onlyPackage != null) { setResult(RestoreEngine.TARGET_FAILURE); setRunning(false); return false; @@ -534,9 +514,9 @@ public class FullRestoreEngine extends RestoreEngine { } long bytesToConsume = (info.size + 511) & ~511; while (bytesToConsume > 0) { - int toRead = (bytesToConsume > mBuffer.length) - ? mBuffer.length : (int) bytesToConsume; - long nRead = instream.read(mBuffer, 0, toRead); + int toRead = (bytesToConsume > buffer.length) + ? buffer.length : (int) bytesToConsume; + long nRead = instream.read(buffer, 0, toRead); if (nRead >= 0) { mBytes += nRead; } @@ -608,198 +588,10 @@ public class FullRestoreEngine extends RestoreEngine { setRunning(false); } - class RestoreInstallObserver extends PackageInstallObserver { - - final AtomicBoolean mDone = new AtomicBoolean(); - String mPackageName; - int mResult; - - public void reset() { - synchronized (mDone) { - mDone.set(false); - } - } - - public void waitForCompletion() { - synchronized (mDone) { - while (mDone.get() == false) { - try { - mDone.wait(); - } catch (InterruptedException e) { - } - } - } - } - - int getResult() { - return mResult; - } - - @Override - public void onPackageInstalled(String packageName, int returnCode, - String msg, Bundle extras) { - synchronized (mDone) { - mResult = returnCode; - mPackageName = packageName; - mDone.set(true); - mDone.notifyAll(); - } - } - } - - class RestoreDeleteObserver extends IPackageDeleteObserver.Stub { - - final AtomicBoolean mDone = new AtomicBoolean(); - int mResult; - - public void reset() { - synchronized (mDone) { - mDone.set(false); - } - } - - public void waitForCompletion() { - synchronized (mDone) { - while (mDone.get() == false) { - try { - mDone.wait(); - } catch (InterruptedException e) { - } - } - } - } - - @Override - public void packageDeleted(String packageName, int returnCode) throws RemoteException { - synchronized (mDone) { - mResult = returnCode; - mDone.set(true); - mDone.notifyAll(); - } - } - } - final RestoreInstallObserver mInstallObserver = new RestoreInstallObserver(); final RestoreDeleteObserver mDeleteObserver = new RestoreDeleteObserver(); - boolean installApk(FileMetadata info, String installerPackage, InputStream instream) { - boolean okay = true; - - if (RefactoredBackupManagerService.DEBUG) { - Slog.d(RefactoredBackupManagerService.TAG, - "Installing from backup: " + info.packageName); - } - - // The file content is an .apk file. Copy it out to a staging location and - // attempt to install it. - File apkFile = new File(backupManagerService.getDataDir(), info.packageName); - try { - FileOutputStream apkStream = new FileOutputStream(apkFile); - byte[] buffer = new byte[32 * 1024]; - long size = info.size; - while (size > 0) { - long toRead = (buffer.length < size) ? buffer.length : size; - int didRead = instream.read(buffer, 0, (int) toRead); - if (didRead >= 0) { - mBytes += didRead; - } - apkStream.write(buffer, 0, didRead); - size -= didRead; - } - apkStream.close(); - - // make sure the installer can read it - apkFile.setReadable(true, false); - - // Now install it - Uri packageUri = Uri.fromFile(apkFile); - mInstallObserver.reset(); - backupManagerService.getPackageManager().installPackage(packageUri, mInstallObserver, - PackageManager.INSTALL_REPLACE_EXISTING | PackageManager.INSTALL_FROM_ADB, - installerPackage); - mInstallObserver.waitForCompletion(); - - if (mInstallObserver.getResult() != PackageManager.INSTALL_SUCCEEDED) { - // The only time we continue to accept install of data even if the - // apk install failed is if we had already determined that we could - // accept the data regardless. - if (mPackagePolicies.get(info.packageName) != RestorePolicy.ACCEPT) { - okay = false; - } - } else { - // Okay, the install succeeded. Make sure it was the right app. - boolean uninstall = false; - if (!mInstallObserver.mPackageName.equals(info.packageName)) { - Slog.w(RefactoredBackupManagerService.TAG, - "Restore stream claimed to include apk for " - + info.packageName + " but apk was really " - + mInstallObserver.mPackageName); - // delete the package we just put in place; it might be fraudulent - okay = false; - uninstall = true; - } else { - try { - PackageInfo pkg = backupManagerService.getPackageManager().getPackageInfo( - info.packageName, - PackageManager.GET_SIGNATURES); - if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_ALLOW_BACKUP) - == 0) { - Slog.w(RefactoredBackupManagerService.TAG, - "Restore stream contains apk of package " - + info.packageName - + " but it disallows backup/restore"); - okay = false; - } else { - // So far so good -- do the signatures match the manifest? - Signature[] sigs = mManifestSignatures.get(info.packageName); - if (AppBackupUtils.signaturesMatch(sigs, pkg)) { - // If this is a system-uid app without a declared backup agent, - // don't restore any of the file data. - if ((pkg.applicationInfo.uid < Process.FIRST_APPLICATION_UID) - && (pkg.applicationInfo.backupAgentName == null)) { - Slog.w(RefactoredBackupManagerService.TAG, - "Installed app " + info.packageName - + " has restricted uid and no agent"); - okay = false; - } - } else { - Slog.w(RefactoredBackupManagerService.TAG, - "Installed app " + info.packageName - + " signatures do not match restore manifest"); - okay = false; - uninstall = true; - } - } - } catch (NameNotFoundException e) { - Slog.w(RefactoredBackupManagerService.TAG, - "Install of package " + info.packageName - + " succeeded but now not found"); - okay = false; - } - } - - // If we're not okay at this point, we need to delete the package - // that we just installed. - if (uninstall) { - mDeleteObserver.reset(); - backupManagerService.getPackageManager().deletePackage( - mInstallObserver.mPackageName, - mDeleteObserver, 0); - mDeleteObserver.waitForCompletion(); - } - } - } catch (IOException e) { - Slog.e(RefactoredBackupManagerService.TAG, - "Unable to transcribe restored apk for install"); - okay = false; - } finally { - apkFile.delete(); - } - - return okay; - } - - private boolean isRestorableFile(FileMetadata info) { + private static boolean isRestorableFile(FileMetadata info) { if (FullBackup.CACHE_TREE_TOKEN.equals(info.domain)) { if (RefactoredBackupManagerService.MORE_DEBUG) { Slog.i(RefactoredBackupManagerService.TAG, "Dropping cache file path " + info.path); @@ -821,28 +613,19 @@ public class FullRestoreEngine extends RestoreEngine { } } - // The path needs to be canonical - if (info.path.contains("..") || info.path.contains("//")) { - if (RefactoredBackupManagerService.MORE_DEBUG) { - Slog.w(RefactoredBackupManagerService.TAG, "Dropping invalid path " + info.path); - } - return false; - } - // Otherwise we think this file is good to go return true; } - void sendStartRestore() { - if (mObserver != null) { - try { - mObserver.onStartRestore(); - } catch (RemoteException e) { - Slog.w(RefactoredBackupManagerService.TAG, - "full restore observer went away: startRestore"); - mObserver = null; + private static boolean isCanonicalFilePath(String path) { + if (path.contains("..") || path.contains("//")) { + if (RefactoredBackupManagerService.MORE_DEBUG) { + Slog.w(RefactoredBackupManagerService.TAG, "Dropping invalid path " + path); } + return false; } + + return true; } void sendOnRestorePackage(String name) { @@ -857,16 +640,4 @@ public class FullRestoreEngine extends RestoreEngine { } } } - - void sendEndRestore() { - if (mObserver != null) { - try { - mObserver.onEndRestore(); - } catch (RemoteException e) { - Slog.w(RefactoredBackupManagerService.TAG, - "full restore observer went away: endRestore"); - mObserver = null; - } - } - } } diff --git a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java index 7a749ea86e4a212ee666e739e75135d91f660059..1ddaae7a86606e6bb4ae021089c6cdd0fe29a94a 100644 --- a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java +++ b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java @@ -18,20 +18,15 @@ package com.android.server.backup.restore; import android.app.ApplicationThreadConstants; import android.app.IBackupAgent; -import android.app.PackageInstallObserver; import android.app.backup.FullBackup; +import android.app.backup.IBackupManagerMonitor; import android.app.backup.IFullBackupRestoreObserver; import android.content.pm.ApplicationInfo; -import android.content.pm.IPackageDeleteObserver; import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.Signature; -import android.net.Uri; -import android.os.Bundle; import android.os.Environment; import android.os.ParcelFileDescriptor; -import android.os.Process; import android.os.RemoteException; import android.util.Slog; @@ -40,12 +35,13 @@ import com.android.server.backup.KeyValueAdbRestoreEngine; import com.android.server.backup.PackageManagerBackupAgent; import com.android.server.backup.RefactoredBackupManagerService; import com.android.server.backup.fullbackup.FullBackupObbConnection; -import com.android.server.backup.utils.AppBackupUtils; +import com.android.server.backup.utils.BytesReadListener; +import com.android.server.backup.utils.FullBackupRestoreObserverUtils; import com.android.server.backup.utils.PasswordUtils; +import com.android.server.backup.utils.RestoreUtils; import com.android.server.backup.utils.TarBackupReader; import java.io.DataInputStream; -import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; @@ -144,44 +140,11 @@ public class PerformAdbRestoreTask implements Runnable { mClearedPackages.add(RefactoredBackupManagerService.SETTINGS_PACKAGE); } - class RestoreFileRunnable implements Runnable { - - IBackupAgent mAgent; - FileMetadata mInfo; - ParcelFileDescriptor mSocket; - int mToken; - - RestoreFileRunnable(IBackupAgent agent, FileMetadata info, - ParcelFileDescriptor socket, int token) throws IOException { - mAgent = agent; - mInfo = info; - mToken = token; - - // This class is used strictly for process-local binder invocations. The - // semantics of ParcelFileDescriptor differ in this case; in particular, we - // do not automatically get a 'dup'ed descriptor that we can can continue - // to use asynchronously from the caller. So, we make sure to dup it ourselves - // before proceeding to do the restore. - mSocket = ParcelFileDescriptor.dup(socket.getFileDescriptor()); - } - - @Override - public void run() { - try { - mAgent.doRestoreFile(mSocket, mInfo.size, mInfo.type, - mInfo.domain, mInfo.path, mInfo.mode, mInfo.mtime, - mToken, backupManagerService.getBackupManagerBinder()); - } catch (RemoteException e) { - // never happens; this is used strictly for local binder calls - } - } - } - @Override public void run() { Slog.i(RefactoredBackupManagerService.TAG, "--- Performing full-dataset restore ---"); mObbConnection.establish(); - sendStartRestore(); + mObserver = FullBackupRestoreObserverUtils.sendStartRestore(mObserver); // Are we able to restore shared-storage data? if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { @@ -258,7 +221,9 @@ public class PerformAdbRestoreTask implements Runnable { boolean didRestore; do { - didRestore = restoreOneFile(in, buffer); + didRestore = restoreOneFile(in, false /* mustKillAgent */, buffer, + null /* onlyPackage */, true /* allowApks */, + backupManagerService.generateRandomIntegerToken(), null /* monitor */); } while (didRestore); if (RefactoredBackupManagerService.MORE_DEBUG) { @@ -288,7 +253,7 @@ public class PerformAdbRestoreTask implements Runnable { mLatchObject.notifyAll(); } mObbConnection.tearDown(); - sendEndRestore(); + mObserver = FullBackupRestoreObserverUtils.sendEndRestore(mObserver); Slog.d(RefactoredBackupManagerService.TAG, "Full restore pass complete."); backupManagerService.getWakelock().release(); } @@ -425,14 +390,16 @@ public class PerformAdbRestoreTask implements Runnable { return result; } - boolean restoreOneFile(InputStream instream, byte[] buffer) { + boolean restoreOneFile(InputStream instream, boolean mustKillAgent, byte[] buffer, + PackageInfo onlyPackage, boolean allowApks, int token, IBackupManagerMonitor monitor) { + BytesReadListener bytesReadListener = new BytesReadListener() { + @Override + public void onBytesRead(long bytesRead) { + mBytes += bytesRead; + } + }; TarBackupReader tarBackupReader = new TarBackupReader(instream, - new TarBackupReader.BytesReadListener() { - @Override - public void onBytesRead(long bytesRead) { - mBytes += bytesRead; - } - }, null /* monitor */); + bytesReadListener, monitor); FileMetadata info; try { info = tarBackupReader.readTarHeaders(); @@ -466,7 +433,7 @@ public class PerformAdbRestoreTask implements Runnable { if (info.path.equals(RefactoredBackupManagerService.BACKUP_MANIFEST_FILENAME)) { RestorePolicy appManifest = tarBackupReader.readAppManifest( - backupManagerService.getPackageManager(), true /* allowApks */, + backupManagerService.getPackageManager(), allowApks, mManifestSignatures, info); mPackagePolicies.put(pkg, appManifest); mPackageInstallers.put(pkg, info.installerPackageName); @@ -474,11 +441,20 @@ public class PerformAdbRestoreTask implements Runnable { // so consume the footer before looping around to the next // input file tarBackupReader.skipTarPadding(info.size); - sendOnRestorePackage(pkg); + mObserver = FullBackupRestoreObserverUtils.sendOnRestorePackage(mObserver, pkg); } else if (info.path.equals( RefactoredBackupManagerService.BACKUP_METADATA_FILENAME)) { // Metadata blobs! tarBackupReader.readMetadata(info); + + // The following only exist because we want to keep refactoring as safe as + // possible, without changing too much. + // TODO: Refactor, so that there are no funny things like this. + // This is read during TarBackupReader.readMetadata(). + mWidgetData = tarBackupReader.getWidgetData(); + // This can be nulled during TarBackupReader.readMetadata(). + monitor = tarBackupReader.getMonitor(); + tarBackupReader.skipTarPadding(info.size); } else { // Non-manifest, so it's actual file data. Is this a package @@ -500,9 +476,14 @@ public class PerformAdbRestoreTask implements Runnable { } // Try to install the app. String installerName = mPackageInstallers.get(pkg); - okay = installApk(info, installerName, instream); + boolean isSuccessfullyInstalled = RestoreUtils.installApk( + instream, backupManagerService.getPackageManager(), + mInstallObserver, mDeleteObserver, mManifestSignatures, + mPackagePolicies, info, installerName, + bytesReadListener, backupManagerService.getDataDir() + ); // good to go; promote to ACCEPT - mPackagePolicies.put(pkg, (okay) + mPackagePolicies.put(pkg, isSuccessfullyInstalled ? RestorePolicy.ACCEPT : RestorePolicy.IGNORE); // At this point we've consumed this file entry @@ -544,11 +525,7 @@ public class PerformAdbRestoreTask implements Runnable { } // The path needs to be canonical - if (info.path.contains("..") || info.path.contains("//")) { - if (RefactoredBackupManagerService.MORE_DEBUG) { - Slog.w(RefactoredBackupManagerService.TAG, - "Dropping invalid path " + info.path); - } + if (!isCanonicalFilePath(info.path)) { okay = false; } @@ -608,10 +585,9 @@ public class PerformAdbRestoreTask implements Runnable { } if (mAgent == null) { - if (RefactoredBackupManagerService.DEBUG) { - Slog.d(RefactoredBackupManagerService.TAG, - "Unable to create agent for " + pkg); - } + Slog.e( + RefactoredBackupManagerService.TAG, + "Unable to create agent for " + pkg); okay = false; tearDownPipes(); mPackagePolicies.put(pkg, RestorePolicy.IGNORE); @@ -633,13 +609,13 @@ public class PerformAdbRestoreTask implements Runnable { if (okay) { boolean agentSuccess = true; long toCopy = info.size; - final int token = backupManagerService.generateRandomIntegerToken(); try { backupManagerService .prepareOperationTimeout(token, RefactoredBackupManagerService.TIMEOUT_RESTORE_INTERVAL, null, RefactoredBackupManagerService.OP_TYPE_RESTORE_WAIT); + if (FullBackup.OBB_TREE_TOKEN.equals(info.domain)) { if (RefactoredBackupManagerService.DEBUG) { Slog.d(RefactoredBackupManagerService.TAG, @@ -676,7 +652,7 @@ public class PerformAdbRestoreTask implements Runnable { Slog.d(RefactoredBackupManagerService.TAG, "system process agent - spinning a thread"); RestoreFileRunnable runner = new RestoreFileRunnable( - mAgent, info, mPipes[0], token); + backupManagerService, mAgent, info, mPipes[0], token); new Thread(runner, "restore-sys-runner").start(); } else { mAgent.doRestoreFile(mPipes[0], info.size, info.type, @@ -788,6 +764,17 @@ public class PerformAdbRestoreTask implements Runnable { return (info != null); } + private static boolean isCanonicalFilePath(String path) { + if (path.contains("..") || path.contains("//")) { + if (RefactoredBackupManagerService.MORE_DEBUG) { + Slog.w(RefactoredBackupManagerService.TAG, "Dropping invalid path " + path); + } + return false; + } + + return true; + } + void setUpPipes() throws IOException { mPipes = ParcelFileDescriptor.createPipe(); } @@ -842,231 +829,7 @@ public class PerformAdbRestoreTask implements Runnable { } } - class RestoreInstallObserver extends PackageInstallObserver { - - final AtomicBoolean mDone = new AtomicBoolean(); - String mPackageName; - int mResult; - - public void reset() { - synchronized (mDone) { - mDone.set(false); - } - } - - public void waitForCompletion() { - synchronized (mDone) { - while (mDone.get() == false) { - try { - mDone.wait(); - } catch (InterruptedException e) { - } - } - } - } - - int getResult() { - return mResult; - } - - @Override - public void onPackageInstalled(String packageName, int returnCode, - String msg, Bundle extras) { - synchronized (mDone) { - mResult = returnCode; - mPackageName = packageName; - mDone.set(true); - mDone.notifyAll(); - } - } - } - - class RestoreDeleteObserver extends IPackageDeleteObserver.Stub { - - final AtomicBoolean mDone = new AtomicBoolean(); - int mResult; - - public void reset() { - synchronized (mDone) { - mDone.set(false); - } - } - - public void waitForCompletion() { - synchronized (mDone) { - while (mDone.get() == false) { - try { - mDone.wait(); - } catch (InterruptedException e) { - } - } - } - } - - @Override - public void packageDeleted(String packageName, int returnCode) throws RemoteException { - synchronized (mDone) { - mResult = returnCode; - mDone.set(true); - mDone.notifyAll(); - } - } - } - final RestoreInstallObserver mInstallObserver = new RestoreInstallObserver(); final RestoreDeleteObserver mDeleteObserver = new RestoreDeleteObserver(); - boolean installApk(FileMetadata info, String installerPackage, InputStream instream) { - boolean okay = true; - - if (RefactoredBackupManagerService.DEBUG) { - Slog.d(RefactoredBackupManagerService.TAG, - "Installing from backup: " + info.packageName); - } - - // The file content is an .apk file. Copy it out to a staging location and - // attempt to install it. - File apkFile = new File(backupManagerService.getDataDir(), info.packageName); - try { - FileOutputStream apkStream = new FileOutputStream(apkFile); - byte[] buffer = new byte[32 * 1024]; - long size = info.size; - while (size > 0) { - long toRead = (buffer.length < size) ? buffer.length : size; - int didRead = instream.read(buffer, 0, (int) toRead); - if (didRead >= 0) { - mBytes += didRead; - } - apkStream.write(buffer, 0, didRead); - size -= didRead; - } - apkStream.close(); - - // make sure the installer can read it - apkFile.setReadable(true, false); - - // Now install it - Uri packageUri = Uri.fromFile(apkFile); - mInstallObserver.reset(); - backupManagerService.getPackageManager().installPackage(packageUri, mInstallObserver, - PackageManager.INSTALL_REPLACE_EXISTING | PackageManager.INSTALL_FROM_ADB, - installerPackage); - mInstallObserver.waitForCompletion(); - - if (mInstallObserver.getResult() != PackageManager.INSTALL_SUCCEEDED) { - // The only time we continue to accept install of data even if the - // apk install failed is if we had already determined that we could - // accept the data regardless. - if (mPackagePolicies.get(info.packageName) != RestorePolicy.ACCEPT) { - okay = false; - } - } else { - // Okay, the install succeeded. Make sure it was the right app. - boolean uninstall = false; - if (!mInstallObserver.mPackageName.equals(info.packageName)) { - Slog.w(RefactoredBackupManagerService.TAG, - "Restore stream claimed to include apk for " - + info.packageName + " but apk was really " - + mInstallObserver.mPackageName); - // delete the package we just put in place; it might be fraudulent - okay = false; - uninstall = true; - } else { - try { - PackageInfo pkg = backupManagerService.getPackageManager().getPackageInfo( - info.packageName, - PackageManager.GET_SIGNATURES); - if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_ALLOW_BACKUP) - == 0) { - Slog.w(RefactoredBackupManagerService.TAG, - "Restore stream contains apk of package " - + info.packageName - + " but it disallows backup/restore"); - okay = false; - } else { - // So far so good -- do the signatures match the manifest? - Signature[] sigs = mManifestSignatures.get(info.packageName); - if (AppBackupUtils.signaturesMatch(sigs, pkg)) { - // If this is a system-uid app without a declared backup agent, - // don't restore any of the file data. - if ((pkg.applicationInfo.uid < Process.FIRST_APPLICATION_UID) - && (pkg.applicationInfo.backupAgentName == null)) { - Slog.w(RefactoredBackupManagerService.TAG, - "Installed app " + info.packageName - + " has restricted uid and no agent"); - okay = false; - } - } else { - Slog.w(RefactoredBackupManagerService.TAG, - "Installed app " + info.packageName - + " signatures do not match restore manifest"); - okay = false; - uninstall = true; - } - } - } catch (NameNotFoundException e) { - Slog.w(RefactoredBackupManagerService.TAG, - "Install of package " + info.packageName - + " succeeded but now not found"); - okay = false; - } - } - - // If we're not okay at this point, we need to delete the package - // that we just installed. - if (uninstall) { - mDeleteObserver.reset(); - backupManagerService.getPackageManager().deletePackage( - mInstallObserver.mPackageName, - mDeleteObserver, 0); - mDeleteObserver.waitForCompletion(); - } - } - } catch (IOException e) { - Slog.e(RefactoredBackupManagerService.TAG, - "Unable to transcribe restored apk for install"); - okay = false; - } finally { - apkFile.delete(); - } - - return okay; - } - - void sendStartRestore() { - if (mObserver != null) { - try { - mObserver.onStartRestore(); - } catch (RemoteException e) { - Slog.w(RefactoredBackupManagerService.TAG, - "full restore observer went away: startRestore"); - mObserver = null; - } - } - } - - void sendOnRestorePackage(String name) { - if (mObserver != null) { - try { - // TODO: use a more user-friendly name string - mObserver.onRestorePackage(name); - } catch (RemoteException e) { - Slog.w(RefactoredBackupManagerService.TAG, - "full restore observer went away: restorePackage"); - mObserver = null; - } - } - } - - void sendEndRestore() { - if (mObserver != null) { - try { - mObserver.onEndRestore(); - } catch (RemoteException e) { - Slog.w(RefactoredBackupManagerService.TAG, - "full restore observer went away: endRestore"); - mObserver = null; - } - } - } } diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java index 714b664ba843b8766f22413e62aebf19677268b7..b73b0969d5821a167890085b50fd9af0a620d23e 100644 --- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java +++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java @@ -377,7 +377,8 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { // Pull the Package Manager metadata from the restore set first mCurrentPackage = new PackageInfo(); mCurrentPackage.packageName = RefactoredBackupManagerService.PACKAGE_MANAGER_SENTINEL; - mPmAgent = new PackageManagerBackupAgent(backupManagerService.getPackageManager(), null); + mPmAgent = new PackageManagerBackupAgent(backupManagerService.getPackageManager(), + null); mAgent = IBackupAgent.Stub.asInterface(mPmAgent.onBind()); if (RefactoredBackupManagerService.MORE_DEBUG) { Slog.v(RefactoredBackupManagerService.TAG, "initiating restore for PMBA"); @@ -503,7 +504,8 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { Bundle monitoringExtras = BackupManagerMonitorUtils.putMonitoringExtra(null, BackupManagerMonitor.EXTRA_LOG_RESTORE_VERSION, metaInfo.versionCode); - monitoringExtras = BackupManagerMonitorUtils.putMonitoringExtra(monitoringExtras, + monitoringExtras = BackupManagerMonitorUtils.putMonitoringExtra( + monitoringExtras, BackupManagerMonitor.EXTRA_LOG_RESTORE_ANYWAY, false); mMonitor = BackupManagerMonitorUtils.monitorEvent(mMonitor, BackupManagerMonitor.LOG_EVENT_ID_RESTORE_VERSION_HIGHER, @@ -524,7 +526,8 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { Bundle monitoringExtras = BackupManagerMonitorUtils.putMonitoringExtra(null, BackupManagerMonitor.EXTRA_LOG_RESTORE_VERSION, metaInfo.versionCode); - monitoringExtras = BackupManagerMonitorUtils.putMonitoringExtra(monitoringExtras, + monitoringExtras = BackupManagerMonitorUtils.putMonitoringExtra( + monitoringExtras, BackupManagerMonitor.EXTRA_LOG_RESTORE_ANYWAY, true); mMonitor = BackupManagerMonitorUtils.monitorEvent(mMonitor, BackupManagerMonitor.LOG_EVENT_ID_RESTORE_VERSION_HIGHER, @@ -1029,7 +1032,9 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { try { while (mEngine.isRunning()) { // Tell it to be sure to leave the agent instance up after finishing - mEngine.restoreOneFile(mEngineStream, false); + mEngine.restoreOneFile(mEngineStream, false, mEngine.mBuffer, + mEngine.mOnlyPackage, mEngine.mAllowApks, mEngine.mEphemeralOpToken, + mEngine.mMonitor); } } finally { // Because mEngineStream adopted its underlying FD, this also diff --git a/services/backup/java/com/android/server/backup/restore/RestoreDeleteObserver.java b/services/backup/java/com/android/server/backup/restore/RestoreDeleteObserver.java new file mode 100644 index 0000000000000000000000000000000000000000..5bc3ecae067b64f1ac9ac1851e404138049a05ae --- /dev/null +++ b/services/backup/java/com/android/server/backup/restore/RestoreDeleteObserver.java @@ -0,0 +1,53 @@ +package com.android.server.backup.restore; + +import android.content.pm.IPackageDeleteObserver; +import android.os.RemoteException; + +import com.android.internal.annotations.GuardedBy; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Synchronous implementation of IPackageDeleteObserver.Stub. + * + * Allows the caller to synchronously wait for package deleted event. + */ +public class RestoreDeleteObserver extends IPackageDeleteObserver.Stub { + + @GuardedBy("mDone") + private final AtomicBoolean mDone = new AtomicBoolean(); + + public RestoreDeleteObserver() { + } + + /** + * Resets the observer to prepare for another removal. + */ + public void reset() { + synchronized (mDone) { + mDone.set(false); + } + } + + /** + * Synchronously waits for completion. + */ + public void waitForCompletion() { + synchronized (mDone) { + while (mDone.get() == false) { + try { + mDone.wait(); + } catch (InterruptedException e) { + } + } + } + } + + @Override + public void packageDeleted(String packageName, int returnCode) throws RemoteException { + synchronized (mDone) { + mDone.set(true); + mDone.notifyAll(); + } + } +} diff --git a/services/backup/java/com/android/server/backup/restore/RestoreFileRunnable.java b/services/backup/java/com/android/server/backup/restore/RestoreFileRunnable.java new file mode 100644 index 0000000000000000000000000000000000000000..4cb0abc6f0b9522097f5b3299a760dbbcc64bac3 --- /dev/null +++ b/services/backup/java/com/android/server/backup/restore/RestoreFileRunnable.java @@ -0,0 +1,49 @@ +package com.android.server.backup.restore; + +import android.app.IBackupAgent; +import android.os.ParcelFileDescriptor; +import android.os.RemoteException; + +import com.android.server.backup.FileMetadata; +import com.android.server.backup.RefactoredBackupManagerService; + +import java.io.IOException; + +/** + * Runner that can be placed in a separate thread to do in-process invocations of the full restore + * API asynchronously. Used by adb restore. + */ +class RestoreFileRunnable implements Runnable { + + private final IBackupAgent mAgent; + private final FileMetadata mInfo; + private final ParcelFileDescriptor mSocket; + private final int mToken; + private final RefactoredBackupManagerService mBackupManagerService; + + RestoreFileRunnable(RefactoredBackupManagerService backupManagerService, IBackupAgent agent, + FileMetadata info, ParcelFileDescriptor socket, int token) throws IOException { + mAgent = agent; + mInfo = info; + mToken = token; + + // This class is used strictly for process-local binder invocations. The + // semantics of ParcelFileDescriptor differ in this case; in particular, we + // do not automatically get a 'dup'ed descriptor that we can can continue + // to use asynchronously from the caller. So, we make sure to dup it ourselves + // before proceeding to do the restore. + mSocket = ParcelFileDescriptor.dup(socket.getFileDescriptor()); + this.mBackupManagerService = backupManagerService; + } + + @Override + public void run() { + try { + mAgent.doRestoreFile(mSocket, mInfo.size, mInfo.type, + mInfo.domain, mInfo.path, mInfo.mode, mInfo.mtime, + mToken, mBackupManagerService.getBackupManagerBinder()); + } catch (RemoteException e) { + // never happens; this is used strictly for local binder calls + } + } +} diff --git a/services/backup/java/com/android/server/backup/restore/RestoreInstallObserver.java b/services/backup/java/com/android/server/backup/restore/RestoreInstallObserver.java new file mode 100644 index 0000000000000000000000000000000000000000..eff857ade039671dcfc3f5e8f115a9e0da4e89ec --- /dev/null +++ b/services/backup/java/com/android/server/backup/restore/RestoreInstallObserver.java @@ -0,0 +1,73 @@ +package com.android.server.backup.restore; + +import android.app.PackageInstallObserver; +import android.os.Bundle; + +import com.android.internal.annotations.GuardedBy; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Synchronous implementation of PackageInstallObserver. + * + * Allows the caller to synchronously wait for package install event. + */ +public class RestoreInstallObserver extends PackageInstallObserver { + + @GuardedBy("mDone") + private final AtomicBoolean mDone = new AtomicBoolean(); + + private String mPackageName; + private int mResult; + + public RestoreInstallObserver() { + } + + /** + * Resets the observer to prepare for another installation. + */ + public void reset() { + synchronized (mDone) { + mDone.set(false); + } + } + + /** + * Synchronously waits for completion. + */ + public void waitForCompletion() { + synchronized (mDone) { + while (mDone.get() == false) { + try { + mDone.wait(); + } catch (InterruptedException e) { + } + } + } + } + + /** + * Returns result code. + */ + public int getResult() { + return mResult; + } + + /** + * Returns installed package name. + */ + public String getPackageName() { + return mPackageName; + } + + @Override + public void onPackageInstalled(String packageName, int returnCode, + String msg, Bundle extras) { + synchronized (mDone) { + mResult = returnCode; + mPackageName = packageName; + mDone.set(true); + mDone.notifyAll(); + } + } +} diff --git a/services/backup/java/com/android/server/backup/utils/BytesReadListener.java b/services/backup/java/com/android/server/backup/utils/BytesReadListener.java new file mode 100644 index 0000000000000000000000000000000000000000..15951537b6207c354daa1d6bc848fa5f1e0f8ef5 --- /dev/null +++ b/services/backup/java/com/android/server/backup/utils/BytesReadListener.java @@ -0,0 +1,12 @@ +package com.android.server.backup.utils; + +/** + * Listener for bytes reading. + */ +public interface BytesReadListener { + /** + * Will be called on each read operation. + * @param bytesRead - number of bytes read with the most recent read operation. + */ + void onBytesRead(long bytesRead); +} diff --git a/services/backup/java/com/android/server/backup/utils/FullBackupRestoreObserverUtils.java b/services/backup/java/com/android/server/backup/utils/FullBackupRestoreObserverUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..0c868afdb63ae73fa5bba72a571baf989c78a117 --- /dev/null +++ b/services/backup/java/com/android/server/backup/utils/FullBackupRestoreObserverUtils.java @@ -0,0 +1,75 @@ +package com.android.server.backup.utils; + +import android.app.backup.IFullBackupRestoreObserver; +import android.os.RemoteException; +import android.util.Slog; + +import com.android.server.backup.RefactoredBackupManagerService; + +/** + * Utility methods to communicate with FullBackupRestoreObserver. + */ +public class FullBackupRestoreObserverUtils { + /** + * Wraps {@link IFullBackupRestoreObserver#onStartRestore()} to handle RemoteException, so that + * the caller doesn't have to. + * + * @param observer - IFullBackupRestoreObserver to communicate with. + * @return observer if the call worked and null if there was a communication problem. + */ + public static IFullBackupRestoreObserver sendStartRestore(IFullBackupRestoreObserver observer) { + if (observer != null) { + try { + observer.onStartRestore(); + } catch (RemoteException e) { + Slog.w(RefactoredBackupManagerService.TAG, + "full restore observer went away: startRestore"); + observer = null; + } + } + return observer; + } + + /** + * Wraps {@link IFullBackupRestoreObserver#onRestorePackage(String)} to handle RemoteException, + * so that the caller doesn't have to. + * + * @param observer - IFullBackupRestoreObserver to communicate with. + * @param name - package name. + * @return observer if the call worked and null if there was a communication problem. + */ + public static IFullBackupRestoreObserver sendOnRestorePackage( + IFullBackupRestoreObserver observer, String name) { + if (observer != null) { + try { + // TODO: use a more user-friendly name string + observer.onRestorePackage(name); + } catch (RemoteException e) { + Slog.w(RefactoredBackupManagerService.TAG, + "full restore observer went away: restorePackage"); + observer = null; + } + } + return observer; + } + + /** + * Wraps {@link IFullBackupRestoreObserver#onEndRestore()} ()} to handle RemoteException, so + * that the caller doesn't have to. + * + * @param observer - IFullBackupRestoreObserver to communicate with. + * @return observer if the call worked and null if there was a communication problem. + */ + public static IFullBackupRestoreObserver sendEndRestore(IFullBackupRestoreObserver observer) { + if (observer != null) { + try { + observer.onEndRestore(); + } catch (RemoteException e) { + Slog.w(RefactoredBackupManagerService.TAG, + "full restore observer went away: endRestore"); + observer = null; + } + } + return observer; + } +} diff --git a/services/backup/java/com/android/server/backup/utils/RestoreUtils.java b/services/backup/java/com/android/server/backup/utils/RestoreUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..cdda68e2b0f5a89be5e49ef83dda764faee45f57 --- /dev/null +++ b/services/backup/java/com/android/server/backup/utils/RestoreUtils.java @@ -0,0 +1,167 @@ +package com.android.server.backup.utils; + +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.Signature; +import android.net.Uri; +import android.os.Process; +import android.util.Slog; + +import com.android.server.backup.FileMetadata; +import com.android.server.backup.RefactoredBackupManagerService; +import com.android.server.backup.restore.RestoreDeleteObserver; +import com.android.server.backup.restore.RestoreInstallObserver; +import com.android.server.backup.restore.RestorePolicy; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; + +/** + * Utility methods used by {@link com.android.server.backup.restore.PerformAdbRestoreTask} and + * {@link com.android.server.backup.restore.FullRestoreEngine}. + */ +public class RestoreUtils { + /** + * Reads apk contents from input stream and installs the apk. + * + * @param instream - input stream to read apk data from. + * @param packageManager - {@link PackageManager} instance. + * @param installObserver - {@link RestoreInstallObserver} instance. + * @param deleteObserver - {@link RestoreDeleteObserver} instance. + * @param manifestSignatures - manifest signatures. + * @param packagePolicies - package policies. + * @param info - backup file info. + * @param installerPackage - installer package. + * @param bytesReadListener - listener to be called for counting bytes read. + * @param dataDir - directory where to create apk file. + * @return true if apk was successfully read and installed and false otherwise. + */ + // TODO: Refactor to get rid of unneeded params. + public static boolean installApk(InputStream instream, PackageManager packageManager, + RestoreInstallObserver installObserver, RestoreDeleteObserver deleteObserver, + HashMap manifestSignatures, + HashMap packagePolicies, + FileMetadata info, + String installerPackage, BytesReadListener bytesReadListener, + File dataDir) { + boolean okay = true; + + if (RefactoredBackupManagerService.DEBUG) { + Slog.d(RefactoredBackupManagerService.TAG, + "Installing from backup: " + info.packageName); + } + + // The file content is an .apk file. Copy it out to a staging location and + // attempt to install it. + File apkFile = new File(dataDir, info.packageName); + try { + FileOutputStream apkStream = new FileOutputStream(apkFile); + byte[] buffer = new byte[32 * 1024]; + long size = info.size; + while (size > 0) { + long toRead = (buffer.length < size) ? buffer.length : size; + int didRead = instream.read(buffer, 0, (int) toRead); + if (didRead >= 0) { + bytesReadListener.onBytesRead(didRead); + } + apkStream.write(buffer, 0, didRead); + size -= didRead; + } + apkStream.close(); + + // make sure the installer can read it + apkFile.setReadable(true, false); + + // Now install it + Uri packageUri = Uri.fromFile(apkFile); + installObserver.reset(); + // TODO: PackageManager.installPackage() is deprecated, refactor. + packageManager.installPackage(packageUri, installObserver, + PackageManager.INSTALL_REPLACE_EXISTING | PackageManager.INSTALL_FROM_ADB, + installerPackage); + installObserver.waitForCompletion(); + + if (installObserver.getResult() != PackageManager.INSTALL_SUCCEEDED) { + // The only time we continue to accept install of data even if the + // apk install failed is if we had already determined that we could + // accept the data regardless. + if (packagePolicies.get(info.packageName) != RestorePolicy.ACCEPT) { + okay = false; + } + } else { + // Okay, the install succeeded. Make sure it was the right app. + boolean uninstall = false; + if (!installObserver.getPackageName().equals(info.packageName)) { + Slog.w(RefactoredBackupManagerService.TAG, + "Restore stream claimed to include apk for " + + info.packageName + " but apk was really " + + installObserver.getPackageName()); + // delete the package we just put in place; it might be fraudulent + okay = false; + uninstall = true; + } else { + try { + PackageInfo pkg = packageManager.getPackageInfo( + info.packageName, + PackageManager.GET_SIGNATURES); + if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_ALLOW_BACKUP) + == 0) { + Slog.w(RefactoredBackupManagerService.TAG, + "Restore stream contains apk of package " + + info.packageName + + " but it disallows backup/restore"); + okay = false; + } else { + // So far so good -- do the signatures match the manifest? + Signature[] sigs = manifestSignatures.get(info.packageName); + if (AppBackupUtils.signaturesMatch(sigs, pkg)) { + // If this is a system-uid app without a declared backup agent, + // don't restore any of the file data. + if ((pkg.applicationInfo.uid < Process.FIRST_APPLICATION_UID) + && (pkg.applicationInfo.backupAgentName == null)) { + Slog.w(RefactoredBackupManagerService.TAG, + "Installed app " + info.packageName + + " has restricted uid and no agent"); + okay = false; + } + } else { + Slog.w(RefactoredBackupManagerService.TAG, + "Installed app " + info.packageName + + " signatures do not match restore manifest"); + okay = false; + uninstall = true; + } + } + } catch (PackageManager.NameNotFoundException e) { + Slog.w(RefactoredBackupManagerService.TAG, + "Install of package " + info.packageName + + " succeeded but now not found"); + okay = false; + } + } + + // If we're not okay at this point, we need to delete the package + // that we just installed. + if (uninstall) { + deleteObserver.reset(); + packageManager.deletePackage( + installObserver.getPackageName(), + deleteObserver, 0); + deleteObserver.waitForCompletion(); + } + } + } catch (IOException e) { + Slog.e(RefactoredBackupManagerService.TAG, + "Unable to transcribe restored apk for install"); + okay = false; + } finally { + apkFile.delete(); + } + + return okay; + } +} diff --git a/services/backup/java/com/android/server/backup/utils/TarBackupReader.java b/services/backup/java/com/android/server/backup/utils/TarBackupReader.java index 4102225a3e2871f418302e5d2a5b2a72ebf9e9fa..25832c9c2d1d1cae83070680929888054bb52cf2 100644 --- a/services/backup/java/com/android/server/backup/utils/TarBackupReader.java +++ b/services/backup/java/com/android/server/backup/utils/TarBackupReader.java @@ -65,13 +65,6 @@ public class TarBackupReader { // Widget blob to be restored out-of-band. private byte[] mWidgetData = null; - /** - * Listener for bytes reading. - */ - public interface BytesReadListener { - void onBytesRead(long bytesRead); - } - public TarBackupReader(InputStream inputStream, BytesReadListener bytesReadListener, IBackupManagerMonitor monitor) { mInputStream = inputStream; diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index dc84c45800abb87a5e4141a0fca3b5d80c229993..6093241a66811a953be792a6edb35763c24508df 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -414,8 +414,9 @@ public class CompanionDeviceManagerService extends SystemService implements Bind 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); @@ -425,8 +426,9 @@ public class CompanionDeviceManagerService extends SystemService implements Bind } 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); @@ -438,6 +440,10 @@ public class CompanionDeviceManagerService extends SystemService implements Bind }); } + private static 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(() -> { diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 0748816a89578e7c6e2203dff046b954b0e3c2ac..8555851fbcaea31da65bed4b8361854c085c45cd 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2624,6 +2624,17 @@ public class ConnectivityService extends IConnectivityManager.Stub 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/DropBoxManagerService.java b/services/core/java/com/android/server/DropBoxManagerService.java index 9d3d5313eb4acfe431e62dc2d07b4931162ff262..e1756d1bf1980b7c4681612b0d186a5a072829dd 100644 --- a/services/core/java/com/android/server/DropBoxManagerService.java +++ b/services/core/java/com/android/server/DropBoxManagerService.java @@ -371,6 +371,14 @@ public final class DropBoxManagerService extends SystemService { 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 8ad3d23648bf1cbbd1c30289741ba51a401d1f08..20a6d14e5ca4ea40063f5152cd9fab2f68dcc5bf 100644 --- a/services/core/java/com/android/server/InputMethodManagerService.java +++ b/services/core/java/com/android/server/InputMethodManagerService.java @@ -212,6 +212,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub 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/NsdService.java b/services/core/java/com/android/server/NsdService.java index 77e4da65333451e223d647fccf0c00a108f414aa..d74bc19f7440c378bd84761e7a12b3332b060d88 100644 --- a/services/core/java/com/android/server/NsdService.java +++ b/services/core/java/com/android/server/NsdService.java @@ -39,6 +39,7 @@ import android.util.SparseArray; import java.io.FileDescriptor; import java.io.PrintWriter; import java.net.InetAddress; +import java.util.Arrays; import java.util.HashMap; import java.util.concurrent.CountDownLatch; @@ -65,8 +66,8 @@ public class NsdService extends INsdManager.Stub { private final Context mContext; private final NsdSettings mNsdSettings; private final NsdStateMachine mNsdStateMachine; - private final NativeDaemonConnector mNativeConnector; - private final CountDownLatch mNativeDaemonConnected = new CountDownLatch(1); + private final DaemonConnection mDaemon; + private final NativeCallbackReceiver mDaemonCallback; /** * Clients receiving asynchronous messages @@ -546,18 +547,13 @@ public class NsdService extends INsdManager.Stub { } @VisibleForTesting - NsdService(Context ctx, NsdSettings settings, Handler handler) { + NsdService(Context ctx, NsdSettings settings, Handler handler, DaemonConnectionSupplier fn) { mContext = ctx; mNsdSettings = settings; - - NativeCallbackReceiver callback = new NativeCallbackReceiver(); - mNativeConnector = new NativeDaemonConnector(callback, "mdns", 10, MDNS_TAG, 25, null); - mNsdStateMachine = new NsdStateMachine(TAG, handler); mNsdStateMachine.start(); - - Thread th = new Thread(mNativeConnector, MDNS_TAG); - th.start(); + mDaemonCallback = new NativeCallbackReceiver(); + mDaemon = fn.get(mDaemonCallback); } public static NsdService create(Context context) throws InterruptedException { @@ -565,8 +561,8 @@ public class NsdService extends INsdManager.Stub { HandlerThread thread = new HandlerThread(TAG); thread.start(); Handler handler = new Handler(thread.getLooper()); - NsdService service = new NsdService(context, settings, handler); - service.mNativeDaemonConnected.await(); + NsdService service = new NsdService(context, settings, handler, DaemonConnection::new); + service.mDaemonCallback.awaitConnection(); return service; } @@ -665,14 +661,23 @@ public class NsdService extends INsdManager.Stub { } class NativeCallbackReceiver implements INativeDaemonConnectorCallbacks { + private final CountDownLatch connected = new CountDownLatch(1); + + public void awaitConnection() throws InterruptedException { + connected.await(); + } + + @Override public void onDaemonConnected() { - mNativeDaemonConnected.countDown(); + connected.countDown(); } + @Override public boolean onCheckHoldWakeLock(int code) { return false; } + @Override public boolean onEvent(int code, String raw, String[] cooked) { // TODO: NDC translates a message to a callback, we could enhance NDC to // directly interact with a state machine through messages @@ -682,132 +687,102 @@ public class NsdService extends INsdManager.Stub { } } - private boolean startMDnsDaemon() { - if (DBG) Slog.d(TAG, "startMDnsDaemon"); - try { - mNativeConnector.execute("mdnssd", "start-service"); - } catch(NativeDaemonConnectorException e) { - Slog.e(TAG, "Failed to start daemon" + e); - return false; + interface DaemonConnectionSupplier { + DaemonConnection get(NativeCallbackReceiver callback); + } + + @VisibleForTesting + public static class DaemonConnection { + final NativeDaemonConnector mNativeConnector; + + DaemonConnection(NativeCallbackReceiver callback) { + mNativeConnector = new NativeDaemonConnector(callback, "mdns", 10, MDNS_TAG, 25, null); + new Thread(mNativeConnector, MDNS_TAG).start(); + } + + public boolean execute(Object... args) { + if (DBG) { + Slog.d(TAG, "mdnssd " + Arrays.toString(args)); + } + try { + mNativeConnector.execute("mdnssd", args); + } catch (NativeDaemonConnectorException e) { + Slog.e(TAG, "Failed to execute mdnssd " + Arrays.toString(args), e); + return false; + } + return true; } - return true; + + public boolean execute(Command cmd) { + if (DBG) { + Slog.d(TAG, cmd.toString()); + } + try { + mNativeConnector.execute(cmd); + } catch (NativeDaemonConnectorException e) { + Slog.e(TAG, "Failed to execute " + cmd, e); + return false; + } + return true; + } + } + + private boolean startMDnsDaemon() { + return mDaemon.execute("start-service"); } private boolean stopMDnsDaemon() { - if (DBG) Slog.d(TAG, "stopMDnsDaemon"); - try { - mNativeConnector.execute("mdnssd", "stop-service"); - } catch(NativeDaemonConnectorException e) { - Slog.e(TAG, "Failed to start daemon" + e); - return false; - } - return true; + return mDaemon.execute("stop-service"); } private boolean registerService(int regId, NsdServiceInfo service) { - if (DBG) Slog.d(TAG, "registerService: " + regId + " " + service); - try { - Command cmd = new Command("mdnssd", "register", regId, service.getServiceName(), - service.getServiceType(), service.getPort(), - Base64.encodeToString(service.getTxtRecord(), Base64.DEFAULT) - .replace("\n", "")); - - mNativeConnector.execute(cmd); - } catch(NativeDaemonConnectorException e) { - Slog.e(TAG, "Failed to execute registerService " + e); - return false; - } - return true; + if (DBG) { + Slog.d(TAG, "registerService: " + regId + " " + service); + } + String name = service.getServiceName(); + String type = service.getServiceType(); + int port = service.getPort(); + byte[] textRecord = service.getTxtRecord(); + String record = Base64.encodeToString(textRecord, Base64.DEFAULT).replace("\n", ""); + Command cmd = new Command("mdnssd", "register", regId, name, type, port, record); + return mDaemon.execute(cmd); } private boolean unregisterService(int regId) { - if (DBG) Slog.d(TAG, "unregisterService: " + regId); - try { - mNativeConnector.execute("mdnssd", "stop-register", regId); - } catch(NativeDaemonConnectorException e) { - Slog.e(TAG, "Failed to execute unregisterService " + e); - return false; - } - return true; + return mDaemon.execute("stop-register", regId); } private boolean updateService(int regId, DnsSdTxtRecord t) { - if (DBG) Slog.d(TAG, "updateService: " + regId + " " + t); - try { - if (t == null) return false; - mNativeConnector.execute("mdnssd", "update", regId, t.size(), t.getRawData()); - } catch(NativeDaemonConnectorException e) { - Slog.e(TAG, "Failed to updateServices " + e); + if (t == null) { return false; } - return true; + return mDaemon.execute("update", regId, t.size(), t.getRawData()); } private boolean discoverServices(int discoveryId, String serviceType) { - if (DBG) Slog.d(TAG, "discoverServices: " + discoveryId + " " + serviceType); - try { - mNativeConnector.execute("mdnssd", "discover", discoveryId, serviceType); - } catch(NativeDaemonConnectorException e) { - Slog.e(TAG, "Failed to discoverServices " + e); - return false; - } - return true; + return mDaemon.execute("discover", discoveryId, serviceType); } private boolean stopServiceDiscovery(int discoveryId) { - if (DBG) Slog.d(TAG, "stopServiceDiscovery: " + discoveryId); - try { - mNativeConnector.execute("mdnssd", "stop-discover", discoveryId); - } catch(NativeDaemonConnectorException e) { - Slog.e(TAG, "Failed to stopServiceDiscovery " + e); - return false; - } - return true; + return mDaemon.execute("stop-discover", discoveryId); } private boolean resolveService(int resolveId, NsdServiceInfo service) { - if (DBG) Slog.d(TAG, "resolveService: " + resolveId + " " + service); - try { - mNativeConnector.execute("mdnssd", "resolve", resolveId, service.getServiceName(), - service.getServiceType(), "local."); - } catch(NativeDaemonConnectorException e) { - Slog.e(TAG, "Failed to resolveService " + e); - return false; - } - return true; + String name = service.getServiceName(); + String type = service.getServiceType(); + return mDaemon.execute("resolve", resolveId, name, type, "local."); } private boolean stopResolveService(int resolveId) { - if (DBG) Slog.d(TAG, "stopResolveService: " + resolveId); - try { - mNativeConnector.execute("mdnssd", "stop-resolve", resolveId); - } catch(NativeDaemonConnectorException e) { - Slog.e(TAG, "Failed to stop resolve " + e); - return false; - } - return true; + return mDaemon.execute("stop-resolve", resolveId); } private boolean getAddrInfo(int resolveId, String hostname) { - if (DBG) Slog.d(TAG, "getAdddrInfo: " + resolveId); - try { - mNativeConnector.execute("mdnssd", "getaddrinfo", resolveId, hostname); - } catch(NativeDaemonConnectorException e) { - Slog.e(TAG, "Failed to getAddrInfo " + e); - return false; - } - return true; + return mDaemon.execute("getaddrinfo", resolveId, hostname); } private boolean stopGetAddrInfo(int resolveId) { - if (DBG) Slog.d(TAG, "stopGetAdddrInfo: " + resolveId); - try { - mNativeConnector.execute("mdnssd", "stop-getaddrinfo", resolveId); - } catch(NativeDaemonConnectorException e) { - Slog.e(TAG, "Failed to stopGetAddrInfo " + e); - return false; - } - return true; + return mDaemon.execute("stop-getaddrinfo", resolveId); } @Override diff --git a/services/core/java/com/android/server/SyntheticPasswordManager.java b/services/core/java/com/android/server/SyntheticPasswordManager.java index b1a0d77647550ca7b0ab16bcc04f949444791cb8..6722bc5a5485b3586a0fc8b17d1fdfec779fdad2 100644 --- a/services/core/java/com/android/server/SyntheticPasswordManager.java +++ b/services/core/java/com/android/server/SyntheticPasswordManager.java @@ -101,7 +101,7 @@ public class SyntheticPasswordManager { // 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; @@ -583,6 +583,9 @@ public class SyntheticPasswordManager { sid = GateKeeper.INVALID_SECURE_USER_ID; applicationId = transformUnderWeaverSecret(pwdToken, weaverSecret); } else { + // In case GK enrollment leaves persistent state around (in RPMB), this will nuke them + // to prevent them from accumulating and causing problems. + gatekeeper.clearSecureUserId(fakeUid(userId)); // GateKeeper based user password GateKeeperResponse response = gatekeeper.enroll(fakeUid(userId), null, null, passwordTokenToGkInput(pwdToken)); diff --git a/services/core/java/com/android/server/SystemService.java b/services/core/java/com/android/server/SystemService.java index c105b1244e74242b7b8796bdc8dd26f21c8a4d61..94397d07e1a247fa6b0ad5379bb6c7479b5cc813 100644 --- a/services/core/java/com/android/server/SystemService.java +++ b/services/core/java/com/android/server/SystemService.java @@ -173,6 +173,9 @@ public abstract class SystemService { * 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). + * + *

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 @@ public abstract class SystemService { * 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. + * + *

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/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index 018e41b7bef13b956179aaa93fb9587df67e4d0f..03da5b21fef8bb9bd4c1e18e82533c82c51c1b0b 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 @@ public class AccountManagerService 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 @@ public class AccountManagerService 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 c6e44e0d424c59b459e9ef1e8815ca9a68652289..e0fc531eb326a3dd28bd5bf80adf838af56d3d78 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 java.util.Set; 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.Looper; 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 @@ public final class ActiveServices { // 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 @@ public final class ActiveServices { /** Temporary list for holding the results of calls to {@link #collectPackageServicesLocked} */ private ArrayList 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 @@ -175,10 +160,24 @@ public final class ActiveServices { } }; + /** + * 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 mServicesByName = new ArrayMap<>(); final ArrayMap mServicesByIntent = new ArrayMap<>(); @@ -196,7 +195,11 @@ public final class ActiveServices { final ArrayList mStartingBackground = new ArrayList<>(); + final ArrayMap 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 @@ public final class ActiveServices { rescheduleDelayedStartsLocked(); } } break; + case MSG_UPDATE_FOREGROUND_APPS: { + updateForegroundApps(this); + } break; } } @@ -528,7 +534,7 @@ public final class ActiveServices { 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 @@ public final class ActiveServices { } } + void updateForegroundApps(ServiceMap smap) { + // This is called from the handler without the lock held. + ArrayList 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 @@ public final class ActiveServices { } 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 @@ public final class ActiveServices { PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE); } else { if (r.isForeground) { + final ServiceMap smap = getServiceMapLocked(r.userId); + if (smap != null) { + decActiveForegroundAppLocked(smap, r); + } r.isForeground = false; if (r.app != null) { mAm.updateLruProcessLocked(r.app, false, null); @@ -1561,8 +1752,8 @@ public final class ActiveServices { if ((r.serviceInfo.applicationInfo.flags &ApplicationInfo.FLAG_PERSISTENT) == 0) { - long minDuration = SERVICE_RESTART_DURATION; - long resetTime = SERVICE_RESET_RUN_DURATION; + long minDuration = mAm.mConstants.SERVICE_RESTART_DURATION; + long resetTime = mAm.mConstants.SERVICE_RESET_RUN_DURATION; // Any delivered but not yet finished starts should be put back // on the pending list. @@ -1603,7 +1794,7 @@ public final class ActiveServices { r.restartCount = 1; r.restartDelay = minDuration; } else { - r.restartDelay *= SERVICE_RESTART_DURATION_FACTOR; + r.restartDelay *= mAm.mConstants.SERVICE_RESTART_DURATION_FACTOR; if (r.restartDelay < minDuration) { r.restartDelay = minDuration; } @@ -1617,13 +1808,12 @@ public final class ActiveServices { boolean repeat; do { repeat = false; + final long restartTimeBetween = mAm.mConstants.SERVICE_MIN_RESTART_TIME_BETWEEN; for (int i=mRestartingServices.size()-1; i>=0; i--) { ServiceRecord r2 = mRestartingServices.get(i); - if (r2 != r && r.nextRestartTime - >= (r2.nextRestartTime-SERVICE_MIN_RESTART_TIME_BETWEEN) - && r.nextRestartTime - < (r2.nextRestartTime+SERVICE_MIN_RESTART_TIME_BETWEEN)) { - r.nextRestartTime = r2.nextRestartTime + SERVICE_MIN_RESTART_TIME_BETWEEN; + if (r2 != r && r.nextRestartTime >= (r2.nextRestartTime-restartTimeBetween) + && r.nextRestartTime < (r2.nextRestartTime+restartTimeBetween)) { + r.nextRestartTime = r2.nextRestartTime + restartTimeBetween; r.restartDelay = r.nextRestartTime - now; repeat = true; break; @@ -1868,7 +2058,8 @@ public final class ActiveServices { final boolean newService = app.services.add(r); bumpServiceExecutingLocked(r, execInFg, "create"); mAm.updateLruProcessLocked(app, false, null); - updateServiceForegroundLocked(r.app, true); + updateServiceForegroundLocked(r.app, /* oomAdj= */ false); + mAm.updateOomAdjLocked(); boolean created = false; try { @@ -2150,7 +2341,10 @@ public final class ActiveServices { final ServiceMap smap = getServiceMapLocked(r.userId); ServiceRecord found = smap.mServicesByName.remove(r.name); - if (found != r) { + + // Note when this method is called by bringUpServiceLocked(), the service is not found + // in mServicesByName and found will be null. + if (found != null && found != r) { // This is not actually the service we think is running... this should not happen, // but if it does, fail hard. smap.mServicesByName.put(r.name, found); @@ -2170,6 +2364,9 @@ public final class ActiveServices { } cancelForegroundNotificationLocked(r); + if (r.isForeground) { + decActiveForegroundAppLocked(smap, r); + } r.isForeground = false; r.foregroundId = 0; r.foregroundNoti = null; @@ -2608,6 +2805,22 @@ public final class ActiveServices { 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 services = new ArrayList<>(); ArrayMap alls = getServicesLocked(tr.userId); @@ -3390,6 +3603,55 @@ public final class ActiveServices { } } + 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 55ee18335410ce626099e2b98e69697699f3e072..5749f31ddb2e1a42eb4fd8d35a1204abc1de0a5a 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.content.ContentResolver; 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 @@ final class ActivityManagerConstants extends ContentObserver { } 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 @@ final class ActivityManagerConstants extends ContentObserver { 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 bef74e85170a0559f9be5f220933ea5509782e44..ace2b557c4a6674f0041b24e7ca9c4a9b494fff5 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -513,41 +513,12 @@ public class ActivityManagerService extends IActivityManager.Stub // 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 @@ public class ActivityManagerService extends IActivityManager.Stub // 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; @@ -1477,12 +1436,6 @@ public class ActivityManagerService extends IActivityManager.Stub final ProcessMap> mForegroundPackages = new ProcessMap>(); - /** - * This is set if we had to do a delayed dexopt of an app before launching - * it, to increase the ANR timeouts in that case. - */ - boolean mDidDexOpt; - /** * Set if the systemServer made a call to enterSafeMode. */ @@ -1965,13 +1918,6 @@ public class ActivityManagerService extends IActivityManager.Stub } } break; case SERVICE_TIMEOUT_MSG: { - if (mDidDexOpt) { - mDidDexOpt = false; - Message nmsg = mHandler.obtainMessage(SERVICE_TIMEOUT_MSG); - nmsg.obj = msg.obj; - mHandler.sendMessageDelayed(nmsg, ActiveServices.SERVICE_TIMEOUT); - return; - } mServices.serviceTimeout((ProcessRecord)msg.obj); } break; case SERVICE_FOREGROUND_TIMEOUT_MSG: { @@ -2047,13 +1993,6 @@ public class ActivityManagerService extends IActivityManager.Stub } } break; case PROC_START_TIMEOUT_MSG: { - if (mDidDexOpt) { - mDidDexOpt = false; - Message nmsg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG); - nmsg.obj = msg.obj; - mHandler.sendMessageDelayed(nmsg, PROC_START_TIMEOUT); - return; - } ProcessRecord app = (ProcessRecord)msg.obj; synchronized (ActivityManagerService.this) { processStartTimedOutLocked(app); @@ -2147,7 +2086,7 @@ public class ActivityManagerService extends IActivityManager.Stub 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 +4198,7 @@ public class ActivityManagerService extends IActivityManager.Stub "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"); } @@ -5345,7 +5284,7 @@ public class ActivityManagerService extends IActivityManager.Stub 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 +7042,7 @@ public class ActivityManagerService extends IActivityManager.Stub 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"); @@ -12277,14 +12216,15 @@ public class ActivityManagerService extends IActivityManager.Stub } 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(); @@ -12298,7 +12238,20 @@ public class ActivityManagerService extends IActivityManager.Stub 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; } } @@ -12807,12 +12760,6 @@ public class ActivityManagerService extends IActivityManager.Stub return false; } - if (mDidDexOpt) { - // Give more time since we were dexopting. - mDidDexOpt = false; - return false; - } - if (proc.instr != null) { Bundle info = new Bundle(); info.putString("shortMsg", "keyDispatchingTimedOut"); @@ -12836,7 +12783,7 @@ public class ActivityManagerService extends IActivityManager.Stub 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; } @@ -12906,25 +12853,21 @@ public class ActivityManagerService extends IActivityManager.Stub 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()"); @@ -12974,7 +12917,7 @@ public class ActivityManagerService extends IActivityManager.Stub } try { activity.app.thread.requestAssistContextExtras(activity.appToken, pae, requestType, - mViSessionId); + mViSessionId, flags); mPendingAssistExtras.add(pae); mUiHandler.postDelayed(pae, timeout); } catch (RemoteException e) { @@ -13086,7 +13029,7 @@ public class ActivityManagerService extends IActivityManager.Stub 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) { @@ -14645,8 +14588,10 @@ public class ActivityManagerService extends IActivityManager.Stub } 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 { @@ -14656,7 +14601,8 @@ public class ActivityManagerService extends IActivityManager.Stub } 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) { @@ -14671,7 +14617,7 @@ public class ActivityManagerService extends IActivityManager.Stub 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; } @@ -14681,6 +14627,7 @@ public class ActivityManagerService extends IActivityManager.Stub enforceNotIsolatedCaller("getRunningAppProcesses"); final int callingUid = Binder.getCallingUid(); + final int clientTargetSdk = mPackageManagerInt.getUidTargetSdkVersion(callingUid); // Lazy instantiation of list List runList = null; @@ -14703,7 +14650,7 @@ public class ActivityManagerService extends IActivityManager.Stub 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 = @@ -14759,12 +14706,16 @@ public class ActivityManagerService extends IActivityManager.Stub @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); } } @@ -19031,6 +18982,8 @@ public class ActivityManagerService extends IActivityManager.Stub removeTasksByPackageNameLocked(ssp, userId); + mServices.removeUninstalledPackageLocked(ssp, userId); + // Hide the "unsupported display" dialog if necessary. if (mUnsupportedDisplaySizeDialog != null && ssp.equals( mUnsupportedDisplaySizeDialog.getPackageName())) { @@ -19716,12 +19669,12 @@ public class ActivityManagerService extends IActivityManager.Stub 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; @@ -20820,8 +20773,8 @@ public class ActivityManagerService extends IActivityManager.Stub 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; @@ -20853,7 +20806,7 @@ public class ActivityManagerService extends IActivityManager.Stub 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. @@ -20918,8 +20871,7 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ -20965,7 +20917,8 @@ public class ActivityManagerService extends IActivityManager.Stub 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. @@ -21009,6 +20962,12 @@ public class ActivityManagerService extends IActivityManager.Stub } } } + } 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) { @@ -21147,7 +21106,8 @@ public class ActivityManagerService extends IActivityManager.Stub } } - 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; @@ -21169,6 +21129,7 @@ public class ActivityManagerService extends IActivityManager.Stub 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. @@ -21364,7 +21325,8 @@ public class ActivityManagerService extends IActivityManager.Stub 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; } } @@ -21446,7 +21408,7 @@ public class ActivityManagerService extends IActivityManager.Stub 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. @@ -21489,10 +21451,10 @@ public class ActivityManagerService extends IActivityManager.Stub 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); } @@ -21525,7 +21487,7 @@ public class ActivityManagerService extends IActivityManager.Stub */ 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)) { @@ -21555,10 +21517,10 @@ public class ActivityManagerService extends IActivityManager.Stub 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(); @@ -21723,9 +21685,11 @@ public class ActivityManagerService extends IActivityManager.Stub } } } 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); } @@ -21814,7 +21778,7 @@ public class ActivityManagerService extends IActivityManager.Stub 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); @@ -21987,7 +21951,8 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ -21996,8 +21961,8 @@ public class ActivityManagerService extends IActivityManager.Stub && 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) { @@ -22513,7 +22478,8 @@ public class ActivityManagerService extends IActivityManager.Stub // 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 { @@ -22618,7 +22584,7 @@ public class ActivityManagerService extends IActivityManager.Stub 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(); @@ -22643,7 +22609,7 @@ public class ActivityManagerService extends IActivityManager.Stub if (nextTime > 0) { mHandler.removeMessages(IDLE_UIDS_MSG); mHandler.sendEmptyMessageDelayed(IDLE_UIDS_MSG, - nextTime + BACKGROUND_SETTLE_TIME - nowElapsed); + nextTime + mConstants.BACKGROUND_SETTLE_TIME - nowElapsed); } } } diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 158175f4b0d95d7b7b5004e47a93eb30e292feef..7bd8b0b3209a1aad86e49fc49c5e0d1ccdb67520 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -2328,6 +2328,9 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo 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 e3dfd9830e7182afdbeb7ee1f0f635ceae4fdac3..57dfd05ebbb3558d4cc0aeb8939602c51f57680d 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -3301,13 +3301,21 @@ class ActivityStack extends ConfigurationContai 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 +3381,8 @@ class ActivityStack extends ConfigurationContai 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 bff3ce3a3885084a56f534bd2ff8db02df088aca..d84a1c03a4534d6f43410e9daccf85c9c427f0d5 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.ActivityManager.StackInfo; 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.MediaStore; 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 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D 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 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D 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 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D 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 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // Calculate the default bounds (don't use existing stack bounds as we may have just created // the stack - final Rect destBounds = mWindowManager.getPictureInPictureBounds(DEFAULT_DISPLAY, - aspectRatio, false /* useExistingStackBounds */); + final Rect destBounds = stack.getPictureInPictureBounds(aspectRatio, + false /* useExistingStackBounds */); stack.animateResizePinnedStack(sourceHintBounds, destBounds, -1 /* animationDuration */, true /* schedulePipModeChangedOnAnimationEnd */); @@ -3944,10 +3942,11 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } 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; @@ -4356,13 +4355,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D case IDLE_TIMEOUT_MSG: { if (DEBUG_IDLE) Slog.d(TAG_IDLE, "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj); - if (mService.mDidDexOpt) { - mService.mDidDexOpt = false; - Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); - nmsg.obj = msg.obj; - mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT); - return; - } // We don't at this point know if the activity is fullscreen, // so we need to be conservative and assume it isn't. activityIdleInternal((ActivityRecord) msg.obj, @@ -4388,11 +4380,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } } break; case LAUNCH_TIMEOUT_MSG: { - if (mService.mDidDexOpt) { - mService.mDidDexOpt = false; - mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT); - return; - } synchronized (mService) { if (mLaunchingActivity.isHeld()) { Slog.w(TAG, "Launch timeout has expired, giving up wake lock!"); @@ -5140,10 +5127,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D 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 1f4b21b14ed59d9af595b425440eedfb9b679e04..ca842d5574d32335e2b87f4a6df1d6e484975103 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 @@ class ActivityStarter { 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 @@ class ActivityStarter { // 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 @@ class ActivityStarter { * Creates a launch intent for the given auxiliary resolution data. */ private @NonNull Intent createLaunchIntent(@NonNull AuxiliaryResolveInfo auxiliaryResponse, - Intent originalIntent, String callingPackage, String resolvedType, int userId) { + Intent originalIntent, String callingPackage, Bundle verificationBundle, + String resolvedType, int userId) { if (auxiliaryResponse.needsPhaseTwo) { // request phase two resolution mService.getPackageManagerInternalLocked().requestInstantAppResolutionPhaseTwo( - auxiliaryResponse, originalIntent, resolvedType, callingPackage, userId); + auxiliaryResponse, originalIntent, resolvedType, callingPackage, + verificationBundle, userId); } return InstantAppResolver.buildEphemeralInstallerIntent(originalIntent, - callingPackage, resolvedType, userId, auxiliaryResponse.packageName, + callingPackage, verificationBundle, resolvedType, userId, auxiliaryResponse.packageName, auxiliaryResponse.splitName, auxiliaryResponse.versionCode, auxiliaryResponse.token, auxiliaryResponse.needsPhaseTwo); } diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java index ba72dcf23c98bca58d7eddf9abe21f9f351520e9..d6bfb35b193539d4c39000745520a6c1d8b8ca4b 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 @@ class AppErrors { 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 firstPids = new ArrayList(5); @@ -812,7 +832,7 @@ class AppErrors { firstPids.add(app.pid); // Don't dump other PIDs if it's a background ANR - isSilentANR = !showBackground && !app.isInterestingToUserLocked() && app.pid != MY_PID; + isSilentANR = !showBackground && !isInterestingForBackgroundTraces(app); if (!isSilentANR) { int parentPid = app.pid; if (parent != null && parent.app != null && parent.app.pid > 0) { diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index d08298bcac058cb7a9d0ebe81e48a8a42736816a..090234c42eec3c8b68e68814abfe214fdf44b93c 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -1399,13 +1399,6 @@ public final class BroadcastQueue { long now = SystemClock.uptimeMillis(); BroadcastRecord r = mOrderedBroadcasts.get(0); if (fromMsg) { - if (mService.mDidDexOpt) { - // Delay timeouts until dexopt finishes. - mService.mDidDexOpt = false; - long timeoutTime = SystemClock.uptimeMillis() + mTimeoutPeriod; - setBroadcastTimeoutLocked(timeoutTime); - return; - } if (!mService.mProcessesReady) { // Only process broadcast timeouts if the system is ready. That way // PRE_BOOT_COMPLETED broadcasts can't timeout as they are intended diff --git a/services/core/java/com/android/server/am/ConnectionRecord.java b/services/core/java/com/android/server/am/ConnectionRecord.java index cd370412554e9c33bc2028aa3884dac058d95a34..9b7a0c43b19106d533ebec72773064aac123f282 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 @@ final class ConnectionRecord { 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 dd16e228cbe3e0358b37e96e054fca8c34eb0d31..144eb11cbf8544a931c65a7c58a518f3f3ca631d 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 @@ class KeyguardController { return; } mKeyguardShowing = showing; + dismissDockedStackIfNeeded(); if (showing) { mKeyguardGoingAway = false; mDismissalRequested = false; diff --git a/services/core/java/com/android/server/am/PinnedActivityStack.java b/services/core/java/com/android/server/am/PinnedActivityStack.java index a4932bbdd732b3eb7a024bf3806044edc3d4488d..672f563d17ca8747b9138d2fe40cfefab278616a 100644 --- a/services/core/java/com/android/server/am/PinnedActivityStack.java +++ b/services/core/java/com/android/server/am/PinnedActivityStack.java @@ -43,6 +43,11 @@ class PinnedActivityStack extends ActivityStack return new PinnedStackWindowController(mStackId, this, displayId, onTop, outBounds); } + Rect getPictureInPictureBounds(float aspectRatio, boolean useExistingStackBounds) { + return getWindowContainerController().getPictureInPictureBounds(aspectRatio, + useExistingStackBounds); + } + void animateResizePinnedStack(Rect sourceHintBounds, Rect toBounds, int animationDuration, boolean schedulePipModeChangedOnAnimationEnd) { getWindowContainerController().animateResizePinnedStack(toBounds, sourceHintBounds, diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 0dc6788133388cc766eabba7bec372ca4e85db9d..80e7c757931ce9b69632ca5de7e8d72681f8ade7 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 @@ final class ProcessList { 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 @@ final class ProcessList { 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 @@ final class ProcessList { 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 @@ final class ProcessList { 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 @@ final class ProcessList { 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 @@ final class ProcessList { 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 3c5c5fd0cfe4ec701d7a808d18fa0576bc0b8821..b025385413eadef12b4e9375e96f0b322642f895 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 @@ final class ProcessRecord { 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/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index 22d1bd12685c6a5600c3dc47479a753892e14ed4..abe2daf65322c1f9e92211c2e283d9e2f908cfed 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 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta 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(); } } } diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 742ee3553896d626cc5a3663289a7980e6be5615..e9555f7870d78340b53a224a378442f57493d0cc 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 @@ public class AudioService extends IAudioService.Stub 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 @@ public class AudioService extends IAudioService.Stub 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 @@ public class AudioService extends IAudioService.Stub } } 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 @@ public class AudioService extends IAudioService.Stub 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 */, @@ -3929,6 +3930,16 @@ public class AudioService extends IAudioService.Stub } 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) { @@ -3936,8 +3947,9 @@ public class AudioService extends IAudioService.Stub } 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 @@ public class AudioService extends IAudioService.Stub } } + 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 @@ public class AudioService extends IAudioService.Stub 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 @@ public class AudioService extends IAudioService.Stub // 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 @@ public class AudioService extends IAudioService.Stub 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 @@ public class AudioService extends IAudioService.Stub private void onBluetoothA2dpDeviceConfigChange(BluetoothDevice btDevice) { - if (DEBUG_VOL) { + if (DEBUG_DEVICES) { Log.d(TAG, "onBluetoothA2dpDeviceConfigChange btDevice=" + btDevice); } if (btDevice == null) { @@ -5128,12 +5173,22 @@ public class AudioService extends IAudioService.Stub 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 @@ public class AudioService extends IAudioService.Stub 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 @@ public class AudioService extends IAudioService.Stub // 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 @@ public class AudioService extends IAudioService.Stub 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 @@ public class AudioService extends IAudioService.Stub } } + 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 @@ public class AudioService extends IAudioService.Stub } 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 @@ public class AudioService extends IAudioService.Stub 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 @@ public class AudioService extends IAudioService.Stub 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/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java index b3d2e3099c1b86824647e14c3e1e721df3caedeb..36779059eb63bfa924ae2e748c3a96039b489899 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 class NetworkMonitor extends StateMachine { 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 ec6a414489423117c5b0957c638ab00ddadfc847..e98c5b98eed5bba8662b31918230c2eccfc2502f 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -222,6 +222,10 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering return (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); } + private WifiManager getWifiManager() { + return (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); + } + private void updateConfiguration() { mConfig = new TetheringConfiguration(mContext); } @@ -412,16 +416,21 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } private int setWifiTethering(final boolean enable) { - synchronized (mPublicSync) { - mWifiTetherRequested = enable; - final WifiManager wifiManager = - (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); - if ((enable && wifiManager.startSoftAp(null /* use existing wifi config */)) || - (!enable && wifiManager.stopSoftAp())) { - 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) { @@ -1351,12 +1360,37 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } 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 { @@ -1672,7 +1706,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering 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 e21349af8649ad4e5b052a4c7c111ac7cd441b1c..d3cfd875faae3669d98cb811634621e3e912dc54 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 @@ public class TetherInterfaceStateMachine extends StateMachine { setInitialState(mInitialState); } - public int interfaceType() { - return mInterfaceType; - } + public String interfaceName() { return mIfaceName; } + + public int interfaceType() { return mInterfaceType; } + + public int lastError() { return mLastError; } // configured when we start tethering and unconfig'd on error or conclusion private boolean configureIfaceIp(boolean enabled) { diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java index 313abab7a7501a33b6364b8de69b65acd2c16453..dbccc0765b7391230e90c883662782cc7b17f39e 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 @@ public final class DreamManagerService extends SystemService { && mCurrentDreamIsTest == isTest && mCurrentDreamCanDoze == canDoze && mCurrentDreamUserId == userId) { + Slog.i(TAG, "Already in target dream."); return; } @@ -388,6 +389,7 @@ public final class DreamManagerService extends SystemService { 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 abb2b555be578a121fdd16eef9d15ed9b1e5b0d7..e2c1274a4be6a8172d7a1cced9a7890908682137 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 @@ public final class JobSchedulerService extends com.android.server.SystemService } 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 @@ public final class JobSchedulerService extends com.android.server.SystemService 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 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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } } - 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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { 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/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 51cc39174f0d58198cfccd1b07f7b15e9742ffb8..ed47c3e55b7475408418c2836119c440035eddf5 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 android.view.WindowManager.LayoutParams.TYPE_TOAST; 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 @@ public class NotificationManagerService extends SystemService { 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 @@ public class NotificationManagerService extends SystemService { @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 @@ public class NotificationManagerService extends SystemService { 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 @@ public class NotificationManagerService extends SystemService { @Override public void onStart() { + SnoozeHelper snoozeHelper = new SnoozeHelper(getContext(), new SnoozeHelper.Callback() { + @Override + public void repost(int userId, NotificationRecord r) { + try { + if (DBG) { + Slog.d(TAG, "Reposting " + r.getKey()); + } + enqueueNotificationInternal(r.sbn.getPackageName(), r.sbn.getOpPkg(), + r.sbn.getUid(), r.sbn.getInitialPid(), r.sbn.getTag(), r.sbn.getId(), + r.sbn.getNotification(), userId); + } catch (Exception e) { + Slog.e(TAG, "Cannot un-snooze notification", e); + } + } + }, mUserProfiles); + init(Looper.myLooper(), AppGlobals.getPackageManager(), getContext().getPackageManager(), getLocalService(LightsManager.class), new NotificationListeners(), - null); + null, snoozeHelper); publishBinderService(Context.NOTIFICATION_SERVICE, mService); publishLocalService(NotificationManagerInternal.class, mInternalService); } @@ -2838,6 +2849,7 @@ public class NotificationManagerService extends SystemService { 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) @@ -3304,7 +3316,7 @@ public class NotificationManagerService extends SystemService { return false; } } else if (isCallerInstantApp(pkg)) { - // Ephemeral apps have some special contraints for notifications. + // Ephemeral apps have some special constraints for notifications. // They are not allowed to create new notifications however they are allowed to // update notifications created by the system (e.g. a foreground service // notification). @@ -3378,6 +3390,76 @@ public class NotificationManagerService extends SystemService { 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 groupNotifications = findGroupNotificationsLocked( + r.sbn.getPackageName(), r.sbn.getGroupKey(), r.sbn.getUserId()); + if (r.getNotification().isGroupSummary()) { + // snooze summary and all children + for (int i = 0; i < groupNotifications.size(); i++) { + snoozeNotificationLocked(groupNotifications.get(i)); + } + } else { + // if there is a valid summary for this group, and we are snoozing the only + // child, also snooze the summary + if (mSummaryByGroupKey.containsKey(r.sbn.getGroupKey())) { + if (groupNotifications.size() != 2) { + snoozeNotificationLocked(r); + } else { + // snooze summary and the one child + for (int i = 0; i < groupNotifications.size(); i++) { + snoozeNotificationLocked(groupNotifications.get(i)); + } + } + } else { + snoozeNotificationLocked(r); + } + } + } else { + // just snooze the one notification + snoozeNotificationLocked(r); + } + } + + void snoozeNotificationLocked(NotificationRecord r) { + MetricsLogger.action(r.getLogMaker() + .setCategory(MetricsEvent.NOTIFICATION_SNOOZED) + .setType(MetricsEvent.TYPE_CLOSE) + .addTaggedData(MetricsEvent.NOTIFICATION_SNOOZED_CRITERIA, + mSnoozeCriterionId == null ? 0 : 1)); + cancelNotificationLocked(r, false, REASON_SNOOZED); + updateLightsLocked(); + if (mSnoozeCriterionId != null) { + mNotificationAssistants.notifyAssistantSnoozedLocked(r.sbn, mSnoozeCriterionId); + mSnoozeHelper.snooze(r); + } else { + mSnoozeHelper.snooze(r, mDuration); + } + savePolicyFile(); + } + } + protected class EnqueueNotificationRunnable implements Runnable { private final NotificationRecord r; private final int userId; @@ -3412,6 +3494,11 @@ public class NotificationManagerService extends SystemService { // 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") @@ -4130,7 +4217,9 @@ public class NotificationManagerService extends SystemService { 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 +4342,11 @@ public class NotificationManagerService extends SystemService { 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 +4476,7 @@ public class NotificationManagerService extends SystemService { 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 +4485,7 @@ public class NotificationManagerService extends SystemService { 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 +4598,30 @@ public class NotificationManagerService extends SystemService { } } + @NonNull List findGroupNotificationsLocked(String pkg, + String groupKey, int userId) { + List records = new ArrayList<>(); + records.addAll(findGroupNotificationByListLocked(mNotificationList, pkg, groupKey, userId)); + records.addAll( + findGroupNotificationByListLocked(mEnqueuedNotifications, pkg, groupKey, userId)); + return records; + } + + + private @NonNull List findGroupNotificationByListLocked( + ArrayList list, String pkg, String groupKey, int userId) { + List 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 +4636,7 @@ public class NotificationManagerService extends SystemService { return null; } - private NotificationRecord findNotificationLocked(String pkg, String tag, int id, int userId) { + NotificationRecord findNotificationLocked(String pkg, String tag, int id, int userId) { NotificationRecord r; if ((r = findNotificationByListLocked(mNotificationList, pkg, tag, id, userId)) != null) { return r; diff --git a/services/core/java/com/android/server/notification/SnoozeHelper.java b/services/core/java/com/android/server/notification/SnoozeHelper.java index 913f636edfbab6eb95b2607f865c8de08c0d5b49..a178a525cedeacef9fae42720c597425d1ee547b 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 org.xmlpull.v1.XmlSerializer; 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 @@ public class SnoozeHelper { 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 @@ public class SnoozeHelper { protected Collection 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 @@ public class SnoozeHelper { protected @NonNull List getSnoozed() { List snoozedForUser = new ArrayList<>(); int[] userIds = mUserProfiles.getCurrentProfileIds(); - final int N = userIds.length; - for (int i = 0; i < N; i++) { - final ArrayMap> snoozedPkgs = - mSnoozedNotifications.get(userIds[i]); - if (snoozedPkgs != null) { - final int M = snoozedPkgs.size(); - for (int j = 0; j < M; j++) { - final ArrayMap 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> snoozedPkgs = + mSnoozedNotifications.get(userIds[i]); + if (snoozedPkgs != null) { + final int M = snoozedPkgs.size(); + for (int j = 0; j < M; j++) { + final ArrayMap records = snoozedPkgs.valueAt(j); + if (records != null) { + snoozedForUser.addAll(records.values()); + } } } } @@ -165,16 +167,10 @@ public class SnoozeHelper { for (Map.Entry 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 @@ public class SnoozeHelper { final int N = userIds.length; for (int i = 0; i < N; i++) { final ArrayMap> 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 @@ public class SnoozeHelper { 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 @@ public class SnoozeHelper { if (mSnoozedNotifications.containsKey(userId)) { if (mSnoozedNotifications.get(userId).containsKey(pkg)) { ArrayMap 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 @@ public class SnoozeHelper { 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 @@ public class SnoozeHelper { 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 @@ public class SnoozeHelper { 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 @@ public class SnoozeHelper { } } + protected void repostGroupSummary(String pkg, int userId, String groupKey) { + if (mSnoozedNotifications.containsKey(userId)) { + ArrayMap> keysByPackage + = mSnoozedNotifications.get(userId); + + if (keysByPackage != null && keysByPackage.containsKey(pkg)) { + ArrayMap 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 fc9e0a3edd51f148276709ab68f788839bd384a9..b1659841d5acbecf9cf4e841fbe91758bfd6c7c3 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 @@ class InstantAppRegistry { 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 b56db047fd302466525deb94bf9b0c56928a67f8..624d8c9ef13eac78ca84546ec44d28805da8018e 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.content.pm.InstantAppResolveInfo.InstantAppDigest; 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 @@ public abstract class InstantAppResolver { final Intent installerIntent = buildEphemeralInstallerIntent( requestObj.origIntent, requestObj.callingPackage, + requestObj.verificationBundle, requestObj.resolvedType, requestObj.userId, packageName, @@ -172,6 +174,7 @@ public abstract class InstantAppResolver { */ 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 @@ public abstract class InstantAppResolver { 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/InstructionSets.java b/services/core/java/com/android/server/pm/InstructionSets.java index 5092ebf9d4b937f9b310b6790ab303fb71808114..f326f1d20c46fda721a458941dfe074e8e678e31 100644 --- a/services/core/java/com/android/server/pm/InstructionSets.java +++ b/services/core/java/com/android/server/pm/InstructionSets.java @@ -34,7 +34,7 @@ import dalvik.system.VMRuntime; */ public class InstructionSets { private static final String PREFERRED_INSTRUCTION_SET = - VMRuntime.getInstructionSet(Build.SUPPORTED_ABIS[0]);; + VMRuntime.getInstructionSet(Build.SUPPORTED_ABIS[0]); public static String[] getAppDexInstructionSets(ApplicationInfo info) { if (info.primaryCpuAbi != null) { if (info.secondaryCpuAbi != null) { diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index 254bc2ac0e8bbce1311c757981c72345450cdd44..4c0d9da52f37fadfc4c8bf4973f7e8c14796cd41 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -361,10 +361,10 @@ public class PackageDexOptimizer { 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 99b24e2c42e5999f8586eb087812aa7044f9c496..03f6aaa2129399c61b5844be2e2b48e29a2eb559 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -127,6 +127,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.AppsQueryHelper; import android.content.pm.ChangedPackages; import android.content.pm.ComponentInfo; +import android.content.pm.IDexModuleRegisterCallback; import android.content.pm.InstantAppRequest; import android.content.pm.AuxiliaryResolveInfo; import android.content.pm.FallbackCategoryProvider; @@ -739,12 +740,123 @@ public class PackageManagerService extends IPackageManager.Stub @GuardedBy("mPackages") final SparseArray> 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 getStaticOverlayPackagesLocked( + Collection allPackages, String targetPackageName) { + List overlayPackages = null; + for (PackageParser.Package p : allPackages) { + if (targetPackageName.equals(p.mOverlayTarget) && p.mIsStaticOverlay) { + if (overlayPackages == null) { + overlayPackages = new ArrayList(); + } + overlayPackages.add(p); + } + } + if (overlayPackages != null) { + Comparator cmp = new Comparator() { + public int compare(PackageParser.Package p1, PackageParser.Package p2) { + return p1.mOverlayPriority - p2.mOverlayPriority; + } + }; + Collections.sort(overlayPackages, cmp); + } + return overlayPackages; + } + + final String[] getStaticOverlayPathsLocked(Collection 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 overlayPackages = + getStaticOverlayPackagesLocked(allPackages, targetPackageName); + if (overlayPackages == null || overlayPackages.isEmpty()) { + return null; + } + List overlayPathList = null; + for (PackageParser.Package overlayPackage : overlayPackages) { + if (targetPath == null) { + if (overlayPathList == null) { + overlayPathList = new ArrayList(); + } + 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(); + } + 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 mOverlayPackages = null; + + void findStaticOverlayPackages() { + synchronized (mPackages) { + for (PackageParser.Package p : mPackages.values()) { + if (p.mIsStaticOverlay) { + if (mOverlayPackages == null) { + mOverlayPackages = new ArrayList(); + } + 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 +2565,8 @@ public class PackageManagerService extends IPackageManager.Stub | 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 +4361,7 @@ public class PackageManagerService extends IPackageManager.Stub } 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)); @@ -5820,10 +5933,10 @@ public class PackageManagerService extends IPackageManager.Stub 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); } @@ -6372,7 +6485,7 @@ public class PackageManagerService extends IPackageManager.Stub Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "resolveEphemeral"); final InstantAppRequest requestObject = new InstantAppRequest( null /*responseObj*/, intent /*origIntent*/, resolvedType, - null /*callingPackage*/, userId); + null /*callingPackage*/, userId, null /*verificationBundle*/); final AuxiliaryResolveInfo auxiliaryResponse = InstantAppResolver.doInstantAppResolutionPhaseOne( mContext, mInstantAppResolverConnection, requestObject); @@ -6396,7 +6509,7 @@ public class PackageManagerService extends IPackageManager.Stub ephemeralInstaller.filter = new IntentFilter(intent.getAction()); ephemeralInstaller.filter.addDataPath( intent.getData().getPath(), PatternMatcher.PATTERN_LITERAL); - ephemeralInstaller.instantAppAvailable = true; + ephemeralInstaller.isInstantAppAvailable = true; result.add(ephemeralInstaller); } } @@ -7856,7 +7969,8 @@ public class PackageManagerService extends IPackageManager.Stub + " 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 +8668,7 @@ public class PackageManagerService extends IPackageManager.Stub // 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) && @@ -8614,6 +8728,31 @@ public class PackageManagerService extends IPackageManager.Stub mDexManager.notifyDexLoad(ai, dexPaths, loaderIsa, userId); } + @Override + public void registerDexModule(String packageName, String dexModulePath, boolean isSharedModule, + IDexModuleRegisterCallback callback) { + int userId = UserHandle.getCallingUserId(); + ApplicationInfo ai = getApplicationInfo(packageName, /*flags*/ 0, userId); + DexManager.RegisterDexModuleResult result; + if (ai == null) { + Slog.w(TAG, "Registering a dex module for a package that does not exist for the" + + " calling user. package=" + packageName + ", user=" + userId); + result = new DexManager.RegisterDexModuleResult(false, "Package not installed"); + } else { + result = mDexManager.registerDexModule(ai, dexModulePath, isSharedModule, userId); + } + + if (callback != null) { + mHandler.post(() -> { + try { + callback.onDexModuleRegistered(dexModulePath, result.success, result.message); + } catch (RemoteException e) { + Slog.w(TAG, "Failed to callback after module registration " + dexModulePath, e); + } + }); + } + } + @Override public boolean performDexOpt(String packageName, boolean checkProfiles, int compileReason, boolean force) { @@ -12497,7 +12636,7 @@ public class PackageManagerService extends IPackageManager.Stub } res.iconResourceId = info.icon; res.system = res.activityInfo.applicationInfo.isSystemApp(); - res.instantAppAvailable = userState.instantApp; + res.isInstantAppAvailable = userState.instantApp; return res; } @@ -17075,10 +17214,10 @@ public class PackageManagerService extends IPackageManager.Stub 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 +17775,7 @@ public class PackageManagerService extends IPackageManager.Stub 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 @@ -20571,6 +20709,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); 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; @@ -20816,6 +20955,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); 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(); @@ -21146,6 +21287,31 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); 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 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); } @@ -23427,9 +23593,11 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @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 @@ -23574,6 +23742,13 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); 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 25a596aaad90bd80d8e150c3b3070651c65083a0..c1d68b8b80083bb9462a8fbca54a9ca37a5957f1 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 @@ class PackageManagerShellCommand extends ShellCommand { 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 7c89e1ccb7c8c32017fa318d8fbae9e53232177c..bed8f1a786496070131a4bb9dac521e6e78bda4c 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 @@ public class ShortcutService extends IShortcutService.Stub { } @Override - public void onCleanupUser(int userHandle) { - mService.handleCleanupUser(userHandle); + public void onStopUser(int userHandle) { + mService.handleStopUser(userHandle); } @Override @@ -606,9 +606,9 @@ public class ShortcutService extends IShortcutService.Stub { } /** 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 @@ public class ShortcutService extends IShortcutService.Stub { 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/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java index 3d7cedce522afe15b3997957f4567e0bbb172637..4a8232da2b35dd995dadd18adfc3f9469ac951b8 100644 --- a/services/core/java/com/android/server/pm/dex/DexManager.java +++ b/services/core/java/com/android/server/pm/dex/DexManager.java @@ -30,6 +30,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.server.pm.Installer; import com.android.server.pm.Installer.InstallerException; import com.android.server.pm.PackageDexOptimizer; +import com.android.server.pm.PackageManagerService; import com.android.server.pm.PackageManagerServiceUtils; import com.android.server.pm.PackageManagerServiceCompilerMapping; @@ -41,6 +42,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import static com.android.server.pm.InstructionSets.getAppDexInstructionSets; import static com.android.server.pm.dex.PackageDexUsage.PackageUseInfo; import static com.android.server.pm.dex.PackageDexUsage.DexUseInfo; @@ -431,6 +433,52 @@ public class DexManager { } } + public RegisterDexModuleResult registerDexModule(ApplicationInfo info, String dexPath, + boolean isUsedByOtherApps, int userId) { + // Find the owning package record. + DexSearchResult searchResult = getDexPackage(info, dexPath, userId); + + if (searchResult.mOutcome == DEX_SEARCH_NOT_FOUND) { + return new RegisterDexModuleResult(false, "Package not found"); + } + if (!info.packageName.equals(searchResult.mOwningPackageName)) { + return new RegisterDexModuleResult(false, "Dex path does not belong to package"); + } + if (searchResult.mOutcome == DEX_SEARCH_FOUND_PRIMARY || + searchResult.mOutcome == DEX_SEARCH_FOUND_SPLIT) { + return new RegisterDexModuleResult(false, "Main apks cannot be registered"); + } + + // We found the package. Now record the usage for all declared ISAs. + boolean update = false; + Set isas = new HashSet<>(); + for (String isa : getAppDexInstructionSets(info)) { + isas.add(isa); + boolean newUpdate = mPackageDexUsage.record(searchResult.mOwningPackageName, + dexPath, userId, isa, isUsedByOtherApps, /*primaryOrSplit*/ false); + update |= newUpdate; + } + if (update) { + mPackageDexUsage.maybeWriteAsync(); + } + + // Try to optimize the package according to the install reason. + String compilerFilter = PackageManagerServiceCompilerMapping.getCompilerFilterForReason( + PackageManagerService.REASON_INSTALL); + int result = mPackageDexOptimizer.dexOptSecondaryDexPath(info, dexPath, isas, + compilerFilter, isUsedByOtherApps); + + // If we fail to optimize the package log an error but don't propagate the error + // back to the app. The app cannot do much about it and the background job + // will rety again when it executes. + // TODO(calin): there might be some value to return the error here but it may + // cause red herrings since that doesn't mean the app cannot use the module. + if (result != PackageDexOptimizer.DEX_OPT_FAILED) { + Slog.e(TAG, "Failed to optimize dex module " + dexPath); + } + return new RegisterDexModuleResult(true, "Dex module registered successfully"); + } + /** * Return all packages that contain records of secondary dex files. */ @@ -510,6 +558,20 @@ public class DexManager { return existingValue == null ? newValue : existingValue; } + public static class RegisterDexModuleResult { + public RegisterDexModuleResult() { + this(false, null); + } + + public RegisterDexModuleResult(boolean success, String message) { + this.success = success; + this.message = message; + } + + public final boolean success; + public final String message; + } + /** * Convenience class to store the different locations where a package might * own code. @@ -589,6 +651,4 @@ public class DexManager { return mOwningPackageName + "-" + mOutcome; } } - - } diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 61ed72d990ca6284650209b30bdf89cf2ea4c685..8c3d80f18581168a028ab7d9d6ed90605fc7f3b8 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.IVrManager; 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.am.BatteryStatsService; 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 @@ public final class PowerManagerService extends SystemService // 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 @@ public final class PowerManagerService extends SystemService 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; @@ -4339,6 +4353,25 @@ public final class PowerManagerService extends SystemService } } + /** + * 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. * @@ -4566,6 +4599,28 @@ public final class PowerManagerService extends SystemService } } + @VisibleForTesting + int getLastShutdownReasonInternal(File lastRebootReason) { + String line = ""; + try (BufferedReader bufferedReader = new BufferedReader(new FileReader(lastRebootReason))){ + line = bufferedReader.readLine(); + } catch (IOException e) { + Slog.e(TAG, "Failed to read last_reboot_reason file", e); + } + switch (line) { + case REASON_SHUTDOWN: + return PowerManager.SHUTDOWN_REASON_SHUTDOWN; + case REASON_REBOOT: + return PowerManager.SHUTDOWN_REASON_REBOOT; + case REASON_USERREQUESTED: + return PowerManager.SHUTDOWN_REASON_USER_REQUESTED; + case REASON_THERMAL_SHUTDOWN: + return PowerManager.SHUTDOWN_REASON_THERMAL_SHUTDOWN; + default: + return PowerManager.SHUTDOWN_REASON_UNKNOWN; + } + } + private final class LocalService extends PowerManagerInternal { @Override public void setScreenBrightnessOverrideFromWindowManager(int screenBrightness) { diff --git a/services/core/java/com/android/server/radio/Tuner.java b/services/core/java/com/android/server/radio/Tuner.java index 53188613f220237323e52c1b9036491dae33889b..248a139748ef87b24a5ccc6aa96e65003c3c8348 100644 --- a/services/core/java/com/android/server/radio/Tuner.java +++ b/services/core/java/com/android/server/radio/Tuner.java @@ -31,7 +31,10 @@ class Tuner extends ITuner.Stub { */ private final long mNativeContext; - Tuner(@NonNull ITunerCallback clientCallback) { + private int mRegion; + + Tuner(@NonNull ITunerCallback clientCallback, int region) { + mRegion = region; mNativeContext = nativeInit(clientCallback); } diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 6a18beb813082e82166a65fbbb266e6a5ea75c46..d572003ce996445338a77f21c857574506181917 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -52,6 +52,7 @@ import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapRegionDecoder; +import android.graphics.Color; import android.graphics.Point; import android.graphics.Rect; import android.os.Binder; @@ -73,10 +74,12 @@ import android.os.UserManager; import android.service.wallpaper.IWallpaperConnection; import android.service.wallpaper.IWallpaperEngine; import android.service.wallpaper.IWallpaperService; +import android.app.WallpaperColors; import android.service.wallpaper.WallpaperService; import android.system.ErrnoException; import android.system.Os; import android.util.EventLog; +import android.util.Pair; import android.util.Slog; import android.util.SparseArray; import android.util.Xml; @@ -86,6 +89,7 @@ import android.view.WindowManager; import com.android.internal.R; import com.android.internal.content.PackageMonitor; +import com.android.internal.graphics.palette.Palette; import com.android.internal.os.BackgroundThread; import com.android.internal.util.DumpUtils; import com.android.internal.util.FastXmlSerializer; @@ -94,6 +98,7 @@ import com.android.server.EventLogTags; import com.android.server.FgThread; import com.android.server.SystemService; +import java.util.ArrayList; import libcore.io.IoUtils; import org.xmlpull.v1.XmlPullParser; @@ -219,6 +224,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { // lock-only changes happen on the dedicated lock wallpaper input file final boolean sysWallpaperChanged = (mWallpaperFile.equals(changedFile)); final boolean lockWallpaperChanged = (mWallpaperLockFile.equals(changedFile)); + int notifyColorsWhich = 0; WallpaperData wallpaper = dataForEvent(sysWallpaperChanged, lockWallpaperChanged); if (DEBUG) { @@ -240,6 +246,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { } SELinux.restorecon(changedFile); notifyLockWallpaperChanged(); + notifyWallpaperColorsChanged(wallpaper, FLAG_LOCK); return; } @@ -284,6 +291,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { // If this was the system wallpaper, rebind... bindWallpaperComponentLocked(mImageWallpaper, true, false, wallpaper, null); + notifyColorsWhich |= FLAG_SYSTEM; } if (lockWallpaperChanged || (wallpaper.whichPending & FLAG_LOCK) != 0) { @@ -298,12 +306,19 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { } // and in any case, tell keyguard about it notifyLockWallpaperChanged(); + notifyColorsWhich |= FLAG_LOCK; } + saveSettingsLocked(wallpaper.userId); } } } } + + // Outside of the lock since it will synchronize itself + if (notifyColorsWhich != 0) { + notifyWallpaperColorsChanged(wallpaper, notifyColorsWhich); + } } } @@ -318,6 +333,90 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { } } + private void notifyWallpaperColorsChanged(WallpaperData wallpaper, int which) { + boolean needsExtraction; + synchronized (mLock) { + if (mColorsChangedListeners.getRegisteredCallbackCount() == 0) + return; + + if (DEBUG) { + Slog.v(TAG, "notifyWallpaperColorsChanged " + which); + } + + needsExtraction = wallpaper.primaryColors == null; + } + + // This should not be synchronized because color extraction + // might take a while. + if (needsExtraction) { + extractColors(wallpaper); + } + + synchronized (mLock) { + final int n = mColorsChangedListeners.beginBroadcast(); + for (int i = 0; i < n; i++) { + IWallpaperManagerCallback callback = mColorsChangedListeners.getBroadcastItem(i); + try { + callback.onWallpaperColorsChanged(wallpaper.primaryColors, which); + } catch (RemoteException e) { + // Callback is gone, it's not necessary to unregister it since + // RemoteCallbackList#getBroadcastItem will take care of it. + } + } + mColorsChangedListeners.finishBroadcast(); + + final IWallpaperManagerCallback cb = mKeyguardListener; + if (cb != null) { + try { + cb.onWallpaperColorsChanged(wallpaper.primaryColors, which); + } catch (RemoteException e) { + // Oh well it went away; no big deal + } + } + } + } + + private void extractColors(WallpaperData wallpaper) { + String cropFile = null; + int wallpaperId = -1; + synchronized (mLock) { + // Only extract colors of ImageWallpaper or lock wallpapers (null) + final boolean supportedComponent = mImageWallpaper.equals(wallpaper.wallpaperComponent) + || wallpaper.wallpaperComponent == null; + if (!supportedComponent) + return; + + if (wallpaper.cropFile != null && wallpaper.cropFile.exists()) { + cropFile = wallpaper.cropFile.getAbsolutePath(); + } + wallpaperId = wallpaper.wallpaperId; + } + + if (cropFile != null) { + final Bitmap bitmap = BitmapFactory.decodeFile(cropFile); + if (bitmap == null) { + Slog.w(TAG, "Cannot extract colors because wallpaper file could not be read."); + return; + } + Palette palette = Palette.from(bitmap).generate(); + bitmap.recycle(); + + final List> colors = new ArrayList<>(); + for (Palette.Swatch swatch : palette.getSwatches()) { + colors.add(new Pair<>(Color.valueOf(swatch.getRgb()), + swatch.getPopulation())); + } + + synchronized (mLock) { + if (wallpaper.wallpaperId == wallpaperId) { + wallpaper.primaryColors = new WallpaperColors(colors); + } else { + Slog.w(TAG, "Not setting primary colors since wallpaper changed"); + } + } + } + } + /** * Once a new wallpaper has been written via setWallpaper(...), it needs to be cropped * for display. @@ -481,6 +580,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { final IPackageManager mIPackageManager; final MyPackageMonitor mMonitor; final AppOpsManager mAppOpsManager; + final RemoteCallbackList mColorsChangedListeners; WallpaperData mLastWallpaper; IWallpaperManagerCallback mKeyguardListener; boolean mWaitingForUnlock; @@ -557,6 +657,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { */ int wallpaperId; + /** + * Primary colors histogram + */ + WallpaperColors primaryColors; + WallpaperConnection connection; long lastDiedTime; boolean wallpaperUpdating; @@ -706,6 +811,35 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { } } + /** + * Called by a live wallpaper if its colors have changed. + * @param primaryColors representation of wallpaper primary colors + */ + @Override + public void onWallpaperColorsChanged(WallpaperColors primaryColors) { + int which; + synchronized (mLock) { + // Do not broadcast changes on ImageWallpaper since it's handled + // internally by this class. + if (mImageWallpaper.equals(mWallpaper.wallpaperComponent)) { + return; + } + + mWallpaper.primaryColors = primaryColors; + + // Live wallpapers always are system wallpapers. + which = FLAG_SYSTEM; + // It's also the lock screen wallpaper when we don't have a bitmap in there + WallpaperData lockedWallpaper = mLockWallpaperMap.get(mCurrentUserId); + if (lockedWallpaper == null) { + which |= FLAG_LOCK; + } + } + if (which != 0) { + notifyWallpaperColorsChanged(mWallpaper, which); + } + } + @Override public void attachEngine(IWallpaperEngine engine) { synchronized (mLock) { @@ -916,6 +1050,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { mMonitor.register(context, null, UserHandle.ALL, true); getWallpaperDir(UserHandle.USER_SYSTEM).mkdirs(); loadSettingsLocked(UserHandle.USER_SYSTEM, false); + mColorsChangedListeners = new RemoteCallbackList<>(); } private static File getWallpaperDir(int userId) { @@ -1130,6 +1265,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { synchronized (mLock) { clearWallpaperLocked(false, which, userId, null); } + + // When clearing a wallpaper, broadcast new valid colors + WallpaperData data = getWallpaperSafeLocked(mCurrentUserId, which); + notifyWallpaperColorsChanged(data, which); } void clearWallpaperLocked(boolean defaultFailed, int which, int userId, IRemoteCallback reply) { @@ -1421,6 +1560,20 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { return -1; } + @Override + public void registerWallpaperColorsCallback(IWallpaperManagerCallback cb) { + synchronized (mLock) { + mColorsChangedListeners.register(cb); + } + } + + @Override + public void unregisterWallpaperColorsCallback(IWallpaperManagerCallback cb) { + synchronized (mLock) { + mColorsChangedListeners.unregister(cb); + } + } + @Override public boolean setLockWallpaperCallback(IWallpaperManagerCallback cb) { checkPermission(android.Manifest.permission.INTERNAL_SYSTEM_WINDOW); @@ -1430,6 +1583,41 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { return true; } + @Override + public WallpaperColors getWallpaperColors(int which) throws RemoteException { + if (which != FLAG_LOCK && which != FLAG_SYSTEM) { + throw new IllegalArgumentException("which should be either FLAG_LOCK or FLAG_SYSTEM"); + } + + WallpaperData wallpaperData = null; + boolean shouldExtract; + + synchronized (mLock) { + if (which == FLAG_LOCK) { + wallpaperData = mLockWallpaperMap.get(mCurrentUserId); + } + + // Try to get the system wallpaper anyway since it might + // also be the lock screen wallpaper + if (wallpaperData == null) { + wallpaperData = mWallpaperMap.get(mCurrentUserId); + } + + if (wallpaperData == null) { + return null; + } + shouldExtract = wallpaperData.primaryColors == null; + } + + if (shouldExtract) { + extractColors(wallpaperData); + } + + synchronized (mLock) { + return wallpaperData.primaryColors; + } + } + @Override public ParcelFileDescriptor setWallpaper(String name, String callingPackage, Rect cropHint, boolean allowBackup, Bundle extras, int which, @@ -1509,6 +1697,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { lockWP.width = sysWP.width; lockWP.height = sysWP.height; lockWP.allowBackup = sysWP.allowBackup; + lockWP.primaryColors = sysWP.primaryColors; // Migrate the bitmap files outright; no need to copy try { @@ -1546,6 +1735,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { if (extras != null) { extras.putInt(WallpaperManager.EXTRA_NEW_WALLPAPER_ID, wallpaper.wallpaperId); } + // Nullify field to require new computation + wallpaper.primaryColors = null; if (DEBUG) { Slog.v(TAG, "updateWallpaperBitmapLocked() : id=" + wallpaper.wallpaperId + " name=" + name + " file=" + wallpaper.wallpaperFile.getName()); @@ -1577,9 +1768,13 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { false /* all */, true /* full */, "changing live wallpaper", null /* pkg */); checkPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT); + int which = FLAG_SYSTEM; + boolean shouldNotifyColors = false; + WallpaperData wallpaper; + synchronized (mLock) { if (DEBUG) Slog.v(TAG, "setWallpaperComponent name=" + name); - WallpaperData wallpaper = mWallpaperMap.get(userId); + wallpaper = mWallpaperMap.get(userId); if (wallpaper == null) { throw new IllegalStateException("Wallpaper not yet initialized for user " + userId); } @@ -1597,16 +1792,26 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { } } + // New live wallpaper is also a lock wallpaper if nothing is set + if (mLockWallpaperMap.get(userId) == null) { + which |= FLAG_LOCK; + } + try { wallpaper.imageWallpaperPending = false; if (bindWallpaperComponentLocked(name, false, true, wallpaper, null)) { wallpaper.wallpaperId = makeWallpaperIdLocked(); notifyCallbacksLocked(wallpaper); + shouldNotifyColors = true; } } finally { Binder.restoreCallingIdentity(ident); } } + + if (shouldNotifyColors) { + notifyWallpaperColorsChanged(wallpaper, which); + } } boolean bindWallpaperComponentLocked(ComponentName componentName, boolean force, @@ -1731,6 +1936,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { } wallpaper.wallpaperComponent = componentName; wallpaper.connection = newConn; + wallpaper.primaryColors = null; newConn.mReply = reply; try { if (wallpaper.userId == mCurrentUserId) { @@ -1810,6 +2016,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { } } wallpaper.callbacks.finishBroadcast(); + final Intent intent = new Intent(Intent.ACTION_WALLPAPER_CHANGED); mContext.sendBroadcastAsUser(intent, new UserHandle(mCurrentUserId)); } @@ -1900,6 +2107,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { private void writeWallpaperAttributes(XmlSerializer out, String tag, WallpaperData wallpaper) throws IllegalArgumentException, IllegalStateException, IOException { + if (DEBUG) { + Slog.v(TAG, "writeWallpaperAttributes"); + } out.startTag(null, tag); out.attribute(null, "id", Integer.toString(wallpaper.wallpaperId)); out.attribute(null, "width", Integer.toString(wallpaper.width)); @@ -1923,6 +2133,20 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { out.attribute(null, "paddingBottom", Integer.toString(wallpaper.padding.bottom)); } + if (wallpaper.primaryColors != null) { + int colorsCount = wallpaper.primaryColors.getColors().size(); + out.attribute(null, "colorsCount", Integer.toString(colorsCount)); + if (colorsCount > 0) { + for (int i = 0; i < colorsCount; i++) { + Pair wc = wallpaper.primaryColors.getColors().get(i); + out.attribute(null, "colorValue"+i, Integer.toString(wc.first.toArgb())); + out.attribute(null, "colorWeight"+i, Integer.toString(wc.second)); + } + } + out.attribute(null, "supportsDarkText", + Integer.toString(wallpaper.primaryColors.supportsDarkText() ? 1 : 0)); + } + out.attribute(null, "name", wallpaper.name); if (wallpaper.wallpaperComponent != null && !wallpaper.wallpaperComponent.equals(mImageWallpaper)) { @@ -2054,6 +2278,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { Slog.v(TAG, "mWidth:" + wallpaper.width); Slog.v(TAG, "mHeight:" + wallpaper.height); Slog.v(TAG, "cropRect:" + wallpaper.cropHint); + Slog.v(TAG, "primaryColors:" + wallpaper.primaryColors); Slog.v(TAG, "mName:" + wallpaper.name); Slog.v(TAG, "mNextWallpaperComponent:" + wallpaper.nextWallpaperComponent); @@ -2152,6 +2377,18 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { wallpaper.padding.top = getAttributeInt(parser, "paddingTop", 0); wallpaper.padding.right = getAttributeInt(parser, "paddingRight", 0); wallpaper.padding.bottom = getAttributeInt(parser, "paddingBottom", 0); + int colorsCount = getAttributeInt(parser, "colorsCount", 0); + if (colorsCount > 0) { + List> colors = new ArrayList<>(); + for (int i = 0; i < colorsCount; i++) { + colors.add(new Pair<>( + Color.valueOf(getAttributeInt(parser, "colorValue"+i, 0)), + getAttributeInt(parser, "colorWeight"+i, 0) + )); + } + boolean dark = getAttributeInt(parser, "supportsDarkText", 0) == 1; + wallpaper.primaryColors = new WallpaperColors(colors, dark); + } wallpaper.name = parser.getAttributeValue(null, "name"); wallpaper.allowBackup = "true".equals(parser.getAttributeValue(null, "backup")); } diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 3c2dfa51d8f6fb05e535519b90db6371336db2b8..36418bea1940ec2326e39e717797a34e52ed4de5 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -893,6 +893,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree if (mPendingRelaunchCount > 0) { mPendingRelaunchCount--; } + updateAllDrawn(); } void clearRelaunching() { @@ -1301,16 +1302,20 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree } } - 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 +1332,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree + " interesting=" + numInteresting + " drawn=" + mNumDrawnWindowsExcludingSaved); allDrawnExcludingSaved = true; - dc.setLayoutNeeded(); + if (mDisplayContent != null) { + mDisplayContent.setLayoutNeeded(); + } if (isAnimatingInvisibleWithSavedSurface() && !mService.mFinishedEarlyAnim.contains(this)) { mService.mFinishedEarlyAnim.add(this); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index d85552a4d140a62b4e98c121d5a87af1b55a44a2..05b95e2659b22db3c145d5959e40a829e0d4f7d8 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -2730,7 +2730,7 @@ class DisplayContent extends WindowContainer + +namespace android { + +JavaRef make_javaref(JNIEnv *env, jobject ref) { + ALOGV("wrapping %p", ref); + ALOGE_IF(env == nullptr, "Environment is a nullptr"); + + return JavaRef(ref, [env](jobject ref) { + ALOGV("deleting %p", ref); + if (env && ref) { + env->DeleteLocalRef(ref); + } + }); +} + +EnvWrapper::EnvWrapper(JNIEnv *env) : mEnv(env) { + ALOGE_IF(env == nullptr, "Environment is a nullptr"); +} + +JavaRef EnvWrapper::operator() (jobject ref) const { + return make_javaref(mEnv, ref); +} + +} // namespace android diff --git a/services/core/jni/JavaRef.h b/services/core/jni/JavaRef.h new file mode 100644 index 0000000000000000000000000000000000000000..c25f289e14e51de42d96a92bbe597f82a3d55bd0 --- /dev/null +++ b/services/core/jni/JavaRef.h @@ -0,0 +1,44 @@ +/** + * 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. + */ + +#ifndef _ANDROID_JAVA_REF_H +#define _ANDROID_JAVA_REF_H + +#include +#include +#include +#include + +namespace android { + +typedef std::unique_ptr<_jobject, std::function> JavaRef; + +JavaRef make_javaref(JNIEnv *env, jobject ref); + +class EnvWrapper { +public: + EnvWrapper(JNIEnv *env); + JavaRef operator() (jobject ref) const; + +private: + JNIEnv *mEnv; + + DISALLOW_COPY_AND_ASSIGN(EnvWrapper); +}; + +} // namespace android + +#endif // _ANDROID_JAVA_REF_H diff --git a/services/core/jni/com_android_server_SystemServer.cpp b/services/core/jni/com_android_server_SystemServer.cpp index 4a08ce4aebb7c653740a9b453b13f6fbf8ffe6ec..96c2d7e382328bbb2447b002db09060e09f1b943 100644 --- a/services/core/jni/com_android_server_SystemServer.cpp +++ b/services/core/jni/com_android_server_SystemServer.cpp @@ -48,7 +48,7 @@ static void android_server_SystemServer_startHidlServices(JNIEnv* /* env */, job status_t err; - configureRpcThreadpool(1, false /* callerWillJoin */); + configureRpcThreadpool(5, false /* callerWillJoin */); sp sensorService = new SensorManager(); err = sensorService->registerAsService(); diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index 1b0d2087e223d46ca524b1765dcd2cff91bb0faa..00061107249f00a20a84b23b11bbfaf2226891bc 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -1504,7 +1504,11 @@ static void nativeSetCustomPointerIcon(JNIEnv* env, jclass /* clazz */, } SpriteIcon spriteIcon; - pointerIcon.bitmap.copyTo(&spriteIcon.bitmap, kN32_SkColorType); + SkImageInfo spriteInfo = pointerIcon.bitmap.info().makeColorType(kN32_SkColorType); + if (spriteIcon.bitmap.tryAllocPixels(spriteInfo)) { + pointerIcon.bitmap.readPixels(spriteInfo, spriteIcon.bitmap.getPixels(), + spriteIcon.bitmap.rowBytes(), 0, 0); + } spriteIcon.hotSpotX = pointerIcon.hotSpotX; spriteIcon.hotSpotY = pointerIcon.hotSpotY; im->setCustomPointerIcon(spriteIcon); diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index 74ecd11d13f4118a4fe98b46ba5cd5ff866009a3..edd7d537ad9d9e8e161d3851914cbfb345a47945 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 @@ static void android_location_GnssLocationProvider_delete_aiding_data(JNIEnv* /* * 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/core/jni/com_android_server_radio_RadioService.cpp b/services/core/jni/com_android_server_radio_RadioService.cpp index bb206c0e90795861ad90f748a0810df15a88e212..a6bcdbb3901231a044c138d56996e48edc5eace7 100644 --- a/services/core/jni/com_android_server_radio_RadioService.cpp +++ b/services/core/jni/com_android_server_radio_RadioService.cpp @@ -20,6 +20,7 @@ #include "com_android_server_radio_RadioService.h" #include "com_android_server_radio_Tuner.h" +#include "com_android_server_radio_convert.h" #include #include @@ -132,13 +133,15 @@ static jobject nativeOpenTuner(JNIEnv *env, jobject obj, long nativeContext, jin return nullptr; } - jobject tuner = env->NewObject(gTunerClass, gTunerCstor, callback); + Region region; + BandConfig bandConfigHal = convert::BandConfigToHal(env, bandConfig, region); + + jobject tuner = env->NewObject(gTunerClass, gTunerCstor, callback, region); if (tuner == nullptr) { ALOGE("Unable to create new tuner object."); return nullptr; } - BandConfig bandConfigHal = {}; // TODO(b/36863239): convert from bandConfig auto tunerCb = Tuner::getNativeCallback(env, tuner); Result halResult; sp halTuner = nullptr; @@ -176,10 +179,12 @@ static const JNINativeMethod gRadioServiceMethods[] = { void register_android_server_radio_RadioService(JNIEnv *env) { using namespace server::radio::RadioService; + register_android_server_radio_convert(env); + auto tunerClass = FindClassOrDie(env, "com/android/server/radio/Tuner"); gTunerClass = MakeGlobalRefOrDie(env, tunerClass); gTunerCstor = GetMethodIDOrDie(env, tunerClass, "", - "(Landroid/hardware/radio/ITunerCallback;)V"); + "(Landroid/hardware/radio/ITunerCallback;I)V"); auto serviceClass = FindClassOrDie(env, "com/android/server/radio/RadioService"); gServiceClass = MakeGlobalRefOrDie(env, serviceClass); diff --git a/services/core/jni/com_android_server_radio_Tuner.cpp b/services/core/jni/com_android_server_radio_Tuner.cpp index b817a7551a20a622f39ddfc5416249dbf4ff1cb4..3245bff91a5db4a0a692a4a9686ffd8499cb332a 100644 --- a/services/core/jni/com_android_server_radio_Tuner.cpp +++ b/services/core/jni/com_android_server_radio_Tuner.cpp @@ -46,8 +46,12 @@ using V1_1::ProgramListResult; static Mutex gContextMutex; -static jclass gTunerClass; -static jfieldID gNativeContextId; +static struct { + struct { + jfieldID nativeContext; + jfieldID region; + } Tuner; +} gjni; struct TunerContext { TunerContext() {} @@ -69,7 +73,7 @@ static TunerContext& getNativeContext(jlong nativeContextHandle) { * Always lock gContextMutex when using native context. */ static TunerContext& getNativeContext(JNIEnv *env, jobject obj) { - return getNativeContext(env->GetLongField(obj, gNativeContextId)); + return getNativeContext(env->GetLongField(obj, gjni.Tuner.nativeContext)); } static jlong nativeInit(JNIEnv *env, jobject obj, jobject clientCallback) { @@ -106,6 +110,10 @@ sp getNativeCallback(JNIEnv *env, jobject obj) { return ctx.mNativeCallback; } +Region getRegion(JNIEnv *env, jobject obj) { + return static_cast(env->GetIntField(obj, gjni.Tuner.region)); +} + static void close(JNIEnv *env, jobject obj, jlong nativeContext) { AutoMutex _l(gContextMutex); auto& ctx = getNativeContext(nativeContext); @@ -125,12 +133,14 @@ static const JNINativeMethod gTunerMethods[] = { } // namespace radio } // namespace server -void register_android_server_radio_Tuner(JNIEnv *env) { +void register_android_server_radio_Tuner(JavaVM *vm, JNIEnv *env) { using namespace server::radio::Tuner; + register_android_server_radio_Tuner_TunerCallback(vm, env); + auto tunerClass = FindClassOrDie(env, "com/android/server/radio/Tuner"); - gTunerClass = MakeGlobalRefOrDie(env, tunerClass); - gNativeContextId = GetFieldIDOrDie(env, gTunerClass, "mNativeContext", "J"); + gjni.Tuner.nativeContext = GetFieldIDOrDie(env, tunerClass, "mNativeContext", "J"); + gjni.Tuner.region = GetFieldIDOrDie(env, tunerClass, "mRegion", "I"); auto res = jniRegisterNativeMethods(env, "com/android/server/radio/Tuner", gTunerMethods, NELEM(gTunerMethods)); diff --git a/services/core/jni/com_android_server_radio_Tuner.h b/services/core/jni/com_android_server_radio_Tuner.h index f82e18b5cd827f421c9cbc957e9d1b6db5ee5d07..73fee7f5c9db8b5b654cf89c8c987bb50d065a82 100644 --- a/services/core/jni/com_android_server_radio_Tuner.h +++ b/services/core/jni/com_android_server_radio_Tuner.h @@ -17,6 +17,8 @@ #ifndef _ANDROID_SERVER_RADIO_TUNER_H #define _ANDROID_SERVER_RADIO_TUNER_H +#include "com_android_server_radio_types.h" + #include #include #include @@ -24,7 +26,7 @@ namespace android { -void register_android_server_radio_Tuner(JNIEnv *env); +void register_android_server_radio_Tuner(JavaVM *vm, JNIEnv *env); namespace server { namespace radio { @@ -34,6 +36,8 @@ void setHalTuner(JNIEnv *env, jobject obj, sp getNativeCallback(JNIEnv *env, jobject obj); +Region getRegion(JNIEnv *env, jobject obj); + } // namespace Tuner } // namespace radio } // namespace server diff --git a/services/core/jni/com_android_server_radio_Tuner_TunerCallback.cpp b/services/core/jni/com_android_server_radio_Tuner_TunerCallback.cpp index 8c4098652621dd16ab4452783540eb217ce23fac..54dd7df4585d64960c2d47c1a2c1617c2eef4b28 100644 --- a/services/core/jni/com_android_server_radio_Tuner_TunerCallback.cpp +++ b/services/core/jni/com_android_server_radio_Tuner_TunerCallback.cpp @@ -19,6 +19,9 @@ #include "com_android_server_radio_Tuner_TunerCallback.h" +#include "com_android_server_radio_convert.h" +#include "com_android_server_radio_Tuner.h" + #include #include #include @@ -91,11 +94,13 @@ Return TunerCallback::hardwareFailure() { Return TunerCallback::configChange(Result result, const BandConfig& config) { ALOGV("configChange(%d)", result); - mCallbackThread.enqueue([result, this](JNIEnv *env) { + mCallbackThread.enqueue([result, config, this](JNIEnv *env) { if (result == Result::OK) { - // TODO(b/36863239): convert parameter + auto region = getRegion(env, mTuner); + auto jConfig = convert::BandConfigFromHal(env, config, region); + if (jConfig == nullptr) return; env->CallVoidMethod(mClientCallback, gITunerCallbackMethods.onConfigurationChanged, - nullptr); + jConfig.get()); } else { env->CallVoidMethod(mClientCallback, gITunerCallbackMethods.onError, TunerError::CONFIG); diff --git a/services/core/jni/com_android_server_radio_convert.cpp b/services/core/jni/com_android_server_radio_convert.cpp new file mode 100644 index 0000000000000000000000000000000000000000..afa3539bcfdb905092261f3812d334a177295b8c --- /dev/null +++ b/services/core/jni/com_android_server_radio_convert.cpp @@ -0,0 +1,199 @@ +/** + * 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 "radio.convert.jni" +#define LOG_NDEBUG 0 + +#include "com_android_server_radio_convert.h" + +#include +#include +#include + +namespace android { +namespace server { +namespace radio { +namespace convert { + +using hardware::hidl_vec; + +using V1_0::Band; +using V1_0::Deemphasis; +using V1_0::Rds; + +static struct { + struct { + jfieldID descriptor; + } BandConfig; + struct { + jclass clazz; + jmethodID cstor; + jfieldID stereo; + jfieldID rds; + jfieldID ta; + jfieldID af; + jfieldID ea; + } FmBandConfig; + struct { + jclass clazz; + jmethodID cstor; + jfieldID stereo; + } AmBandConfig; + + struct { + jfieldID region; + jfieldID type; + jfieldID lowerLimit; + jfieldID upperLimit; + jfieldID spacing; + } BandDescriptor; +} gjni; + +static Rds RdsForRegion(bool rds, Region region) { + if (!rds) return Rds::NONE; + + switch(region) { + case Region::ITU_1: + case Region::OIRT: + case Region::JAPAN: + case Region::KOREA: + return Rds::WORLD; + case Region::ITU_2: + return Rds::US; + default: + ALOGE("Unexpected region: %d", region); + return Rds::NONE; + } +} + +static Deemphasis DeemphasisForRegion(Region region) { + switch(region) { + case Region::KOREA: + case Region::ITU_2: + return Deemphasis::D75; + case Region::ITU_1: + case Region::OIRT: + case Region::JAPAN: + return Deemphasis::D50; + default: + ALOGE("Unexpected region: %d", region); + return Deemphasis::D50; + } +} + +JavaRef BandConfigFromHal(JNIEnv *env, const V1_0::BandConfig &config, Region region) { + EnvWrapper wrap(env); + + jint spacing = config.spacings.size() > 0 ? config.spacings[0] : 0; + ALOGW_IF(config.spacings.size() == 0, "No channel spacing specified"); + + switch (config.type) { + case Band::FM: + case Band::FM_HD: { + auto& fm = config.ext.fm; + return wrap(env->NewObject(gjni.FmBandConfig.clazz, gjni.FmBandConfig.cstor, + region, config.type, config.lowerLimit, config.upperLimit, spacing, + fm.stereo, fm.rds != Rds::NONE, fm.ta, fm.af, fm.ea)); + } + case Band::AM: + case Band::AM_HD: { + auto& am = config.ext.am; + return wrap(env->NewObject(gjni.AmBandConfig.clazz, gjni.AmBandConfig.cstor, + region, config.type, config.lowerLimit, config.upperLimit, spacing, + am.stereo)); + } + default: + ALOGE("Unsupported band type: %d", config.type); + return nullptr; + } +} + +V1_0::BandConfig BandConfigToHal(JNIEnv *env, jobject jConfig, Region ®ion) { + auto jDescriptor = env->GetObjectField(jConfig, gjni.BandConfig.descriptor); + if (jDescriptor == nullptr) { + ALOGE("Descriptor is missing"); + return {}; + } + + region = static_cast(env->GetIntField(jDescriptor, gjni.BandDescriptor.region)); + + V1_0::BandConfig config = {}; + config.type = static_cast(env->GetIntField(jDescriptor, gjni.BandDescriptor.type)); + config.antennaConnected = false; // just don't set it + config.lowerLimit = env->GetIntField(jDescriptor, gjni.BandDescriptor.lowerLimit); + config.upperLimit = env->GetIntField(jDescriptor, gjni.BandDescriptor.upperLimit); + config.spacings = hidl_vec({ + static_cast(env->GetIntField(jDescriptor, gjni.BandDescriptor.spacing)) + }); + + if (env->IsInstanceOf(jConfig, gjni.FmBandConfig.clazz)) { + auto& fm = config.ext.fm; + fm.deemphasis = DeemphasisForRegion(region); + fm.stereo = env->GetBooleanField(jConfig, gjni.FmBandConfig.stereo); + fm.rds = RdsForRegion(env->GetBooleanField(jConfig, gjni.FmBandConfig.rds), region); + fm.ta = env->GetBooleanField(jConfig, gjni.FmBandConfig.ta); + fm.af = env->GetBooleanField(jConfig, gjni.FmBandConfig.af); + fm.ea = env->GetBooleanField(jConfig, gjni.FmBandConfig.ea); + } else if (env->IsInstanceOf(jConfig, gjni.AmBandConfig.clazz)) { + auto& am = config.ext.am; + am.stereo = env->GetBooleanField(jConfig, gjni.AmBandConfig.stereo); + } else { + ALOGE("Unexpected band config type"); + return {}; + } + + return config; +} + + +} // namespace convert +} // namespace radio +} // namespace server + +void register_android_server_radio_convert(JNIEnv *env) { + using namespace server::radio::convert; + + auto bandConfigClass = FindClassOrDie(env, "android/hardware/radio/RadioManager$BandConfig"); + gjni.BandConfig.descriptor = GetFieldIDOrDie(env, bandConfigClass, + "mDescriptor", "Landroid/hardware/radio/RadioManager$BandDescriptor;"); + + auto fmBandConfigClass = FindClassOrDie(env, + "android/hardware/radio/RadioManager$FmBandConfig"); + gjni.FmBandConfig.clazz = MakeGlobalRefOrDie(env, fmBandConfigClass); + gjni.FmBandConfig.cstor = GetMethodIDOrDie(env, fmBandConfigClass, + "", "(IIIIIZZZZZ)V"); + gjni.FmBandConfig.stereo = GetFieldIDOrDie(env, fmBandConfigClass, "mStereo", "Z"); + gjni.FmBandConfig.rds = GetFieldIDOrDie(env, fmBandConfigClass, "mRds", "Z"); + gjni.FmBandConfig.ta = GetFieldIDOrDie(env, fmBandConfigClass, "mTa", "Z"); + gjni.FmBandConfig.af = GetFieldIDOrDie(env, fmBandConfigClass, "mAf", "Z"); + gjni.FmBandConfig.ea = GetFieldIDOrDie(env, fmBandConfigClass, "mEa", "Z"); + + auto amBandConfigClass = FindClassOrDie(env, + "android/hardware/radio/RadioManager$AmBandConfig"); + gjni.AmBandConfig.clazz = MakeGlobalRefOrDie(env, amBandConfigClass); + gjni.AmBandConfig.cstor = GetMethodIDOrDie(env, amBandConfigClass, "", "(IIIIIZ)V"); + gjni.AmBandConfig.stereo = GetFieldIDOrDie(env, amBandConfigClass, "mStereo", "Z"); + + auto bandDescriptorClass = FindClassOrDie(env, + "android/hardware/radio/RadioManager$BandDescriptor"); + gjni.BandDescriptor.region = GetFieldIDOrDie(env, bandDescriptorClass, "mRegion", "I"); + gjni.BandDescriptor.type = GetFieldIDOrDie(env, bandDescriptorClass, "mType", "I"); + gjni.BandDescriptor.lowerLimit = GetFieldIDOrDie(env, bandDescriptorClass, "mLowerLimit", "I"); + gjni.BandDescriptor.upperLimit = GetFieldIDOrDie(env, bandDescriptorClass, "mUpperLimit", "I"); + gjni.BandDescriptor.spacing = GetFieldIDOrDie(env, bandDescriptorClass, "mSpacing", "I"); +} + +} // namespace android diff --git a/services/core/jni/com_android_server_radio_convert.h b/services/core/jni/com_android_server_radio_convert.h new file mode 100644 index 0000000000000000000000000000000000000000..b7e5b9c053c7adcc1365ad043f4932bb75ad3c84 --- /dev/null +++ b/services/core/jni/com_android_server_radio_convert.h @@ -0,0 +1,45 @@ +/** + * 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. + */ + +#ifndef _ANDROID_SERVER_RADIO_CONVERT_H +#define _ANDROID_SERVER_RADIO_CONVERT_H + +#include "JavaRef.h" +#include "com_android_server_radio_types.h" + +#include +#include + +namespace android { + +void register_android_server_radio_convert(JNIEnv *env); + +namespace server { +namespace radio { +namespace convert { + +namespace V1_0 = hardware::broadcastradio::V1_0; +namespace V1_1 = hardware::broadcastradio::V1_1; + +JavaRef BandConfigFromHal(JNIEnv *env, const V1_0::BandConfig &config, Region region); +V1_0::BandConfig BandConfigToHal(JNIEnv *env, jobject jConfig, Region ®ion); + +} // namespace convert +} // namespace radio +} // namespace server +} // namespace android + +#endif // _ANDROID_SERVER_RADIO_CONVERT_H diff --git a/services/core/jni/com_android_server_radio_types.h b/services/core/jni/com_android_server_radio_types.h new file mode 100644 index 0000000000000000000000000000000000000000..f2f253ce30e74ac67a3904ef8db9eb6794c77112 --- /dev/null +++ b/services/core/jni/com_android_server_radio_types.h @@ -0,0 +1,43 @@ +/** + * 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. + */ + +#ifndef _ANDROID_SERVER_RADIO_TYPES_H +#define _ANDROID_SERVER_RADIO_TYPES_H + +#include + +namespace android { +namespace server { +namespace radio { + +/* Most of these enums are dereived from Java code, based at + * frameworks/base/core/java/android/hardware/radio/RadioManager.java. + */ + +// Keep in sync with REGION_* constants from RadioManager.java. +enum class Region : jint { + ITU_1 = 0, + ITU_2 = 1, + OIRT = 2, + JAPAN = 3, + KOREA = 4, +}; + +} // namespace radio +} // namespace server +} // namespace android + +#endif // _ANDROID_SERVER_RADIO_TYPES_H diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp index 23a5256020239fda976ed929095bd8f22f0695fc..2acefc3482b02d7642a830d8c55c7d8417bd6a98 100644 --- a/services/core/jni/onload.cpp +++ b/services/core/jni/onload.cpp @@ -21,7 +21,6 @@ #include "com_android_server_radio_RadioService.h" #include "com_android_server_radio_Tuner.h" -#include "com_android_server_radio_Tuner_TunerCallback.h" namespace android { int register_android_server_AlarmManagerService(JNIEnv* env); @@ -67,8 +66,7 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) ALOG_ASSERT(env, "Could not retrieve the env!"); register_android_server_radio_RadioService(env); - register_android_server_radio_Tuner(env); - register_android_server_radio_Tuner_TunerCallback(vm, env); + register_android_server_radio_Tuner(vm, env); register_android_server_PowerManagerService(env); register_android_server_SerialService(env); register_android_server_InputApplicationHandle(env); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 6b77fae1d452aa9b37a473421bf1f6fd76ac9f75..87fb8c8dd272820528f012c5fa03480bb1819491 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; @@ -4665,19 +4666,20 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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); } @@ -10105,14 +10107,16 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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 affiliationIds = new ArraySet(ids); - Preconditions.checkArgument( - !affiliationIds.contains(""), "ids must not contain empty strings"); - + final Set affiliationIds = new ArraySet<>(ids); final int callingUserId = mInjector.userHandleGetCallingUserId(); synchronized (this) { getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); @@ -10933,8 +10937,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java index d402d10bc2e1df0b999a2f4863df4dbb14157b33..f41a99f91d3b3219a57a0e208c52459755e71d85 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.assertTrue; 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,6 +97,7 @@ public class NotificationManagerServiceTest { 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 { @@ -133,7 +135,8 @@ public class NotificationManagerServiceTest { 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 +150,18 @@ public class NotificationManagerServiceTest { mTestableLooper.processAllMessages(); } + private NotificationRecord generateNotificationRecord(NotificationChannel channel, int id, + String groupKey, boolean isSummary) { + Notification.Builder nb = new Notification.Builder(mContext, channel.getId()) + .setContentTitle("foo") + .setSmallIcon(android.R.drawable.sym_def_app_icon) + .setGroup(groupKey) + .setGroupSummary(isSummary); + + StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, id, "tag", uid, 0, + nb.build(), new UserHandle(uid), null, 0); + return new NotificationRecord(mContext, sbn, channel); + } private NotificationRecord generateNotificationRecord(NotificationChannel channel) { return generateNotificationRecord(channel, null); } @@ -395,6 +410,46 @@ public class NotificationManagerServiceTest { assertEquals(0, notifs[0].getNotification().flags & Notification.FLAG_FOREGROUND_SERVICE); } + @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 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); @@ -701,4 +756,134 @@ public class NotificationManagerServiceTest { 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/SnoozeHelperTest.java b/services/tests/notification/src/com/android/server/notification/SnoozeHelperTest.java index 9575d3253b28e4adcc408f6328259d540df3b7b4..bc25860e8e92d8fccddd047bf473eb95fda03808 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.service.notification.StatusBarNotification; 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 @@ public class SnoozeHelperTest { 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 @@ public class SnoozeHelperTest { 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,16 +157,46 @@ public class SnoozeHelperTest { 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); @@ -232,13 +263,50 @@ public class SnoozeHelperTest { assertEquals(4, mSnoozeHelper.getSnoozed().size()); } + @Test + public void repostGroupSummary_onlyFellowGroupChildren() throws Exception { + NotificationRecord r = getNotificationRecord( + "pkg", 1, "one", UserHandle.SYSTEM, "group1", false); + NotificationRecord r2 = getNotificationRecord( + "pkg", 2, "two", UserHandle.SYSTEM, "group1", false); + mSnoozeHelper.snooze(r, 1000); + mSnoozeHelper.snooze(r2, 1000); + mSnoozeHelper.repostGroupSummary("pkg", UserHandle.USER_SYSTEM, "group1"); + + verify(mCallback, never()).repost(UserHandle.USER_SYSTEM, r); + } + + @Test + public void repostGroupSummary_repostsSummary() throws Exception { + when(mUserProfiles.getCurrentProfileIds()).thenReturn( + new int[] {UserHandle.USER_SYSTEM}); + NotificationRecord r = getNotificationRecord( + "pkg", 1, "one", UserHandle.SYSTEM, "group1", true); + NotificationRecord r2 = getNotificationRecord( + "pkg", 2, "two", UserHandle.SYSTEM, "group1", false); + mSnoozeHelper.snooze(r, 1000); + mSnoozeHelper.snooze(r2, 1000); + assertEquals(2, mSnoozeHelper.getSnoozed().size()); + assertEquals(2, mSnoozeHelper.getSnoozed(UserHandle.USER_SYSTEM, "pkg").size()); + + mSnoozeHelper.repostGroupSummary("pkg", UserHandle.USER_SYSTEM, r.getGroupKey()); + + verify(mCallback, times(1)).repost(UserHandle.USER_SYSTEM, r); + verify(mCallback, never()).repost(UserHandle.USER_SYSTEM, r2); + + assertEquals(1, mSnoozeHelper.getSnoozed().size()); + assertEquals(1, mSnoozeHelper.getSnoozed(UserHandle.USER_SYSTEM, "pkg").size()); + } + private NotificationRecord getNotificationRecord(String pkg, int id, String tag, - UserHandle user) { + UserHandle user, String groupKey, boolean groupSummary) { Notification n = new Notification.Builder(getContext(), TEST_CHANNEL_ID) .setContentTitle("A") .setGroup("G") .setSortKey("A") .setWhen(1205) + .setGroup(groupKey) + .setGroupSummary(groupSummary) .build(); final NotificationChannel notificationChannel = new NotificationChannel( TEST_CHANNEL_ID, "name", NotificationManager.IMPORTANCE_LOW); @@ -246,4 +314,9 @@ public class SnoozeHelperTest { pkg, pkg, id, tag, 0, 0, n, user, null, System.currentTimeMillis()), notificationChannel); } + + private NotificationRecord getNotificationRecord(String pkg, int id, String tag, + UserHandle user) { + return getNotificationRecord(pkg, id, tag, user, null, false); + } } diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityGestureDetectorTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityGestureDetectorTest.java index d0c2b52f4a675282da44f88e33f285141a383e0c..14abb8a1d7bfb85d7d2f7a9ba0737c364d6fd08a 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 cf477f2b32eff923928e85499ae003a00917bf9a..360ccbf874f0d64b3abbef90ccf941b5ceb86a05 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 @@ public class FingerprintGestureControllerTest { 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 @@ public class FingerprintGestureControllerTest { 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 b876a5fde6435bb85e54e78f42bb7c739807cfb1..8d389a22d5e2800ed520fc2f53f42997f582a90e 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 @@ public class GestureDescriptionTest { 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 steps = MotionEventGenerator .getGestureStepsFromGestureDescription(gesture, 10); @@ -260,9 +259,8 @@ public class GestureDescriptionTest { 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 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 58166b6c1ac5b9db2fecfa47b2748936f40752ca..c87eaed5c9542ebe20f004a4b56d48afa7a1f55e 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.assertNull; 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 @@ public class ActivityStackTests extends ActivityTestsBase { // 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 08270844203290a6d17d1af98857be08202e0ba6..28051f9b2f8c801d116bf35c2d1c120eb19dc886 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 @@ public class ActivityTestsBase { void moveHomeStackToFront(String reason) { } + @Override + boolean moveHomeStackTaskToTop(String reason) { + return true; + } + // Invoked during {@link ActivityStack} creation. @Override void updateUIDsPresentOnDisplay() { @@ -225,9 +230,17 @@ public class ActivityTestsBase { 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/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index 31de3195fd034cad2b09e3ef215c4291d22fb9e9..c2b0ea5430e6c7f4f452cf2037b4da0bfac3bc76 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -2177,7 +2177,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Have the profile owner specify a set of affiliation ids. Check that the test user remains // unaffiliated. - final List userAffiliationIds = new ArrayList<>(); + final Set userAffiliationIds = new ArraySet<>(); userAffiliationIds.add("red"); userAffiliationIds.add("green"); userAffiliationIds.add("blue"); @@ -2187,7 +2187,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // 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 deviceAffiliationIds = new ArrayList<>(); + final Set deviceAffiliationIds = new ArraySet<>(); deviceAffiliationIds.add("cyan"); deviceAffiliationIds.add("yellow"); deviceAffiliationIds.add("magenta"); @@ -2207,7 +2207,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { 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()); @@ -3400,7 +3400,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { MoreAsserts.assertEmpty(targetUsers); // Setting affiliation ids - final List userAffiliationIds = Arrays.asList("some.affiliation-id"); + final Set userAffiliationIds = Collections.singleton("some.affiliation-id"); mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; dpm.setAffiliationIds(admin1, userAffiliationIds); @@ -3420,7 +3420,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { 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. @@ -3445,7 +3445,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { addManagedProfile(adminDifferentPackage, MANAGED_PROFILE_ADMIN_UID, admin2); // Setting affiliation ids - final List userAffiliationIds = Arrays.asList("some-affiliation-id"); + final Set userAffiliationIds = Collections.singleton("some-affiliation-id"); dpm.setAffiliationIds(admin1, userAffiliationIds); mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID; @@ -3507,7 +3507,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertFalse(dpm.isLockTaskPermitted("doPackage1")); // Setting same affiliation ids - final List userAffiliationIds = Arrays.asList("some-affiliation-id"); + final Set userAffiliationIds = Collections.singleton("some-affiliation-id"); mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; dpm.setAffiliationIds(admin1, userAffiliationIds); @@ -3523,7 +3523,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { .updateLockTaskPackages(eq(MANAGED_PROFILE_USER_ID), eq(poPackages)); // Unaffiliate the profile, lock task mode no longer available on the profile. - dpm.setAffiliationIds(adminDifferentPackage, Collections.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)) 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 315d37cbd662dde3863c6662034c9de14a846006..db317a0e4cca93d7d97330c1dd9c0fd0dcf73679 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 @@ public class NetworkEventTest extends DpmTestBase { 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 @@ public class NetworkEventTest extends DpmTestBase { 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 d8db3315d423bef585f5b4db370ef421e627541c..1284b1b5bf24338044e2bb0a25b025839e7aa991 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 @@ public class PackageParserTest { // 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 cd39d8875692d4a3c24bcd3dc0f3b9ba5828b95d..4c7bf4df01430463b13bb8b767afabfb74ce44d9 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 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { 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 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { 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 9880caa11f85e4dfcfc68e993f4cae1c542979d5..2b40c511ef14cf2fedecf4048d7fe97284b44808 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 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { 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 967b0a44e086df8cef6366725a91ac7c83c3c1ef..d12c07a84004b495c07584b662b63f631b576602 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 @@ public class PowerManagerServiceTest extends AndroidTestCase { 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 @@ public class PowerManagerServiceTest extends AndroidTestCase { .thenReturn(mPowerSaveState); mDisplayPowerRequest = new DisplayPowerRequest(); mService = new PowerManagerService(getContext(), mBatterySaverPolicy); + temporaryFolder.create(); + mTempReason = temporaryFolder.newFile(LAST_REBOOT_REASON); } @SmallTest @@ -63,4 +79,17 @@ public class PowerManagerServiceTest extends AndroidTestCase { 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/TaskSnapshotPersisterLoaderTest.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java index 4121447c156f14dbbac8dd9ee0e09aa390d24939..8108909152bbd3c680b6d1ae484a746fafef1e76 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 static org.junit.Assert.fail; 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 @@ public class TaskSnapshotPersisterLoaderTest extends TaskSnapshotPersisterTestBa @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 @@ public class TaskSnapshotPersisterLoaderTest extends TaskSnapshotPersisterTestBa @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 @@ public class TaskSnapshotPersisterLoaderTest extends TaskSnapshotPersisterTestBa @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 @@ public class TaskSnapshotPersisterLoaderTest extends TaskSnapshotPersisterTestBa @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 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 @@ public class TaskSnapshotPersisterLoaderTest extends TaskSnapshotPersisterTestBa @Test public void testRemoveObsoleteFiles_addedOneInTheMeantime() { - mPersister.persistSnapshot(1, sTestUserId, createSnapshot()); + mPersister.persistSnapshot(1, mTestUserId, createSnapshot()); final ArraySet 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 5e7389d24330445f8f405bfc32f37b6520a50006..18d0c321d181d5ba524ddd249c69372594cd0d57 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_HW_TEXTURE; 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.os.UserManager; 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 @@ import java.io.File; */ 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 @@ class TaskSnapshotPersisterTestBase extends WindowTestsBase { 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 @@ class TaskSnapshotPersisterTestBase extends WindowTestsBase { } 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/usage/java/com/android/server/usage/StorageStatsService.java b/services/usage/java/com/android/server/usage/StorageStatsService.java index 2ebf5fc1c5331d4c34b27c0c9bbe31621607c673..e13665bed2756adbe55d91e86f2f4f8535a6e8a7 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 @@ public class StorageStatsService extends IStorageStatsManager.Stub { @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 @@ public class StorageStatsService extends IStorageStatsManager.Stub { @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 @@ public class StorageStatsService extends IStorageStatsManager.Stub { } 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 @@ public class StorageStatsService extends IStorageStatsManager.Stub { @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 @@ public class StorageStatsService extends IStorageStatsManager.Stub { 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 @@ public class StorageStatsService extends IStorageStatsManager.Stub { @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 @@ public class StorageStatsService extends IStorageStatsManager.Stub { @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 @@ public class StorageStatsService extends IStorageStatsManager.Stub { @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/UsbAlsaManager.java b/services/usb/java/com/android/server/usb/UsbAlsaManager.java index 03d82412a5c5b17daddf7565f9671b9d91e50d00..d315b181c3578447a26ced28146154d552be0f96 100644 --- a/services/usb/java/com/android/server/usb/UsbAlsaManager.java +++ b/services/usb/java/com/android/server/usb/UsbAlsaManager.java @@ -189,10 +189,10 @@ public final class UsbAlsaManager { AudioSystem.DEVICE_OUT_USB_DEVICE); if (DEBUG) { Slog.i(TAG, "pre-call device:0x" + Integer.toHexString(device) + - " addr:" + address + " name:" + audioDevice.mDeviceName); + " addr:" + address + " name:" + audioDevice.getDeviceName()); } mAudioService.setWiredDeviceConnectionState( - device, state, address, audioDevice.mDeviceName, TAG); + device, state, address, audioDevice.getDeviceName(), TAG); } // Capture Device @@ -201,7 +201,7 @@ public final class UsbAlsaManager { AudioSystem.DEVICE_IN_USB_ACCESSORY : AudioSystem.DEVICE_IN_USB_DEVICE); mAudioService.setWiredDeviceConnectionState( - device, state, address, audioDevice.mDeviceName, TAG); + device, state, address, audioDevice.getDeviceName(), TAG); } } catch (RemoteException e) { Slog.e(TAG, "RemoteException in setWiredDeviceConnectionState"); @@ -329,10 +329,9 @@ public final class UsbAlsaManager { UsbAudioDevice audioDevice = new UsbAudioDevice(card, device, hasPlayback, hasCapture, deviceClass); AlsaCardsParser.AlsaCardRecord cardRecord = mCardsParser.getCardRecordFor(card); - audioDevice.mDeviceName = cardRecord.mCardName; - audioDevice.mDeviceDescription = cardRecord.mCardDescription; + audioDevice.setDeviceNameAndDescription(cardRecord.mCardName, cardRecord.mCardDescription); - notifyDeviceState(audioDevice, true); + notifyDeviceState(audioDevice, true /*enabled*/); return audioDevice; } @@ -442,7 +441,7 @@ public final class UsbAlsaManager { Slog.i(TAG, "USB Audio Device Removed: " + audioDevice); if (audioDevice != null) { if (audioDevice.mHasPlayback || audioDevice.mHasCapture) { - notifyDeviceState(audioDevice, false); + notifyDeviceState(audioDevice, false /*enabled*/); // if there any external devices left, select one of them selectDefaultDevice(); @@ -461,9 +460,9 @@ public final class UsbAlsaManager { if (enabled) { mAccessoryAudioDevice = new UsbAudioDevice(card, device, true, false, UsbAudioDevice.kAudioDeviceClass_External); - notifyDeviceState(mAccessoryAudioDevice, true); + notifyDeviceState(mAccessoryAudioDevice, true /*enabled*/); } else if (mAccessoryAudioDevice != null) { - notifyDeviceState(mAccessoryAudioDevice, false); + notifyDeviceState(mAccessoryAudioDevice, false /*enabled*/); mAccessoryAudioDevice = null; } } @@ -508,6 +507,7 @@ public final class UsbAlsaManager { // // Logging // + // called by UsbService.dump public void dump(IndentingPrintWriter pw) { pw.println("USB Audio Devices:"); for (UsbDevice device : mAudioDevices.keySet()) { diff --git a/services/usb/java/com/android/server/usb/UsbAudioDevice.java b/services/usb/java/com/android/server/usb/UsbAudioDevice.java index 70d1fc6913b526e22878c0b459dca66d5ce29646..4b17dfe0f27dcd13c6d3118bd8172a48c40c4660 100644 --- a/services/usb/java/com/android/server/usb/UsbAudioDevice.java +++ b/services/usb/java/com/android/server/usb/UsbAudioDevice.java @@ -36,8 +36,8 @@ public final class UsbAudioDevice { // This member is a combination of the above bit-flags public final int mDeviceClass; - public String mDeviceName = ""; - public String mDeviceDescription = ""; + private String mDeviceName = ""; + private String mDeviceDescription = ""; public UsbAudioDevice(int card, int device, boolean hasPlayback, boolean hasCapture, int deviceClass) { @@ -59,8 +59,19 @@ public final class UsbAudioDevice { return sb.toString(); } - public String toShortString() { + // called by logDevices + String toShortString() { return "[card:" + mCard + " device:" + mDevice + " " + mDeviceName + "]"; } + + String getDeviceName() { + return mDeviceName; + } + + void setDeviceNameAndDescription(String deviceName, String deviceDescription) { + mDeviceName = deviceName; + mDeviceDescription = deviceDescription; + } + } diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index 3b4fd04f244267802ebd8a086798c84d2d575ae5..84a2e8b5d2660ec37a747118b1168c5de23bce5e 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -424,6 +424,8 @@ public class UsbDeviceManager { private boolean mSinkPower; private boolean mConfigured; private boolean mUsbDataUnlocked; + private boolean mAudioAccessoryConnected; + private boolean mAudioAccessorySupported; private String mCurrentFunctions; private boolean mCurrentFunctionsApplied; private UsbAccessory mCurrentAccessory; @@ -534,30 +536,13 @@ public class UsbDeviceManager { } public void updateHostState(UsbPort port, UsbPortStatus status) { - boolean hostConnected = status.getCurrentDataRole() == UsbPort.DATA_ROLE_HOST; - boolean sourcePower = status.getCurrentPowerRole() == UsbPort.POWER_ROLE_SOURCE; - boolean sinkPower = status.getCurrentPowerRole() == UsbPort.POWER_ROLE_SINK; - // Ideally we want to see if PR_SWAP and DR_SWAP is supported. - // But, this should be suffice, since, all four combinations are only supported - // when PR_SWAP and DR_SWAP are supported. - boolean supportsAllCombinations = status.isRoleCombinationSupported( - UsbPort.POWER_ROLE_SOURCE, UsbPort.DATA_ROLE_HOST) - && status.isRoleCombinationSupported(UsbPort.POWER_ROLE_SINK, - UsbPort.DATA_ROLE_HOST) - && status.isRoleCombinationSupported(UsbPort.POWER_ROLE_SOURCE, - UsbPort.DATA_ROLE_DEVICE) - && status.isRoleCombinationSupported(UsbPort.POWER_ROLE_SINK, - UsbPort.DATA_ROLE_HOST); - if (DEBUG) { Slog.i(TAG, "updateHostState " + port + " status=" + status); } SomeArgs args = SomeArgs.obtain(); - args.argi1 = hostConnected ? 1 : 0; - args.argi2 = sourcePower ? 1 : 0; - args.argi3 = sinkPower ? 1 : 0; - args.argi4 = supportsAllCombinations ? 1 : 0; + args.arg1 = port; + args.arg2 = status; removeMessages(MSG_UPDATE_PORT_STATE); Message msg = obtainMessage(MSG_UPDATE_PORT_STATE, args); @@ -931,10 +916,26 @@ public class UsbDeviceManager { case MSG_UPDATE_PORT_STATE: SomeArgs args = (SomeArgs) msg.obj; boolean prevHostConnected = mHostConnected; - mHostConnected = (args.argi1 == 1); - mSourcePower = (args.argi2 == 1); - mSinkPower = (args.argi3 == 1); - mSupportsAllCombinations = (args.argi4 == 1); + UsbPort port = (UsbPort) args.arg1; + UsbPortStatus status = (UsbPortStatus) args.arg2; + mHostConnected = status.getCurrentDataRole() == UsbPort.DATA_ROLE_HOST; + mSourcePower = status.getCurrentPowerRole() == UsbPort.POWER_ROLE_SOURCE; + mSinkPower = status.getCurrentPowerRole() == UsbPort.POWER_ROLE_SINK; + mAudioAccessoryConnected = + (status.getCurrentMode() == UsbPort.MODE_AUDIO_ACCESSORY); + mAudioAccessorySupported = port.isModeSupported(UsbPort.MODE_AUDIO_ACCESSORY); + // Ideally we want to see if PR_SWAP and DR_SWAP is supported. + // But, this should be suffice, since, all four combinations are only supported + // when PR_SWAP and DR_SWAP are supported. + mSupportsAllCombinations = status.isRoleCombinationSupported( + UsbPort.POWER_ROLE_SOURCE, UsbPort.DATA_ROLE_HOST) + && status.isRoleCombinationSupported(UsbPort.POWER_ROLE_SINK, + UsbPort.DATA_ROLE_HOST) + && status.isRoleCombinationSupported(UsbPort.POWER_ROLE_SOURCE, + UsbPort.DATA_ROLE_DEVICE) + && status.isRoleCombinationSupported(UsbPort.POWER_ROLE_SINK, + UsbPort.DATA_ROLE_HOST); + args.recycle(); updateUsbNotification(false); if (mBootCompleted) { @@ -1076,7 +1077,10 @@ public class UsbDeviceManager { int id = 0; int titleRes = 0; Resources r = mContext.getResources(); - if (mConnected) { + if (mAudioAccessoryConnected && !mAudioAccessorySupported) { + titleRes = com.android.internal.R.string.usb_unsupported_audio_accessory_title; + id = SystemMessage.NOTE_USB_AUDIO_ACCESSORY_NOT_SUPPORTED; + } else if (mConnected) { if (!mUsbDataUnlocked) { if (mSourcePower) { titleRes = com.android.internal.R.string.usb_supplying_notification_title; @@ -1123,18 +1127,43 @@ public class UsbDeviceManager { mUsbNotificationId = 0; } if (id != 0) { - CharSequence message = r.getText( - com.android.internal.R.string.usb_notification_message); + CharSequence message; CharSequence title = r.getText(titleRes); + PendingIntent pi; + String channel; + + if (titleRes + != com.android.internal.R.string + .usb_unsupported_audio_accessory_title) { + Intent intent = Intent.makeRestartActivityTask( + new ComponentName("com.android.settings", + "com.android.settings.deviceinfo.UsbModeChooserActivity")); + pi = PendingIntent.getActivityAsUser(mContext, 0, + intent, 0, null, UserHandle.CURRENT); + channel = SystemNotificationChannels.USB; + message = r.getText( + com.android.internal.R.string.usb_notification_message); + } else { + final Intent intent = new Intent(); + intent.setClassName("com.android.settings", + "com.android.settings.HelpTrampoline"); + intent.putExtra(Intent.EXTRA_TEXT, + "help_url_audio_accessory_not_supported"); + + if (mContext.getPackageManager().resolveActivity(intent, 0) != null) { + pi = PendingIntent.getActivity(mContext, 0, intent, 0); + } else { + pi = null; + } - Intent intent = Intent.makeRestartActivityTask( - new ComponentName("com.android.settings", - "com.android.settings.deviceinfo.UsbModeChooserActivity")); - PendingIntent pi = PendingIntent.getActivityAsUser(mContext, 0, - intent, 0, null, UserHandle.CURRENT); + channel = SystemNotificationChannels.ALERTS; + message = r.getText( + com.android.internal.R.string + .usb_unsupported_audio_accessory_message); + } Notification notification = - new Notification.Builder(mContext, SystemNotificationChannels.USB) + new Notification.Builder(mContext, channel) .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb) .setWhen(0) .setOngoing(true) @@ -1148,6 +1177,7 @@ public class UsbDeviceManager { .setContentIntent(pi) .setVisibility(Notification.VISIBILITY_PUBLIC) .build(); + mNotificationManager.notifyAsUser(null, id, notification, UserHandle.ALL); mUsbNotificationId = id; @@ -1230,6 +1260,8 @@ public class UsbDeviceManager { pw.println(" mSinkPower: " + mSinkPower); pw.println(" mUsbCharging: " + mUsbCharging); pw.println(" mHideUsbNotification: " + mHideUsbNotification); + pw.println(" mAudioAccessoryConnected: " + mAudioAccessoryConnected); + try { pw.println(" Kernel state: " + FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim()); diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index 6c4ced4326a26326f9c4e868ca20f72bb6759746..4ffacfd7056aab369f66eee83eec7d070823e5ca 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -1202,6 +1202,50 @@ public class VoiceInteractionManagerService extends SystemService { public void onHandleUserStop(Intent intent, int userHandle) { } + @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(); diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java index f822d5e23b2375e78d3e73108a85bf80515c0dc9..c1475784a9ac3352bc6d83a3641967f46c7642a2 100644 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -165,20 +165,39 @@ public final class Call { "android.telecom.extra.HANDOVER_VIDEO_STATE"; /** - * Call event sent from Telecom via {@link Connection#onCallEvent(String, Bundle)} to - * inform a {@link Connection} that a handover initiated via {@link #EVENT_REQUEST_HANDOVER} - * has completed. + * Extra key used with the {@link #EVENT_REQUEST_HANDOVER} call event. Used by the + * {@link InCallService} initiating a handover to provide a {@link Bundle} with extra + * information to the handover {@link ConnectionService} specified by + * {@link #EXTRA_HANDOVER_PHONE_ACCOUNT_HANDLE}. + *

+ * This {@link Bundle} is not interpreted by Telecom, but passed as-is to the + * {@link ConnectionService} via the request extras when + * {@link ConnectionService#onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)} + * is called to initate the handover. * @hide */ - public static final String EVENT_HANDOVER_COMPLETE = "android.telecom.event.HANDOVER_COMPLETE"; + public static final String EXTRA_HANDOVER_EXTRAS = "android.telecom.extra.HANDOVER_EXTRAS"; /** - * Call event sent from Telecom via {@link Connection#onCallEvent(String, Bundle)} to - * inform a {@link Connection} that a handover initiated via {@link #EVENT_REQUEST_HANDOVER} - * has failed to complete. + * Call event sent from Telecom to the handover {@link ConnectionService} via + * {@link Connection#onCallEvent(String, Bundle)} to inform a {@link Connection} that a handover + * to the {@link ConnectionService} has completed successfully. + *

+ * A handover is initiated with the {@link #EVENT_REQUEST_HANDOVER} call event. + * @hide + */ + public static final String EVENT_HANDOVER_COMPLETE = + "android.telecom.event.HANDOVER_COMPLETE"; + /** + * Call event sent from Telecom to the handover {@link ConnectionService} via + * {@link Connection#onCallEvent(String, Bundle)} to inform a {@link Connection} that a handover + * to the {@link ConnectionService} has failed. + *

+ * A handover is initiated with the {@link #EVENT_REQUEST_HANDOVER} call event. * @hide */ - public static final String EVENT_HANDOVER_FAILED = "android.telecom.event.HANDOVER_FAILED"; + public static final String EVENT_HANDOVER_FAILED = + "android.telecom.event.HANDOVER_FAILED"; public static class Details { diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index 239cdcf038fd6d9d08f9170873a5150de89a03e9..6f1a39d661510c85300691df494fe2fbc13c7e25 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -551,6 +551,24 @@ public abstract class Connection extends Conferenceable { public static final String EVENT_CALL_REMOTELY_UNHELD = "android.telecom.event.CALL_REMOTELY_UNHELD"; + /** + * Connection event used to inform an {@link InCallService} which initiated a call handover via + * {@link Call#EVENT_REQUEST_HANDOVER} that the handover from this {@link Connection} has + * successfully completed. + * @hide + */ + public static final String EVENT_HANDOVER_COMPLETE = + "android.telecom.event.HANDOVER_COMPLETE"; + + /** + * Connection event used to inform an {@link InCallService} which initiated a call handover via + * {@link Call#EVENT_REQUEST_HANDOVER} that the handover from this {@link Connection} has failed + * to complete. + * @hide + */ + public static final String EVENT_HANDOVER_FAILED = + "android.telecom.event.HANDOVER_FAILED"; + // Flag controlling whether PII is emitted into the logs private static final boolean PII_DEBUG = Log.isLoggable(android.util.Log.DEBUG); diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java index 080ead1a2c0f2f8bf7e9a0326257ad433dd756b2..b5d9d3935c535d08b1a92e1a7332c1d98753aa5f 100644 --- a/telecomm/java/android/telecom/PhoneAccount.java +++ b/telecomm/java/android/telecom/PhoneAccount.java @@ -41,6 +41,15 @@ import java.util.List; */ public final class PhoneAccount implements Parcelable { + /** + * {@link PhoneAccount} extras key (see {@link PhoneAccount#getExtras()}) which determines the + * sort order for {@link PhoneAccount}s from the same + * {@link android.telecom.ConnectionService}. + * @hide + */ + public static final String EXTRA_SORT_ORDER = + "android.telecom.extra.SORT_ORDER"; + /** * {@link PhoneAccount} extras key (see {@link PhoneAccount#getExtras()}) which determines the * maximum permitted length of a call subject specified via the @@ -95,6 +104,18 @@ public final class PhoneAccount implements Parcelable { public static final String EXTRA_SUPPORTS_HANDOVER_FROM = "android.telecom.extra.SUPPORTS_HANDOVER_FROM"; + + /** + * Boolean {@link PhoneAccount} extras key (see {@link PhoneAccount#getExtras()}) which + * indicates whether a Self-Managed {@link PhoneAccount} should log its calls to the call log. + *

+ * By default, Self-Managed {@link PhoneAccount}s do not log their calls to the call log. + * Setting this extra to {@code true} provides a means for them to log their calls. + * @hide + */ + public static final String EXTRA_LOG_SELF_MANAGED_CALLS = + "android.telecom.extra.LOG_SELF_MANAGED_CALLS"; + /** * Flag indicating that this {@code PhoneAccount} can act as a connection manager for * other connections. The {@link ConnectionService} associated with this {@code PhoneAccount} diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index 38e4861caee1f79d1ad4706eacaa10fdc85ecafe..7a35cd3ac5c7e479d53504521f19cdf4feed7236 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -346,15 +346,34 @@ public class TelecomManager { "android.telecom.extra.NEW_OUTGOING_CALL_CANCEL_TIMEOUT"; /** - * Boolean extra specified when calling {@link #addNewIncomingCall(PhoneAccountHandle, Bundle)} - * to indicate to Telecom that the purpose of adding a new incoming call is to handover an + * Boolean extra specified to indicate that the intention of adding a call is to handover an * existing call from the user's device to a different {@link PhoneAccount}. *

+ * Used when calling {@link #addNewIncomingCall(PhoneAccountHandle, Bundle)} + * to indicate to Telecom that the purpose of adding a new incoming call is to handover an + * existing call from the user's device to a different {@link PhoneAccount}. This occurs on + * the receiving side of a handover. + *

+ * Used when Telecom calls + * {@link ConnectionService#onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)} + * to indicate that the purpose of Telecom requesting a new outgoing connection it to request + * a handover to this {@link ConnectionService} from an ongoing call on the user's device. This + * occurs on the initiating side of a handover. + *

* The phone number of the call used by Telecom to determine which call should be handed over. * @hide */ public static final String EXTRA_IS_HANDOVER = "android.telecom.extra.IS_HANDOVER"; + /** + * Extra key specified in the {@link ConnectionRequest#getExtras()} when Telecom calls + * {@link ConnectionService#onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)} + * to inform the {@link ConnectionService} what the initial {@link CallAudioState} of the + * {@link Connection} will be. + * @hide + */ + public static final String EXTRA_CALL_AUDIO_STATE = "android.telecom.extra.CALL_AUDIO_STATE"; + /** * A boolean extra, which when set on the {@link Intent#ACTION_CALL} intent or on the bundle * passed into {@link #placeCall(Uri, Bundle)}, indicates that the call should be initiated with diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 2f547dbda7c0347e5a255b2557c6f7cfb4a84d31..e0788cafb1956e2622279a618c921ed948cde62b 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -1010,6 +1010,20 @@ public class CarrierConfigManager { public static final String KEY_CARRIER_DEFAULT_ACTIONS_ON_DCFAILURE_STRING_ARRAY = "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 @@ -1614,7 +1628,8 @@ public class CarrierConfigManager { 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); @@ -1626,6 +1641,9 @@ public class CarrierConfigManager { //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/MbmsDownloadManager.java b/telephony/java/android/telephony/MbmsDownloadManager.java index bb4bf1e838fbde2feb6cc9db8709758ece77a893..862c91942d601fe28c0d7d48182a14e2a21c8cbc 100644 --- a/telephony/java/android/telephony/MbmsDownloadManager.java +++ b/telephony/java/android/telephony/MbmsDownloadManager.java @@ -16,14 +16,16 @@ package android.telephony; -import android.app.PendingIntent; import android.content.Context; import android.net.Uri; -import android.telephony.mbms.DownloadListener; +import android.os.RemoteException; +import android.telephony.mbms.DownloadCallback; import android.telephony.mbms.DownloadRequest; import android.telephony.mbms.DownloadStatus; -import android.telephony.mbms.FileServiceInfo; -import android.telephony.mbms.IMbmsDownloadManagerListener; +import android.telephony.mbms.IMbmsDownloadManagerCallback; +import android.telephony.mbms.MbmsInitializationException; +import android.telephony.mbms.vendor.IMbmsDownloadService; +import android.util.Log; import java.util.List; @@ -31,9 +33,135 @@ import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; /** @hide */ public class MbmsDownloadManager { + private static final String LOG_TAG = MbmsDownloadManager.class.getSimpleName(); + + /** + * The MBMS middleware should send this when a download of single file has completed or + * failed. Mandatory extras are + * {@link #EXTRA_RESULT} + * {@link #EXTRA_INFO} + * {@link #EXTRA_REQUEST} + * {@link #EXTRA_TEMP_LIST} + * {@link #EXTRA_FINAL_URI} + * + * TODO: future systemapi + */ + public static final String ACTION_DOWNLOAD_RESULT_INTERNAL = + "android.telephony.mbms.action.DOWNLOAD_RESULT_INTERNAL"; + + /** + * The MBMS middleware should send this when it wishes to request {@code content://} URIs to + * serve as temp files for downloads or when it wishes to resume paused downloads. Mandatory + * extras are + * {@link #EXTRA_REQUEST} + * + * Optional extras are + * {@link #EXTRA_FD_COUNT} (0 if not present) + * {@link #EXTRA_PAUSED_LIST} (empty if not present) + * + * TODO: future systemapi + */ + public static final String ACTION_FILE_DESCRIPTOR_REQUEST = + "android.telephony.mbms.action.FILE_DESCRIPTOR_REQUEST"; + + /** + * The MBMS middleware should send this when it wishes to clean up temp files in the app's + * filesystem. Mandatory extras are: + * {@link #EXTRA_TEMP_FILES_IN_USE} + * + * TODO: future systemapi + */ + public static final String ACTION_CLEANUP = + "android.telephony.mbms.action.CLEANUP"; + + /** + * Integer extra indicating the result code of the download. + * TODO: put in link to error list + * TODO: future systemapi (here and and all extras) + */ + public static final String EXTRA_RESULT = "android.telephony.mbms.extra.RESULT"; + + /** + * Extra containing the {@link android.telephony.mbms.FileInfo} for which the download result + * is for. Must not be null. + */ + public static final String EXTRA_INFO = "android.telephony.mbms.extra.INFO"; + + /** + * Extra containing the {@link DownloadRequest} for which the download result or file + * descriptor request is for. Must not be null. + */ + public static final String EXTRA_REQUEST = "android.telephony.mbms.extra.REQUEST"; + + /** + * Extra containing a {@link List} of {@link Uri}s that were used as temp files for this + * completed file. These {@link Uri}s should have scheme {@code file://}, and the temp + * files will be deleted upon receipt of the intent. + * May be null. + */ + public static final String EXTRA_TEMP_LIST = "android.telephony.mbms.extra.TEMP_LIST"; + + /** + * Extra containing a single {@link Uri} indicating the path to the temp file in which the + * decoded downloaded file resides. Must not be null. + */ + public static final String EXTRA_FINAL_URI = "android.telephony.mbms.extra.FINAL_URI"; + + /** + * Extra containing an integer indicating the number of temp files requested. + */ + public static final String EXTRA_FD_COUNT = "android.telephony.mbms.extra.FD_COUNT"; + + /** + * Extra containing a list of {@link Uri}s that the middleware is requesting access to via + * {@link #ACTION_FILE_DESCRIPTOR_REQUEST} in order to resume downloading. These {@link Uri}s + * should have scheme {@code file://}. + */ + public static final String EXTRA_PAUSED_LIST = "android.telephony.mbms.extra.PAUSED_LIST"; + + /** + * Extra containing a list of {@link android.telephony.mbms.UriPathPair}s, used in the + * response to {@link #ACTION_FILE_DESCRIPTOR_REQUEST}. These are temp files that are meant + * to be used for new file downloads. + */ + public static final String EXTRA_FREE_URI_LIST = "android.telephony.mbms.extra.FREE_URI_LIST"; + + /** + * Extra containing a list of {@link android.telephony.mbms.UriPathPair}s, used in the + * response to {@link #ACTION_FILE_DESCRIPTOR_REQUEST}. These + * {@link android.telephony.mbms.UriPathPair}s contain {@code content://} URIs that provide + * access to previously paused downloads. + */ + public static final String EXTRA_PAUSED_URI_LIST = + "android.telephony.mbms.extra.PAUSED_URI_LIST"; + + /** + * Extra containing a list of {@link Uri}s indicating temp files which the middleware is + * still using. + */ + public static final String EXTRA_TEMP_FILES_IN_USE = + "android.telephony.mbms.extra.TEMP_FILES_IN_USE"; + + public static final int RESULT_SUCCESSFUL = 1; + public static final int RESULT_CANCELLED = 2; + public static final int RESULT_EXPIRED = 3; + // TODO - more results! + private final Context mContext; private int mSubId = INVALID_SUBSCRIPTION_ID; + private IMbmsDownloadService mService; + private final IMbmsDownloadManagerCallback mCallback; + private final String mDownloadAppName; + + private MbmsDownloadManager(Context context, IMbmsDownloadManagerCallback callback, + String downloadAppName, int subId) { + mContext = context; + mCallback = callback; + mDownloadAppName = downloadAppName; + mSubId = subId; + } + /** * Create a new MbmsDownloadManager using the system default data subscription ID. * @@ -42,9 +170,13 @@ public class MbmsDownloadManager { * * @hide */ - public MbmsDownloadManager(Context context, IMbmsDownloadManagerListener listener, - String downloadAppName) { - mContext = context; + public static MbmsDownloadManager createManager(Context context, + IMbmsDownloadManagerCallback listener, String downloadAppName) + throws MbmsInitializationException{ + MbmsDownloadManager mdm = new MbmsDownloadManager(context, listener, downloadAppName, + SubscriptionManager.getDefaultSubscriptionId()); + mdm.bindAndInitialize(); + return mdm; } /** @@ -55,9 +187,23 @@ public class MbmsDownloadManager { * * @hide */ - public MbmsDownloadManager(Context context, IMbmsDownloadManagerListener listener, - String downloadAppName, int subId) { - mContext = context; + + public static MbmsDownloadManager createManager(Context context, + IMbmsDownloadManagerCallback listener, String downloadAppName, int subId) + throws MbmsInitializationException { + MbmsDownloadManager mdm = new MbmsDownloadManager(context, listener, downloadAppName, + subId); + mdm.bindAndInitialize(); + return mdm; + } + + private void bindAndInitialize() throws MbmsInitializationException { + // TODO: bind + try { + mService.initialize(mDownloadAppName, mSubId, mCallback); + } catch (RemoteException e) { + throw new MbmsInitializationException(0); // TODO: proper error code + } } /** @@ -84,31 +230,9 @@ public class MbmsDownloadManager { } - public static final String EXTRA_REQUEST = "extraRequest"; - - public static final int RESULT_SUCCESSFUL = 1; - public static final int RESULT_CANCELLED = 2; - public static final int RESULT_EXPIRED = 3; - // TODO - more results! - - public static final String EXTRA_RESULT = "extraResult"; - public static final String EXTRA_URI = "extraDownloadedUri"; - /** * Requests a future download. * returns a token which may be used to cancel a download. - * fileServiceInfo indicates what FileService to download from - * source indicates which file to download from the given FileService. This is - * an optional field - it may be null or empty to indicate download everything from - * the FileService. - * destination is a file URI for where in the apps accessible storage locations to write - * the content. This URI may be used to store temporary data and should not be - * accessed until the PendingIntent is called indicating success. - * resultIntent is sent when each file is completed and when the request is concluded - * either via TTL expiration, cancel or error. - * This intent is sent with three extras: a {@link DownloadRequest} typed extra called - * {@link #EXTRA_REQUEST}, an Integer called {@link #EXTRA_RESULT} for the result code - * and a {@link Uri} called {@link #EXTRA_URI} to the resulting file (if successful). * downloadListener is an optional callback object which can be used to get progress reports * of a currently occuring download. Note this can only run while the calling app * is running, so future downloads will simply result in resultIntents being sent @@ -118,7 +242,7 @@ public class MbmsDownloadManager { * * Asynchronous errors through the listener include any of the errors */ - public DownloadRequest download(DownloadRequest downloadRequest, DownloadListener listener) { + public DownloadRequest download(DownloadRequest downloadRequest, DownloadCallback listener) { return null; } @@ -168,7 +292,7 @@ public class MbmsDownloadManager { } /** - * Resets middleware knowldge regarding this download request. + * Resets middleware knowledge regarding this download request. * * This state consists of knowledge of what files have already been downloaded. * Normally the middleware won't download files who's hash matches previously downloaded @@ -187,5 +311,15 @@ public class MbmsDownloadManager { } public void dispose() { + try { + if (mService != null) { + mService.dispose(mDownloadAppName, mSubId); + } else { + Log.i(LOG_TAG, "Service already dead"); + } + } catch (RemoteException e) { + // Ignore + Log.i(LOG_TAG, "Remote exception while disposing of service"); + } } } diff --git a/telephony/java/android/telephony/MbmsStreamingManager.java b/telephony/java/android/telephony/MbmsStreamingManager.java index 9a2ba6de93deb4cf8c1076d735c6767f200fc8db..770a04a8881ae0297584191bf9087d09bc2e4ae9 100644 --- a/telephony/java/android/telephony/MbmsStreamingManager.java +++ b/telephony/java/android/telephony/MbmsStreamingManager.java @@ -17,10 +17,13 @@ package android.telephony; import android.content.Context; -import android.telephony.mbms.IMbmsStreamingManagerListener; -import android.telephony.mbms.IStreamingServiceListener; +import android.os.RemoteException; +import android.telephony.mbms.IMbmsStreamingManagerCallback; +import android.telephony.mbms.IStreamingServiceCallback; +import android.telephony.mbms.MbmsInitializationException; import android.telephony.mbms.StreamingService; import android.telephony.mbms.StreamingServiceInfo; +import android.telephony.mbms.vendor.IMbmsStreamingService; import android.util.Log; import java.util.List; @@ -31,30 +34,60 @@ import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; public class MbmsStreamingManager { private static final String LOG_TAG = "MbmsStreamingManager"; private static final boolean DEBUG = true; + private IMbmsStreamingService mService; + private IMbmsStreamingManagerCallback mCallbackToApp; + private final String mAppName; private final Context mContext; - private int mSubId = INVALID_SUBSCRIPTION_ID; + private int mSubscriptionId = INVALID_SUBSCRIPTION_ID; + + /** @hide */ + private MbmsStreamingManager(Context context, IMbmsStreamingManagerCallback listener, + String streamingAppName, int subscriptionId) { + mContext = context; + mAppName = streamingAppName; + mCallbackToApp = listener; + mSubscriptionId = subscriptionId; + } /** - * Create a new MbmsStreamingManager using the system default data subscription ID. + * Create a new MbmsStreamingManager using the given subscription ID. * * Note that this call will bind a remote service and that may take a bit. This * may throw an IllegalArgumentException or RemoteException. + * TODO: document this and add exceptions that can be thrown for synchronous + * initialization/bind errors + * + * @param context + * @param listener + * @param streamingAppName + * @param subscriptionId + * @return */ - public MbmsStreamingManager(Context context, IMbmsStreamingManagerListener listener, - String streamingAppName) { - mContext = context; + public static MbmsStreamingManager create(Context context, + IMbmsStreamingManagerCallback listener, String streamingAppName, int subscriptionId) + throws MbmsInitializationException { + MbmsStreamingManager manager = new MbmsStreamingManager(context, listener, + streamingAppName, subscriptionId); + manager.bindAndInitialize(); + return manager; } /** - * Create a new MbmsStreamingManager using the given subscription ID. + * Create a new MbmsStreamingManager using the system default data subscription ID. * * Note that this call will bind a remote service and that may take a bit. This * may throw an IllegalArgumentException or RemoteException. */ - public MbmsStreamingManager(Context context, IMbmsStreamingManagerListener listener, - String streamingAppName, int subId) { - mContext = context; + public static MbmsStreamingManager create(Context context, + IMbmsStreamingManagerCallback listener, String streamingAppName) + throws MbmsInitializationException { + // TODO: get default sub id + int subId = INVALID_SUBSCRIPTION_ID; + MbmsStreamingManager manager = new MbmsStreamingManager(context, listener, + streamingAppName, subId); + manager.bindAndInitialize(); + return manager; } /** @@ -97,7 +130,7 @@ public class MbmsStreamingManager { * Asynchronous errors through the listener include any of the errors */ public StreamingService startStreaming(StreamingServiceInfo serviceInfo, - IStreamingServiceListener listener) { + IStreamingServiceCallback listener) { return null; } @@ -125,4 +158,20 @@ public class MbmsStreamingManager { private void logd(String str) { Log.d(LOG_TAG, str); } + + private boolean isServiceConnected() { + return mService != null; + } + + private void bindAndInitialize() throws MbmsInitializationException { + // TODO: bind to the service + try { + int returnCode = mService.initialize(mCallbackToApp, mAppName, mSubscriptionId); + if (returnCode != 0) { + throw new MbmsInitializationException(returnCode); + } + } catch (RemoteException e) { + throw new MbmsInitializationException(/* some error */ 0); + } + } } diff --git a/telephony/java/android/telephony/NetworkScan.java b/telephony/java/android/telephony/NetworkScan.java new file mode 100644 index 0000000000000000000000000000000000000000..0cb4cff0858e4397101603f53209c31709cf9047 --- /dev/null +++ b/telephony/java/android/telephony/NetworkScan.java @@ -0,0 +1,83 @@ +/* + * 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.telephony; + +import android.content.Context; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.util.Log; + +import com.android.internal.telephony.ITelephony; + +/** + * Allows applications to request the system to perform a network scan. + * + * The caller of {@link #requestNetworkScan(NetworkScanRequest, NetworkScanCallback)} will + * receive a NetworkScan which contains the callback method to stop the scan requested. + * @hide + */ +public class NetworkScan { + + public static final String TAG = "NetworkScan"; + + public static final int SUCCESS = 0; + public static final int ERROR_INVALID_SCAN = 1; + public static final int ERROR_UNSUPPORTED = 2; + public static final int ERROR_INTERRUPTED = 3; + public static final int ERROR_CANCELLED = 4; + + private final int mScanId; + private final int mSubId; + + /** + * Stops the network scan + * + * This is the callback method to stop an ongoing scan. When user requests a new scan, + * a NetworkScan object will be returned, and the user can stop the scan by calling this + * method. + */ + public void stop() throws RemoteException { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + telephony.stopNetworkScan(mSubId, mScanId); + } else { + throw new RemoteException("Failed to get the ITelephony instance."); + } + } catch (RemoteException ex) { + Rlog.e(TAG, "stopNetworkScan RemoteException", ex); + throw new RemoteException("Failed to stop the network scan with id " + mScanId); + } + } + + /** + * Creates a new NetworkScan with scanId + * + * @param scanId The id of the scan + * @param subId the id of the subscription + * @hide + */ + public NetworkScan(int scanId, int subId) { + mScanId = scanId; + mSubId = subId; + } + + private ITelephony getITelephony() { + return ITelephony.Stub.asInterface( + ServiceManager.getService(Context.TELEPHONY_SERVICE)); + } +} diff --git a/telephony/java/android/telephony/NetworkScanRequest.aidl b/telephony/java/android/telephony/NetworkScanRequest.aidl new file mode 100644 index 0000000000000000000000000000000000000000..5addb1cd7c5974e826347c021e2550fd0ef147ea --- /dev/null +++ b/telephony/java/android/telephony/NetworkScanRequest.aidl @@ -0,0 +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.telephony; + +parcelable NetworkScanRequest; diff --git a/telephony/java/android/telephony/NetworkScanRequest.java b/telephony/java/android/telephony/NetworkScanRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..0a542a7aacef44042c1216e4035135cfe4b27b4a --- /dev/null +++ b/telephony/java/android/telephony/NetworkScanRequest.java @@ -0,0 +1,115 @@ +/* + * 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.telephony; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.Arrays; + +/** + * Defines a request to peform a network scan. + * + * This class defines whether the network scan will be performed only once or periodically until + * cancelled, when the scan is performed periodically, the time interval is not controlled by the + * user but defined by the modem vendor. + * @hide + */ +public final class NetworkScanRequest implements Parcelable { + + /** Performs the scan only once */ + public static final int SCAN_TYPE_ONE_SHOT = 0; + /** + * Performs the scan periodically until cancelled + * + * The modem will start new scans periodically, and the interval between two scans is usually + * multiple minutes. + * */ + public static final int SCAN_TYPE_PERIODIC = 1; + + /** Defines the type of the scan. */ + public int scanType; + + /** Describes the radio access technologies with bands or channels that need to be scanned. */ + public RadioAccessSpecifier[] specifiers; + + /** + * Creates a new NetworkScanRequest with scanType and network specifiers + * + * @param scanType The type of the scan + * @param specifiers the radio network with bands / channels to be scanned + */ + public NetworkScanRequest(int scanType, RadioAccessSpecifier[] specifiers) { + this.scanType = scanType; + this.specifiers = specifiers; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(scanType); + dest.writeParcelableArray(specifiers, flags); + } + + private NetworkScanRequest(Parcel in) { + scanType = in.readInt(); + specifiers = (RadioAccessSpecifier[]) in.readParcelableArray( + Object.class.getClassLoader(), + RadioAccessSpecifier.class); + } + + @Override + public boolean equals (Object o) { + NetworkScanRequest nsr; + + try { + nsr = (NetworkScanRequest) o; + } catch (ClassCastException ex) { + return false; + } + + if (o == null) { + return false; + } + + return (scanType == nsr.scanType + && Arrays.equals(specifiers, nsr.specifiers)); + } + + @Override + public int hashCode () { + return ((scanType * 31) + + (Arrays.hashCode(specifiers)) * 37); + } + + public static final Creator CREATOR = + new Creator() { + @Override + public NetworkScanRequest createFromParcel(Parcel in) { + return new NetworkScanRequest(in); + } + + @Override + public NetworkScanRequest[] newArray(int size) { + return new NetworkScanRequest[size]; + } + }; +} diff --git a/telephony/java/android/telephony/RadioAccessSpecifier.aidl b/telephony/java/android/telephony/RadioAccessSpecifier.aidl new file mode 100644 index 0000000000000000000000000000000000000000..7e09e0b4f74ceb579031641f77e01ff683b1c784 --- /dev/null +++ b/telephony/java/android/telephony/RadioAccessSpecifier.aidl @@ -0,0 +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.telephony; + +parcelable RadioAccessSpecifier; diff --git a/telephony/java/android/telephony/RadioAccessSpecifier.java b/telephony/java/android/telephony/RadioAccessSpecifier.java new file mode 100644 index 0000000000000000000000000000000000000000..33ce8b4212bcb1a601f0016f2ab6aa821d8bd87a --- /dev/null +++ b/telephony/java/android/telephony/RadioAccessSpecifier.java @@ -0,0 +1,129 @@ +/* + * 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.telephony; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.Arrays; + +/** + * Describes a particular radio access network to be scanned. + * + * The scan can be performed on either bands or channels for a specific radio access network type. + * @hide + */ +public final class RadioAccessSpecifier implements Parcelable { + + /** + * The radio access network that needs to be scanned + * + * See {@link RadioNetworkConstants.RadioAccessNetworks} for details. + */ + public int radioAccessNetwork; + + /** + * The frequency bands that need to be scanned + * + * bands must be used together with radioAccessNetwork + * + * See {@link RadioNetworkConstants} for details. + */ + public int[] bands; + + /** + * The frequency channels that need to be scanned + * + * channels must be used together with radioAccessNetwork + * + * See {@link RadioNetworkConstants.RadioAccessNetworks} for details. + */ + public int[] channels; + + /** + * Creates a new RadioAccessSpecifier with radio network, bands and channels + * + * The user must specify the radio network type, and at least specify either of frequency + * bands or channels. + * + * @param ran The type of the radio access network + * @param bands the frequency bands to be scanned + * @param channels the frequency bands to be scanned + */ + public RadioAccessSpecifier(int ran, int[] bands, int[] channels) { + this.radioAccessNetwork = ran; + this.bands = bands; + this.channels = channels; + } + + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator (){ + @Override + public RadioAccessSpecifier createFromParcel(Parcel in) { + return new RadioAccessSpecifier(in); + } + + @Override + public RadioAccessSpecifier[] newArray(int size) { + return new RadioAccessSpecifier[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(radioAccessNetwork); + dest.writeIntArray(bands); + dest.writeIntArray(channels); + } + + private RadioAccessSpecifier(Parcel in) { + radioAccessNetwork = in.readInt(); + bands = in.createIntArray(); + channels = in.createIntArray(); + } + + @Override + public boolean equals (Object o) { + RadioAccessSpecifier ras; + + try { + ras = (RadioAccessSpecifier) o; + } catch (ClassCastException ex) { + return false; + } + + if (o == null) { + return false; + } + + return (radioAccessNetwork == ras.radioAccessNetwork + && Arrays.equals(bands, ras.bands) + && Arrays.equals(channels, ras.channels)); + } + + @Override + public int hashCode () { + return ((radioAccessNetwork * 31) + + (Arrays.hashCode(bands) * 37) + + (Arrays.hashCode(channels)) * 39); + } +} diff --git a/telephony/java/android/telephony/RadioNetworkConstants.java b/telephony/java/android/telephony/RadioNetworkConstants.java new file mode 100644 index 0000000000000000000000000000000000000000..1a9072d3eb0aaa570eea4683067723110f376c6f --- /dev/null +++ b/telephony/java/android/telephony/RadioNetworkConstants.java @@ -0,0 +1,169 @@ +/* + * 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.telephony; + +/** + * Contains radio access network related constants. + * @hide + */ +public final class RadioNetworkConstants { + + public static final class RadioAccessNetworks { + public static final int GERAN = 1; + public static final int UTRAN = 2; + public static final int EUTRAN = 3; + /** @hide */ + public static final int CDMA2000 = 4; + } + + /** + * Frenquency bands for GERAN. + * http://www.etsi.org/deliver/etsi_ts/145000_145099/145005/14.00.00_60/ts_145005v140000p.pdf + */ + public static final class GeranBands { + public static final int BAND_T380 = 1; + public static final int BAND_T410 = 2; + public static final int BAND_450 = 3; + public static final int BAND_480 = 4; + public static final int BAND_710 = 5; + public static final int BAND_750 = 6; + public static final int BAND_T810 = 7; + public static final int BAND_850 = 8; + public static final int BAND_P900 = 9; + public static final int BAND_E900 = 10; + public static final int BAND_R900 = 11; + public static final int BAND_DCS1800 = 12; + public static final int BAND_PCS1900 = 13; + public static final int BAND_ER900 = 14; + } + + /** + * Frenquency bands for UTRAN. + * http://www.etsi.org/deliver/etsi_ts/125100_125199/125104/13.03.00_60/ts_125104v130p.pdf + */ + public static final class UtranBands { + public static final int BAND_1 = 1; + public static final int BAND_2 = 2; + public static final int BAND_3 = 3; + public static final int BAND_4 = 4; + public static final int BAND_5 = 5; + public static final int BAND_6 = 6; + public static final int BAND_7 = 7; + public static final int BAND_8 = 8; + public static final int BAND_9 = 9; + public static final int BAND_10 = 10; + public static final int BAND_11 = 11; + public static final int BAND_12 = 12; + public static final int BAND_13 = 13; + public static final int BAND_14 = 14; + /** band 15, 16, 17, 18 are reserved */ + public static final int BAND_19 = 19; + public static final int BAND_20 = 20; + public static final int BAND_21 = 21; + public static final int BAND_22 = 22; + /** band 23, 24 are reserved */ + public static final int BAND_25 = 25; + public static final int BAND_26 = 26; + } + + /** + * Frenquency bands for EUTRAN. + * http://www.etsi.org/deliver/etsi_ts/136100_136199/136101/14.03.00_60/ts_136101v140p.pdf + */ + public static final class EutranBands { + public static final int BAND_1 = 1; + public static final int BAND_2 = 2; + public static final int BAND_3 = 3; + public static final int BAND_4 = 4; + public static final int BAND_5 = 5; + public static final int BAND_6 = 6; + public static final int BAND_7 = 7; + public static final int BAND_8 = 8; + public static final int BAND_9 = 9; + public static final int BAND_10 = 10; + public static final int BAND_11 = 11; + public static final int BAND_12 = 12; + public static final int BAND_13 = 13; + public static final int BAND_14 = 14; + public static final int BAND_17 = 17; + public static final int BAND_18 = 18; + public static final int BAND_19 = 19; + public static final int BAND_20 = 20; + public static final int BAND_21 = 21; + public static final int BAND_22 = 22; + public static final int BAND_23 = 23; + public static final int BAND_24 = 24; + public static final int BAND_25 = 25; + public static final int BAND_26 = 26; + public static final int BAND_27 = 27; + public static final int BAND_28 = 28; + public static final int BAND_30 = 30; + public static final int BAND_31 = 31; + public static final int BAND_33 = 33; + public static final int BAND_34 = 34; + public static final int BAND_35 = 35; + public static final int BAND_36 = 36; + public static final int BAND_37 = 37; + public static final int BAND_38 = 38; + public static final int BAND_39 = 39; + public static final int BAND_40 = 40; + public static final int BAND_41 = 41; + public static final int BAND_42 = 42; + public static final int BAND_43 = 43; + public static final int BAND_44 = 44; + public static final int BAND_45 = 45; + public static final int BAND_46 = 46; + public static final int BAND_47 = 47; + public static final int BAND_48 = 48; + public static final int BAND_65 = 65; + public static final int BAND_66 = 66; + public static final int BAND_68 = 68; + public static final int BAND_70 = 70; + } + + /** + * Frenquency bands for CDMA2000. + * http://www.3gpp2.org/Public_html/Specs/C.S0057-E_v1.0_Bandclass_Specification.pdf + * @hide + * + * TODO(yinxu): Check with the nexus team about the definition of CDMA bands. + */ + public static final class CdmaBands { + public static final int BAND_0 = 1; + public static final int BAND_1 = 2; + public static final int BAND_2 = 3; + public static final int BAND_3 = 4; + public static final int BAND_4 = 5; + public static final int BAND_5 = 6; + public static final int BAND_6 = 7; + public static final int BAND_7 = 8; + public static final int BAND_8 = 9; + public static final int BAND_9 = 10; + public static final int BAND_10 = 11; + public static final int BAND_11 = 12; + public static final int BAND_12 = 13; + public static final int BAND_13 = 14; + public static final int BAND_14 = 15; + public static final int BAND_15 = 16; + public static final int BAND_16 = 17; + public static final int BAND_17 = 18; + public static final int BAND_18 = 19; + public static final int BAND_19 = 20; + public static final int BAND_20 = 21; + public static final int BAND_21 = 22; + } +} diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 81f660047c6bbbc7a78d58ff6e9f39cb8fe37c15..7f616ad6fb080f7e87e09a6309f06f0d117a3764 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -342,6 +342,32 @@ public class SubscriptionManager { 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:

+ * 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:

+ * {@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 class SubscriptionManager { public static void putPhoneIdAndSubIdExtra(Intent intent, int phoneId, int subId) { if (VDBG) logd("putPhoneIdAndSubIdExtra: phoneId=" + phoneId + " subId=" + subId); intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, subId); - intent.putExtra(Intent.EXTRA_SUBSCRIPTION_INDEX, subId); + intent.putExtra(EXTRA_SUBSCRIPTION_INDEX, subId); intent.putExtra(PhoneConstants.PHONE_KEY, phoneId); //FIXME this is using phoneId and slotIndex interchangeably //Eventually, this should be removed as it is not the slot id diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index e97012469e254a624aadd25b4d9c70b8f847432a..c20eb30dab8f43c6f85e66247062d14838290ca4 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -33,8 +33,14 @@ import android.content.Intent; import android.net.ConnectivityManager; import android.net.Uri; import android.os.BatteryStats; +import android.os.Binder; import android.os.Bundle; import android.os.Handler; +import android.os.HandlerThread; +import android.os.Looper; +import android.os.Message; +import android.os.Messenger; +import android.os.Parcelable; import android.os.PersistableBundle; import android.os.RemoteException; import android.os.ResultReceiver; @@ -140,6 +146,7 @@ public class TelephonyManager { private final Context mContext; private final int mSubId; private SubscriptionManager mSubscriptionManager; + private TelephonyScanManager mTelephonyScanManager; private static String multiSimConfig = SystemProperties.get(TelephonyProperties.PROPERTY_MULTI_SIM_CONFIG); @@ -4589,6 +4596,32 @@ public class TelephonyManager { return null; } + /** + * Request a network scan. + * + * This method is asynchronous, so the network scan results will be returned by callback. + * The returned NetworkScan will contain a callback method which can be used to stop the scan. + * + *

+ * Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} + * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * + * @param request Contains all the RAT with bands/channels that need to be scanned. + * @param callback Returns network scan results or errors. + * @return A NetworkScan obj which contains a callback which can stop the scan. + * @hide + */ + public NetworkScan requestNetworkScan( + NetworkScanRequest request, TelephonyScanManager.NetworkScanCallback callback) { + synchronized (this) { + if (mTelephonyScanManager == null) { + mTelephonyScanManager = new TelephonyScanManager(); + } + } + return mTelephonyScanManager.requestNetworkScan(getSubId(), request, callback); + } + /** * Ask the radio to connect to the input network and change selection mode to manual. * diff --git a/telephony/java/android/telephony/TelephonyScanManager.java b/telephony/java/android/telephony/TelephonyScanManager.java new file mode 100644 index 0000000000000000000000000000000000000000..c905d3a433f31f8b361e25fb82d83015883cb608 --- /dev/null +++ b/telephony/java/android/telephony/TelephonyScanManager.java @@ -0,0 +1,186 @@ +/* + * 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.telephony; + +import static com.android.internal.util.Preconditions.checkNotNull; + +import android.content.Context; +import android.os.Binder; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Looper; +import android.os.Message; +import android.os.Messenger; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.util.Log; +import android.util.SparseArray; +import java.util.List; + +import com.android.internal.telephony.ITelephony; + +/** + * Manages the radio access network scan requests and callbacks. + * @hide + */ +public final class TelephonyScanManager { + + private static final String TAG = "TelephonyScanManager"; + + /** @hide */ + public static final int CALLBACK_SCAN_RESULTS = 1; + /** @hide */ + public static final int CALLBACK_SCAN_ERROR = 2; + /** @hide */ + public static final int CALLBACK_SCAN_COMPLETE = 3; + + /** + * The caller of {@link #requestNetworkScan(NetworkScanRequest, NetworkScanCallback)} should + * implement and provide this callback so that the scan results or errors can be returned. + */ + public static abstract class NetworkScanCallback { + /** Returns the scan results to the user, this callback will be called multiple times. */ + public void onResults(List results) {} + + /** + * Informs the user that the scan has stopped. + * + * This callback will be called when the scan is finished or cancelled by the user. + * The related NetworkScanRequest will be deleted after this callback. + */ + public void onComplete() {} + + /** + * Informs the user that there is some error about the scan. + * + * This callback will be called whenever there is any error about the scan, but the scan + * won't stop unless the onComplete() callback is called. + */ + public void onError(int error) {} + } + + private static class NetworkScanInfo { + private final NetworkScanRequest mRequest; + private final NetworkScanCallback mCallback; + + NetworkScanInfo(NetworkScanRequest request, NetworkScanCallback callback) { + mRequest = request; + mCallback = callback; + } + } + + private final Looper mLooper; + private final Messenger mMessenger; + private SparseArray mScanInfo = new SparseArray(); + + public TelephonyScanManager() { + HandlerThread thread = new HandlerThread(TAG); + thread.start(); + mLooper = thread.getLooper(); + mMessenger = new Messenger(new Handler(mLooper) { + @Override + public void handleMessage(Message message) { + checkNotNull(message, "message cannot be null"); + NetworkScanInfo nsi; + synchronized (mScanInfo) { + nsi = mScanInfo.get(message.arg2); + } + if (nsi == null) { + throw new RuntimeException( + "Failed to find NetworkScanInfo with id " + message.arg2); + } + NetworkScanCallback callback = nsi.mCallback; + if (callback == null) { + throw new RuntimeException( + "Failed to find NetworkScanCallback with id " + message.arg2); + } + + switch (message.what) { + case CALLBACK_SCAN_RESULTS: + try { + callback.onResults((List) message.obj); + } catch (Exception e) { + Rlog.e(TAG, "Exception in networkscan callback onResults", e); + } + break; + case CALLBACK_SCAN_ERROR: + try { + callback.onError(message.arg1); + } catch (Exception e) { + Rlog.e(TAG, "Exception in networkscan callback onError", e); + } + break; + case CALLBACK_SCAN_COMPLETE: + try { + callback.onComplete(); + mScanInfo.remove(message.arg2); + } catch (Exception e) { + Rlog.e(TAG, "Exception in networkscan callback onComplete", e); + } + break; + default: + Rlog.e(TAG, "Unhandled message " + Integer.toHexString(message.what)); + break; + } + } + }); + } + + /** + * Request a network scan. + * + * This method is asynchronous, so the network scan results will be returned by callback. + * The returned NetworkScan will contain a callback method which can be used to stop the scan. + * + *

+ * Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} + * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * + * @param request Contains all the RAT with bands/channels that need to be scanned. + * @param callback Returns network scan results or errors. + * @return A NetworkScan obj which contains a callback which can stop the scan. + * @hide + */ + public NetworkScan requestNetworkScan(int subId, + NetworkScanRequest request, NetworkScanCallback callback) { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + int scanId = telephony.requestNetworkScan(subId, request, mMessenger, new Binder()); + saveScanInfo(scanId, request, callback); + return new NetworkScan(scanId, subId); + } + } catch (RemoteException ex) { + Rlog.e(TAG, "requestNetworkScan RemoteException", ex); + } catch (NullPointerException ex) { + Rlog.e(TAG, "requestNetworkScan NPE", ex); + } + return null; + } + + private void saveScanInfo(int id, NetworkScanRequest request, NetworkScanCallback callback) { + synchronized (mScanInfo) { + mScanInfo.put(id, new NetworkScanInfo(request, callback)); + } + } + + private ITelephony getITelephony() { + return ITelephony.Stub.asInterface( + ServiceManager.getService(Context.TELEPHONY_SERVICE)); + } +} diff --git a/telephony/java/android/telephony/ims/ImsServiceProxy.java b/telephony/java/android/telephony/ims/ImsServiceProxy.java index 38ea6e6ff9a07168d8c446c00e4e0a9c664cf57a..a75cd86dcf071fd845dc3ffdd1495f6f1bad6d35 100644 --- a/telephony/java/android/telephony/ims/ImsServiceProxy.java +++ b/telephony/java/android/telephony/ims/ImsServiceProxy.java @@ -120,7 +120,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur public int startSession(PendingIntent incomingCallIntent, IImsRegistrationListener listener) throws RemoteException { synchronized (mLock) { - checkBinderConnection(); + checkServiceIsReady(); return getServiceInterface(mBinder).startSession(mSlotId, mSupportedFeature, incomingCallIntent, listener); } @@ -129,7 +129,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur @Override public void endSession(int sessionId) throws RemoteException { synchronized (mLock) { - checkBinderConnection(); + checkServiceIsReady(); getServiceInterface(mBinder).endSession(mSlotId, mSupportedFeature, sessionId); } } @@ -138,7 +138,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur public boolean isConnected(int callServiceType, int callType) throws RemoteException { synchronized (mLock) { - checkBinderConnection(); + checkServiceIsReady(); return getServiceInterface(mBinder).isConnected(mSlotId, mSupportedFeature, callServiceType, callType); } @@ -147,7 +147,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur @Override public boolean isOpened() throws RemoteException { synchronized (mLock) { - checkBinderConnection(); + checkServiceIsReady(); return getServiceInterface(mBinder).isOpened(mSlotId, mSupportedFeature); } } @@ -156,7 +156,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur public void addRegistrationListener(IImsRegistrationListener listener) throws RemoteException { synchronized (mLock) { - checkBinderConnection(); + checkServiceIsReady(); getServiceInterface(mBinder).addRegistrationListener(mSlotId, mSupportedFeature, listener); } @@ -166,7 +166,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur public void removeRegistrationListener(IImsRegistrationListener listener) throws RemoteException { synchronized (mLock) { - checkBinderConnection(); + checkServiceIsReady(); getServiceInterface(mBinder).removeRegistrationListener(mSlotId, mSupportedFeature, listener); } @@ -176,7 +176,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur public ImsCallProfile createCallProfile(int sessionId, int callServiceType, int callType) throws RemoteException { synchronized (mLock) { - checkBinderConnection(); + checkServiceIsReady(); return getServiceInterface(mBinder).createCallProfile(mSlotId, mSupportedFeature, sessionId, callServiceType, callType); } @@ -186,7 +186,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur public IImsCallSession createCallSession(int sessionId, ImsCallProfile profile, IImsCallSessionListener listener) throws RemoteException { synchronized (mLock) { - checkBinderConnection(); + checkServiceIsReady(); return getServiceInterface(mBinder).createCallSession(mSlotId, mSupportedFeature, sessionId, profile, listener); } @@ -196,7 +196,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur public IImsCallSession getPendingCallSession(int sessionId, String callId) throws RemoteException { synchronized (mLock) { - checkBinderConnection(); + checkServiceIsReady(); return getServiceInterface(mBinder).getPendingCallSession(mSlotId, mSupportedFeature, sessionId, callId); } @@ -205,7 +205,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur @Override public IImsUt getUtInterface() throws RemoteException { synchronized (mLock) { - checkBinderConnection(); + checkServiceIsReady(); return getServiceInterface(mBinder).getUtInterface(mSlotId, mSupportedFeature); } } @@ -213,7 +213,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur @Override public IImsConfig getConfigInterface() throws RemoteException { synchronized (mLock) { - checkBinderConnection(); + checkServiceIsReady(); return getServiceInterface(mBinder).getConfigInterface(mSlotId, mSupportedFeature); } } @@ -221,7 +221,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur @Override public void turnOnIms() throws RemoteException { synchronized (mLock) { - checkBinderConnection(); + checkServiceIsReady(); getServiceInterface(mBinder).turnOnIms(mSlotId, mSupportedFeature); } } @@ -229,7 +229,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur @Override public void turnOffIms() throws RemoteException { synchronized (mLock) { - checkBinderConnection(); + checkServiceIsReady(); getServiceInterface(mBinder).turnOffIms(mSlotId, mSupportedFeature); } } @@ -237,7 +237,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur @Override public IImsEcbm getEcbmInterface() throws RemoteException { synchronized (mLock) { - checkBinderConnection(); + checkServiceIsReady(); return getServiceInterface(mBinder).getEcbmInterface(mSlotId, mSupportedFeature); } } @@ -246,7 +246,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur public void setUiTTYMode(int uiTtyMode, Message onComplete) throws RemoteException { synchronized (mLock) { - checkBinderConnection(); + checkServiceIsReady(); getServiceInterface(mBinder).setUiTTYMode(mSlotId, mSupportedFeature, uiTtyMode, onComplete); } @@ -255,7 +255,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur @Override public IImsMultiEndpoint getMultiEndpointInterface() throws RemoteException { synchronized (mLock) { - checkBinderConnection(); + checkServiceIsReady(); return getServiceInterface(mBinder).getMultiEndpointInterface(mSlotId, mSupportedFeature); } @@ -264,7 +264,8 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur @Override public int getFeatureStatus() { synchronized (mLock) { - if (mFeatureStatusCached != null) { + if (isBinderAlive() && mFeatureStatusCached != null) { + Log.i(LOG_TAG, "getFeatureStatus - returning cached: " + mFeatureStatusCached); return mFeatureStatusCached; } } @@ -277,6 +278,7 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur // Cache only non-null value for feature status. mFeatureStatusCached = status; } + Log.i(LOG_TAG, "getFeatureStatus - returning " + status); return status; } @@ -301,10 +303,28 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur mStatusCallback = c; } + /** + * @return Returns true if the ImsService is ready to take commands, false otherwise. If this + * method returns false, it doesn't mean that the Binder connection is not available (use + * {@link #isBinderReady()} to check that), but that the ImsService is not accepting commands + * at this time. + * + * For example, for DSDS devices, only one slot can be {@link ImsFeature#STATE_READY} to take + * commands at a time, so the other slot must stay at {@link ImsFeature#STATE_NOT_AVAILABLE}. + */ + public boolean isBinderReady() { + return isBinderAlive() && getFeatureStatus() == ImsFeature.STATE_READY; + } + @Override public boolean isBinderAlive() { - return mIsAvailable && getFeatureStatus() == ImsFeature.STATE_READY && mBinder != null && - mBinder.isBinderAlive(); + return mIsAvailable && mBinder != null && mBinder.isBinderAlive(); + } + + protected void checkServiceIsReady() throws RemoteException { + if (!isBinderReady()) { + throw new RemoteException("ImsServiceProxy is not ready to accept commands."); + } } private IImsServiceController getServiceInterface(IBinder b) { diff --git a/telephony/java/android/telephony/ims/feature/ImsFeature.java b/telephony/java/android/telephony/ims/feature/ImsFeature.java index 988dd588ecad7a46cae45b02b7ff11477e7ae823..395f1ccc7a2968cc533196c9556f062e506a4894 100644 --- a/telephony/java/android/telephony/ims/feature/ImsFeature.java +++ b/telephony/java/android/telephony/ims/feature/ImsFeature.java @@ -150,7 +150,7 @@ public abstract class ImsFeature { private void notifyFeatureState(@ImsState int state) { if (mStatusCallback != null) { try { - Log.i(LOG_TAG, "notifying ImsFeatureState"); + Log.i(LOG_TAG, "notifying ImsFeatureState=" + state); mStatusCallback.notifyImsFeatureStatus(state); } catch (RemoteException e) { mStatusCallback = null; diff --git a/telephony/java/android/telephony/mbms/DownloadListener.java b/telephony/java/android/telephony/mbms/DownloadCallback.java similarity index 96% rename from telephony/java/android/telephony/mbms/DownloadListener.java rename to telephony/java/android/telephony/mbms/DownloadCallback.java index 8d1bd024a5db686639dc3d44f1121b17589534b3..0c6fec4b9c75e03859a0ab317ec809415618b867 100644 --- a/telephony/java/android/telephony/mbms/DownloadListener.java +++ b/telephony/java/android/telephony/mbms/DownloadCallback.java @@ -20,7 +20,7 @@ package android.telephony.mbms; * A optional listener class used by download clients to track progress. * @hide */ -public class DownloadListener extends IDownloadListener.Stub { +public class DownloadCallback extends IDownloadCallback.Stub { /** * Gives process callbacks for a given DownloadRequest. * request indicates which download is being referenced. diff --git a/telephony/java/android/telephony/mbms/DownloadRequest.java b/telephony/java/android/telephony/mbms/DownloadRequest.java index 42a82da94d31660cd103d435d91cd0f7ab695aa6..dbaf10bb68eb5417a1770b784f513e76591646c4 100644 --- a/telephony/java/android/telephony/mbms/DownloadRequest.java +++ b/telephony/java/android/telephony/mbms/DownloadRequest.java @@ -16,44 +16,101 @@ package android.telephony.mbms; -import android.app.PendingIntent; +import android.content.Intent; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; +import java.net.URISyntaxException; + /** * A Parcelable class describing a pending Cell-Broadcast download request * @hide */ public class DownloadRequest implements Parcelable { - public DownloadRequest(int id, FileServiceInfo serviceInfo, Uri source, Uri dest, - PendingIntent resultPI, int sub) { + /** @hide */ + public static class Builder { + private int id; + private FileServiceInfo serviceInfo; + private Uri source; + private Uri dest; + private int sub; + private String appIntent; + + public Builder setId(int id) { + this.id = id; + return this; + } + + public Builder setServiceInfo(FileServiceInfo serviceInfo) { + this.serviceInfo = serviceInfo; + return this; + } + + public Builder setSource(Uri source) { + this.source = source; + return this; + } + + public Builder setDest(Uri dest) { + this.dest = dest; + return this; + } + + public Builder setSub(int sub) { + this.sub = sub; + return this; + } + + public Builder setAppIntent(Intent intent) { + this.appIntent = intent.toUri(0); + return this; + } + + public DownloadRequest build() { + return new DownloadRequest(id, serviceInfo, source, dest, sub, appIntent); + } + } + + private final int downloadId; + private final FileServiceInfo fileServiceInfo; + private final Uri sourceUri; + private final Uri destinationUri; + private final int subId; + private final String serializedResultIntentForApp; + + private DownloadRequest(int id, FileServiceInfo serviceInfo, + Uri source, Uri dest, + int sub, String appIntent) { downloadId = id; fileServiceInfo = serviceInfo; sourceUri = source; destinationUri = dest; subId = sub; + serializedResultIntentForApp = appIntent; } - /** @hide */ - public DownloadRequest(DownloadRequest dr, PendingIntent fdRequestPI, PendingIntent cleanupPI) { + public static DownloadRequest copy(DownloadRequest other) { + return new DownloadRequest(other); + } + + private DownloadRequest(DownloadRequest dr) { downloadId = dr.downloadId; fileServiceInfo = dr.fileServiceInfo; sourceUri = dr.sourceUri; destinationUri = dr.destinationUri; subId = dr.subId; - /* - * resultPI = new PI - * fileDescriptorRequstPI = fdRequestPI; - * this.cleanupPI = cleanupPI; - */ + serializedResultIntentForApp = dr.serializedResultIntentForApp; } - public final int downloadId; - public final FileServiceInfo fileServiceInfo; - public final Uri sourceUri; - public final Uri destinationUri; - public final int subId; + private DownloadRequest(Parcel in) { + downloadId = in.readInt(); + fileServiceInfo = in.readParcelable(getClass().getClassLoader()); + sourceUri = in.readParcelable(getClass().getClassLoader()); + destinationUri = in.readParcelable(getClass().getClassLoader()); + subId = in.readInt(); + serializedResultIntentForApp = in.readString(); + } public int describeContents() { return 0; @@ -65,14 +122,35 @@ public class DownloadRequest implements Parcelable { out.writeParcelable(sourceUri, flags); out.writeParcelable(destinationUri, flags); out.writeInt(subId); + out.writeString(serializedResultIntentForApp); } - private DownloadRequest(Parcel in) { - downloadId = in.readInt(); - fileServiceInfo = in.readParcelable(null); - sourceUri = in.readParcelable(null); - destinationUri = in.readParcelable(null); - subId = in.readInt(); + public int getDownloadId() { + return downloadId; + } + + public FileServiceInfo getFileServiceInfo() { + return fileServiceInfo; + } + + public Uri getSourceUri() { + return sourceUri; + } + + public Uri getDestinationUri() { + return destinationUri; + } + + public int getSubId() { + return subId; + } + + public Intent getIntentForApp() { + try { + return Intent.parseUri(serializedResultIntentForApp, 0); + } catch (URISyntaxException e) { + return null; + } } public static final Parcelable.Creator CREATOR = diff --git a/telephony/java/android/telephony/mbms/IDownloadListener.aidl b/telephony/java/android/telephony/mbms/IDownloadCallback.aidl similarity index 97% rename from telephony/java/android/telephony/mbms/IDownloadListener.aidl rename to telephony/java/android/telephony/mbms/IDownloadCallback.aidl index 9838682f2bb84ebe39e111e48940c756feb8ef6f..a6bd7e5f84f9b465a316b717e01e183026756a81 100755 --- a/telephony/java/android/telephony/mbms/IDownloadListener.aidl +++ b/telephony/java/android/telephony/mbms/IDownloadCallback.aidl @@ -23,7 +23,7 @@ import android.telephony.mbms.FileInfo; * The optional interface used by download clients to track progress. * @hide */ -interface IDownloadListener +interface IDownloadCallback { /** * Gives progress callbacks for a given DownloadRequest. Includes a FileInfo diff --git a/telephony/java/android/telephony/mbms/IMbmsDownloadManagerListener.aidl b/telephony/java/android/telephony/mbms/IMbmsDownloadManagerCallback.aidl similarity index 97% rename from telephony/java/android/telephony/mbms/IMbmsDownloadManagerListener.aidl rename to telephony/java/android/telephony/mbms/IMbmsDownloadManagerCallback.aidl index 6b5c0217f1fc8a07cd61d2a3e3fd608a98a6c941..03227d0d9f5ab3865d82de0afb8cbd3981ce6e71 100755 --- a/telephony/java/android/telephony/mbms/IMbmsDownloadManagerListener.aidl +++ b/telephony/java/android/telephony/mbms/IMbmsDownloadManagerCallback.aidl @@ -24,7 +24,7 @@ import java.util.List; * The interface the clients top-level file download listener will satisfy. * @hide */ -interface IMbmsDownloadManagerListener +interface IMbmsDownloadManagerCallback { void error(int errorCode, String message); diff --git a/telephony/java/android/telephony/mbms/IMbmsStreamingManagerListener.aidl b/telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl similarity index 97% rename from telephony/java/android/telephony/mbms/IMbmsStreamingManagerListener.aidl rename to telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl index 80176bfa55e40d9b7784dc784e99c4d97e617104..cbf0fca461f0da242ba50899679dd21fce0cb82b 100755 --- a/telephony/java/android/telephony/mbms/IMbmsStreamingManagerListener.aidl +++ b/telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl @@ -24,7 +24,7 @@ import java.util.List; * The interface the clients top-level streaming listener will satisfy. * @hide */ -interface IMbmsStreamingManagerListener +interface IMbmsStreamingManagerCallback { void error(int errorCode, String message); diff --git a/telephony/java/android/telephony/mbms/IStreamingServiceListener.aidl b/telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl similarity index 84% rename from telephony/java/android/telephony/mbms/IStreamingServiceListener.aidl rename to telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl index a41aca30a19133d43eeb76138c93760000a40488..7b4ecf25ea9c77db181e61512e0374bddd47e78e 100755 --- a/telephony/java/android/telephony/mbms/IStreamingServiceListener.aidl +++ b/telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl @@ -18,13 +18,14 @@ package android.telephony.mbms; import android.net.Uri; import android.telephony.SignalStrength; +import android.telephony.mbms.StreamingService; /** * @hide */ -oneway interface IStreamingServiceListener { +oneway interface IStreamingServiceCallback { void error(int errorCode, String message); - void stateUpdated(int state); + void streamStateChanged(in StreamingService service, int state); void uriUpdated(in Uri uri); void signalStrengthUpdated(in SignalStrength signalStrength); } diff --git a/telephony/java/android/telephony/mbms/MbmsDownloadManagerListener.java b/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java similarity index 95% rename from telephony/java/android/telephony/mbms/MbmsDownloadManagerListener.java rename to telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java index 04c2f9ac5dbdb2da3911b8e0a384fd669cafb8c4..16fafe415b0f303885237d2da4d99fabf208a002 100644 --- a/telephony/java/android/telephony/mbms/MbmsDownloadManagerListener.java +++ b/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java @@ -22,7 +22,7 @@ import java.util.List; * A Parcelable class with Cell-Broadcast service information. * @hide */ -public class MbmsDownloadManagerListener extends IMbmsDownloadManagerListener.Stub { +public class MbmsDownloadManagerCallback extends IMbmsDownloadManagerCallback.Stub { public final static int ERROR_CARRIER_NOT_SUPPORTED = 1; public final static int ERROR_UNABLE_TO_INITIALIZE = 2; diff --git a/telephony/java/android/telephony/mbms/MbmsInitializationException.java b/telephony/java/android/telephony/mbms/MbmsInitializationException.java new file mode 100644 index 0000000000000000000000000000000000000000..1612bc9cc1b3215e19bed2488374b45bdf128f19 --- /dev/null +++ b/telephony/java/android/telephony/mbms/MbmsInitializationException.java @@ -0,0 +1,32 @@ +/* + * 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.telephony.mbms; + +/** @hide */ +public class MbmsInitializationException extends Exception { + private final int mErrorCode; + + /** @hide */ + public MbmsInitializationException(int errorCode) { + super(); + mErrorCode = errorCode; + } + + public int getErrorCode() { + return mErrorCode; + } +} diff --git a/telephony/java/android/telephony/mbms/MbmsStreamingManagerListener.java b/telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java similarity index 96% rename from telephony/java/android/telephony/mbms/MbmsStreamingManagerListener.java rename to telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java index c64ad440ed181f51fca163cd1a651c91bc911933..b3bc8146275eb921fd1dba5d68941ff54019d33b 100644 --- a/telephony/java/android/telephony/mbms/MbmsStreamingManagerListener.java +++ b/telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java @@ -22,7 +22,7 @@ import java.util.List; * A Parcelable class with Cell-Broadcast service information. * @hide */ -public class MbmsStreamingManagerListener extends IMbmsStreamingManagerListener.Stub { +public class MbmsStreamingManagerCallback extends IMbmsStreamingManagerCallback.Stub { public final static int ERROR_CARRIER_NOT_SUPPORTED = 1; public final static int ERROR_UNABLE_TO_INITIALIZE = 2; diff --git a/telephony/java/android/telephony/mbms/StreamingService.java b/telephony/java/android/telephony/mbms/StreamingService.java index ee0d89421fa96f419a4e7fb81afe27384639696e..8cc604356badb807471e4d424c65ccb494673f1c 100644 --- a/telephony/java/android/telephony/mbms/StreamingService.java +++ b/telephony/java/android/telephony/mbms/StreamingService.java @@ -33,7 +33,7 @@ public class StreamingService { /** */ StreamingService(StreamingServiceInfo streamingServiceInfo, - IStreamingServiceListener listener) { + IStreamingServiceCallback listener) { } /** diff --git a/telephony/java/android/telephony/mbms/StreamingServiceListener.java b/telephony/java/android/telephony/mbms/StreamingServiceCallback.java similarity index 93% rename from telephony/java/android/telephony/mbms/StreamingServiceListener.java rename to telephony/java/android/telephony/mbms/StreamingServiceCallback.java index bc5aebbbd6b3d75ce263728682f29df45f6f7208..7f5c486f8d903e4bb9b216351c862bd4a06ce2bf 100644 --- a/telephony/java/android/telephony/mbms/StreamingServiceListener.java +++ b/telephony/java/android/telephony/mbms/StreamingServiceCallback.java @@ -23,7 +23,7 @@ import android.telephony.SignalStrength; * A Callback class for use when the applicaiton is actively streaming content. * @hide */ -public class StreamingServiceListener extends IStreamingServiceListener.Stub { +public class StreamingServiceCallback extends IStreamingServiceCallback.Stub { public void error(int errorCode, String message) { @@ -36,7 +36,7 @@ public class StreamingServiceListener extends IStreamingServiceListener.Stub { * See {@link StreamingService#STATE_STOPPED}, {@link StreamingService#STATE_STARTED} * and {@link StreamingService#STATE_STALLED}. */ - public void stateUpdated(int state) { + public void streamStateChanged(StreamingService service, int state) { // default implementation empty } diff --git a/telephony/java/android/telephony/mbms/UriPathPair.aidl b/telephony/java/android/telephony/mbms/UriPathPair.aidl new file mode 100755 index 0000000000000000000000000000000000000000..8bf768246da954fc4503e8f015a3061586108e8b --- /dev/null +++ b/telephony/java/android/telephony/mbms/UriPathPair.aidl @@ -0,0 +1,20 @@ +/* +** +** Copyright 2016, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + +package android.telephony.mbms; + +parcelable UriPathPair; diff --git a/telephony/java/android/telephony/mbms/UriPathPair.java b/telephony/java/android/telephony/mbms/UriPathPair.java new file mode 100644 index 0000000000000000000000000000000000000000..7acc270ed729184051ac74882f3ba8c806ce26f8 --- /dev/null +++ b/telephony/java/android/telephony/mbms/UriPathPair.java @@ -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 + */ + +package android.telephony.mbms; + +import android.content.ContentResolver; +import android.net.Uri; +import android.os.Parcel; +import android.os.Parcelable; + +/** @hide */ +public class UriPathPair implements Parcelable { + private final Uri mFilePathUri; + private final Uri mContentUri; + + /** @hide */ + public UriPathPair(Uri fileUri, Uri contentUri) { + if (fileUri == null || !ContentResolver.SCHEME_FILE.equals(fileUri.getScheme())) { + throw new IllegalArgumentException("File URI must have file scheme"); + } + if (contentUri == null || !ContentResolver.SCHEME_CONTENT.equals(contentUri.getScheme())) { + throw new IllegalArgumentException("Content URI must have content scheme"); + } + + mFilePathUri = fileUri; + mContentUri = contentUri; + } + + /** @hide */ + protected UriPathPair(Parcel in) { + mFilePathUri = in.readParcelable(Uri.class.getClassLoader()); + mContentUri = in.readParcelable(Uri.class.getClassLoader()); + } + + public static final Creator CREATOR = new Creator() { + @Override + public UriPathPair createFromParcel(Parcel in) { + return new UriPathPair(in); + } + + @Override + public UriPathPair[] newArray(int size) { + return new UriPathPair[size]; + } + }; + + /** future systemapi */ + public Uri getFilePathUri() { + return mFilePathUri; + } + + /** future systemapi */ + public Uri getContentUri() { + return mContentUri; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeParcelable(mFilePathUri, flags); + dest.writeParcelable(mContentUri, flags); + } +} diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl index 4ec40dafc301c3581a3134cab0f977d437e99e62..3090e1275f54d587e18d3e4b774e902708e653aa 100755 --- a/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl +++ b/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl @@ -20,8 +20,8 @@ import android.app.PendingIntent; import android.net.Uri; import android.telephony.mbms.DownloadRequest; import android.telephony.mbms.DownloadStatus; -import android.telephony.mbms.IMbmsDownloadManagerListener; -import android.telephony.mbms.IDownloadListener; +import android.telephony.mbms.IMbmsDownloadManagerCallback; +import android.telephony.mbms.IDownloadCallback; /** * The interface the opaque MbmsStreamingService will satisfy. @@ -35,7 +35,7 @@ interface IMbmsDownloadService * * No return value. Async errors may be reported, but none expected (not doing anything yet). */ - void initialize(String appName, int subId, IMbmsDownloadManagerListener listener); + void initialize(String appName, int subId, IMbmsDownloadManagerCallback listener); /** * - Registers serviceClasses of interest with the uid/appName/subId key. @@ -50,20 +50,20 @@ interface IMbmsDownloadService /** * should move the params into a DownloadRequest parcelable */ - int download(in DownloadRequest downloadRequest, IDownloadListener listener); + int download(String appName, in DownloadRequest downloadRequest, IDownloadCallback listener); - List listPendingDownloads(); + List listPendingDownloads(String appName); - int cancelDownload(in DownloadRequest downloadRequest); + int cancelDownload(String appName, in DownloadRequest downloadRequest); - DownloadStatus getDownloadStatus(in DownloadRequest downloadRequest); + DownloadStatus getDownloadStatus(String appName, in DownloadRequest downloadRequest); /* * named this for 2 reasons: * 1 don't want 'State' here as it conflicts with 'Status' of the previous function * 2 want to perfect typing 'Knowledge' */ - void resetDownloadKnowledge(in DownloadRequest downloadRequest); + void resetDownloadKnowledge(String appName, in DownloadRequest downloadRequest); /** * End of life for this MbmsDownloadManager. diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl index cb83969b09582c21d31e71627bb2edfa529190b6..fbc093134abad86f4e2cab01cf21a4862cb436ac 100755 --- a/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl +++ b/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl @@ -17,8 +17,8 @@ package android.telephony.mbms.vendor; import android.net.Uri; -import android.telephony.mbms.IMbmsStreamingManagerListener; -import android.telephony.mbms.IStreamingServiceListener; +import android.telephony.mbms.IMbmsStreamingManagerCallback; +import android.telephony.mbms.IStreamingServiceCallback; import android.telephony.mbms.StreamingService; import android.telephony.mbms.StreamingServiceInfo; import android.telephony.SignalStrength; @@ -34,7 +34,7 @@ interface IMbmsStreamingService * Registers this listener, subId with this appName * */ - int initialize(IMbmsStreamingManagerListener listener, String appName, int subId); + int initialize(IMbmsStreamingManagerCallback listener, String appName, int subId); /** @@ -55,7 +55,7 @@ interface IMbmsStreamingService * URL-change and State-change pair. */ StreamingService startStreaming(String appName, int subId, String serviceId, - IStreamingServiceListener listener); + IStreamingServiceCallback listener); /** * Asynchronously fetches all Services being streamed by this uid/appName/subId. diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java new file mode 100644 index 0000000000000000000000000000000000000000..369aef1c2c6842f056cc440306e1648aa558965f --- /dev/null +++ b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java @@ -0,0 +1,76 @@ +/* + * 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.telephony.mbms.vendor; + +import android.os.RemoteException; +import android.telephony.mbms.DownloadRequest; +import android.telephony.mbms.DownloadStatus; +import android.telephony.mbms.IDownloadCallback; +import android.telephony.mbms.IMbmsDownloadManagerCallback; + +import java.util.List; + +/** + * Base class for MbmsDownloadService. The middleware should extend this base class rather than + * the aidl stub for compatibility + * @hide + * TODO: future systemapi + */ +public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub { + @Override + public void initialize(String appName, int subId, IMbmsDownloadManagerCallback listener) + throws RemoteException { + } + + @Override + public int getFileServices(String appName, int subId, List serviceClasses) throws + RemoteException { + return 0; + } + + @Override + public int download(String appName, DownloadRequest downloadRequest, IDownloadCallback listener) + throws RemoteException { + return 0; + } + + @Override + public List listPendingDownloads(String appName) throws RemoteException { + return null; + } + + @Override + public int cancelDownload(String appName, DownloadRequest downloadRequest) + throws RemoteException { + return 0; + } + + @Override + public DownloadStatus getDownloadStatus(String appName, DownloadRequest downloadRequest) + throws RemoteException { + return null; + } + + @Override + public void resetDownloadKnowledge(String appName, DownloadRequest downloadRequest) + throws RemoteException { + } + + @Override + public void dispose(String appName, int subId) throws RemoteException { + } +} diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java new file mode 100644 index 0000000000000000000000000000000000000000..1c8ab7c544d09dfcd578ed97845a4edcd755e432 --- /dev/null +++ b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java @@ -0,0 +1,82 @@ +/* + * 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.telephony.mbms.vendor; + +import android.net.Uri; +import android.os.RemoteException; +import android.telephony.mbms.IMbmsStreamingManagerCallback; +import android.telephony.mbms.IStreamingServiceCallback; +import android.telephony.mbms.StreamingService; + +import java.util.List; + +/** + * @hide + * TODO: future systemapi + */ +public class MbmsStreamingServiceBase extends IMbmsStreamingService.Stub { + + @Override + public int initialize(IMbmsStreamingManagerCallback listener, String appName, int subId) + throws RemoteException { + return 0; + } + + @Override + public int getStreamingServices(String appName, int subId, List serviceClasses) + throws RemoteException { + return 0; + } + + @Override + public StreamingService startStreaming(String appName, int subId, + String serviceId, IStreamingServiceCallback listener) throws RemoteException { + return null; + } + + @Override + public int getActiveStreamingServices(String appName, int subId) throws RemoteException { + return 0; + } + + @Override + public Uri getPlaybackUri(String appName, int subId, String serviceId) throws RemoteException { + return null; + } + + @Override + public void switchStreams(String appName, int subId, String oldServiceId, String newServiceId) + throws RemoteException { + } + + @Override + public int getState(String appName, int subId, String serviceId) throws RemoteException { + return 0; + } + + @Override + public void stopStreaming(String appName, int subId, String serviceId) throws RemoteException { + } + + @Override + public void disposeStream(String appName, int subId, String serviceId) throws RemoteException { + } + + @Override + public void dispose(String appName, int subId) throws RemoteException { + } +} diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index da333aee61684abfb72944ad7483da3f0d0647df..621ccd620717d97521e865c12b7bd224b94bfe25 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -19,6 +19,8 @@ package com.android.internal.telephony; import android.app.PendingIntent; import android.content.Intent; import android.os.Bundle; +import android.os.IBinder; +import android.os.Messenger; import android.os.ResultReceiver; import android.net.Uri; import android.service.carrier.CarrierIdentifier; @@ -29,6 +31,7 @@ import android.telephony.ClientRequestStats; import android.telephony.IccOpenLogicalChannelResponse; import android.telephony.ModemActivityInfo; import android.telephony.NeighboringCellInfo; +import android.telephony.NetworkScanRequest; import android.telephony.RadioAccessFamily; import android.telephony.ServiceState; import android.telephony.TelephonyHistogram; @@ -792,6 +795,26 @@ interface ITelephony { */ CellNetworkScanResult getCellNetworkScanResults(int subId); + /** + * Perform a radio network scan and return the id of this scan. + * + * @param subId the id of the subscription. + * @param request Defines all the configs for network scan. + * @param messenger Callback messages will be sent using this messenger. + * @param binder the binder object instantiated in TelephonyManager. + * @return An id for this scan. + */ + int requestNetworkScan(int subId, in NetworkScanRequest request, in Messenger messenger, + in IBinder binder); + + /** + * Stop an existing radio network scan. + * + * @param subId the id of the subscription. + * @param scanId The id of the scan that is going to be stopped. + */ + void stopNetworkScan(int subId, int scanId); + /** * Ask the radio to connect to the input network and change selection mode to manual. * diff --git a/telephony/java/com/android/internal/telephony/TelephonyIntents.java b/telephony/java/com/android/internal/telephony/TelephonyIntents.java index 687ef326548b4f2bf7d03afd46f7a1985acf6b1d..32d3f2705d273e7207dcd0ca28bd12b45b1b124e 100644 --- a/telephony/java/com/android/internal/telephony/TelephonyIntents.java +++ b/telephony/java/com/android/internal/telephony/TelephonyIntents.java @@ -18,6 +18,7 @@ package com.android.internal.telephony; import android.content.Intent; import android.content.Intent; +import android.telephony.SubscriptionManager; /** * The intents that the telephony services broadcast. @@ -336,11 +337,11 @@ public class TelephonyIntents { *

    *
  • subscription - A int, the current default subscription.
  • *
- * @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 @@ -368,11 +369,11 @@ public class TelephonyIntents { *
    *
  • subscription - A int, the current sms default subscription.
  • *
- * @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. @@ -403,7 +404,7 @@ public class TelephonyIntents { *
    *
  • apnType
  • A string with the apn type.
    *
  • redirectionUrl
  • redirection url string
    - *
  • subId
  • Sub Id which associated the data connection failure. + *
  • subId
  • Sub Id which associated the data connection failure.
    *
*

This is a protected intent that can only be sent by the system.

*/ @@ -416,7 +417,7 @@ public class TelephonyIntents { *
    *
  • apnType
  • A string with the apn type.
    *
  • errorCode
  • A integer with dataFailCause.
    - *
  • subId
  • Sub Id which associated the data connection failure. + *
  • subId
  • Sub Id which associated the data connection failure.
    *
*

This is a protected intent that can only be sent by the system.

*/ @@ -433,13 +434,25 @@ public class TelephonyIntents { * IPV4V6) *
  • pcoId
  • An integer indicating the pco id for the data.
    *
  • pcoValue
  • A byte array of pco data read from modem.
    - *
  • subId
  • Sub Id which associated the data connection. + *
  • subId
  • Sub Id which associated the data connection.
    * *

    This is a protected intent that can only be sent by the system.

    */ public static final String ACTION_CARRIER_SIGNAL_PCO_VALUE = "com.android.internal.telephony.CARRIER_SIGNAL_PCO_VALUE"; + /** + *

    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:

    + *
      + *
    • subId
    • Sub Id which associated the data connection failure.
      + *
    + *

    This is a protected intent that can only be sent by the system.

    + */ + 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/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index 2d3d79a03446473013ddc611096fc0f945621f7a..9a03c53d95cc1c149e4422909a508a8e1797e5b0 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -17,6 +17,7 @@ package android.test.mock; import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.PackageInstallObserver; import android.content.ComponentName; import android.content.Intent; @@ -1159,4 +1160,13 @@ public class MockPackageManager extends PackageManager { public String getInstantAppAndroidId(String packageName, UserHandle user) { throw new UnsupportedOperationException(); } + + /** + * @hide + */ + @Override + public void registerDexModule(String dexModulePath, + @Nullable DexModuleRegisterCallback callback) { + throw new UnsupportedOperationException(); + } } diff --git a/tests/FeatureSplit/feature1/AndroidManifest.xml b/tests/FeatureSplit/feature1/AndroidManifest.xml index 42619b623e108971d6d23e2ce186d0327cea8c3f..b87361faac62780f50e5f6fa56711609ae62021c 100644 --- a/tests/FeatureSplit/feature1/AndroidManifest.xml +++ b/tests/FeatureSplit/feature1/AndroidManifest.xml @@ -16,7 +16,7 @@ + featureSplit="feature1"> diff --git a/tests/FeatureSplit/feature1/res/layout/included.xml b/tests/FeatureSplit/feature1/res/layout/included.xml new file mode 100644 index 0000000000000000000000000000000000000000..c64bdb7ff85f00e9173f0e95bb07ebef3898769b --- /dev/null +++ b/tests/FeatureSplit/feature1/res/layout/included.xml @@ -0,0 +1,5 @@ + + diff --git a/tests/FeatureSplit/feature1/res/layout/main.xml b/tests/FeatureSplit/feature1/res/layout/main.xml new file mode 100644 index 0000000000000000000000000000000000000000..dbea42ab23d0bd5c0e599a6bdef0132deef5e403 --- /dev/null +++ b/tests/FeatureSplit/feature1/res/layout/main.xml @@ -0,0 +1,8 @@ + + + + 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 def133919f909165273007fc6bf7ee6eabf978db..61ac9dfba1cba93fbf6e7385795bf7724e69342f 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 b50044ac37b790b8a7f2ca6961d188087a2456a3..abd0b5eb6933d9488175134aff9733e04fea401e 100644 --- a/tests/FeatureSplit/feature2/AndroidManifest.xml +++ b/tests/FeatureSplit/feature2/AndroidManifest.xml @@ -16,7 +16,7 @@ + featureSplit="feature2"> diff --git a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java index 93677e35dc4f2032cb76324eea2028b41b4e92c3..5dd42dd21c906f82c16e91ec3564ca963ef65278 100644 --- a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java +++ b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java @@ -385,6 +385,23 @@ public class NotificationTestList extends TestActivity 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/android/net/nsd/NsdManagerTest.java b/tests/net/java/android/net/nsd/NsdManagerTest.java index 2418450c82beba5a9ada2638dda087e21fd81bdb..235556ee8e4fd5aa19279292f87fdfdaa71476ec 100644 --- a/tests/net/java/android/net/nsd/NsdManagerTest.java +++ b/tests/net/java/android/net/nsd/NsdManagerTest.java @@ -18,6 +18,7 @@ package android.net.nsd; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; import static org.mockito.Mockito.when; import static org.mockito.Mockito.any; import static org.mockito.Mockito.reset; @@ -42,10 +43,14 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.util.function.Consumer; + @RunWith(AndroidJUnit4.class) @SmallTest public class NsdManagerTest { + static final int PROTOCOL = NsdManager.PROTOCOL_DNS_SD; + @Mock Context mContext; @Mock INsdManager mService; MockServiceHandler mServiceHandler; @@ -101,7 +106,128 @@ public class NsdManagerTest { verify(listener1, timeout(mTimeoutMs).times(1)).onServiceResolved(reply); verify(listener2, timeout(mTimeoutMs).times(1)).onServiceResolved(reply); - } + } + + @Test + public void testRegisterService() { + NsdManager manager = makeManager(); + + NsdServiceInfo request1 = new NsdServiceInfo("a_name", "a_type"); + NsdServiceInfo request2 = new NsdServiceInfo("another_name", "another_type"); + request1.setPort(2201); + request2.setPort(2202); + NsdManager.RegistrationListener listener1 = mock(NsdManager.RegistrationListener.class); + NsdManager.RegistrationListener listener2 = mock(NsdManager.RegistrationListener.class); + + // Register two services + manager.registerService(request1, PROTOCOL, listener1); + int key1 = verifyRequest(NsdManager.REGISTER_SERVICE); + + manager.registerService(request2, PROTOCOL, listener2); + int key2 = verifyRequest(NsdManager.REGISTER_SERVICE); + + // First reques fails, second request succeeds + sendResponse(NsdManager.REGISTER_SERVICE_SUCCEEDED, 0, key2, request2); + verify(listener2, timeout(mTimeoutMs).times(1)).onServiceRegistered(request2); + + int err = 1; + sendResponse(NsdManager.REGISTER_SERVICE_FAILED, err, key1, request1); + verify(listener1, timeout(mTimeoutMs).times(1)).onRegistrationFailed(request1, err); + + // Client retries first request, it succeeds + manager.registerService(request1, PROTOCOL, listener1); + int key3 = verifyRequest(NsdManager.REGISTER_SERVICE); + + sendResponse(NsdManager.REGISTER_SERVICE_SUCCEEDED, 0, key3, request1); + verify(listener1, timeout(mTimeoutMs).times(1)).onServiceRegistered(request1); + + // First request is unregistered, it succeeds + manager.unregisterService(listener1); + int key3again = verifyRequest(NsdManager.UNREGISTER_SERVICE); + assertEquals(key3, key3again); + + sendResponse(NsdManager.UNREGISTER_SERVICE_SUCCEEDED, 0, key3again, null); + verify(listener1, timeout(mTimeoutMs).times(1)).onServiceUnregistered(request1); + + // Second request is unregistered, it fails + manager.unregisterService(listener2); + int key2again = verifyRequest(NsdManager.UNREGISTER_SERVICE); + assertEquals(key2, key2again); + + sendResponse(NsdManager.UNREGISTER_SERVICE_FAILED, err, key2again, null); + verify(listener2, timeout(mTimeoutMs).times(1)).onUnregistrationFailed(request2, err); + + // TODO: do not unregister listener until service is unregistered + // Client retries unregistration of second request, it succeeds + //manager.unregisterService(listener2); + //int key2yetAgain = verifyRequest(NsdManager.UNREGISTER_SERVICE); + //assertEquals(key2, key2yetAgain); + + //sendResponse(NsdManager.UNREGISTER_SERVICE_SUCCEEDED, 0, key2yetAgain, null); + //verify(listener2, timeout(mTimeoutMs).times(1)).onServiceUnregistered(request2); + } + + @Test + public void testInvalidCalls() { + NsdManager manager = new NsdManager(mContext, mService); + + NsdManager.RegistrationListener listener1 = mock(NsdManager.RegistrationListener.class); + NsdManager.DiscoveryListener listener2 = mock(NsdManager.DiscoveryListener.class); + NsdManager.ResolveListener listener3 = mock(NsdManager.ResolveListener.class); + + NsdServiceInfo invalidService = new NsdServiceInfo(null, null); + NsdServiceInfo validService = new NsdServiceInfo("a_name", "a_type"); + validService.setPort(2222); + + // Service registration + // - invalid arguments + mustFail(() -> { manager.unregisterService(null); }); + mustFail(() -> { manager.registerService(null, -1, null); }); + mustFail(() -> { manager.registerService(null, PROTOCOL, listener1); }); + mustFail(() -> { manager.registerService(invalidService, PROTOCOL, listener1); }); + mustFail(() -> { manager.registerService(validService, -1, listener1); }); + mustFail(() -> { manager.registerService(validService, PROTOCOL, null); }); + manager.registerService(validService, PROTOCOL, listener1); + // - listener already registered + mustFail(() -> { manager.registerService(validService, PROTOCOL, listener1); }); + manager.unregisterService(listener1); + // TODO: make listener immediately reusable + //mustFail(() -> { manager.unregisterService(listener1); }); + //manager.registerService(validService, PROTOCOL, listener1); + + // Discover service + // - invalid arguments + mustFail(() -> { manager.stopServiceDiscovery(null); }); + mustFail(() -> { manager.discoverServices(null, -1, null); }); + mustFail(() -> { manager.discoverServices(null, PROTOCOL, listener2); }); + mustFail(() -> { manager.discoverServices("a_service", -1, listener2); }); + mustFail(() -> { manager.discoverServices("a_service", PROTOCOL, null); }); + manager.discoverServices("a_service", PROTOCOL, listener2); + // - listener already registered + mustFail(() -> { manager.discoverServices("another_service", PROTOCOL, listener2); }); + manager.stopServiceDiscovery(listener2); + // TODO: make listener immediately reusable + //mustFail(() -> { manager.stopServiceDiscovery(listener2); }); + //manager.discoverServices("another_service", PROTOCOL, listener2); + + // Resolver service + // - invalid arguments + mustFail(() -> { manager.resolveService(null, null); }); + mustFail(() -> { manager.resolveService(null, listener3); }); + mustFail(() -> { manager.resolveService(invalidService, listener3); }); + mustFail(() -> { manager.resolveService(validService, null); }); + manager.resolveService(validService, listener3); + // - listener already registered:w + mustFail(() -> { manager.resolveService(validService, listener3); }); + } + + public void mustFail(Runnable fn) { + try { + fn.run(); + fail(); + } catch (Exception expected) { + } + } NsdManager makeManager() { NsdManager manager = new NsdManager(mContext, mService); diff --git a/tests/net/java/android/net/nsd/NsdServiceTest.java b/tests/net/java/android/net/nsd/NsdServiceTest.java index 64466bf69dcd3d0c0707450aff0eaa1d7f200b1f..acc390c8d4478f391a2e27b49a7675c855cc82ab 100644 --- a/tests/net/java/android/net/nsd/NsdServiceTest.java +++ b/tests/net/java/android/net/nsd/NsdServiceTest.java @@ -16,6 +16,11 @@ package com.android.server; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.os.Handler; @@ -25,6 +30,9 @@ import android.os.test.TestLooper; import android.content.Context; import android.content.ContentResolver; import android.net.nsd.NsdManager; +import com.android.server.NsdService.DaemonConnection; +import com.android.server.NsdService.DaemonConnectionSupplier; +import com.android.server.NsdService.NativeCallbackReceiver; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import org.junit.Before; @@ -34,7 +42,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; // TODOs: -// - test daemon connection // - test client disconnects // - test client can send requests and receive replies // - test NSD_ON ENABLE/DISABLED listening @@ -45,6 +52,8 @@ public class NsdServiceTest { @Mock Context mContext; @Mock ContentResolver mResolver; @Mock NsdService.NsdSettings mSettings; + @Mock DaemonConnection mDaemon; + NativeCallbackReceiver mDaemonCallback; TestLooper mLooper; TestHandler mHandler; @@ -58,8 +67,13 @@ public class NsdServiceTest { @Test public void testClientsCanConnect() { + when(mSettings.isEnabled()).thenReturn(true); + NsdService service = makeService(); + NsdManager client1 = connectClient(service); + verify(mDaemon, timeout(100).times(1)).execute("start-service"); + NsdManager client2 = connectClient(service); // TODO: disconnect client1 @@ -67,7 +81,13 @@ public class NsdServiceTest { } NsdService makeService() { - return new NsdService(mContext, mSettings, mHandler); + DaemonConnectionSupplier supplier = (callback) -> { + mDaemonCallback = callback; + return mDaemon; + }; + NsdService service = new NsdService(mContext, mSettings, mHandler, supplier); + verify(mDaemon, never()).execute(any(String.class)); + return service; } NsdManager connectClient(NsdService service) { diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 633a914778a55a4f16a1dcfac2e9f1cf13750cda..46dcdad2e83ac15c366fab9096711994800f1dd6 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.ContextWrapper; 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.Parcel; 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 @@ public class ConnectivityServiceTest extends AndroidTestCase { 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 @@ public class ConnectivityServiceTest extends AndroidTestCase { private final MockContentResolver mContentResolver; @Spy private Resources mResources; + private final LinkedBlockingQueue mStartedActivities = new LinkedBlockingQueue<>(); MockContext(Context base) { super(base); @@ -168,6 +171,27 @@ public class ConnectivityServiceTest extends AndroidTestCase { mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider()); } + @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; @@ -1829,6 +1853,52 @@ public class ConnectivityServiceTest extends AndroidTestCase { validatedCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); } + @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(); diff --git a/tests/net/java/com/android/server/connectivity/TetheringTest.java b/tests/net/java/com/android/server/connectivity/TetheringTest.java index b2c1244af7082c31a031b51444d3438e184550be..7a1c2395c438e8f97270bbfd16dec243e6fd1b1f 100644 --- a/tests/net/java/com/android/server/connectivity/TetheringTest.java +++ b/tests/net/java/com/android/server/connectivity/TetheringTest.java @@ -236,6 +236,9 @@ public class TetheringTest { 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". @@ -261,6 +264,7 @@ public class TetheringTest { 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, @@ -292,6 +296,9 @@ public class TetheringTest { 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". @@ -338,6 +345,7 @@ public class TetheringTest { 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 b09bcde897d7ff947032950a77ead79ef2836fdc..32ee091a46c9463b58e1f3b40ed57417aefa731e 100644 --- a/tests/testables/src/android/testing/BaseFragmentTest.java +++ b/tests/testables/src/android/testing/BaseFragmentTest.java @@ -161,12 +161,12 @@ public abstract class BaseFragmentTest { 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 cb5d4cb8242fc22597144b8b3b1b829daa20cf8e..630a287c6f4a5984f0ae038a612e6601b1d0d3ad 100644 --- a/tests/testables/src/android/testing/TestableContext.java +++ b/tests/testables/src/android/testing/TestableContext.java @@ -43,7 +43,7 @@ import org.junit.runners.model.Statement; *
      *
    • System services can be mocked out with {@link #addMockSystemService}
    • *
    • Service binding can be mocked out with {@link #addMockService}
    • - *
    • Settings support {@link TestableSettings}
    • + *
    • Settings support {@link TestableSettingsProvider}
    • *
    • Has support for {@link LeakCheck} for services and receivers
    • *
    * @@ -59,7 +59,7 @@ import org.junit.runners.model.Statement; public class TestableContext extends ContextWrapper implements TestRule { private final TestableContentResolver mTestableContentResolver; - private final TestableSettings mSettingsProvider; + private final TestableSettingsProvider mSettingsProvider; private ArrayMap mMockSystemServices; private ArrayMap mMockServices; @@ -79,9 +79,8 @@ public class TestableContext extends ContextWrapper implements TestRule { 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 @@ public class TestableContext extends ContextWrapper implements TestRule { return super.getSystemService(name); } - public TestableSettings getSettingsProvider() { + TestableSettingsProvider getSettingsProvider() { return mSettingsProvider; } @@ -236,12 +235,12 @@ public class TestableContext extends ContextWrapper implements TestRule { 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 d19f1ef60b2e496c1ae4c7b8ca5e9719cdf0324c..0000000000000000000000000000000000000000 --- 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. - *

    - * To use, in the before method acquire the override add all settings that will affect if - * your test passes or not. - * - *

    - * {@literal
    - * mSettingOverride = mTestableContext.getSettingsProvider().acquireOverridesBuilder()
    - * .addSetting("secure", Secure.USER_SETUP_COMPLETE, "0")
    - * .build();
    - * }
    - * 
    - * - * Then in the after free up the settings. - * - *
    - * {@literal
    - * mSettingOverride.release();
    - * }
    - * 
    - */ -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 overrides = mProvider.mOwners.remove(this); - if (overrides != null) { - overrides.forEach(override -> override.ensureReleased()); - } - } - - private void acquireSettings(SettingOverrider overridder, Set 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 mValidKeys; - private final Map mValueMap = new ArrayMap<>(); - private final TestableSettings mSettings; - private boolean mReleased; - public Throwable mObtain; - - private SettingOverrider(Set 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 mKeys = new ArraySet<>(); - private Map 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 mOverrideMap = new ArrayMap<>(); - private final Map> 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 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 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 keys, - Object owner) throws AcquireTimeoutException { - synchronized (mOwners) { - List 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 0000000000000000000000000000000000000000..13056cf677d6444c25e575a39d7abe2d2c786b6f --- /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 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 0000000000000000000000000000000000000000..1f71867396ab4975d72a3392a0eb4d813aad4f8b --- /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 1b01542a8a640321064269c0708d4e3f1142e153..0000000000000000000000000000000000000000 --- 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 60b01e372d7b1e868ce1efa76efe13297283e913..b872ebbeb159806a7f882fa507786464be0eb9e2 100644 --- a/tools/aapt2/Debug.cpp +++ b/tools/aapt2/Debug.cpp @@ -274,7 +274,13 @@ class XmlPrinter : public xml::Visitor { 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 87fda16ee956a8237d735e0d5e5abb0f41630021..01930d0c424ba53423d4a017ce9273c2d2695cab 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 @@ int PrintVersion() { return 0; } -extern int Compile(const std::vector& args); -extern int Link(const std::vector& args); +extern int Compile(const std::vector& args, IDiagnostics* diagnostics); +extern int Link(const std::vector& args, IDiagnostics* diagnostics); extern int Dump(const std::vector& args); extern int Diff(const std::vector& args); extern int Optimize(const std::vector& args); @@ -53,9 +55,11 @@ int main(int argc, char** argv) { 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 b93c6ecea274a6a2057a83812231ba2528abc046..5413b336ea90557cc4bebd9d56b3ade3ad589b37 100644 --- a/tools/aapt2/cmd/Compile.cpp +++ b/tools/aapt2/cmd/Compile.cpp @@ -598,6 +598,9 @@ static bool CompileFile(IAaptContext* context, const CompileOptions& options, 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 @@ class CompileContext : public IAaptContext { } IDiagnostics* GetDiagnostics() override { - return &diagnostics_; + return diagnostics_; } NameMangler* GetNameMangler() override { @@ -639,7 +642,7 @@ class CompileContext : public IAaptContext { } private: - StdErrDiagnostics diagnostics_; + IDiagnostics* diagnostics_; bool verbose_ = false; }; @@ -647,8 +650,8 @@ class CompileContext : public IAaptContext { * Entry point for compilation phase. Parses arguments and dispatches to the * correct steps. */ -int Compile(const std::vector& args) { - CompileContext context; +int Compile(const std::vector& 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 258516db2ac917d7c1c7863c1c5b7dd527f18fe9..8accfa84c0a6c8567960f7b60539d0e8244723c5 100644 --- a/tools/aapt2/cmd/Link.cpp +++ b/tools/aapt2/cmd/Link.cpp @@ -118,7 +118,8 @@ struct LinkOptions { 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 @@ class LinkContext : public IAaptContext { } IDiagnostics* GetDiagnostics() override { - return &diagnostics_; + return diagnostics_; } NameMangler* GetNameMangler() override { @@ -181,7 +182,7 @@ class LinkContext : public IAaptContext { 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 @@ class LinkContext : public IAaptContext { 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 FindByName( + const ResourceName& name, + const std::vector>& sources) override { + std::unique_ptr 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 max_sdk_level, bool keep_raw_values, IArchiveWriter* writer, IAaptContext* context) { @@ -1463,6 +1520,19 @@ class LinkCommand { context_->GetExternalSymbols()->PrependSource( util::make_unique(&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(context_)); + } + ReferenceLinker linker; if (!linker.Consume(context_, &final_table_)) { context_->GetDiagnostics()->Error(DiagMessage() << "failed linking references"); @@ -1736,8 +1806,8 @@ class LinkCommand { std::map shared_libs_; }; -int Link(const std::vector& args) { - LinkContext context; +int Link(const std::vector& args, IDiagnostics* diagnostics) { + LinkContext context(diagnostics); LinkOptions options; std::vector overlay_arg_list; std::vector extra_java_packages; diff --git a/tools/aapt2/cmd/Optimize.cpp b/tools/aapt2/cmd/Optimize.cpp index 78ed49b64dd2c6170dd35fcb82d12070c2491bd3..194c0c80c2b23dfede4bfe842f666a004584aa6e 100644 --- a/tools/aapt2/cmd/Optimize.cpp +++ b/tools/aapt2/cmd/Optimize.cpp @@ -213,10 +213,10 @@ class OptimizeCommand { 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 d44b3e095c0fde0000408f77581ae9c3b8baf20f..f4d02262f25c129be6e554ba97cf56e85f4cd5ee 100644 --- a/tools/aapt2/flatten/TableFlattener.cpp +++ b/tools/aapt2/flatten/TableFlattener.cpp @@ -573,10 +573,17 @@ bool TableFlattener::Consume(IAaptContext* context, ResourceTable* table) { // Write the ResTable header. ChunkWriter table_writer(buffer_); - ResTable_header* table_header = - table_writer.StartChunk(RES_TABLE_TYPE); + ResTable_header* table_header = table_writer.StartChunk(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 8dff3a27b79fde7bf16b0ff83bb4ecf55722a95e..6d1350d433a48471eb0b8f2a15a5af57d6f295d1 100644 --- a/tools/aapt2/flatten/TableFlattener_test.cpp +++ b/tools/aapt2/flatten/TableFlattener_test.cpp @@ -400,7 +400,7 @@ TEST_F(TableFlattenerTest, FlattenTableReferencingSharedLibraries) { const DynamicRefTable* dynamic_ref_table = result.getDynamicRefTableForCookie(1); ASSERT_NE(nullptr, dynamic_ref_table); - const KeyedVector entries = dynamic_ref_table->entries(); + const KeyedVector& entries = dynamic_ref_table->entries(); ssize_t idx = entries.indexOfKey(android::String16("lib_one")); ASSERT_GE(idx, 0); @@ -411,6 +411,26 @@ TEST_F(TableFlattenerTest, FlattenTableReferencingSharedLibraries) { EXPECT_EQ(0x03u, entries.valueAt(idx)); } +TEST_F(TableFlattenerTest, PackageWithNonStandardIdHasDynamicRefTable) { + std::unique_ptr context = + test::ContextBuilder().SetCompilationPackage("app").SetPackageId(0x80).Build(); + std::unique_ptr 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& 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 366c373223dc8212ad0d7074f14ccfc041e19144..e98d2d758df472a6bf43ff82d06a1dd6206a38a7 100644 --- a/tools/aapt2/flatten/XmlFlattener.cpp +++ b/tools/aapt2/flatten/XmlFlattener.cpp @@ -99,7 +99,11 @@ class XmlFlattenerVisitor : public xml::Visitor { flat_node->comment.index = util::HostToDevice32(-1); ResXMLTree_cdataExt* flat_text = writer.NextBlock(); - 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 @@ class XmlFlattenerVisitor : public xml::Visitor { 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 @@ class XmlFlattenerVisitor : public xml::Visitor { 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 @@ class XmlFlattenerVisitor : public xml::Visitor { } 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 @@ class XmlFlattenerVisitor : public xml::Visitor { // 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 @@ class XmlFlattenerVisitor : public xml::Visitor { 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 @@ class XmlFlattenerVisitor : public xml::Visitor { } 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 494d9d25b00827813dac8cda5d0f9d3218753b66..cfa89bb4b09f98613eac9a807e4c2f104152ad05 100644 --- a/tools/aapt2/flatten/XmlFlattener_test.cpp +++ b/tools/aapt2/flatten/XmlFlattener_test.cpp @@ -35,13 +35,16 @@ class XmlFlattenerTest : public ::testing::Test { .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 @@ class XmlFlattenerTest : public ::testing::Test { } protected: - std::unique_ptr context_; + std::unique_ptr context_; }; TEST_F(XmlFlattenerTest, FlattenXmlWithNoCompiledAttributes) { @@ -79,72 +82,71 @@ TEST_F(XmlFlattenerTest, FlattenXmlWithNoCompiledAttributes) { 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 @@ TEST_F(XmlFlattenerTest, AssignSpecialAttributeIndices) { 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 doc = - test::BuildXmlDom(""); + std::unique_ptr doc = test::BuildXmlDom(""); android::ResXMLTree tree; ASSERT_TRUE(Flatten(doc.get(), &tree)); @@ -261,4 +259,81 @@ TEST_F(XmlFlattenerTest, EmptyStringValueInAttributeIsNotNull) { 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 doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF( + )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 doc = test::BuildXmlDom( + R"EOF(\\d{5})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 a8226c0a90827a85622d5e30d4efcca7ffcfe579..2a23aa9e5372b00a49050fa35fe3424388a5d2fb 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 @@ void JavaClassGenerator::ProcessResource(const ResourceNameRef& name, const Reso 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 resource_member = - util::make_unique(field_name, id); + util::make_unique(field_name, real_id); // Build the comments and annotations for this entry. AnnotationProcessor* processor = resource_member->GetCommentBuilder(); @@ -458,7 +465,7 @@ void JavaClassGenerator::ProcessResource(const ResourceNameRef& name, const Reso 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 ce3d282e6f9beccdd63a48a882bb3d7a91ed7143..ad5ad4c336e5b66a236c88016c8c6389f1142ebe 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 &args); -extern int Link(const std::vector &args); +extern int Compile(const std::vector& args, IDiagnostics* iDiagnostics); +extern int Link(const std::vector& args, IDiagnostics* iDiagnostics); } /* @@ -77,20 +78,66 @@ static std::vector extract_pieces(const std::vector 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 compile_args_jni = list_to_utfchars(env, arguments_obj); std::vector 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 link_args_jni = list_to_utfchars(env, arguments_obj); std::vector 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 90150b4d731e96c86851f91da9e792f8223d533a..3cd98658fab26248d2cb5261795215bcc11c6ac3 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 @@ JNIEXPORT void JNICALL Java_com_android_tools_aapt2_Aapt2Jni_ping /* * 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 27ab22bb00107594123a858d758141a4c563baad..f998d31dc96a4f6314c0d016094c55512e401ada 100644 --- a/tools/aapt2/link/ManifestFixer.cpp +++ b/tools/aapt2/link/ManifestFixer.cpp @@ -332,7 +332,7 @@ bool ManifestFixer::BuildRules(xml::XmlActionExecutor* executor, // 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 cc59416cb2b94865900d86bd303fe2390a7c6d0a..66ecc15730edb1231512344876ef1d10ef498368 100644 --- a/tools/aapt2/link/XmlReferenceLinker_test.cpp +++ b/tools/aapt2/link/XmlReferenceLinker_test.cpp @@ -81,6 +81,7 @@ TEST_F(XmlReferenceLinkerTest, LinkBasicAttributes) { 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 @@ TEST_F(XmlReferenceLinkerTest, LinkBasicAttributes) { 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(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(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(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 @@ TEST_F(XmlReferenceLinkerTest, LinkBasicAttributes) { ASSERT_NE(nullptr, ValueCast(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 bcafbcabee6c7b9807b656690acd44835ef61343..1a648bf080b5562861b8a6aee0a55a4b746ff58c 100644 --- a/tools/aapt2/process/SymbolTable.cpp +++ b/tools/aapt2/process/SymbolTable.cpp @@ -34,6 +34,21 @@ using android::StringPiece; namespace aapt { +SymbolTable::SymbolTable(NameMangler* mangler) + : mangler_(mangler), + delegate_(util::make_unique()), + cache_(200), + id_cache_(200) { +} + +void SymbolTable::SetDelegate(std::unique_ptr 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 source) { sources_.push_back(std::move(source)); @@ -75,28 +90,27 @@ const SymbolTable::Symbol* SymbolTable::FindByName(const ResourceName& name) { mangled_name = &mangled_name_impl.value(); } - for (auto& symbolSource : sources_) { - std::unique_ptr 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 shared_symbol(std::move(symbol)); + std::unique_ptr symbol = delegate_->FindByName(*mangled_name, sources_); + if (symbol == nullptr) { + return nullptr; + } - // 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); + // Take ownership of the symbol into a shared_ptr. We do this because + // LruCache doesn't support unique_ptr. + std::shared_ptr shared_symbol(std::move(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); - } + // 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); - // Returns the raw pointer. Callers are not expected to hold on to this - // between calls to Find*. - return shared_symbol.get(); - } + if (shared_symbol->id) { + // The symbol has an ID, so we can also cache this! + id_cache_.put(shared_symbol->id.value(), shared_symbol); } - return nullptr; + + // 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 @@ const SymbolTable::Symbol* SymbolTable::FindById(const ResourceId& id) { } // We did not find it in the cache, so look through the sources. - for (auto& symbolSource : sources_) { - std::unique_ptr 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 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 = 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 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 @@ const SymbolTable::Symbol* SymbolTable::FindByReference(const Reference& ref) { return symbol; } +std::unique_ptr DefaultSymbolTableDelegate::FindByName( + const ResourceName& name, const std::vector>& sources) { + for (auto& source : sources) { + std::unique_ptr symbol = source->FindByName(name); + if (symbol) { + return symbol; + } + } + return {}; +} + +std::unique_ptr DefaultSymbolTableDelegate::FindById( + ResourceId id, const std::vector>& sources) { + for (auto& source : sources) { + std::unique_ptr symbol = source->FindById(id); + if (symbol) { + return symbol; + } + } + return {}; +} + std::unique_ptr ResourceTableSymbolSource::FindByName( const ResourceName& name) { Maybe result = table_->FindResource(name); diff --git a/tools/aapt2/process/SymbolTable.h b/tools/aapt2/process/SymbolTable.h index 298da4d42c773a719cce242dd2bb21841b05d4bd..bd252d245dc85bb76e3461441d5375be50d26dfb 100644 --- a/tools/aapt2/process/SymbolTable.h +++ b/tools/aapt2/process/SymbolTable.h @@ -47,6 +47,7 @@ inline android::hash_t hash_type(const ResourceId& id) { } class ISymbolSource; +class ISymbolTableDelegate; class NameMangler; class SymbolTable { @@ -73,7 +74,11 @@ class SymbolTable { 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 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 @@ class SymbolTable { private: NameMangler* mangler_; + std::unique_ptr delegate_; std::vector> sources_; // We use shared_ptr because unique_ptr is not supported and @@ -109,11 +115,41 @@ class SymbolTable { 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 FindByName( + const ResourceName& name, const std::vector>& sources) = 0; + + virtual std::unique_ptr FindById( + ResourceId id, const std::vector>& sources) = 0; + + private: + DISALLOW_COPY_AND_ASSIGN(ISymbolTableDelegate); +}; + +class DefaultSymbolTableDelegate : public ISymbolTableDelegate { + public: + DefaultSymbolTableDelegate() = default; + virtual ~DefaultSymbolTableDelegate() = default; + + virtual std::unique_ptr FindByName( + const ResourceName& name, + const std::vector>& sources) override; + virtual std::unique_ptr FindById( + ResourceId id, const std::vector>& 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 @@ class ISymbolSource { const ResourceName& name) = 0; virtual std::unique_ptr 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 FindByReference( const Reference& ref) { if (ref.name) { @@ -136,11 +170,9 @@ class ISymbolSource { } }; -/** - * 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 daf1ebc20461f9bd9d72e2f4cfaaa365afebae36..0291720bb1ac2b5e306d1b1bc7e5dd8e858aa40c 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 29d183876c4c27f065f93a82190c857159d04644..0564db063b9a4c7fa40127ff59fb8aac7849a757 100644 --- a/tools/aapt2/test/Context.h +++ b/tools/aapt2/test/Context.h @@ -52,15 +52,27 @@ class Context : public IAaptContext { 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 42786b5387cffb1387f7c87144f919ba482b570c..f3116701056b25a1194d4d3eedab64e9d3092cde 100644 --- a/tools/aapt2/unflatten/BinaryResourceParser.cpp +++ b/tools/aapt2/unflatten/BinaryResourceParser.cpp @@ -439,11 +439,10 @@ std::unique_ptr BinaryResourceParser::ParseValue(const ResourceNameRef& na 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 60551901fe8df2bc1537a6df57924d8d31b7a29b..98f5f1d06df9ee0b5cdf775ab02a0d01c63f48eb 100644 --- a/tools/aapt2/xml/XmlDom.cpp +++ b/tools/aapt2/xml/XmlDom.cpp @@ -42,7 +42,6 @@ struct Stack { std::stack node_stack; std::string pending_comment; std::unique_ptr last_text_node; - util::StringBuilder pending_text; }; /** @@ -66,14 +65,12 @@ static void SplitName(const char* name, std::string* out_ns, 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 @@ static void XMLCALL StartElementHandler(void* user_data, const char* name, 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 @@ static void XMLCALL CharacterDataHandler(void* user_data, const char* s, int len // 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(); 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 0fc3cec66666d5bc9582c6d776279d4e97bce99f..fb18ea316ca686c7d8daf59d27bb5da15f945db4 100644 --- a/tools/aapt2/xml/XmlDom_test.cpp +++ b/tools/aapt2/xml/XmlDom_test.cpp @@ -49,23 +49,26 @@ TEST(XmlDomTest, Inflate) { EXPECT_EQ(ns->namespace_prefix, "android"); } -TEST(XmlDomTest, HandleEscapes) { - std::unique_ptr doc = test::BuildXmlDom( - R"EOF(\\d{5})EOF"); +// Escaping is handled after parsing of the values for resource-specific values. +TEST(XmlDomTest, ForwardEscapes) { + std::unique_ptr doc = test::BuildXmlDom(R"EOF( + \\d{5})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(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/BridgePackageManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java index 764eeebaef6a8660f58f1f2b49e3f713315eea11..47dad3404beba1ce5f6f0364d4fdb173720f38f0 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java @@ -949,4 +949,10 @@ public class BridgePackageManager extends PackageManager { public String getInstantAppAndroidId(String packageName, UserHandle user) { return null; } + + @Override + public void registerDexModule(String dexModulePath, + @Nullable DexModuleRegisterCallback callback) { + callback.onDexModuleRegistered(dexModulePath, false, null); + } } 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 339019d2ab1601a8a5b0f45903c9f49db121847e..ed428ec9cfe8959a2c2520c2909b331748716ab3 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 @@ package com.android.layoutlib.bridge.android; 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 class BridgePowerManager implements IPowerManager { 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 01837ca0bb778451de191b3e190ab331f99b8607..d942d056a316246a788d1e0288344b70a3295c11 100644 --- a/wifi/java/android/net/wifi/IWifiManager.aidl +++ b/wifi/java/android/net/wifi/IWifiManager.aidl @@ -81,7 +81,7 @@ interface IWifiManager boolean disableNetwork(int netId); - void startScan(in ScanSettings requested, in WorkSource ws); + void startScan(in ScanSettings requested, in WorkSource ws, in String packageName); List getScanResults(String callingPackage); @@ -131,6 +131,14 @@ interface IWifiManager 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/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java index 7defa7c17d9519259d3075d649fa8486b8c4a2fb..e31a74b42b1436225346c674e5ec5f612eb9c7b1 100644 --- a/wifi/java/android/net/wifi/WifiConfiguration.java +++ b/wifi/java/android/net/wifi/WifiConfiguration.java @@ -228,9 +228,9 @@ public class WifiConfiguration implements Parcelable { */ 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 @@ public class WifiConfiguration implements Parcelable { /** * 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 @@ public class WifiConfiguration implements Parcelable { * 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}). *

    * When the value of one of these keys is read, the actual key is diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 867c49608c56e2860e698485a0220fd53757c73f..e59b74f0bf6007918e547e004d3f41fae6f9564a 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -40,10 +40,15 @@ import android.os.WorkSource; 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; @@ -362,7 +367,7 @@ public class WifiManager { /** * 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 @@ -473,7 +478,6 @@ public class WifiManager { */ 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 @@ -848,6 +852,22 @@ public class WifiManager { 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 @@ -1457,19 +1477,15 @@ public class WifiManager { * @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(); @@ -1812,6 +1828,179 @@ public class WifiManager { } } + /** + * 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. + *

    + * 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. + *

    + * 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}. + *

    + * 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. + *

    + * 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. + *

    + * 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). + *

    + * 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}. + *

    + * @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. + *

    + * 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. + *

    + * 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}. + *

    + * @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}, @@ -2068,6 +2257,309 @@ public class WifiManager { public void onFailure(int reason); } + /** + * LocalOnlyHotspotReservation that contains the {@link WifiConfiguration} for the active + * LocalOnlyHotspot request. + *

    + * 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. + *

    + * 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. + *

    + * Applications can attempt to call + * {@link WifiManager#startLocalOnlyHotspot(LocalOnlyHotspotCallback, Handler)} again at + * a later time. + *

    + * @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 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 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 333a4f7dc3cee4876f0658b2f50234429d1ba373..f892bb0a38849f902135340a7f0562fe48d93d3e 100644 --- a/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java +++ b/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java @@ -80,9 +80,15 @@ public final class PasspointConfiguration implements Parcelable { * 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 @@ public final class PasspointConfiguration implements Parcelable { * 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 @@ public final class PasspointConfiguration implements Parcelable { * identity during EAP authentication. */ private Map mTrustRootCertList = null; + /** + * @hide + */ public void setTrustRootCertList(Map trustRootCertList) { mTrustRootCertList = trustRootCertList; } + /** + * @hide + */ public Map getTrustRootCertList() { return mTrustRootCertList; } @@ -118,9 +136,15 @@ public final class PasspointConfiguration implements Parcelable { * 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 @@ public final class PasspointConfiguration implements Parcelable { * 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 @@ public final class PasspointConfiguration implements Parcelable { * * 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 @@ public final class PasspointConfiguration implements Parcelable { * * 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 @@ public final class PasspointConfiguration implements Parcelable { * specific. */ private String mSubscriptionType = null; + /** + * @hide + */ public void setSubscriptionType(String subscriptionType) { mSubscriptionType = subscriptionType; } + /** + * @hide + */ public String getSubscriptionType() { return mSubscriptionType; } @@ -184,9 +232,15 @@ public final class PasspointConfiguration implements Parcelable { * “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 @@ public final class PasspointConfiguration implements Parcelable { * * 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 @@ public final class PasspointConfiguration implements Parcelable { * 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 @@ public final class PasspointConfiguration implements Parcelable { * 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 @@ public final class PasspointConfiguration implements Parcelable { } 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 @@ public final class PasspointConfiguration implements Parcelable { 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 @@ public final class PasspointConfiguration implements Parcelable { && 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 @@ public final class PasspointConfiguration implements Parcelable { @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 @@ public final class PasspointConfiguration implements Parcelable { 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 @@ public final class PasspointConfiguration implements Parcelable { 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 5dc5d13569c64e6cb864884f58d9ba648c549338..f6183fa219a1bd65d0dff8ba8354800de2937fa8 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 @@ public final class PpsMoParser { 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 @@ public final class PpsMoParser { 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 @@ public final class PpsMoParser { 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 67fa1bbccd1e440c81fd442e1f17bdcdaae4ac34..d712feb7c6d2ef5bacc00255531102b962c9ef58 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 @@ public final class Credential implements Parcelable { * 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 @@ public final class Credential implements Parcelable { * 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 @@ public final class Credential implements Parcelable { * Protocol) authentication. */ private boolean mCheckAaaServerCertStatus = false; + /** + * @hide + */ public void setCheckAaaServerCertStatus(boolean checkAaaServerCertStatus) { mCheckAaaServerCertStatus = checkAaaServerCertStatus; } + /** + * @hide + */ public boolean getCheckAaaServerCertStatus() { return mCheckAaaServerCertStatus; } @@ -166,9 +184,15 @@ public final class Credential implements Parcelable { * 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 @@ public final class Credential implements Parcelable { * 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 @@ public final class Credential implements Parcelable { * 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 final class Credential implements Parcelable { */ 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 @@ public final class Credential implements Parcelable { @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 @@ public final class Credential implements Parcelable { 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 @@ public final class Credential implements Parcelable { @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 final class Credential implements Parcelable { 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 @@ public final class Credential implements Parcelable { @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 9192ab015e206ca4cca82b865d8527ae6e48b9d2..2247860d23a590a02ab18a2ebd75e28d16f71d20 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 @@ public final class HomeSp implements Parcelable { * 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 @@ public final class HomeSp implements Parcelable { * string is assumed to be encoded using UTF-8. */ private Map mHomeNetworkIds = null; + /** + * @hide + */ public void setHomeNetworkIds(Map homeNetworkIds) { mHomeNetworkIds = homeNetworkIds; } + /** + * @hide + */ public Map getHomeNetworkIds() { return mHomeNetworkIds; } @@ -107,9 +119,15 @@ public final class HomeSp implements Parcelable { * (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 @@ public final class HomeSp implements Parcelable { * (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 @@ public final class HomeSp implements Parcelable { * 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 1df70f8d45d004924ee9b9730d6c3a5637e391da..ee0894bd021211b03df2220bd16f4c2b795de498 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 @@ import java.util.Objects; * * 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 a7adfeb9ec0fceac4d92c44696aa60839fe3a938..9eb6314b1fa08f8bbfadc9e6d62f8b7320a25a2d 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 @@ import java.util.Objects; * * 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 0000000000000000000000000000000000000000..03ef319fa1e03b62ae08185486deea8737c06977 --- /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 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 7df4fcf56e8ada7cf31be3624b5da2fa26ffad04..afcf3e344c27a633d55b1ab60ad492de3f912ab3 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 @@ public class PasspointConfigurationTest { 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 7cd72f03dd1b1833390cd021e22a1c2600e7e3a5..afa9fd6a9e8be601a7f291034687b290aea3e175 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 @@ public class PpsMoParserTest { 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 @@ public class PpsMoParserTest { // 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 c7ade002c826bc7011d7b28ba0ee4e44433775e6..9bfc0105fcc9c9cede243151577d0f5e17cd2a64 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 @@ public class CredentialTest { 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 @@ public class CredentialTest { Credential copyCred = new Credential(sourceCred); assertTrue(copyCred.equals(sourceCred)); } -} \ No newline at end of file +}